From 21c479d5b3f25f84ca1b7dfe262e00cef6d108ed Mon Sep 17 00:00:00 2001 From: Zach Loafman Date: Tue, 18 Oct 2016 14:54:44 -0700 Subject: [PATCH] nodeup: Add docker.service dep to LoadImageTask Tested with manual build and NODEUP_URL Fixes #685, #686 --- .../nodeup/kubelet/services/kubelet.service | 1 + upup/pkg/fi/nodeup/nodetasks/load_image.go | 23 ++++++++++++-- upup/pkg/fi/nodeup/nodetasks/service.go | 31 ++++++++++--------- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/upup/models/nodeup/kubelet/services/kubelet.service b/upup/models/nodeup/kubelet/services/kubelet.service index c14a169a76..96a827dac7 100644 --- a/upup/models/nodeup/kubelet/services/kubelet.service +++ b/upup/models/nodeup/kubelet/services/kubelet.service @@ -1,6 +1,7 @@ [Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/kubernetes/kubernetes +After=docker.service [Service] EnvironmentFile=/etc/sysconfig/kubelet diff --git a/upup/pkg/fi/nodeup/nodetasks/load_image.go b/upup/pkg/fi/nodeup/nodetasks/load_image.go index 001b8cf073..92253cfc99 100644 --- a/upup/pkg/fi/nodeup/nodetasks/load_image.go +++ b/upup/pkg/fi/nodeup/nodetasks/load_image.go @@ -18,17 +18,20 @@ package nodetasks import ( "fmt" + "os/exec" + "path" + "strings" + "github.com/golang/glog" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/nodeup/cloudinit" "k8s.io/kops/upup/pkg/fi/nodeup/local" "k8s.io/kops/upup/pkg/fi/utils" "k8s.io/kops/util/pkg/hashing" - "os/exec" - "path" - "strings" ) +const dockerService = "docker.service" + // LoadImageTask is responsible for downloading a docker image type LoadImageTask struct { Source string @@ -36,6 +39,20 @@ type LoadImageTask struct { } var _ fi.Task = &LoadImageTask{} +var _ fi.HasDependencies = &LoadImageTask{} + +func (t *LoadImageTask) GetDependencies(tasks map[string]fi.Task) []fi.Task { + // LoadImageTask depends on the docker service to ensure we + // sideload images after docker is completely updated and + // configured. + var deps []fi.Task + for _, v := range tasks { + if svc, ok := v.(*Service); ok && svc.Name == dockerService { + deps = append(deps, v) + } + } + return deps +} func (t *LoadImageTask) String() string { return fmt.Sprintf("LoadImageTask: %s", t.Source) diff --git a/upup/pkg/fi/nodeup/nodetasks/service.go b/upup/pkg/fi/nodeup/nodetasks/service.go index 4bb995c4c4..bd4f387a7d 100644 --- a/upup/pkg/fi/nodeup/nodetasks/service.go +++ b/upup/pkg/fi/nodeup/nodetasks/service.go @@ -19,19 +19,18 @@ package nodetasks import ( "encoding/json" "fmt" - "github.com/golang/glog" "io/ioutil" + "os" + "os/exec" + "path" + "strings" + "time" + + "github.com/golang/glog" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/nodeup/cloudinit" "k8s.io/kops/upup/pkg/fi/nodeup/local" "k8s.io/kops/upup/pkg/fi/nodeup/tags" - "k8s.io/kops/upup/pkg/fi/utils" - "os" - "os/exec" - "path" - "reflect" - "strings" - "time" ) const ( @@ -60,15 +59,17 @@ var _ fi.HasDependencies = &Service{} func (p *Service) GetDependencies(tasks map[string]fi.Task) []fi.Task { var deps []fi.Task for _, v := range tasks { - // We assume that services depend on basically everything - typeName := utils.BuildTypeName(reflect.TypeOf(v)) - switch typeName { - case "*CopyAssetTask", "*File", "*Package", "*Sysctl", "*UpdatePackages", "*UserTask", "*Disk": + // We assume that services depend on everything except for + // LoadImageTask. If there are any LoadImageTasks (e.g. we're + // launching a custom Kubernetes build), they all depend on + // the "docker.service" Service task. + switch v.(type) { + case *File, *Package, *UpdatePackages, *UserTask, *MountDiskTask: deps = append(deps, v) - case "*Service": - // ignore + case *Service, *LoadImageTask: + // ignore default: - glog.Warningf("Unhandled type name in Service::GetDependencies: %q", typeName) + glog.Warningf("Unhandled type %t in Service::GetDependencies: %v", v, v) deps = append(deps, v) } }