Skip to content

Commit 7845b23

Browse files
authored
Merge pull request #7115 from tstromberg/better-provision
provisioner: only reload docker if necessary, don't install curl
2 parents 5c1af0c + ff9c4fd commit 7845b23

File tree

4 files changed

+61
-75
lines changed

4 files changed

+61
-75
lines changed

pkg/minikube/machine/client.go

+1
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ func (api *LocalClient) Create(h *host.Host) error {
172172
return fmt.Errorf("driver %q does not exist", h.DriverName)
173173
}
174174
if def.Init == nil {
175+
// NOTE: This will call provision.DetectProvisioner
175176
return api.legacyClient.Create(h)
176177
}
177178

pkg/provision/buildroot.go

+13-34
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,16 @@ package provision
1919
import (
2020
"bytes"
2121
"fmt"
22-
"path"
2322
"text/template"
2423
"time"
2524

2625
"github.com/docker/machine/libmachine/auth"
2726
"github.com/docker/machine/libmachine/drivers"
2827
"github.com/docker/machine/libmachine/engine"
29-
"github.com/docker/machine/libmachine/log"
3028
"github.com/docker/machine/libmachine/provision"
3129
"github.com/docker/machine/libmachine/provision/pkgaction"
32-
"github.com/docker/machine/libmachine/provision/serviceaction"
3330
"github.com/docker/machine/libmachine/swarm"
31+
"github.com/golang/glog"
3432
"k8s.io/minikube/pkg/util/retry"
3533
)
3634

