Skip to content

Commit 0bbf6f1

Browse files
Merge pull request docker-archive-public#2789 from robvanmieghem/master
FIX docker-archive-public#2411 On a btrfs system, don't default to aufs
2 parents 9ed16a0 + 84ff3e3 commit 0bbf6f1

File tree

14 files changed

+281
-10
lines changed

14 files changed

+281
-10
lines changed

libmachine/provision/arch.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,11 @@ func (provisioner *ArchProvisioner) Provision(swarmOptions swarm.Options, authOp
9494
provisioner.EngineOptions = engineOptions
9595
swarmOptions.Env = engineOptions.Env
9696

97-
if provisioner.EngineOptions.StorageDriver == "" {
98-
provisioner.EngineOptions.StorageDriver = "overlay"
97+
storageDriver, err := decideStorageDriver(provisioner, "overlay", engineOptions.StorageDriver)
98+
if err != nil {
99+
return err
99100
}
101+
provisioner.EngineOptions.StorageDriver = storageDriver
100102

101103
// HACK: since Arch does not come with sudo by default we install
102104
log.Debug("Installing sudo")

libmachine/provision/arch_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package provision
2+
3+
import (
4+
"testing"
5+
6+
"github.com/docker/machine/drivers/fakedriver"
7+
"github.com/docker/machine/libmachine/auth"
8+
"github.com/docker/machine/libmachine/engine"
9+
"github.com/docker/machine/libmachine/provision/provisiontest"
10+
"github.com/docker/machine/libmachine/swarm"
11+
)
12+
13+
func TestArchDefaultStorageDriver(t *testing.T) {
14+
p := NewArchProvisioner(&fakedriver.Driver{}).(*ArchProvisioner)
15+
p.SSHCommander = provisiontest.NewFakeSSHCommander(provisiontest.FakeSSHCommanderOptions{})
16+
p.Provision(swarm.Options{}, auth.Options{}, engine.Options{})
17+
if p.EngineOptions.StorageDriver != "overlay" {
18+
t.Fatal("Default storage driver should be overlay")
19+
}
20+
}

libmachine/provision/debian.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,11 @@ func (provisioner *DebianProvisioner) Provision(swarmOptions swarm.Options, auth
106106
provisioner.EngineOptions = engineOptions
107107
swarmOptions.Env = engineOptions.Env
108108

109-
if provisioner.EngineOptions.StorageDriver == "" {
110-
provisioner.EngineOptions.StorageDriver = "aufs"
109+
storageDriver, err := decideStorageDriver(provisioner, "aufs", engineOptions.StorageDriver)
110+
if err != nil {
111+
return err
111112
}
113+
provisioner.EngineOptions.StorageDriver = storageDriver
112114

113115
// HACK: since debian does not come with sudo by default we install
114116
log.Debug("installing sudo")
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package provision
2+
3+
import (
4+
"testing"
5+
6+
"github.com/docker/machine/drivers/fakedriver"
7+
"github.com/docker/machine/libmachine/auth"
8+
"github.com/docker/machine/libmachine/engine"
9+
"github.com/docker/machine/libmachine/provision/provisiontest"
10+
"github.com/docker/machine/libmachine/swarm"
11+
)
12+
13+
func TestDebianDefaultStorageDriver(t *testing.T) {
14+
p := NewDebianProvisioner(&fakedriver.Driver{}).(*DebianProvisioner)
15+
p.SSHCommander = provisiontest.NewFakeSSHCommander(provisiontest.FakeSSHCommanderOptions{})
16+
p.Provision(swarm.Options{}, auth.Options{}, engine.Options{})
17+
if p.EngineOptions.StorageDriver != "aufs" {
18+
t.Fatal("Default storage driver should be aufs")
19+
}
20+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//Package provisiontest provides utilities for testing provisioners
2+
package provisiontest
3+
4+
import "errors"
5+
6+
//FakeSSHCommanderOptions is intended to create a FakeSSHCommander without actually knowing the underlying sshcommands by passing it to NewSSHCommander
7+
type FakeSSHCommanderOptions struct {
8+
//Result of the ssh command to look up the FilesystemType
9+
FilesystemType string
10+
}
11+
12+
//FakeSSHCommander is an implementation of provision.SSHCommander to provide predictable responses set by testing code
13+
//Extend it when needed
14+
type FakeSSHCommander struct {
15+
Responses map[string]string
16+
}
17+
18+
//NewFakeSSHCommander creates a FakeSSHCommander without actually knowing the underlying sshcommands
19+
func NewFakeSSHCommander(options FakeSSHCommanderOptions) *FakeSSHCommander {
20+
if options.FilesystemType == "" {
21+
options.FilesystemType = "ext4"
22+
}
23+
sshCmder := &FakeSSHCommander{
24+
Responses: map[string]string{
25+
"stat -f -c %T /var/lib": options.FilesystemType + "\n",
26+
},
27+
}
28+
29+
return sshCmder
30+
}
31+
32+
//SSHCommand is an implementation of provision.SSHCommander.SSHCommand to provide predictable responses set by testing code
33+
func (sshCmder *FakeSSHCommander) SSHCommand(args string) (string, error) {
34+
response, commandRegistered := sshCmder.Responses[args]
35+
if !commandRegistered {
36+
return "", errors.New("Command not registered in FakeSSHCommander")
37+
}
38+
return response, nil
39+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package provisiontest
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestCreateFakeSSHCommander(t *testing.T) {
10+
sshCmder := NewFakeSSHCommander(FakeSSHCommanderOptions{FilesystemType: "btrfs"})
11+
output, err := sshCmder.SSHCommand("stat -f -c %T /var/lib")
12+
if err != nil || output != "btrfs\n" {
13+
t.Fatal("FakeSSHCommander should have returned btrfs and no error but returned '", output, "' and error", err)
14+
}
15+
}
16+
17+
func TestStatSSHCommand(t *testing.T) {
18+
sshCmder := FakeSSHCommander{
19+
Responses: map[string]string{"sshcommand": "sshcommandresponse"},
20+
}
21+
22+
output, err := sshCmder.SSHCommand("sshcommand")
23+
assert.NoError(t, err)
24+
assert.Equal(t, "sshcommandresponse", output)
25+
26+
output, err = sshCmder.SSHCommand("errorcommand")
27+
assert.Error(t, err)
28+
}

libmachine/provision/redhat.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,11 @@ func (provisioner *RedHatProvisioner) Provision(swarmOptions swarm.Options, auth
159159
swarmOptions.Env = engineOptions.Env
160160

161161
// set default storage driver for redhat
162-
if provisioner.EngineOptions.StorageDriver == "" {
163-
provisioner.EngineOptions.StorageDriver = "devicemapper"
162+
storageDriver, err := decideStorageDriver(provisioner, "devicemapper", engineOptions.StorageDriver)
163+
if err != nil {
164+
return err
164165
}
166+
provisioner.EngineOptions.StorageDriver = storageDriver
165167

166168
if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil {
167169
return err

libmachine/provision/redhat_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ package provision
33
import (
44
"regexp"
55
"testing"
6+
7+
"github.com/docker/machine/drivers/fakedriver"
8+
"github.com/docker/machine/libmachine/auth"
9+
"github.com/docker/machine/libmachine/engine"
10+
"github.com/docker/machine/libmachine/provision/provisiontest"
11+
"github.com/docker/machine/libmachine/swarm"
612
)
713

814
func TestRedHatGenerateYumRepoList(t *testing.T) {
@@ -26,3 +32,12 @@ func TestRedHatGenerateYumRepoList(t *testing.T) {
2632
t.Fatalf("expected match for centos/7")
2733
}
2834
}
35+
36+
func TestRedHatDefaultStorageDriver(t *testing.T) {
37+
p := NewRedHatProvisioner("", &fakedriver.Driver{})
38+
p.SSHCommander = provisiontest.NewFakeSSHCommander(provisiontest.FakeSSHCommanderOptions{})
39+
p.Provision(swarm.Options{}, auth.Options{}, engine.Options{})
40+
if p.EngineOptions.StorageDriver != "devicemapper" {
41+
t.Fatal("Default storage driver should be devicemapper")
42+
}
43+
}

libmachine/provision/ubuntu_systemd.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,11 @@ func (provisioner *UbuntuSystemdProvisioner) Provision(swarmOptions swarm.Option
122122
provisioner.EngineOptions = engineOptions
123123
swarmOptions.Env = engineOptions.Env
124124

125-
if provisioner.EngineOptions.StorageDriver == "" {
126-
provisioner.EngineOptions.StorageDriver = "aufs"
125+
storageDriver, err := decideStorageDriver(provisioner, "aufs", engineOptions.StorageDriver)
126+
if err != nil {
127+
return err
127128
}
129+
provisioner.EngineOptions.StorageDriver = storageDriver
128130

129131
log.Debug("setting hostname")
130132
if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil {

libmachine/provision/ubuntu_systemd_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ package provision
22

33
import (
44
"testing"
5+
6+
"github.com/docker/machine/drivers/fakedriver"
7+
"github.com/docker/machine/libmachine/auth"
8+
"github.com/docker/machine/libmachine/engine"
9+
"github.com/docker/machine/libmachine/provision/provisiontest"
10+
"github.com/docker/machine/libmachine/swarm"
511
)
612

713
func TestUbuntuSystemdCompatibleWithHost(t *testing.T) {
@@ -27,3 +33,12 @@ func TestUbuntuSystemdCompatibleWithHost(t *testing.T) {
2733
}
2834

2935
}
36+
37+
func TestUbuntuSystemdDefaultStorageDriver(t *testing.T) {
38+
p := NewUbuntuSystemdProvisioner(&fakedriver.Driver{}).(*UbuntuSystemdProvisioner)
39+
p.SSHCommander = provisiontest.NewFakeSSHCommander(provisiontest.FakeSSHCommanderOptions{})
40+
p.Provision(swarm.Options{}, auth.Options{}, engine.Options{})
41+
if p.EngineOptions.StorageDriver != "aufs" {
42+
t.Fatal("Default storage driver should be aufs")
43+
}
44+
}

0 commit comments

Comments
 (0)