X Tutup
Skip to content

Commit 8106da7

Browse files
committed
Refactoring of the SUSE/openSUSE provisioner
This provisioner is not relying on the bash script hosted at get.docker.com. Helps fixing issue #23480 Signed-off-by: Flavio Castelli <fcastelli@suse.com>
1 parent f0b7a99 commit 8106da7

File tree

1 file changed

+70
-116
lines changed

1 file changed

+70
-116
lines changed

libmachine/provision/suse.go

Lines changed: 70 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package provision
22

33
import (
4-
"bytes"
54
"fmt"
6-
"text/template"
5+
"strings"
76

87
"github.com/docker/machine/libmachine/auth"
98
"github.com/docker/machine/libmachine/drivers"
@@ -27,98 +26,52 @@ func init() {
2726
})
2827
}
2928

30-
func NewOpenSUSEProvisioner(d drivers.Driver) Provisioner {
29+
func NewSLEDProvisioner(d drivers.Driver) Provisioner {
3130
return &SUSEProvisioner{
32-
GenericProvisioner{
33-
SSHCommander: GenericSSHCommander{Driver: d},
34-
DockerOptionsDir: "/etc/docker",
35-
DaemonOptionsFile: "/etc/sysconfig/docker",
36-
OsReleaseID: "opensuse",
37-
Packages: []string{
38-
"curl",
39-
},
40-
Driver: d,
41-
},
31+
NewSystemdProvisioner("sled", d),
4232
}
4333
}
4434

45-
func NewSLEDProvisioner(d drivers.Driver) Provisioner {
35+
func NewSLESProvisioner(d drivers.Driver) Provisioner {
4636
return &SUSEProvisioner{
47-
GenericProvisioner{
48-
SSHCommander: GenericSSHCommander{Driver: d},
49-
DockerOptionsDir: "/etc/docker",
50-
DaemonOptionsFile: "/etc/sysconfig/docker",
51-
OsReleaseID: "sled",
52-
Packages: []string{
53-
"curl",
54-
},
55-
Driver: d,
56-
},
37+
NewSystemdProvisioner("sles", d),
5738
}
5839
}
5940

60-
func NewSLESProvisioner(d drivers.Driver) Provisioner {
41+
func NewOpenSUSEProvisioner(d drivers.Driver) Provisioner {
6142
return &SUSEProvisioner{
62-
GenericProvisioner{
63-
SSHCommander: GenericSSHCommander{Driver: d},
64-
DockerOptionsDir: "/etc/docker",
65-
DaemonOptionsFile: "/etc/sysconfig/docker",
66-
OsReleaseID: "sles",
67-
Packages: []string{
68-
"curl",
69-
},
70-
Driver: d,
71-
},
43+
NewSystemdProvisioner("openSUSE", d),
7244
}
7345
}
7446

7547
type SUSEProvisioner struct {
76-
GenericProvisioner
48+
SystemdProvisioner
7749
}
7850

79-
func (provisioner *SUSEProvisioner) String() string {
80-
return "suse"
51+
func (provisioner *SUSEProvisioner) CompatibleWithHost() bool {
52+
return strings.ToLower(provisioner.OsReleaseInfo.ID) == strings.ToLower(provisioner.OsReleaseID)
8153
}
8254

83-
func (provisioner *SUSEProvisioner) Service(name string, action serviceaction.ServiceAction) error {
84-
reloadDaemon := false
85-
switch action {
86-
case serviceaction.Start, serviceaction.Restart:
87-
reloadDaemon = true
88-
}
89-
90-
// systemd needs reloaded when config changes on disk; we cannot
91-
// be sure exactly when it changes from the provisioner so
92-
// we call a reload on every restart to be safe
93-
if reloadDaemon {
94-
if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil {
95-
return err
96-
}
97-
}
98-
99-
command := fmt.Sprintf("sudo systemctl %s %s", action.String(), name)
100-
101-
if _, err := provisioner.SSHCommand(command); err != nil {
102-
return err
103-
}
104-
105-
return nil
55+
func (provisioner *SUSEProvisioner) String() string {
56+
return "openSUSE"
10657
}
10758

10859
func (provisioner *SUSEProvisioner) Package(name string, action pkgaction.PackageAction) error {
10960
var packageAction string
11061

11162
switch action {
11263
case pkgaction.Install:
113-
packageAction = "install"
64+
packageAction = "in"
11465
case pkgaction.Remove:
115-
packageAction = "remove"
66+
packageAction = "rm"
11667
case pkgaction.Upgrade:
117-
packageAction = "upgrade"
68+
packageAction = "up"
11869
}
11970

12071
command := fmt.Sprintf("sudo -E zypper -n %s %s", packageAction, name)
12172

73+
log.Debugf("zypper: action=%s name=%s", action.String(), name)
74+
12275
if _, err := provisioner.SSHCommand(command); err != nil {
12376
return err
12477
}
@@ -145,96 +98,97 @@ func (provisioner *SUSEProvisioner) Provision(swarmOptions swarm.Options, authOp
14598
provisioner.EngineOptions = engineOptions
14699
swarmOptions.Env = engineOptions.Env
147100

101+
// figure out the filesytem used by /var/lib
102+
fs, err := provisioner.SSHCommand("stat -f -c %T /var/lib/")
103+
if err != nil {
104+
return err
105+
}
106+
graphDriver := "overlay"
107+
if strings.Contains(fs, "btrfs") {
108+
graphDriver = "btrfs"
109+
}
110+
111+
storageDriver, err := decideStorageDriver(provisioner, graphDriver, engineOptions.StorageDriver)
112+
if err != nil {
113+
return err
114+
}
115+
provisioner.EngineOptions.StorageDriver = storageDriver
116+
117+
log.Debug("Setting hostname")
148118
if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil {
149119
return err
150120
}
151121

122+
if strings.ToLower(provisioner.OsReleaseInfo.ID) != "opensuse" {
123+
// This is a SLE machine, enable the containers module to have access
124+
// to the docker packages
125+
if _, err := provisioner.SSHCommand("sudo -E SUSEConnect -p sle-module-containers/12/x86_64 -r ''"); err != nil {
126+
return fmt.Errorf(
127+
"Error while adding the 'containers' module, make sure this machine is registered either against SUSE Customer Center (SCC) or to a local Subscription Management Tool (SMT): %v",
128+
err)
129+
}
130+
}
131+
132+
log.Debug("Installing base packages")
152133
for _, pkg := range provisioner.Packages {
153134
if err := provisioner.Package(pkg, pkgaction.Install); err != nil {
154135
return err
155136
}
156137
}
157138

158-
// update OS -- this is needed for libdevicemapper and the docker install
159-
if _, err := provisioner.SSHCommand("sudo zypper ref"); err != nil {
160-
return err
161-
}
162-
if _, err := provisioner.SSHCommand("sudo zypper -n update"); err != nil {
139+
log.Debug("Installing docker")
140+
if err := provisioner.Package("docker", pkgaction.Install); err != nil {
163141
return err
164142
}
165143

166-
if err := installDockerGeneric(provisioner, engineOptions.InstallURL); err != nil {
144+
// create symlinks for containerd, containerd-shim and runc.
145+
// We have to do that because machine overrides the openSUSE systemd
146+
// unit of docker
147+
if _, err := provisioner.SSHCommand("sudo -E ln -s /usr/sbin/runc /usr/sbin/docker-runc"); err != nil {
167148
return err
168149
}
169-
170-
if _, err := provisioner.SSHCommand("sudo systemctl start docker"); err != nil {
150+
if _, err := provisioner.SSHCommand("sudo -E ln -s /usr/sbin/containerd /usr/sbin/docker-containerd"); err != nil {
171151
return err
172152
}
173-
174-
if err := mcnutils.WaitFor(provisioner.dockerDaemonResponding); err != nil {
153+
if _, err := provisioner.SSHCommand("sudo -E ln -s /usr/sbin/containerd-shim /usr/sbin/docker-containerd-shim"); err != nil {
175154
return err
176155
}
177156

178-
if _, err := provisioner.SSHCommand("sudo systemctl stop docker"); err != nil {
179-
return err
157+
// Is yast2 firewall installed?
158+
if _, installed := provisioner.SSHCommand("rpm -q yast2-firewall"); installed == nil {
159+
// Open the firewall port required by docker
160+
if _, err := provisioner.SSHCommand("sudo -E /sbin/yast2 firewall services add ipprotocol=tcp tcpport=2376 zone=EXT"); err != nil {
161+
return err
162+
}
180163
}
181164

182-
// open firewall port required by docker
183-
if _, err := provisioner.SSHCommand("sudo /sbin/yast2 firewall services add ipprotocol=tcp tcpport=2376 zone=EXT"); err != nil {
165+
log.Debug("Starting systemd docker service")
166+
if err := provisioner.Service("docker", serviceaction.Start); err != nil {
184167
return err
185168
}
186169

187-
if err := makeDockerOptionsDir(provisioner); err != nil {
170+
log.Debug("Waiting for docker daemon")
171+
if err := mcnutils.WaitFor(provisioner.dockerDaemonResponding); err != nil {
188172
return err
189173
}
190174

191175
provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
192176

177+
log.Debug("Configuring auth")
193178
if err := ConfigureAuth(provisioner); err != nil {
194179
return err
195180
}
196181

182+
log.Debug("Configuring swarm")
197183
if err := configureSwarm(provisioner, swarmOptions, provisioner.AuthOptions); err != nil {
198184
return err
199185
}
200186

201-
return nil
202-
}
203-
204-
func (provisioner *SUSEProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) {
205-
var (
206-
engineCfg bytes.Buffer
207-
configPath = provisioner.DaemonOptionsFile
208-
)
209-
210-
// remove existing
211-
if _, err := provisioner.SSHCommand(fmt.Sprintf("sudo rm %s", configPath)); err != nil {
212-
return nil, err
213-
}
214-
215-
driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName())
216-
provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel)
217-
218-
engineConfigTmpl := `# File automatically generated by docker-machine
219-
DOCKER_OPTS=' -H tcp://0.0.0.0:{{.DockerPort}} {{ if .EngineOptions.StorageDriver }} --storage-driver {{.EngineOptions.StorageDriver}} {{ end }} --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 }}'
220-
`
221-
t, err := template.New("engineConfig").Parse(engineConfigTmpl)
222-
if err != nil {
223-
return nil, err
224-
}
225-
226-
engineConfigContext := EngineConfigContext{
227-
DockerPort: dockerPort,
228-
AuthOptions: provisioner.AuthOptions,
229-
EngineOptions: provisioner.EngineOptions,
230-
DockerOptionsDir: provisioner.DockerOptionsDir,
187+
// enable in systemd
188+
log.Debug("Enabling docker in systemd")
189+
if err := provisioner.Service("docker", serviceaction.Enable); err != nil {
190+
return err
231191
}
232192

233-
t.Execute(&engineCfg, engineConfigContext)
234-
235-
daemonOptsDir := configPath
236-
return &DockerOptions{
237-
EngineOptions: engineCfg.String(),
238-
EngineOptionsPath: daemonOptsDir,
239-
}, nil
193+
return nil
240194
}

0 commit comments

Comments
 (0)
X Tutup