From 87446f88940e7ed0d81e60128a56f0984b5c9a5c Mon Sep 17 00:00:00 2001 From: John Gardiner Myers Date: Fri, 26 Jun 2020 09:42:31 -0700 Subject: [PATCH] Make all users of userdata declare it as a dependency --- pkg/model/openstackmodel/servergroup.go | 13 +-- pkg/model/openstackmodel/servergroup_test.go | 91 ++++++++++--------- .../cloudup/alitasks/launchconfiguration.go | 6 ++ .../cloudup/awstasks/launchconfiguration.go | 6 +- .../awstasks/launchconfiguration_test.go | 1 + upup/pkg/fi/cloudup/dotasks/droplet.go | 6 ++ .../fi/cloudup/gcetasks/instancetemplate.go | 10 ++ .../pkg/fi/cloudup/openstacktasks/instance.go | 15 ++- .../fi/cloudup/spotinsttasks/elastigroup.go | 8 +- .../fi/cloudup/spotinsttasks/launch_spec.go | 8 +- upup/pkg/fi/cloudup/spotinsttasks/ocean.go | 8 +- 11 files changed, 109 insertions(+), 63 deletions(-) diff --git a/pkg/model/openstackmodel/servergroup.go b/pkg/model/openstackmodel/servergroup.go index 65047f1953..2f2743c0bd 100644 --- a/pkg/model/openstackmodel/servergroup.go +++ b/pkg/model/openstackmodel/servergroup.go @@ -50,7 +50,6 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg * clusterTag := "KubernetesCluster:" + strings.Replace(b.ClusterName(), ".", "-", -1) - var igUserData *string igMeta := make(map[string]string) if ig.Spec.Role != kops.InstanceGroupRoleBastion { @@ -81,14 +80,6 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg * if err != nil { return fmt.Errorf("could not create startup script for instance group %s: %v", ig.Name, err) } - if startupScript != nil { - // var userData bytes.Buffer - startupStr, err := startupScript.AsString() - if err != nil { - return fmt.Errorf("could not create startup script for instance group %s: %v", ig.Name, err) - } - igUserData = fi.String(startupStr) - } var securityGroups []*openstacktasks.SecurityGroup securityGroupName := b.SecurityGroupName(ig.Spec.Role) @@ -149,13 +140,11 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg * Tags: []string{clusterTag}, Role: fi.String(string(ig.Spec.Role)), Port: portTask, + UserData: startupScript, Metadata: igMeta, SecurityGroups: ig.Spec.AdditionalSecurityGroups, AvailabilityZone: az, } - if igUserData != nil { - instanceTask.UserData = igUserData - } c.AddTask(instanceTask) // Associate a floating IP to the master and bastion always if we have external network in router diff --git a/pkg/model/openstackmodel/servergroup_test.go b/pkg/model/openstackmodel/servergroup_test.go index 45da8c1267..599dabaaed 100644 --- a/pkg/model/openstackmodel/servergroup_test.go +++ b/pkg/model/openstackmodel/servergroup_test.go @@ -126,7 +126,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -172,7 +172,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -311,7 +311,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -357,7 +357,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -398,7 +398,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Bastion"), Port: bastionPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[2])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[2]), Metadata: map[string]string{ "k8s": "cluster", "KopsInstanceGroup": "bastion", @@ -578,7 +578,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -625,7 +625,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -672,7 +672,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -718,7 +718,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -764,7 +764,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -810,7 +810,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1007,7 +1007,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1048,7 +1048,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1089,7 +1089,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1130,7 +1130,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1176,7 +1176,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1222,7 +1222,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1463,7 +1463,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1505,7 +1505,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1547,7 +1547,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1588,7 +1588,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1629,7 +1629,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1670,7 +1670,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1813,7 +1813,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1852,7 +1852,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1891,7 +1891,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1937,7 +1937,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeAPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -1975,7 +1975,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeBPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2013,7 +2013,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodeCPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2141,7 +2141,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2182,7 +2182,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2317,7 +2317,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Master"), Port: masterPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2358,7 +2358,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[1])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[1]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2399,7 +2399,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Bastion"), Port: bastionPort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[2])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[2]), Metadata: map[string]string{ "k8s": "cluster", "KopsInstanceGroup": "bastion", @@ -2495,7 +2495,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2591,7 +2591,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -2685,7 +2685,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { Tags: []string{"KubernetesCluster:cluster"}, Role: s("Node"), Port: nodePort, - UserData: s(mustUserdataForClusterInstance(cluster, instanceGroups[0])), + UserData: mustUserdataForClusterInstance(cluster, instanceGroups[0]), Metadata: map[string]string{ "KubernetesCluster": "cluster", "k8s": "cluster", @@ -3099,18 +3099,25 @@ func compareStrings(t *testing.T, name string, actual, expected *string) { } } -func compareUserData(t *testing.T, actual, expected *string) { +func compareUserData(t *testing.T, actual, expected *fi.ResourceHolder) { t.Helper() if pointersAreBothNil(t, "UserData", actual, expected) { return } if !reflect.DeepEqual(actual, expected) { var a, e string + var err error if actual != nil { - a = *actual + a, err = actual.AsString() + if err != nil { + t.Errorf("error getting actual: %v", err) + } } if expected != nil { - e = *expected + e, err = expected.AsString() + if err != nil { + t.Errorf("error getting actual: %v", err) + } } aLines := strings.Split(a, "\n") eLines := strings.Split(e, "\n") @@ -3186,7 +3193,7 @@ func (n *nodeupConfigBuilder) BuildConfig(ig *kops.InstanceGroup) (*nodeup.Confi return &nodeup.Config{}, nil } -func mustUserdataForClusterInstance(cluster *kops.Cluster, ig *kops.InstanceGroup) string { +func mustUserdataForClusterInstance(cluster *kops.Cluster, ig *kops.InstanceGroup) *fi.ResourceHolder { bootstrapScriptBuilder := &model.BootstrapScript{ NodeUpConfigBuilder: &nodeupConfigBuilder{}, NodeUpSource: map[architectures.Architecture]string{ @@ -3206,5 +3213,5 @@ func mustUserdataForClusterInstance(cluster *kops.Cluster, ig *kops.InstanceGrou if err != nil { panic(fmt.Errorf("error converting userdata to string: %v", err)) } - return userdata + return fi.WrapResource(fi.NewStringResource(userdata)) } diff --git a/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go b/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go index a93cc8bc54..6b8d51f2e5 100644 --- a/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go +++ b/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go @@ -72,12 +72,18 @@ type LaunchConfiguration struct { Tags map[string]string } +var _ fi.Task = &LaunchConfiguration{} var _ fi.CompareWithID = &LaunchConfiguration{} +var _ fi.HasDependencies = &LaunchConfiguration{} func (l *LaunchConfiguration) CompareWithID() *string { return l.ID } +func (l *LaunchConfiguration) GetDependencies(tasks map[string]fi.Task) []fi.Task { + return l.UserData.GetDependencies(tasks) +} + func (l *LaunchConfiguration) Find(c *fi.Context) (*LaunchConfiguration, error) { if l.ScalingGroup == nil || l.ScalingGroup.ScalingGroupId == nil { klog.V(4).Infof("ScalingGroup / ScalingGroupId not found for %s, skipping Find", fi.StringValue(l.Name)) diff --git a/upup/pkg/fi/cloudup/awstasks/launchconfiguration.go b/upup/pkg/fi/cloudup/awstasks/launchconfiguration.go index f47bf832b3..0ae476d35c 100644 --- a/upup/pkg/fi/cloudup/awstasks/launchconfiguration.go +++ b/upup/pkg/fi/cloudup/awstasks/launchconfiguration.go @@ -94,13 +94,17 @@ type LaunchConfiguration struct { } var _ fi.CompareWithID = &LaunchConfiguration{} - +var _ fi.HasDependencies = &LaunchConfiguration{} var _ fi.ProducesDeletions = &LaunchConfiguration{} func (e *LaunchConfiguration) CompareWithID() *string { return e.ID } +func (l *LaunchConfiguration) GetDependencies(tasks map[string]fi.Task) []fi.Task { + return l.UserData.GetDependencies(tasks) +} + // findLaunchConfigurations returns matching LaunchConfigurations, sorted by CreatedTime (ascending) func (e *LaunchConfiguration) findLaunchConfigurations(c *fi.Context) ([]*autoscaling.LaunchConfiguration, error) { cloud := c.Cloud.(awsup.AWSCloud) diff --git a/upup/pkg/fi/cloudup/awstasks/launchconfiguration_test.go b/upup/pkg/fi/cloudup/awstasks/launchconfiguration_test.go index d7b8d38511..55afc24768 100644 --- a/upup/pkg/fi/cloudup/awstasks/launchconfiguration_test.go +++ b/upup/pkg/fi/cloudup/awstasks/launchconfiguration_test.go @@ -53,6 +53,7 @@ func TestLaunchConfigurationGarbageCollection(t *testing.T) { ImageID: s("ami-12345678"), InstanceType: s("m3.medium"), SecurityGroups: []*SecurityGroup{}, + UserData: fi.WrapResource(fi.NewStringResource("")), } return map[string]fi.Task{ diff --git a/upup/pkg/fi/cloudup/dotasks/droplet.go b/upup/pkg/fi/cloudup/dotasks/droplet.go index 63cc330507..b67b083355 100644 --- a/upup/pkg/fi/cloudup/dotasks/droplet.go +++ b/upup/pkg/fi/cloudup/dotasks/droplet.go @@ -45,12 +45,18 @@ type Droplet struct { UserData *fi.ResourceHolder } +var _ fi.Task = &Droplet{} var _ fi.CompareWithID = &Droplet{} +var _ fi.HasDependencies = &Droplet{} func (d *Droplet) CompareWithID() *string { return d.Name } +func (l *Droplet) GetDependencies(tasks map[string]fi.Task) []fi.Task { + return l.UserData.GetDependencies(tasks) +} + func (d *Droplet) Find(c *fi.Context) (*Droplet, error) { cloud := c.Cloud.(*digitalocean.Cloud) diff --git a/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go b/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go index d548bc9421..8431d73f49 100644 --- a/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go +++ b/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go @@ -68,12 +68,22 @@ type InstanceTemplate struct { ID *string } +var _ fi.Task = &InstanceTemplate{} var _ fi.CompareWithID = &InstanceTemplate{} +var _ fi.HasDependencies = &InstanceTemplate{} func (e *InstanceTemplate) CompareWithID() *string { return e.ID } +func (l *InstanceTemplate) GetDependencies(tasks map[string]fi.Task) []fi.Task { + var deps []fi.Task + for _, resource := range l.Metadata { + deps = append(deps, resource.GetDependencies(tasks)...) + } + return deps +} + func (e *InstanceTemplate) Find(c *fi.Context) (*InstanceTemplate, error) { cloud := c.Cloud.(gce.GCECloud) diff --git a/upup/pkg/fi/cloudup/openstacktasks/instance.go b/upup/pkg/fi/cloudup/openstacktasks/instance.go index 8f1b20ff67..689e16d5f4 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/instance.go +++ b/upup/pkg/fi/cloudup/openstacktasks/instance.go @@ -41,7 +41,7 @@ type Instance struct { ServerGroup *ServerGroup Tags []string Role *string - UserData *string + UserData *fi.ResourceHolder Metadata map[string]string AvailabilityZone *string SecurityGroups []string @@ -49,7 +49,9 @@ type Instance struct { Lifecycle *fi.Lifecycle } +var _ fi.Task = &Instance{} var _ fi.HasAddress = &Instance{} +var _ fi.HasDependencies = &Instance{} // GetDependencies returns the dependencies of the Instance task func (e *Instance) GetDependencies(tasks map[string]fi.Task) []fi.Task { @@ -62,6 +64,11 @@ func (e *Instance) GetDependencies(tasks map[string]fi.Task) []fi.Task { deps = append(deps, task) } } + + if e.UserData != nil { + deps = append(deps, e.UserData.GetDependencies(tasks)...) + } + return deps } @@ -169,7 +176,11 @@ func (_ *Instance) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, change SecurityGroups: e.SecurityGroups, } if e.UserData != nil { - opt.UserData = []byte(*e.UserData) + bytes, err := e.UserData.AsBytes() + if err != nil { + return err + } + opt.UserData = bytes } if e.AvailabilityZone != nil { opt.AvailabilityZone = fi.StringValue(e.AvailabilityZone) diff --git a/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go b/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go index 8529d034cc..0a56c6f77c 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go +++ b/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go @@ -100,14 +100,14 @@ type AutoScalerDownOpts struct { EvaluationPeriods *int } +var _ fi.Task = &Elastigroup{} var _ fi.CompareWithID = &Elastigroup{} +var _ fi.HasDependencies = &Elastigroup{} func (e *Elastigroup) CompareWithID() *string { return e.Name } -var _ fi.HasDependencies = &Elastigroup{} - func (e *Elastigroup) GetDependencies(tasks map[string]fi.Task) []fi.Task { var deps []fi.Task @@ -135,6 +135,10 @@ func (e *Elastigroup) GetDependencies(tasks map[string]fi.Task) []fi.Task { } } + if e.UserData != nil { + deps = append(deps, e.UserData.GetDependencies(tasks)...) + } + return deps } diff --git a/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go b/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go index 591895d29c..fc00437af2 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go +++ b/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go @@ -51,14 +51,14 @@ type LaunchSpec struct { Ocean *Ocean } +var _ fi.Task = &LaunchSpec{} var _ fi.CompareWithID = &LaunchSpec{} +var _ fi.HasDependencies = &LaunchSpec{} func (o *LaunchSpec) CompareWithID() *string { return o.Name } -var _ fi.HasDependencies = &LaunchSpec{} - func (o *LaunchSpec) GetDependencies(tasks map[string]fi.Task) []fi.Task { var deps []fi.Task @@ -82,6 +82,10 @@ func (o *LaunchSpec) GetDependencies(tasks map[string]fi.Task) []fi.Task { deps = append(deps, o.Ocean) } + if o.UserData != nil { + deps = append(deps, o.UserData.GetDependencies(tasks)...) + } + return deps } diff --git a/upup/pkg/fi/cloudup/spotinsttasks/ocean.go b/upup/pkg/fi/cloudup/spotinsttasks/ocean.go index 20c9e8b074..0007ec382a 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/ocean.go +++ b/upup/pkg/fi/cloudup/spotinsttasks/ocean.go @@ -64,14 +64,14 @@ type Ocean struct { AutoScalerOpts *AutoScalerOpts } +var _ fi.Task = &Ocean{} var _ fi.CompareWithID = &Ocean{} +var _ fi.HasDependencies = &Ocean{} func (o *Ocean) CompareWithID() *string { return o.Name } -var _ fi.HasDependencies = &Ocean{} - func (o *Ocean) GetDependencies(tasks map[string]fi.Task) []fi.Task { var deps []fi.Task @@ -95,6 +95,10 @@ func (o *Ocean) GetDependencies(tasks map[string]fi.Task) []fi.Task { } } + if o.UserData != nil { + deps = append(deps, o.UserData.GetDependencies(tasks)...) + } + return deps }