From 87446f88940e7ed0d81e60128a56f0984b5c9a5c Mon Sep 17 00:00:00 2001 From: John Gardiner Myers Date: Fri, 26 Jun 2020 09:42:31 -0700 Subject: [PATCH 1/3] 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 } From cef5b175c7c80cfffbd59bfb4bfdc2103ea5b37d Mon Sep 17 00:00:00 2001 From: John Gardiner Myers Date: Fri, 26 Jun 2020 10:57:36 -0700 Subject: [PATCH 2/3] Rename BootstrapScript to BootstrapScriptBuilder --- pkg/model/alimodel/scalinggroup.go | 8 ++-- pkg/model/awsmodel/autoscalinggroup.go | 8 ++-- pkg/model/bootstrapscript.go | 18 ++++----- pkg/model/bootstrapscript_test.go | 4 +- pkg/model/domodel/droplets.go | 6 +-- pkg/model/gcemodel/autoscalinggroup.go | 6 +-- pkg/model/openstackmodel/servergroup.go | 6 +-- pkg/model/openstackmodel/servergroup_test.go | 12 +++--- pkg/model/spotinstmodel/instance_group.go | 12 +++--- upup/pkg/fi/cloudup/apply_cluster.go | 42 ++++++++++---------- 10 files changed, 61 insertions(+), 61 deletions(-) diff --git a/pkg/model/alimodel/scalinggroup.go b/pkg/model/alimodel/scalinggroup.go index f1716b9458..a23b8de1c6 100644 --- a/pkg/model/alimodel/scalinggroup.go +++ b/pkg/model/alimodel/scalinggroup.go @@ -33,9 +33,9 @@ const DefaultInstanceType = "ecs.n2.medium" type ScalingGroupModelBuilder struct { *ALIModelContext - BootstrapScript *model.BootstrapScript - Lifecycle *fi.Lifecycle - SecurityLifecycle *fi.Lifecycle + BootstrapScriptBuilder *model.BootstrapScriptBuilder + Lifecycle *fi.Lifecycle + SecurityLifecycle *fi.Lifecycle } var _ fi.ModelBuilder = &ScalingGroupModelBuilder{} @@ -129,7 +129,7 @@ func (b *ScalingGroupModelBuilder) Build(c *fi.ModelBuilderContext) error { return err } launchConfiguration.SSHKey = b.LinkToSSHKey() - if launchConfiguration.UserData, err = b.BootstrapScript.ResourceNodeUp(ig, b.Cluster); err != nil { + if launchConfiguration.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster); err != nil { return err } } diff --git a/pkg/model/awsmodel/autoscalinggroup.go b/pkg/model/awsmodel/autoscalinggroup.go index 6e34eb433f..2f3403f50b 100644 --- a/pkg/model/awsmodel/autoscalinggroup.go +++ b/pkg/model/awsmodel/autoscalinggroup.go @@ -45,9 +45,9 @@ const ( type AutoscalingGroupModelBuilder struct { *AWSModelContext - BootstrapScript *model.BootstrapScript - Lifecycle *fi.Lifecycle - SecurityLifecycle *fi.Lifecycle + BootstrapScriptBuilder *model.BootstrapScriptBuilder + Lifecycle *fi.Lifecycle + SecurityLifecycle *fi.Lifecycle } var _ fi.ModelBuilder = &AutoscalingGroupModelBuilder{} @@ -261,7 +261,7 @@ func (b *AutoscalingGroupModelBuilder) buildLaunchConfigurationTask(c *fi.ModelB } // @step: add the instancegroup userdata - if t.UserData, err = b.BootstrapScript.ResourceNodeUp(ig, b.Cluster); err != nil { + if t.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster); err != nil { return nil, err } diff --git a/pkg/model/bootstrapscript.go b/pkg/model/bootstrapscript.go index 2906336ae9..bdb43907e2 100644 --- a/pkg/model/bootstrapscript.go +++ b/pkg/model/bootstrapscript.go @@ -43,15 +43,15 @@ type NodeUpConfigBuilder interface { BuildConfig(ig *kops.InstanceGroup) (*nodeup.Config, error) } -// BootstrapScript creates the bootstrap script -type BootstrapScript struct { +// BootstrapScriptBuilder creates the bootstrap script +type BootstrapScriptBuilder struct { NodeUpSource map[architectures.Architecture]string NodeUpSourceHash map[architectures.Architecture]string NodeUpConfigBuilder NodeUpConfigBuilder } // kubeEnv returns the nodeup config for the instance group -func (b *BootstrapScript) kubeEnv(ig *kops.InstanceGroup) (string, error) { +func (b *BootstrapScriptBuilder) kubeEnv(ig *kops.InstanceGroup) (string, error) { config, err := b.NodeUpConfigBuilder.BuildConfig(ig) if err != nil { return "", err @@ -65,7 +65,7 @@ func (b *BootstrapScript) kubeEnv(ig *kops.InstanceGroup) (string, error) { return string(data), nil } -func (b *BootstrapScript) buildEnvironmentVariables(cluster *kops.Cluster) (map[string]string, error) { +func (b *BootstrapScriptBuilder) buildEnvironmentVariables(cluster *kops.Cluster) (map[string]string, error) { env := make(map[string]string) if os.Getenv("GOSSIP_DNS_CONN_LIMIT") != "" { @@ -135,7 +135,7 @@ func (b *BootstrapScript) buildEnvironmentVariables(cluster *kops.Cluster) (map[ // ResourceNodeUp generates and returns a nodeup (bootstrap) script from a // template file, substituting in specific env vars & cluster spec configuration -func (b *BootstrapScript) ResourceNodeUp(ig *kops.InstanceGroup, cluster *kops.Cluster) (*fi.ResourceHolder, error) { +func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster *kops.Cluster) (*fi.ResourceHolder, error) { // Bastions can have AdditionalUserData, but if there isn't any skip this part if ig.IsBastion() && len(ig.Spec.AdditionalUserData) == 0 { templateResource, err := NewTemplateResource("nodeup", "", nil, nil) @@ -299,7 +299,7 @@ func (b *BootstrapScript) ResourceNodeUp(ig *kops.InstanceGroup, cluster *kops.C // getRelevantHooks returns a list of hooks to be applied to the instance group, // with the Manifest and ExecContainer Commands fingerprinted to reduce size -func (b *BootstrapScript) getRelevantHooks(allHooks []kops.HookSpec, role kops.InstanceGroupRole) ([]kops.HookSpec, error) { +func (b *BootstrapScriptBuilder) getRelevantHooks(allHooks []kops.HookSpec, role kops.InstanceGroupRole) ([]kops.HookSpec, error) { relevantHooks := []kops.HookSpec{} for _, hook := range allHooks { if len(hook.Roles) == 0 { @@ -349,7 +349,7 @@ func (b *BootstrapScript) getRelevantHooks(allHooks []kops.HookSpec, role kops.I // getRelevantFileAssets returns a list of file assets to be applied to the // instance group, with the Content fingerprinted to reduce size -func (b *BootstrapScript) getRelevantFileAssets(allFileAssets []kops.FileAssetSpec, role kops.InstanceGroupRole) ([]kops.FileAssetSpec, error) { +func (b *BootstrapScriptBuilder) getRelevantFileAssets(allFileAssets []kops.FileAssetSpec, role kops.InstanceGroupRole) ([]kops.FileAssetSpec, error) { relevantFileAssets := []kops.FileAssetSpec{} for _, fileAsset := range allFileAssets { if len(fileAsset.Roles) == 0 { @@ -384,7 +384,7 @@ func (b *BootstrapScript) getRelevantFileAssets(allFileAssets []kops.FileAssetSp } // computeFingerprint takes a string and returns a base64 encoded fingerprint -func (b *BootstrapScript) computeFingerprint(content string) (string, error) { +func (b *BootstrapScriptBuilder) computeFingerprint(content string) (string, error) { hasher := sha1.New() if _, err := hasher.Write([]byte(content)); err != nil { @@ -394,7 +394,7 @@ func (b *BootstrapScript) computeFingerprint(content string) (string, error) { return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), nil } -func (b *BootstrapScript) createProxyEnv(ps *kops.EgressProxySpec) string { +func (b *BootstrapScriptBuilder) createProxyEnv(ps *kops.EgressProxySpec) string { var buffer bytes.Buffer if ps != nil && ps.HTTPProxy.Host != "" { diff --git a/pkg/model/bootstrapscript_test.go b/pkg/model/bootstrapscript_test.go index 2e86e33607..0d73228045 100644 --- a/pkg/model/bootstrapscript_test.go +++ b/pkg/model/bootstrapscript_test.go @@ -27,7 +27,7 @@ import ( ) func Test_ProxyFunc(t *testing.T) { - b := &BootstrapScript{} + b := &BootstrapScriptBuilder{} ps := &kops.EgressProxySpec{ HTTPProxy: kops.HTTPProxy{ Host: "example.com", @@ -122,7 +122,7 @@ func TestBootstrapUserData(t *testing.T) { cluster := makeTestCluster(x.HookSpecRoles, x.FileAssetSpecRoles) group := makeTestInstanceGroup(x.Role, x.HookSpecRoles, x.FileAssetSpecRoles) - bs := &BootstrapScript{ + bs := &BootstrapScriptBuilder{ NodeUpConfigBuilder: &nodeupConfigBuilder{cluster: cluster}, NodeUpSource: map[architectures.Architecture]string{ architectures.ArchitectureAmd64: "NUSourceAmd64", diff --git a/pkg/model/domodel/droplets.go b/pkg/model/domodel/droplets.go index 77c09078a5..61ea06aaa4 100644 --- a/pkg/model/domodel/droplets.go +++ b/pkg/model/domodel/droplets.go @@ -30,8 +30,8 @@ import ( type DropletBuilder struct { *DOModelContext - BootstrapScript *model.BootstrapScript - Lifecycle *fi.Lifecycle + BootstrapScriptBuilder *model.BootstrapScriptBuilder + Lifecycle *fi.Lifecycle } var _ fi.ModelBuilder = &DropletBuilder{} @@ -78,7 +78,7 @@ func (d *DropletBuilder) Build(c *fi.ModelBuilderContext) error { droplet.Tags = append(droplet.Tags, do.TagKubernetesClusterInstanceGroupPrefix+":"+"nodes") } - userData, err := d.BootstrapScript.ResourceNodeUp(ig, d.Cluster) + userData, err := d.BootstrapScriptBuilder.ResourceNodeUp(ig, d.Cluster) if err != nil { return err } diff --git a/pkg/model/gcemodel/autoscalinggroup.go b/pkg/model/gcemodel/autoscalinggroup.go index 990015736f..ba7bc3fddd 100644 --- a/pkg/model/gcemodel/autoscalinggroup.go +++ b/pkg/model/gcemodel/autoscalinggroup.go @@ -40,8 +40,8 @@ const ( type AutoscalingGroupModelBuilder struct { *GCEModelContext - BootstrapScript *model.BootstrapScript - Lifecycle *fi.Lifecycle + BootstrapScriptBuilder *model.BootstrapScriptBuilder + Lifecycle *fi.Lifecycle } var _ fi.ModelBuilder = &AutoscalingGroupModelBuilder{} @@ -50,7 +50,7 @@ func (b *AutoscalingGroupModelBuilder) Build(c *fi.ModelBuilderContext) error { for _, ig := range b.InstanceGroups { name := b.SafeObjectName(ig.ObjectMeta.Name) - startupScript, err := b.BootstrapScript.ResourceNodeUp(ig, b.Cluster) + startupScript, err := b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) if err != nil { return err } diff --git a/pkg/model/openstackmodel/servergroup.go b/pkg/model/openstackmodel/servergroup.go index 2f2743c0bd..59845743d5 100644 --- a/pkg/model/openstackmodel/servergroup.go +++ b/pkg/model/openstackmodel/servergroup.go @@ -33,8 +33,8 @@ import ( // ServerGroupModelBuilder configures server group objects type ServerGroupModelBuilder struct { *OpenstackModelContext - BootstrapScript *model.BootstrapScript - Lifecycle *fi.Lifecycle + BootstrapScriptBuilder *model.BootstrapScriptBuilder + Lifecycle *fi.Lifecycle } var _ fi.ModelBuilder = &ServerGroupModelBuilder{} @@ -76,7 +76,7 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg * igMeta[openstack.BOOT_VOLUME_SIZE] = v } - startupScript, err := b.BootstrapScript.ResourceNodeUp(ig, b.Cluster) + startupScript, err := b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) if err != nil { return fmt.Errorf("could not create startup script for instance group %s: %v", ig.Name, err) } diff --git a/pkg/model/openstackmodel/servergroup_test.go b/pkg/model/openstackmodel/servergroup_test.go index 599dabaaed..e94de21dcd 100644 --- a/pkg/model/openstackmodel/servergroup_test.go +++ b/pkg/model/openstackmodel/servergroup_test.go @@ -2712,7 +2712,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { for _, testCase := range tests { t.Run(testCase.desc, func(t *testing.T) { clusterLifecycle := fi.LifecycleSync - bootstrapScriptBuilder := &model.BootstrapScript{ + bootstrapScriptBuilder := &model.BootstrapScriptBuilder{ NodeUpConfigBuilder: &nodeupConfigBuilder{}, NodeUpSource: map[architectures.Architecture]string{ architectures.ArchitectureAmd64: "source-amd64", @@ -2798,7 +2798,7 @@ func Test_ServerGroupModelBuilder(t *testing.T) { } } -func createBuilderForCluster(cluster *kops.Cluster, instanceGroups []*kops.InstanceGroup, clusterLifecycle fi.Lifecycle, bootstrapScript *model.BootstrapScript) *ServerGroupModelBuilder { +func createBuilderForCluster(cluster *kops.Cluster, instanceGroups []*kops.InstanceGroup, clusterLifecycle fi.Lifecycle, bootstrapScriptBuilder *model.BootstrapScriptBuilder) *ServerGroupModelBuilder { sshPublicKey := []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDF2sghZsClUBXJB4mBMIw8rb0hJWjg1Vz4eUeXwYmTdi92Gf1zNc5xISSip9Y+PWX/jJokPB7tgPnMD/2JOAKhG1bi4ZqB15pYRmbbBekVpM4o4E0dx+czbqjiAm6wlccTrINK5LYenbucAAQt19eH+D0gJwzYUK9SYz1hWnlGS+qurt2bz7rrsG73lN8E2eiNvGtIXqv3GabW/Hea3acOBgCUJQWUDTRu0OmmwxzKbFN/UpNKeRaHlCqwZWjVAsmqA8TX8LIocq7Np7MmIBwt7EpEeZJxThcmC8DEJs9ClAjD+jlLIvMPXKC3JWCPgwCLGxHjy7ckSGFCSzbyPduh") modelContext := &model.KopsModelContext{ @@ -2811,9 +2811,9 @@ func createBuilderForCluster(cluster *kops.Cluster, instanceGroups []*kops.Insta } return &ServerGroupModelBuilder{ - OpenstackModelContext: openstackModelContext, - BootstrapScript: bootstrapScript, - Lifecycle: &clusterLifecycle, + OpenstackModelContext: openstackModelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, } } @@ -3194,7 +3194,7 @@ func (n *nodeupConfigBuilder) BuildConfig(ig *kops.InstanceGroup) (*nodeup.Confi } func mustUserdataForClusterInstance(cluster *kops.Cluster, ig *kops.InstanceGroup) *fi.ResourceHolder { - bootstrapScriptBuilder := &model.BootstrapScript{ + bootstrapScriptBuilder := &model.BootstrapScriptBuilder{ NodeUpConfigBuilder: &nodeupConfigBuilder{}, NodeUpSource: map[architectures.Architecture]string{ architectures.ArchitectureAmd64: "source-amd64", diff --git a/pkg/model/spotinstmodel/instance_group.go b/pkg/model/spotinstmodel/instance_group.go index e120e08b13..98ce6535c7 100644 --- a/pkg/model/spotinstmodel/instance_group.go +++ b/pkg/model/spotinstmodel/instance_group.go @@ -112,9 +112,9 @@ const ( type InstanceGroupModelBuilder struct { *model.KopsModelContext - BootstrapScript *model.BootstrapScript - Lifecycle *fi.Lifecycle - SecurityLifecycle *fi.Lifecycle + BootstrapScriptBuilder *model.BootstrapScriptBuilder + Lifecycle *fi.Lifecycle + SecurityLifecycle *fi.Lifecycle } var _ fi.ModelBuilder = &InstanceGroupModelBuilder{} @@ -267,7 +267,7 @@ func (b *InstanceGroupModelBuilder) buildElastigroup(c *fi.ModelBuilderContext, } // User data. - group.UserData, err = b.BootstrapScript.ResourceNodeUp(ig, b.Cluster) + group.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) if err != nil { return fmt.Errorf("error building user data: %v", err) } @@ -422,7 +422,7 @@ func (b *InstanceGroupModelBuilder) buildOcean(c *fi.ModelBuilderContext, igs .. ocean.Monitoring = ig.Spec.DetailedInstanceMonitoring // User data. - ocean.UserData, err = b.BootstrapScript.ResourceNodeUp(ig, b.Cluster) + ocean.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) if err != nil { return fmt.Errorf("error building user data: %v", err) } @@ -512,7 +512,7 @@ func (b *InstanceGroupModelBuilder) buildLaunchSpec(c *fi.ModelBuilderContext, ocean.MaxSize = fi.Int64(fi.Int64Value(ocean.MaxSize) + fi.Int64Value(maxSize)) // User data. - launchSpec.UserData, err = b.BootstrapScript.ResourceNodeUp(ig, b.Cluster) + launchSpec.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) if err != nil { return fmt.Errorf("error building user data: %v", err) } diff --git a/upup/pkg/fi/cloudup/apply_cluster.go b/upup/pkg/fi/cloudup/apply_cluster.go index cc97b37b3a..2bba7de04a 100644 --- a/upup/pkg/fi/cloudup/apply_cluster.go +++ b/upup/pkg/fi/cloudup/apply_cluster.go @@ -701,7 +701,7 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { if err != nil { return err } - bootstrapScriptBuilder := &model.BootstrapScript{ + bootstrapScriptBuilder := &model.BootstrapScriptBuilder{ NodeUpConfigBuilder: configBuilder, NodeUpSource: c.NodeUpSource, NodeUpSourceHash: c.NodeUpHash, @@ -714,18 +714,18 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { } awsModelBuilder := &awsmodel.AutoscalingGroupModelBuilder{ - AWSModelContext: awsModelContext, - BootstrapScript: bootstrapScriptBuilder, - Lifecycle: &clusterLifecycle, - SecurityLifecycle: &securityLifecycle, + AWSModelContext: awsModelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, + SecurityLifecycle: &securityLifecycle, } if featureflag.Spotinst.Enabled() { l.Builders = append(l.Builders, &spotinstmodel.InstanceGroupModelBuilder{ - KopsModelContext: modelContext, - BootstrapScript: bootstrapScriptBuilder, - Lifecycle: &clusterLifecycle, - SecurityLifecycle: &securityLifecycle, + KopsModelContext: modelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, + SecurityLifecycle: &securityLifecycle, }) if featureflag.SpotinstHybrid.Enabled() { @@ -741,9 +741,9 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { } l.Builders = append(l.Builders, &domodel.DropletBuilder{ - DOModelContext: doModelContext, - BootstrapScript: bootstrapScriptBuilder, - Lifecycle: &clusterLifecycle, + DOModelContext: doModelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, }) case kops.CloudProviderGCE: { @@ -752,9 +752,9 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { } l.Builders = append(l.Builders, &gcemodel.AutoscalingGroupModelBuilder{ - GCEModelContext: gceModelContext, - BootstrapScript: bootstrapScriptBuilder, - Lifecycle: &clusterLifecycle, + GCEModelContext: gceModelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, }) } @@ -765,9 +765,9 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { } l.Builders = append(l.Builders, &alimodel.ScalingGroupModelBuilder{ - ALIModelContext: aliModelContext, - BootstrapScript: bootstrapScriptBuilder, - Lifecycle: &clusterLifecycle, + ALIModelContext: aliModelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, }) } @@ -777,9 +777,9 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { } l.Builders = append(l.Builders, &openstackmodel.ServerGroupModelBuilder{ - OpenstackModelContext: openstackModelContext, - BootstrapScript: bootstrapScriptBuilder, - Lifecycle: &clusterLifecycle, + OpenstackModelContext: openstackModelContext, + BootstrapScriptBuilder: bootstrapScriptBuilder, + Lifecycle: &clusterLifecycle, }) default: From 013f9bf9148b95ae5843be1289c39a1ace837af4 Mon Sep 17 00:00:00 2001 From: John Gardiner Myers Date: Fri, 26 Jun 2020 11:22:18 -0700 Subject: [PATCH 3/3] Create bootstrap script in a Task --- pkg/model/BUILD.bazel | 2 + pkg/model/alimodel/scalinggroup.go | 2 +- pkg/model/awsmodel/autoscalinggroup.go | 2 +- pkg/model/bootstrapscript.go | 82 +++++++++++++------- pkg/model/bootstrapscript_test.go | 23 ++++-- pkg/model/domodel/droplets.go | 2 +- pkg/model/gcemodel/autoscalinggroup.go | 2 +- pkg/model/openstackmodel/servergroup.go | 2 +- pkg/model/openstackmodel/servergroup_test.go | 26 ++++++- pkg/model/spotinstmodel/instance_group.go | 6 +- 10 files changed, 104 insertions(+), 45 deletions(-) diff --git a/pkg/model/BUILD.bazel b/pkg/model/BUILD.bazel index 16b848e762..ffb92cdd0b 100644 --- a/pkg/model/BUILD.bazel +++ b/pkg/model/BUILD.bazel @@ -75,7 +75,9 @@ go_test( "//pkg/apis/kops:go_default_library", "//pkg/apis/nodeup:go_default_library", "//pkg/testutils/golden:go_default_library", + "//upup/pkg/fi:go_default_library", "//util/pkg/architectures:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/pkg/model/alimodel/scalinggroup.go b/pkg/model/alimodel/scalinggroup.go index a23b8de1c6..3e5fc49247 100644 --- a/pkg/model/alimodel/scalinggroup.go +++ b/pkg/model/alimodel/scalinggroup.go @@ -129,7 +129,7 @@ func (b *ScalingGroupModelBuilder) Build(c *fi.ModelBuilderContext) error { return err } launchConfiguration.SSHKey = b.LinkToSSHKey() - if launchConfiguration.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster); err != nil { + if launchConfiguration.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig); err != nil { return err } } diff --git a/pkg/model/awsmodel/autoscalinggroup.go b/pkg/model/awsmodel/autoscalinggroup.go index 2f3403f50b..ed332341f1 100644 --- a/pkg/model/awsmodel/autoscalinggroup.go +++ b/pkg/model/awsmodel/autoscalinggroup.go @@ -261,7 +261,7 @@ func (b *AutoscalingGroupModelBuilder) buildLaunchConfigurationTask(c *fi.ModelB } // @step: add the instancegroup userdata - if t.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster); err != nil { + if t.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig); err != nil { return nil, err } diff --git a/pkg/model/bootstrapscript.go b/pkg/model/bootstrapscript.go index bdb43907e2..dbc1568cb2 100644 --- a/pkg/model/bootstrapscript.go +++ b/pkg/model/bootstrapscript.go @@ -50,9 +50,19 @@ type BootstrapScriptBuilder struct { NodeUpConfigBuilder NodeUpConfigBuilder } +type BootstrapScript struct { + Name string + ig *kops.InstanceGroup + builder *BootstrapScriptBuilder + resource fi.TaskDependentResource +} + +var _ fi.Task = &BootstrapScript{} +var _ fi.HasName = &BootstrapScript{} + // kubeEnv returns the nodeup config for the instance group -func (b *BootstrapScriptBuilder) kubeEnv(ig *kops.InstanceGroup) (string, error) { - config, err := b.NodeUpConfigBuilder.BuildConfig(ig) +func (b *BootstrapScript) kubeEnv(ig *kops.InstanceGroup) (string, error) { + config, err := b.builder.NodeUpConfigBuilder.BuildConfig(ig) if err != nil { return "", err } @@ -65,7 +75,7 @@ func (b *BootstrapScriptBuilder) kubeEnv(ig *kops.InstanceGroup) (string, error) return string(data), nil } -func (b *BootstrapScriptBuilder) buildEnvironmentVariables(cluster *kops.Cluster) (map[string]string, error) { +func (b *BootstrapScript) buildEnvironmentVariables(cluster *kops.Cluster) (map[string]string, error) { env := make(map[string]string) if os.Getenv("GOSSIP_DNS_CONN_LIMIT") != "" { @@ -135,7 +145,7 @@ func (b *BootstrapScriptBuilder) buildEnvironmentVariables(cluster *kops.Cluster // ResourceNodeUp generates and returns a nodeup (bootstrap) script from a // template file, substituting in specific env vars & cluster spec configuration -func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster *kops.Cluster) (*fi.ResourceHolder, error) { +func (b *BootstrapScriptBuilder) ResourceNodeUp(c *fi.ModelBuilderContext, ig *kops.InstanceGroup) (*fi.ResourceHolder, error) { // Bastions can have AdditionalUserData, but if there isn't any skip this part if ig.IsBastion() && len(ig.Spec.AdditionalUserData) == 0 { templateResource, err := NewTemplateResource("nodeup", "", nil, nil) @@ -145,25 +155,40 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster return fi.WrapResource(templateResource), nil } + task := &BootstrapScript{ + Name: ig.Name, + ig: ig, + builder: b, + } + task.resource.Task = task + c.AddTask(task) + return fi.WrapResource(&task.resource), nil +} + +func (b *BootstrapScript) GetName() *string { + return &b.Name +} + +func (b *BootstrapScript) Run(c *fi.Context) error { functions := template.FuncMap{ "NodeUpSourceAmd64": func() string { - return b.NodeUpSource[architectures.ArchitectureAmd64] + return b.builder.NodeUpSource[architectures.ArchitectureAmd64] }, "NodeUpSourceHashAmd64": func() string { - return b.NodeUpSourceHash[architectures.ArchitectureAmd64] + return b.builder.NodeUpSourceHash[architectures.ArchitectureAmd64] }, "NodeUpSourceArm64": func() string { - return b.NodeUpSource[architectures.ArchitectureArm64] + return b.builder.NodeUpSource[architectures.ArchitectureArm64] }, "NodeUpSourceHashArm64": func() string { - return b.NodeUpSourceHash[architectures.ArchitectureArm64] + return b.builder.NodeUpSourceHash[architectures.ArchitectureArm64] }, "KubeEnv": func() (string, error) { - return b.kubeEnv(ig) + return b.kubeEnv(b.ig) }, "EnvironmentVariables": func() (string, error) { - env, err := b.buildEnvironmentVariables(cluster) + env, err := b.buildEnvironmentVariables(c.Cluster) if err != nil { return "", err } @@ -183,11 +208,11 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster }, "ProxyEnv": func() string { - return b.createProxyEnv(cluster.Spec.EgressProxy) + return b.createProxyEnv(c.Cluster.Spec.EgressProxy) }, "ClusterSpec": func() (string, error) { - cs := cluster.Spec + cs := c.Cluster.Spec spec := make(map[string]interface{}) spec["cloudConfig"] = cs.CloudConfig @@ -206,7 +231,7 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster } } - if ig.IsMaster() { + if b.ig.IsMaster() { spec["encryptionConfig"] = cs.EncryptionConfig spec["etcdClusters"] = make(map[string]kops.EtcdClusterSpec) spec["kubeAPIServer"] = cs.KubeAPIServer @@ -231,7 +256,7 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster } } - hooks, err := b.getRelevantHooks(cs.Hooks, ig.Spec.Role) + hooks, err := b.getRelevantHooks(cs.Hooks, b.ig.Spec.Role) if err != nil { return "", err } @@ -239,7 +264,7 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster spec["hooks"] = hooks } - fileAssets, err := b.getRelevantFileAssets(cs.FileAssets, ig.Spec.Role) + fileAssets, err := b.getRelevantFileAssets(cs.FileAssets, b.ig.Spec.Role) if err != nil { return "", err } @@ -256,11 +281,11 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster "IGSpec": func() (string, error) { spec := make(map[string]interface{}) - spec["kubelet"] = ig.Spec.Kubelet - spec["nodeLabels"] = ig.Spec.NodeLabels - spec["taints"] = ig.Spec.Taints + spec["kubelet"] = b.ig.Spec.Kubelet + spec["nodeLabels"] = b.ig.Spec.NodeLabels + spec["taints"] = b.ig.Spec.Taints - hooks, err := b.getRelevantHooks(ig.Spec.Hooks, ig.Spec.Role) + hooks, err := b.getRelevantHooks(b.ig.Spec.Hooks, b.ig.Spec.Role) if err != nil { return "", err } @@ -268,7 +293,7 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster spec["hooks"] = hooks } - fileAssets, err := b.getRelevantFileAssets(ig.Spec.FileAssets, ig.Spec.Role) + fileAssets, err := b.getRelevantFileAssets(b.ig.Spec.FileAssets, b.ig.Spec.Role) if err != nil { return "", err } @@ -284,22 +309,23 @@ func (b *BootstrapScriptBuilder) ResourceNodeUp(ig *kops.InstanceGroup, cluster }, } - awsNodeUpTemplate, err := resources.AWSNodeUpTemplate(ig) + awsNodeUpTemplate, err := resources.AWSNodeUpTemplate(b.ig) if err != nil { - return nil, err + return err } templateResource, err := NewTemplateResource("nodeup", awsNodeUpTemplate, functions, nil) if err != nil { - return nil, err + return err } - return fi.WrapResource(templateResource), nil + b.resource.Resource = templateResource + return nil } // getRelevantHooks returns a list of hooks to be applied to the instance group, // with the Manifest and ExecContainer Commands fingerprinted to reduce size -func (b *BootstrapScriptBuilder) getRelevantHooks(allHooks []kops.HookSpec, role kops.InstanceGroupRole) ([]kops.HookSpec, error) { +func (b *BootstrapScript) getRelevantHooks(allHooks []kops.HookSpec, role kops.InstanceGroupRole) ([]kops.HookSpec, error) { relevantHooks := []kops.HookSpec{} for _, hook := range allHooks { if len(hook.Roles) == 0 { @@ -349,7 +375,7 @@ func (b *BootstrapScriptBuilder) getRelevantHooks(allHooks []kops.HookSpec, role // getRelevantFileAssets returns a list of file assets to be applied to the // instance group, with the Content fingerprinted to reduce size -func (b *BootstrapScriptBuilder) getRelevantFileAssets(allFileAssets []kops.FileAssetSpec, role kops.InstanceGroupRole) ([]kops.FileAssetSpec, error) { +func (b *BootstrapScript) getRelevantFileAssets(allFileAssets []kops.FileAssetSpec, role kops.InstanceGroupRole) ([]kops.FileAssetSpec, error) { relevantFileAssets := []kops.FileAssetSpec{} for _, fileAsset := range allFileAssets { if len(fileAsset.Roles) == 0 { @@ -384,7 +410,7 @@ func (b *BootstrapScriptBuilder) getRelevantFileAssets(allFileAssets []kops.File } // computeFingerprint takes a string and returns a base64 encoded fingerprint -func (b *BootstrapScriptBuilder) computeFingerprint(content string) (string, error) { +func (b *BootstrapScript) computeFingerprint(content string) (string, error) { hasher := sha1.New() if _, err := hasher.Write([]byte(content)); err != nil { @@ -394,7 +420,7 @@ func (b *BootstrapScriptBuilder) computeFingerprint(content string) (string, err return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), nil } -func (b *BootstrapScriptBuilder) createProxyEnv(ps *kops.EgressProxySpec) string { +func (b *BootstrapScript) createProxyEnv(ps *kops.EgressProxySpec) string { var buffer bytes.Buffer if ps != nil && ps.HTTPProxy.Host != "" { diff --git a/pkg/model/bootstrapscript_test.go b/pkg/model/bootstrapscript_test.go index 0d73228045..b55a52021a 100644 --- a/pkg/model/bootstrapscript_test.go +++ b/pkg/model/bootstrapscript_test.go @@ -20,14 +20,17 @@ import ( "strings" "testing" + "github.com/stretchr/testify/require" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/nodeup" "k8s.io/kops/pkg/testutils/golden" + "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/util/pkg/architectures" ) func Test_ProxyFunc(t *testing.T) { - b := &BootstrapScriptBuilder{} + b := &BootstrapScript{} ps := &kops.EgressProxySpec{ HTTPProxy: kops.HTTPProxy{ Host: "example.com", @@ -121,6 +124,9 @@ func TestBootstrapUserData(t *testing.T) { for i, x := range cs { cluster := makeTestCluster(x.HookSpecRoles, x.FileAssetSpecRoles) group := makeTestInstanceGroup(x.Role, x.HookSpecRoles, x.FileAssetSpecRoles) + c := &fi.ModelBuilderContext{ + Tasks: make(map[string]fi.Task), + } bs := &BootstrapScriptBuilder{ NodeUpConfigBuilder: &nodeupConfigBuilder{cluster: cluster}, @@ -134,18 +140,16 @@ func TestBootstrapUserData(t *testing.T) { }, } - // Purposely running this twice to cover issue #3516 - _, err := bs.ResourceNodeUp(group, cluster) - if err != nil { - t.Errorf("case %d failed to create nodeup resource. error: %s", i, err) - continue - } - res, err := bs.ResourceNodeUp(group, cluster) + res, err := bs.ResourceNodeUp(c, group) if err != nil { t.Errorf("case %d failed to create nodeup resource. error: %s", i, err) continue } + require.Contains(t, c.Tasks, "BootstrapScript/testIG") + err = c.Tasks["BootstrapScript/testIG"].Run(&fi.Context{Cluster: cluster}) + require.NoError(t, err, "running task") + actual, err := res.AsString() if err != nil { t.Errorf("case %d failed to render nodeup resource. error: %s", i, err) @@ -256,6 +260,9 @@ func makeTestCluster(hookSpecRoles []kops.InstanceGroupRole, fileAssetSpecRoles func makeTestInstanceGroup(role kops.InstanceGroupRole, hookSpecRoles []kops.InstanceGroupRole, fileAssetSpecRoles []kops.InstanceGroupRole) *kops.InstanceGroup { return &kops.InstanceGroup{ + ObjectMeta: v1.ObjectMeta{ + Name: "testIG", + }, Spec: kops.InstanceGroupSpec{ Kubelet: &kops.KubeletConfigSpec{ KubeconfigPath: "/etc/kubernetes/igconfig.txt", diff --git a/pkg/model/domodel/droplets.go b/pkg/model/domodel/droplets.go index 61ea06aaa4..30b63dd4f5 100644 --- a/pkg/model/domodel/droplets.go +++ b/pkg/model/domodel/droplets.go @@ -78,7 +78,7 @@ func (d *DropletBuilder) Build(c *fi.ModelBuilderContext) error { droplet.Tags = append(droplet.Tags, do.TagKubernetesClusterInstanceGroupPrefix+":"+"nodes") } - userData, err := d.BootstrapScriptBuilder.ResourceNodeUp(ig, d.Cluster) + userData, err := d.BootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { return err } diff --git a/pkg/model/gcemodel/autoscalinggroup.go b/pkg/model/gcemodel/autoscalinggroup.go index ba7bc3fddd..7ab312142f 100644 --- a/pkg/model/gcemodel/autoscalinggroup.go +++ b/pkg/model/gcemodel/autoscalinggroup.go @@ -50,7 +50,7 @@ func (b *AutoscalingGroupModelBuilder) Build(c *fi.ModelBuilderContext) error { for _, ig := range b.InstanceGroups { name := b.SafeObjectName(ig.ObjectMeta.Name) - startupScript, err := b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) + startupScript, err := b.BootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { return err } diff --git a/pkg/model/openstackmodel/servergroup.go b/pkg/model/openstackmodel/servergroup.go index 59845743d5..02ca820682 100644 --- a/pkg/model/openstackmodel/servergroup.go +++ b/pkg/model/openstackmodel/servergroup.go @@ -76,7 +76,7 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg * igMeta[openstack.BOOT_VOLUME_SIZE] = v } - startupScript, err := b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) + startupScript, err := b.BootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { return fmt.Errorf("could not create startup script for instance group %s: %v", ig.Name, err) } diff --git a/pkg/model/openstackmodel/servergroup_test.go b/pkg/model/openstackmodel/servergroup_test.go index e94de21dcd..4b2e7a79c6 100644 --- a/pkg/model/openstackmodel/servergroup_test.go +++ b/pkg/model/openstackmodel/servergroup_test.go @@ -2736,11 +2736,23 @@ func Test_ServerGroupModelBuilder(t *testing.T) { compareErrors(t, err, testCase.expectedError) expectedTasks := testCase.expectedTasksBuilder(testCase.cluster, testCase.instanceGroups) + for _, ig := range testCase.instanceGroups { + expectedTasks["BootstrapScript/"+ig.Name] = &model.BootstrapScript{Name: ig.Name} + } if len(expectedTasks) != len(context.Tasks) { t.Errorf("expected %d tasks, got %d tasks", len(expectedTasks), len(context.Tasks)) } + for taskName, task := range context.Tasks { + if strings.HasPrefix(taskName, "BootstrapScript/") { + err = task.Run(&fi.Context{Cluster: testCase.cluster}) + if err != nil { + t.Errorf("failed to run BootstrapScript task: %v", err) + } + } + } + for taskName, task := range expectedTasks { actual, ok := context.Tasks[taskName] if !ok { @@ -2784,6 +2796,8 @@ func Test_ServerGroupModelBuilder(t *testing.T) { t.Run("creates a task for "+taskName, func(t *testing.T) { compareSecurityGroups(t, actual, expected) }) + case *model.BootstrapScript: + // ignore default: t.Errorf("found a task with name %q and type %T", taskName, expected) } @@ -3205,10 +3219,20 @@ func mustUserdataForClusterInstance(cluster *kops.Cluster, ig *kops.InstanceGrou architectures.ArchitectureArm64: "source-hash-arm64", }, } - startupResources, err := bootstrapScriptBuilder.ResourceNodeUp(ig, cluster) + c := &fi.ModelBuilderContext{ + Tasks: make(map[string]fi.Task), + } + + startupResources, err := bootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { panic(fmt.Errorf("error getting userdata: %v", err)) } + + err = c.Tasks["BootstrapScript/"+ig.Name].Run(&fi.Context{Cluster: cluster}) + if err != nil { + panic(fmt.Errorf("error running BootstrapScript task: %v", err)) + + } userdata, err := startupResources.AsString() if err != nil { panic(fmt.Errorf("error converting userdata to string: %v", err)) diff --git a/pkg/model/spotinstmodel/instance_group.go b/pkg/model/spotinstmodel/instance_group.go index 98ce6535c7..78baa3f874 100644 --- a/pkg/model/spotinstmodel/instance_group.go +++ b/pkg/model/spotinstmodel/instance_group.go @@ -267,7 +267,7 @@ func (b *InstanceGroupModelBuilder) buildElastigroup(c *fi.ModelBuilderContext, } // User data. - group.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) + group.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { return fmt.Errorf("error building user data: %v", err) } @@ -422,7 +422,7 @@ func (b *InstanceGroupModelBuilder) buildOcean(c *fi.ModelBuilderContext, igs .. ocean.Monitoring = ig.Spec.DetailedInstanceMonitoring // User data. - ocean.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) + ocean.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { return fmt.Errorf("error building user data: %v", err) } @@ -512,7 +512,7 @@ func (b *InstanceGroupModelBuilder) buildLaunchSpec(c *fi.ModelBuilderContext, ocean.MaxSize = fi.Int64(fi.Int64Value(ocean.MaxSize) + fi.Int64Value(maxSize)) // User data. - launchSpec.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(ig, b.Cluster) + launchSpec.UserData, err = b.BootstrapScriptBuilder.ResourceNodeUp(c, ig) if err != nil { return fmt.Errorf("error building user data: %v", err) }