@@ -42,7 +40,7 @@ type BuildrootProvisioner struct {
4240
// NewBuildrootProvisioner creates a new BuildrootProvisioner
4341
func NewBuildrootProvisioner(d drivers.Driver) provision.Provisioner {
4442
return &BuildrootProvisioner{
45-
provision.NewSystemdProvisioner("buildroot", d),
43+
NewSystemdProvisioner("buildroot", d),
4644
}
4745
}
4846

@@ -65,7 +63,7 @@ func (p *BuildrootProvisioner) GenerateDockerOptions(dockerPort int) (*provision
6563
noPivot := true
6664
// Using pivot_root is not supported on fstype rootfs
6765
if fstype, err := rootFileSystemType(p); err == nil {
68-
log.Debugf("root file system type: %s", fstype)
66+
glog.Infof("root file system type: %s", fstype)
6967
noPivot = fstype == "rootfs"
7068
}
7169

@@ -79,7 +77,7 @@ Requires= minikube-automount.service docker.socket
7977
Type=notify
8078
`
8179
if noPivot {
82-
log.Warn("Using fundamentally insecure --no-pivot option")
80+
glog.Warning("Using fundamentally insecure --no-pivot option")
8381
engineConfigTmpl += `
8482
# DOCKER_RAMDISK disables pivot_root in Docker, using MS_MOVE instead.
8583
Environment=DOCKER_RAMDISK=yes
@@ -140,30 +138,11 @@ WantedBy=multi-user.target
140138
return nil, err
141139
}
142140

143-
dockerCfg := &provision.DockerOptions{
141+
do := &provision.DockerOptions{
144142
EngineOptions: engineCfg.String(),
145143
EngineOptionsPath: "/lib/systemd/system/docker.service",
146144
}
147-
148-
log.Info("Setting Docker configuration on the remote daemon...")
149-
150-
if _, err = p.SSHCommand(fmt.Sprintf("sudo mkdir -p %s && printf %%s \"%s\" | sudo tee %s", path.Dir(dockerCfg.EngineOptionsPath), dockerCfg.EngineOptions, dockerCfg.EngineOptionsPath)); err != nil {
151-
return nil, err
152-
}
153-
154-
// To make sure if there is a already-installed docker on the ISO to pick up the new systemd file
155-
if err := p.Service("", serviceaction.DaemonReload); err != nil {
156-
return nil, err
157-
}
158-
159-
if err := p.Service("docker", serviceaction.Enable); err != nil {
160-
return nil, err
161-
}
162-
163-
if err := p.Service("docker", serviceaction.Restart); err != nil {
164-
return nil, err
165-
}
166-
return dockerCfg, nil
145+
return do, updateUnit(p, "docker", do.EngineOptions, do.EngineOptionsPath)
167146
}
168147

169148
// Package installs a package
@@ -177,32 +156,32 @@ func (p *BuildrootProvisioner) Provision(swarmOptions swarm.Options, authOptions
177156
p.AuthOptions = authOptions
178157
p.EngineOptions = engineOptions
179158

180-
log.Infof("provisioning hostname %q", p.Driver.GetMachineName())
159+
glog.Infof("provisioning hostname %q", p.Driver.GetMachineName())
181160
if err := p.SetHostname(p.Driver.GetMachineName()); err != nil {
182161
return err
183162
}
184163

185164
p.AuthOptions = setRemoteAuthOptions(p)
186-
log.Debugf("set auth options %+v", p.AuthOptions)
165+
glog.Infof("set auth options %+v", p.AuthOptions)
187166

188-
log.Debugf("setting up certificates")
167+
glog.Infof("setting up certificates")
189168
configAuth := func() error {
190169
if err := configureAuth(p); err != nil {
191-
log.Warnf("configureAuth failed: %v", err)
170+
glog.Warningf("configureAuth failed: %v", err)
192171
return &retry.RetriableError{Err: err}
193172
}
194173
return nil
195174
}
196175

197176
err := retry.Expo(configAuth, time.Second, 2*time.Minute)
198177
if err != nil {
199-
log.Debugf("Error configuring auth during provisioning %v", err)
178+
glog.Infof("Error configuring auth during provisioning %v", err)
200179
return err
201180
}
202181

203-
log.Debugf("setting minikube options for container-runtime")
182+
glog.Infof("setting minikube options for container-runtime")
204183
if err := setContainerRuntimeOptions(p.Driver.GetMachineName(), p); err != nil {
205-
log.Debugf("Error setting container-runtime options during provisioning %v", err)
184+
glog.Infof("Error setting container-runtime options during provisioning %v", err)
206185
return err
207186
}
208187

pkg/provision/provision.go

+33-7
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ import (
3131
"github.com/docker/machine/libmachine/cert"
3232
"github.com/docker/machine/libmachine/drivers"
3333
"github.com/docker/machine/libmachine/engine"
34-
"github.com/docker/machine/libmachine/log"
3534
"github.com/docker/machine/libmachine/mcnutils"
3635
"github.com/docker/machine/libmachine/provision"
3736
"github.com/docker/machine/libmachine/swarm"
37+
"github.com/golang/glog"
3838
"github.com/pkg/errors"
3939
"k8s.io/minikube/pkg/minikube/assets"
4040
"k8s.io/minikube/pkg/minikube/command"
@@ -66,11 +66,24 @@ func init() {
6666

6767
}
6868

69+
// NewSystemdProvisioner is our fork of the same name in the upstream provision library, without the packages
70+
func NewSystemdProvisioner(osReleaseID string, d drivers.Driver) provision.SystemdProvisioner {
71+
return provision.SystemdProvisioner{
72+
GenericProvisioner: provision.GenericProvisioner{
73+
SSHCommander: provision.GenericSSHCommander{Driver: d},
74+
DockerOptionsDir: "/etc/docker",
75+
DaemonOptionsFile: "/etc/systemd/system/docker.service.d/10-machine.conf",
76+
OsReleaseID: osReleaseID,
77+
Driver: d,
78+
},
79+
}
80+
}
81+
6982
func configureAuth(p miniProvisioner) error {
70-
log.Infof("configureAuth start")
83+
glog.Infof("configureAuth start")
7184
start := time.Now()
7285
defer func() {
73-
log.Infof("configureAuth took %s", time.Since(start))
86+
glog.Infof("configureAuth took %s", time.Since(start))
7487
}()
7588

7689
driver := p.GetDriver()
@@ -90,7 +103,7 @@ func configureAuth(p miniProvisioner) error {
90103

91104
// The Host IP is always added to the certificate's SANs list
92105
hosts := append(authOptions.ServerCertSANs, ip, "localhost", "127.0.0.1")
93-
log.Debugf("generating server cert: %s ca-key=%s private-key=%s org=%s san=%s",
106+
glog.Infof("generating server cert: %s ca-key=%s private-key=%s org=%s san=%s",
94107
authOptions.ServerCertPath,
95108
authOptions.CaCertPath,
96109
authOptions.CaPrivateKeyPath,
@@ -116,11 +129,11 @@ func configureAuth(p miniProvisioner) error {
116129
}
117130

118131
func copyHostCerts(authOptions auth.Options) error {
119-
log.Infof("copyHostCerts")
132+
glog.Infof("copyHostCerts")
120133

121134
err := os.MkdirAll(authOptions.StorePath, 0700)
122135
if err != nil {
123-
log.Errorf("mkdir failed: %v", err)
136+
glog.Errorf("mkdir failed: %v", err)
124137
}
125138

126139
hostCerts := map[string]string{
@@ -144,7 +157,7 @@ func copyHostCerts(authOptions auth.Options) error {
144157
}
145158

146159
func copyRemoteCerts(authOptions auth.Options, driver drivers.Driver) error {
147-
log.Infof("copyRemoteCerts")
160+
glog.Infof("copyRemoteCerts")
148161

149162
remoteCerts := map[string]string{
150163
authOptions.CaCertPath: authOptions.CaCertRemotePath,
@@ -276,3 +289,16 @@ func concatStrings(src []string, prefix string, postfix string) []string {
276289
}
277290
return ret
278291
}
292+
293+
// updateUnit efficiently updates a systemd unit file
294+
func updateUnit(p provision.SSHCommander, name string, content string, dst string) error {
295+
glog.Infof("Updating %s unit: %s ...", name, dst)
296+
297+
if _, err := p.SSHCommand(fmt.Sprintf("sudo mkdir -p %s && printf %%s \"%s\" | sudo tee %s.new", path.Dir(dst), content, dst)); err != nil {
298+
return err
299+
}
300+
if _, err := p.SSHCommand(fmt.Sprintf("sudo diff -u %s %s.new || { sudo mv %s.new %s; sudo systemctl -f daemon-reload && sudo sudo systemctl -f restart %s; }", dst, dst, dst, dst, name)); err != nil {
301+
return err
302+
}
303+
return nil
304+
}

pkg/provision/ubuntu.go

+14-34
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,16 @@ package provision
1919
import (
2020
"bytes"
2121
"fmt"
22-
"path"
2322
"text/template"
2423
"time"
2524

2625
"github.com/docker/machine/libmachine/auth"
2726
"github.com/docker/machine/libmachine/drivers"
2827
"github.com/docker/machine/libmachine/engine"
29-
"github.com/docker/machine/libmachine/log"
3028
"github.com/docker/machine/libmachine/provision"
3129
"github.com/docker/machine/libmachine/provision/pkgaction"
32-
"github.com/docker/machine/libmachine/provision/serviceaction"
3330
"github.com/docker/machine/libmachine/swarm"
31+
"github.com/golang/glog"
3432
"k8s.io/minikube/pkg/util/retry"
3533
)
3634

@@ -43,7 +41,7 @@ type UbuntuProvisioner struct {
4341
func NewUbuntuProvisioner(d drivers.Driver) provision.Provisioner {
4442
return &UbuntuProvisioner{
4543
BuildrootProvisioner{
46-
provision.NewSystemdProvisioner("ubuntu", d),
44+
NewSystemdProvisioner("ubuntu", d),
4745
},
4846
}
4947
}
@@ -67,7 +65,7 @@ func (p *UbuntuProvisioner) GenerateDockerOptions(dockerPort int) (*provision.Do
6765
noPivot := true
6866
// Using pivot_root is not supported on fstype rootfs
6967
if fstype, err := rootFileSystemType(p); err == nil {
70-
log.Debugf("root file system type: %s", fstype)
68+
glog.Infof("root file system type: %s", fstype)
7169
noPivot = fstype == "rootfs"
7270
}
7371

@@ -83,7 +81,7 @@ Requires=docker.socket
8381
Type=notify
8482
`
8583
if noPivot {
86-
log.Warn("Using fundamentally insecure --no-pivot option")
84+
glog.Warning("Using fundamentally insecure --no-pivot option")
8785
engineConfigTmpl += `
8886
# DOCKER_RAMDISK disables pivot_root in Docker, using MS_MOVE instead.
8987
Environment=DOCKER_RAMDISK=yes
@@ -144,30 +142,11 @@ WantedBy=multi-user.target
144142
return nil, err
145143
}
146144

147-
dockerCfg := &provision.DockerOptions{
145+
do := &provision.DockerOptions{
148146
EngineOptions: engineCfg.String(),
149147
EngineOptionsPath: "/lib/systemd/system/docker.service",
150148
}
151-
152-
log.Info("Setting Docker configuration on the remote daemon...")
153-
154-
if _, err = p.SSHCommand(fmt.Sprintf("sudo mkdir -p %s && printf %%s \"%s\" | sudo tee %s", path.Dir(dockerCfg.EngineOptionsPath), dockerCfg.EngineOptions, dockerCfg.EngineOptionsPath)); err != nil {
155-
return nil, err
156-
}
157-
158-
// because in kic base image we pre-install docker it already has a service file. we need to daemon-reload for the new systemd file
159-
if err := p.Service("", serviceaction.DaemonReload); err != nil {
160-
return nil, err
161-
}
162-
163-
if err := p.Service("docker", serviceaction.Enable); err != nil {
164-
return nil, err
165-
}
166-
167-
if err := p.Service("docker", serviceaction.Restart); err != nil {
168-
return nil, err
169-
}
170-
return dockerCfg, nil
149+
return do, updateUnit(p, "docker", do.EngineOptions, do.EngineOptionsPath)
171150
}
172151

173152
// Package installs a package
@@ -181,32 +160,33 @@ func (p *UbuntuProvisioner) Provision(swarmOptions swarm.Options, authOptions au
181160
p.AuthOptions = authOptions
182161
p.EngineOptions = engineOptions
183162

184-
log.Infof("provisioning hostname %q", p.Driver.GetMachineName())
163+
glog.Infof("provisioning hostname %q", p.Driver.GetMachineName())
185164
if err := p.SetHostname(p.Driver.GetMachineName()); err != nil {
186165
return err
187166
}
188167

189168
p.AuthOptions = setRemoteAuthOptions(p)
190-
log.Debugf("set auth options %+v", p.AuthOptions)
169+
glog.Infof("set auth options %+v", p.AuthOptions)
191170

192-
log.Debugf("setting up certificates")
171+
glog.Infof("setting up certificates")
193172
configAuth := func() error {
194173
if err := configureAuth(p); err != nil {
195-
log.Warnf("configureAuth failed: %v", err)
174+
glog.Warningf("configureAuth failed: %v", err)
196175
return &retry.RetriableError{Err: err}
197176
}
198177
return nil
199178
}
200179

201180
err := retry.Expo(configAuth, time.Second, 2*time.Minute)
181+
202182
if err != nil {
203-
log.Debugf("Error configuring auth during provisioning %v", err)
183+
glog.Infof("Error configuring auth during provisioning %v", err)
204184
return err
205185
}
206186

207-
log.Debugf("setting minikube options for container-runtime")
187+
glog.Infof("setting minikube options for container-runtime")
208188
if err := setContainerRuntimeOptions(p.Driver.GetMachineName(), p); err != nil {
209-
log.Debugf("Error setting container-runtime options during provisioning %v", err)
189+
glog.Infof("Error setting container-runtime options during provisioning %v", err)
210190
return err
211191
}
212192

0 commit comments

Comments
 (0)