From 487dc33b7edfe6c9ac94fc8764170490312c8f85 Mon Sep 17 00:00:00 2001 From: Louis Munro Date: Thu, 22 Mar 2018 09:41:58 -0400 Subject: [PATCH] Adds an AfterFiles field to nodetasks.File and makes sure CoreOS uses it --- nodeup/pkg/model/docker.go | 7 +-- upup/pkg/fi/nodeup/nodetasks/BUILD.bazel | 1 + upup/pkg/fi/nodeup/nodetasks/file.go | 12 +++++ upup/pkg/fi/nodeup/nodetasks/file_test.go | 63 +++++++++++++++++++++++ 4 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 upup/pkg/fi/nodeup/nodetasks/file_test.go diff --git a/nodeup/pkg/model/docker.go b/nodeup/pkg/model/docker.go index ff484667ca..203167d9a3 100644 --- a/nodeup/pkg/model/docker.go +++ b/nodeup/pkg/model/docker.go @@ -718,9 +718,10 @@ func (b *DockerBuilder) buildContainerOSConfigurationDropIn(c *fi.ModelBuilderCo contents := strings.Join(lines, "\n") c.AddTask(&nodetasks.File{ - Path: "/etc/systemd/system/docker.service.d/10-kops.conf", - Contents: fi.NewStringResource(contents), - Type: nodetasks.FileType_File, + AfterFiles: []string{"/etc/sysconfig/docker"}, + Path: "/etc/systemd/system/docker.service.d/10-kops.conf", + Contents: fi.NewStringResource(contents), + Type: nodetasks.FileType_File, OnChangeExecute: [][]string{ {"systemctl", "daemon-reload"}, {"systemctl", "restart", "docker.service"}, diff --git a/upup/pkg/fi/nodeup/nodetasks/BUILD.bazel b/upup/pkg/fi/nodeup/nodetasks/BUILD.bazel index 4173656b23..99b275f9b0 100644 --- a/upup/pkg/fi/nodeup/nodetasks/BUILD.bazel +++ b/upup/pkg/fi/nodeup/nodetasks/BUILD.bazel @@ -35,6 +35,7 @@ go_test( srcs = [ "archive_test.go", "bindmount_test.go", + "file_test.go", "loadimage_test.go", "service_test.go", ], diff --git a/upup/pkg/fi/nodeup/nodetasks/file.go b/upup/pkg/fi/nodeup/nodetasks/file.go index e27a02cf19..fee47d8b07 100644 --- a/upup/pkg/fi/nodeup/nodetasks/file.go +++ b/upup/pkg/fi/nodeup/nodetasks/file.go @@ -38,6 +38,7 @@ const FileType_Directory = "directory" const FileType_File = "file" type File struct { + AfterFiles []string `json:"afterfiles,omitempty"` Contents fi.Resource `json:"contents,omitempty"` Group *string `json:"group,omitempty"` IfNotExists bool `json:"ifNotExists,omitempty"` @@ -103,6 +104,17 @@ func (e *File) GetDependencies(tasks map[string]fi.Task) []fi.Task { deps = append(deps, v) } + // Requires other files to be created first + for _, f := range e.AfterFiles { + for _, v := range tasks { + if file, ok := v.(*File); ok { + if file.Path == f { + deps = append(deps, v) + } + } + } + } + return deps } diff --git a/upup/pkg/fi/nodeup/nodetasks/file_test.go b/upup/pkg/fi/nodeup/nodetasks/file_test.go new file mode 100644 index 0000000000..deee1867e6 --- /dev/null +++ b/upup/pkg/fi/nodeup/nodetasks/file_test.go @@ -0,0 +1,63 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nodetasks + +import ( + "testing" + + "k8s.io/kops/upup/pkg/fi" +) + +func TestFileDependencies(t *testing.T) { + parentFileName := "/dependedon" + childFileName := "/dependant" + + grid := []struct { + parent fi.Task + child fi.Task + }{ + { + parent: &File{ + Path: parentFileName, + Contents: fi.NewStringResource("I am depended on by " + childFileName), + Type: FileType_File, + }, + child: &File{ + AfterFiles: []string{parentFileName}, + Path: childFileName, + Contents: fi.NewStringResource("I depend on " + parentFileName), + Type: FileType_File, + }, + }, + } + + for _, g := range grid { + allTasks := make(map[string]fi.Task) + allTasks["parent"] = g.parent + allTasks["child"] = g.child + + deps := g.parent.(fi.HasDependencies).GetDependencies(allTasks) + if len(deps) != 0 { + t.Errorf("found unexpected dependencies for parent: %v %v", g.parent, deps) + } + + childDeps := g.child.(fi.HasDependencies).GetDependencies(allTasks) + if len(childDeps) != 1 { + t.Errorf("found unexpected dependencies for child: %v %v", g.child, childDeps) + } + } +}