Skip to content

Commit 06fc443

Browse files
committed
Merge pull request docker-archive-public#2338 from dgageot/rollback-provisionner
Revert "Remove systemd-related driver duplication"
2 parents ffbcd35 + b00e30c commit 06fc443

File tree

12 files changed

+289
-160
lines changed

12 files changed

+289
-160
lines changed

libmachine/provision/arch.go

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package provision
22

33
import (
4+
"bytes"
45
"fmt"
6+
"text/template"
57

68
"github.com/docker/machine/libmachine/auth"
79
"github.com/docker/machine/libmachine/drivers"
@@ -21,18 +23,39 @@ func init() {
2123

2224
func NewArchProvisioner(d drivers.Driver) Provisioner {
2325
return &ArchProvisioner{
24-
NewSystemdProvisioner("arch", d),
26+
GenericProvisioner{
27+
DockerOptionsDir: "/etc/docker",
28+
DaemonOptionsFile: "/etc/systemd/system/docker.service",
29+
OsReleaseID: "arch",
30+
Packages: []string{},
31+
Driver: d,
32+
},
2533
}
2634
}
2735

2836
type ArchProvisioner struct {
29-
SystemdProvisioner
37+
GenericProvisioner
3038
}
3139

3240
func (provisioner *ArchProvisioner) CompatibleWithHost() bool {
3341
return provisioner.OsReleaseInfo.ID == provisioner.OsReleaseID || provisioner.OsReleaseInfo.IDLike == provisioner.OsReleaseID
3442
}
3543

44+
func (provisioner *ArchProvisioner) Service(name string, action serviceaction.ServiceAction) error {
45+
// daemon-reload to catch config updates; systemd -- ugh
46+
if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil {
47+
return err
48+
}
49+
50+
command := fmt.Sprintf("sudo systemctl %s %s", action.String(), name)
51+
52+
if _, err := provisioner.SSHCommand(command); err != nil {
53+
return err
54+
}
55+
56+
return nil
57+
}
58+
3659
func (provisioner *ArchProvisioner) Package(name string, action pkgaction.PackageAction) error {
3760
var packageAction string
3861

@@ -144,3 +167,37 @@ func (provisioner *ArchProvisioner) Provision(swarmOptions swarm.Options, authOp
144167

145168
return nil
146169
}
170+
171+
func (provisioner *ArchProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) {
172+
var (
173+
engineCfg bytes.Buffer
174+
)
175+
176+
driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName())
177+
provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel)
178+
179+
engineConfigTmpl := `[Service]
180+
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }}
181+
MountFlags=slave
182+
LimitNOFILE=1048576
183+
LimitNPROC=1048576
184+
LimitCORE=infinity
185+
`
186+
t, err := template.New("engineConfig").Parse(engineConfigTmpl)
187+
if err != nil {
188+
return nil, err
189+
}
190+
191+
engineConfigContext := EngineConfigContext{
192+
DockerPort: dockerPort,
193+
AuthOptions: provisioner.AuthOptions,
194+
EngineOptions: provisioner.EngineOptions,
195+
}
196+
197+
t.Execute(&engineCfg, engineConfigContext)
198+
199+
return &DockerOptions{
200+
EngineOptions: engineCfg.String(),
201+
EngineOptionsPath: provisioner.DaemonOptionsFile,
202+
}, nil
203+
}

libmachine/provision/centos.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,21 @@ func init() {
1111
}
1212

1313
func NewCentosProvisioner(d drivers.Driver) Provisioner {
14-
return &CentosProvisioner{
15-
NewRedHatProvisioner("centos", d),
14+
g := GenericProvisioner{
15+
DockerOptionsDir: "/etc/docker",
16+
DaemonOptionsFile: "/etc/systemd/system/docker.service",
17+
OsReleaseID: "centos",
18+
Packages: []string{},
19+
Driver: d,
1620
}
21+
p := &CentosProvisioner{
22+
RedHatProvisioner{
23+
GenericProvisioner: g,
24+
},
25+
}
26+
return p
1727
}
1828

1929
type CentosProvisioner struct {
20-
*RedHatProvisioner
30+
RedHatProvisioner
2131
}

libmachine/provision/coreos.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type CoreOSProvisioner struct {
4545
}
4646

4747
func (provisioner *CoreOSProvisioner) Service(name string, action serviceaction.ServiceAction) error {
48+
// daemon-reload to catch config updates; systemd -- ugh
4849
if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil {
4950
return err
5051
}

libmachine/provision/debian.go

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package provision
22

33
import (
4+
"bytes"
45
"fmt"
6+
"text/template"
57

68
"github.com/docker/machine/libmachine/auth"
79
"github.com/docker/machine/libmachine/drivers"
@@ -21,12 +23,35 @@ func init() {
2123

2224
func NewDebianProvisioner(d drivers.Driver) Provisioner {
2325
return &DebianProvisioner{
24-
NewSystemdProvisioner("debian", d),
26+
GenericProvisioner{
27+
DockerOptionsDir: "/etc/docker",
28+
DaemonOptionsFile: "/etc/systemd/system/docker.service",
29+
OsReleaseID: "debian",
30+
Packages: []string{
31+
"curl",
32+
},
33+
Driver: d,
34+
},
2535
}
2636
}
2737

2838
type DebianProvisioner struct {
29-
SystemdProvisioner
39+
GenericProvisioner
40+
}
41+
42+
func (provisioner *DebianProvisioner) Service(name string, action serviceaction.ServiceAction) error {
43+
// daemon-reload to catch config updates; systemd -- ugh
44+
if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil {
45+
return err
46+
}
47+
48+
command := fmt.Sprintf("sudo systemctl -f %s %s", action.String(), name)
49+
50+
if _, err := provisioner.SSHCommand(command); err != nil {
51+
return err
52+
}
53+
54+
return nil
3055
}
3156

3257
func (provisioner *DebianProvisioner) Package(name string, action pkgaction.PackageAction) error {
@@ -154,3 +179,41 @@ func (provisioner *DebianProvisioner) Provision(swarmOptions swarm.Options, auth
154179

155180
return nil
156181
}
182+
183+
func (provisioner *DebianProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) {
184+
var (
185+
engineCfg bytes.Buffer
186+
)
187+
188+
driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName())
189+
provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel)
190+
191+
engineConfigTmpl := `[Service]
192+
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }}
193+
MountFlags=slave
194+
LimitNOFILE=1048576
195+
LimitNPROC=1048576
196+
LimitCORE=infinity
197+
Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
198+
199+
[Install]
200+
WantedBy=multi-user.target
201+
`
202+
t, err := template.New("engineConfig").Parse(engineConfigTmpl)
203+
if err != nil {
204+
return nil, err
205+
}
206+
207+
engineConfigContext := EngineConfigContext{
208+
DockerPort: dockerPort,
209+
AuthOptions: provisioner.AuthOptions,
210+
EngineOptions: provisioner.EngineOptions,
211+
}
212+
213+
t.Execute(&engineCfg, engineConfigContext)
214+
215+
return &DockerOptions{
216+
EngineOptions: engineCfg.String(),
217+
EngineOptionsPath: provisioner.DaemonOptionsFile,
218+
}, nil
219+
}

libmachine/provision/fedora.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,21 @@ func init() {
1111
}
1212

1313
func NewFedoraProvisioner(d drivers.Driver) Provisioner {
14-
return &FedoraProvisioner{
15-
NewRedHatProvisioner("fedora", d),
14+
g := GenericProvisioner{
15+
DockerOptionsDir: "/etc/docker",
16+
DaemonOptionsFile: "/etc/systemd/system/docker.service",
17+
OsReleaseID: "fedora",
18+
Packages: []string{},
19+
Driver: d,
1620
}
21+
p := &FedoraProvisioner{
22+
RedHatProvisioner{
23+
GenericProvisioner: g,
24+
},
25+
}
26+
return p
1727
}
1828

1929
type FedoraProvisioner struct {
20-
*RedHatProvisioner
30+
RedHatProvisioner
2131
}

libmachine/provision/generic.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
)
1313

1414
type GenericProvisioner struct {
15-
SSHCommander
1615
OsReleaseID string
1716
DockerOptionsDir string
1817
DaemonOptionsFile string
@@ -24,14 +23,6 @@ type GenericProvisioner struct {
2423
SwarmOptions swarm.Options
2524
}
2625

27-
type GenericSSHCmder struct {
28-
Driver drivers.Driver
29-
}
30-
31-
func (sshCmder GenericSSHCmder) SSHCommand(args string) (string, error) {
32-
return drivers.RunSSHCommandFromDriver(sshCmder.Driver, args)
33-
}
34-
3526
func (provisioner *GenericProvisioner) Hostname() (string, error) {
3627
return provisioner.SSHCommand("hostname")
3728
}
@@ -61,6 +52,10 @@ func (provisioner *GenericProvisioner) GetDockerOptionsDir() string {
6152
return provisioner.DockerOptionsDir
6253
}
6354

55+
func (provisioner *GenericProvisioner) SSHCommand(args string) (string, error) {
56+
return drivers.RunSSHCommandFromDriver(provisioner.Driver, args)
57+
}
58+
6459
func (provisioner *GenericProvisioner) CompatibleWithHost() bool {
6560
return provisioner.OsReleaseInfo.ID == provisioner.OsReleaseID
6661
}

libmachine/provision/provisioner.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,8 @@ import (
1414

1515
var provisioners = make(map[string]*RegisteredProvisioner)
1616

17-
type SSHCommander interface {
18-
// Short-hand for accessing an SSH command from the driver.
19-
SSHCommand(args string) (string, error)
20-
}
21-
2217
// Provisioner defines distribution specific actions
2318
type Provisioner interface {
24-
SSHCommander
25-
2619
// Create the files for the daemon to consume configuration settings (return struct of content and path)
2720
GenerateDockerOptions(dockerPort int) (*DockerOptions, error)
2821

@@ -58,6 +51,9 @@ type Provisioner interface {
5851
// Get the driver which is contained in the provisioner.
5952
GetDriver() drivers.Driver
6053

54+
// Short-hand for accessing an SSH command from the driver.
55+
SSHCommand(args string) (string, error)
56+
6157
// Set the OS Release info depending on how it's represented
6258
// internally
6359
SetOsReleaseInfo(info *OsRelease)

libmachine/provision/redhat.go

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/docker/machine/libmachine/mcnutils"
1414
"github.com/docker/machine/libmachine/provision/pkgaction"
1515
"github.com/docker/machine/libmachine/provision/serviceaction"
16+
"github.com/docker/machine/libmachine/ssh"
1617
"github.com/docker/machine/libmachine/swarm"
1718
)
1819

@@ -43,22 +44,47 @@ type PackageListInfo struct {
4344

4445
func init() {
4546
Register("RedHat", &RegisteredProvisioner{
46-
New: func(d drivers.Driver) Provisioner {
47-
return NewRedHatProvisioner("rhel", d)
48-
},
47+
New: NewRedHatProvisioner,
4948
})
5049
}
5150

52-
func NewRedHatProvisioner(osReleaseID string, d drivers.Driver) *RedHatProvisioner {
53-
systemdProvisioner := NewSystemdProvisioner(osReleaseID, d)
54-
systemdProvisioner.SSHCommander = RedHatSSHCommander{Driver: d}
51+
func NewRedHatProvisioner(d drivers.Driver) Provisioner {
5552
return &RedHatProvisioner{
56-
systemdProvisioner,
53+
GenericProvisioner: GenericProvisioner{
54+
DockerOptionsDir: "/etc/docker",
55+
DaemonOptionsFile: "/etc/systemd/system/docker.service",
56+
OsReleaseID: "rhel",
57+
Packages: []string{
58+
"curl",
59+
},
60+
Driver: d,
61+
},
5762
}
5863
}
5964

6065
type RedHatProvisioner struct {
61-
SystemdProvisioner
66+
GenericProvisioner
67+
}
68+
69+
func (provisioner *RedHatProvisioner) SSHCommand(args string) (string, error) {
70+
client, err := drivers.GetSSHClientFromDriver(provisioner.Driver)
71+
if err != nil {
72+
return "", err
73+
}
74+
75+
// redhat needs "-t" for tty allocation on ssh therefore we check for the
76+
// external client and add as needed.
77+
// Note: CentOS 7.0 needs multiple "-tt" to force tty allocation when ssh has
78+
// no local tty.
79+
switch c := client.(type) {
80+
case ssh.ExternalClient:
81+
c.BaseArgs = append(c.BaseArgs, "-tt")
82+
client = c
83+
case ssh.NativeClient:
84+
return c.OutputWithPty(args)
85+
}
86+
87+
return client.Output(args)
6288
}
6389

6490
func (provisioner *RedHatProvisioner) SetHostname(hostname string) error {
@@ -84,6 +110,31 @@ func (provisioner *RedHatProvisioner) SetHostname(hostname string) error {
84110
return nil
85111
}
86112

113+
func (provisioner *RedHatProvisioner) Service(name string, action serviceaction.ServiceAction) error {
114+
reloadDaemon := false
115+
switch action {
116+
case serviceaction.Start, serviceaction.Restart:
117+
reloadDaemon = true
118+
}
119+
120+
// systemd needs reloaded when config changes on disk; we cannot
121+
// be sure exactly when it changes from the provisioner so
122+
// we call a reload on every restart to be safe
123+
if reloadDaemon {
124+
if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil {
125+
return err
126+
}
127+
}
128+
129+
command := fmt.Sprintf("sudo systemctl %s %s", action.String(), name)
130+
131+
if _, err := provisioner.SSHCommand(command); err != nil {
132+
return err
133+
}
134+
135+
return nil
136+
}
137+
87138
func (provisioner *RedHatProvisioner) Package(name string, action pkgaction.PackageAction) error {
88139
var packageAction string
89140

0 commit comments

Comments
 (0)