11package provision
22
33import (
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
7547type 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
10859func (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