diff --git a/upup/pkg/fi/cloudup/apply_cluster.go b/upup/pkg/fi/cloudup/apply_cluster.go index 1b080964fd994..97c97e0cc331f 100644 --- a/upup/pkg/fi/cloudup/apply_cluster.go +++ b/upup/pkg/fi/cloudup/apply_cluster.go @@ -534,11 +534,8 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { } tf := &TemplateFunctions{ - cluster: cluster, - instanceGroups: c.InstanceGroups, - tags: clusterTags, - region: region, - modelContext: modelContext, + KopsModelContext: *modelContext, + tags: clusterTags, } l.Tags = clusterTags @@ -771,7 +768,7 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { return fmt.Errorf("unknown cloudprovider %q", cluster.Spec.CloudProvider) } - l.TemplateFunctions["Masters"] = tf.modelContext.MasterInstanceGroups + l.TemplateFunctions["Masters"] = tf.MasterInstanceGroups err = tf.AddTo(l.TemplateFunctions, secretStore) if err != nil { diff --git a/upup/pkg/fi/cloudup/bootstrapchannelbuilder_test.go b/upup/pkg/fi/cloudup/bootstrapchannelbuilder_test.go index e0ff15437868b..cd614426dd63d 100644 --- a/upup/pkg/fi/cloudup/bootstrapchannelbuilder_test.go +++ b/upup/pkg/fi/cloudup/bootstrapchannelbuilder_test.go @@ -91,11 +91,10 @@ func runChannelBuilderTest(t *testing.T, key string, addonManifests []string) { } tf := &TemplateFunctions{ - cluster: cluster, - modelContext: &model.KopsModelContext{ + KopsModelContext: model.KopsModelContext{ Cluster: cluster, + Region: "us-east-1", }, - region: "us-east-1", } tf.AddTo(templates.TemplateFunctions, secretStore) diff --git a/upup/pkg/fi/cloudup/populate_cluster_spec.go b/upup/pkg/fi/cloudup/populate_cluster_spec.go index 3f43523afecfc..f7e606aa37d5c 100644 --- a/upup/pkg/fi/cloudup/populate_cluster_spec.go +++ b/upup/pkg/fi/cloudup/populate_cluster_spec.go @@ -258,13 +258,11 @@ func (c *populateClusterSpec) run(clientset simple.Clientset) error { return err } - modelContext := &model.KopsModelContext{ - Cluster: cluster, - } tf := &TemplateFunctions{ - cluster: cluster, - tags: tags, - modelContext: modelContext, + KopsModelContext: model.KopsModelContext{ + Cluster: cluster, + }, + tags: tags, } templateFunctions := make(template.FuncMap) @@ -326,7 +324,7 @@ func (c *populateClusterSpec) run(clientset simple.Clientset) error { fullCluster := &kopsapi.Cluster{} *fullCluster = *cluster fullCluster.Spec = *completed - tf.cluster = fullCluster + tf.Cluster = fullCluster if errs := validation.ValidateCluster(fullCluster, true); len(errs) != 0 { return fmt.Errorf("Completed cluster failed validation: %v", errs.ToAggregate()) diff --git a/upup/pkg/fi/cloudup/template_functions.go b/upup/pkg/fi/cloudup/template_functions.go index 187d0d02f9270..2539f2709ec92 100644 --- a/upup/pkg/fi/cloudup/template_functions.go +++ b/upup/pkg/fi/cloudup/template_functions.go @@ -54,22 +54,21 @@ import ( // TemplateFunctions provides a collection of methods used throughout the templates type TemplateFunctions struct { - cluster *kops.Cluster - instanceGroups []*kops.InstanceGroup - modelContext *model.KopsModelContext - region string - tags sets.String + model.KopsModelContext + tags sets.String } // AddTo defines the available functions we can use in our YAML models. // If we are trying to get a new function implemented it MUST // be defined here. func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretStore) (err error) { + cluster := tf.Cluster + dest["EtcdScheme"] = tf.EtcdScheme dest["SharedVPC"] = tf.SharedVPC dest["ToJSON"] = tf.ToJSON - dest["UseBootstrapTokens"] = tf.modelContext.UseBootstrapTokens - dest["UseEtcdTLS"] = tf.modelContext.UseEtcdTLS + dest["UseBootstrapTokens"] = tf.UseBootstrapTokens + dest["UseEtcdTLS"] = tf.UseEtcdTLS // Remember that we may be on a different arch from the target. Hard-code for now. dest["Arch"] = func() string { return "amd64" } dest["replace"] = func(s, find, replace string) string { @@ -82,7 +81,7 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS sprigTxtFuncMap := sprig.TxtFuncMap() dest["indent"] = sprigTxtFuncMap["indent"] - dest["ClusterName"] = tf.modelContext.ClusterName + dest["ClusterName"] = tf.ClusterName dest["HasTag"] = tf.HasTag dest["WithDefaultBool"] = func(v *bool, defaultValue bool) bool { if v != nil { @@ -92,22 +91,22 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS } dest["GetInstanceGroup"] = tf.GetInstanceGroup - dest["CloudTags"] = tf.modelContext.CloudTagsForInstanceGroup + dest["CloudTags"] = tf.CloudTagsForInstanceGroup dest["KubeDNS"] = func() *kops.KubeDNSConfig { - return tf.cluster.Spec.KubeDNS + return cluster.Spec.KubeDNS } dest["NodeLocalDNSClusterIP"] = func() string { - if tf.cluster.Spec.KubeProxy.ProxyMode == "ipvs" { - return tf.cluster.Spec.KubeDNS.ServerIP + if cluster.Spec.KubeProxy.ProxyMode == "ipvs" { + return cluster.Spec.KubeDNS.ServerIP } return "__PILLAR__CLUSTER__DNS__" } dest["NodeLocalDNSServerIP"] = func() string { - if tf.cluster.Spec.KubeProxy.ProxyMode == "ipvs" { + if cluster.Spec.KubeProxy.ProxyMode == "ipvs" { return "" } - return tf.cluster.Spec.KubeDNS.ServerIP + return cluster.Spec.KubeDNS.ServerIP } dest["NodeLocalDNSHealthCheck"] = func() string { return fmt.Sprintf("%d", wellknownports.NodeLocalDNSHealthCheck) @@ -121,7 +120,7 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS // TODO: Only for GCE? dest["EncodeGCELabel"] = gce.EncodeGCELabel dest["Region"] = func() string { - return tf.region + return tf.Region } if featureflag.EnableExternalCloudController.Enabled() { @@ -143,8 +142,8 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS } } - if tf.cluster.Spec.Networking != nil && tf.cluster.Spec.Networking.Flannel != nil { - flannelBackendType := tf.cluster.Spec.Networking.Flannel.Backend + if cluster.Spec.Networking != nil && cluster.Spec.Networking.Flannel != nil { + flannelBackendType := cluster.Spec.Networking.Flannel.Backend if flannelBackendType == "" { klog.Warningf("Defaulting flannel backend to udp (not a recommended configuration)") flannelBackendType = "udp" @@ -152,7 +151,7 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS dest["FlannelBackendType"] = func() string { return flannelBackendType } } - if tf.cluster.Spec.Networking != nil && tf.cluster.Spec.Networking.Weave != nil { + if cluster.Spec.Networking != nil && cluster.Spec.Networking.Weave != nil { weavesecretString := "" weavesecret, _ := secretStore.Secret("weavepassword") if weavesecret != nil { @@ -166,7 +165,7 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap, secretStore fi.SecretS dest["WeaveSecret"] = func() string { return weavesecretString } } - if tf.cluster.Spec.Networking != nil && tf.cluster.Spec.Networking.Cilium != nil { + if cluster.Spec.Networking != nil && cluster.Spec.Networking.Cilium != nil { ciliumsecretString := "" ciliumsecret, _ := secretStore.Secret("ciliumpassword") if ciliumsecret != nil { @@ -195,7 +194,7 @@ func (tf *TemplateFunctions) ToJSON(data interface{}) string { // EtcdScheme parses and grabs the protocol to the etcd cluster func (tf *TemplateFunctions) EtcdScheme() string { - if tf.modelContext.UseEtcdTLS() { + if tf.UseEtcdTLS() { return "https" } @@ -204,7 +203,7 @@ func (tf *TemplateFunctions) EtcdScheme() string { // SharedVPC is a simple helper function which makes the templates for a shared VPC clearer func (tf *TemplateFunctions) SharedVPC() bool { - return tf.cluster.SharedVPC() + return tf.Cluster.SharedVPC() } // HasTag returns true if the specified tag is set @@ -215,53 +214,54 @@ func (tf *TemplateFunctions) HasTag(tag string) bool { // GetInstanceGroup returns the instance group with the specified name func (tf *TemplateFunctions) GetInstanceGroup(name string) (*kops.InstanceGroup, error) { - for _, ig := range tf.instanceGroups { - if ig.ObjectMeta.Name == name { - return ig, nil - } + ig := tf.KopsModelContext.FindInstanceGroup(name) + if ig == nil { + return nil, fmt.Errorf("InstanceGroup %q not found", name) } - return nil, fmt.Errorf("InstanceGroup %q not found", name) + return ig, nil } // CloudControllerConfigArgv returns the args to external cloud controller func (tf *TemplateFunctions) CloudControllerConfigArgv() ([]string, error) { - if tf.cluster.Spec.ExternalCloudControllerManager == nil { + cluster := tf.Cluster + + if cluster.Spec.ExternalCloudControllerManager == nil { return nil, fmt.Errorf("ExternalCloudControllerManager is nil") } var argv []string - if tf.cluster.Spec.ExternalCloudControllerManager.Master != "" { - argv = append(argv, fmt.Sprintf("--master=%s", tf.cluster.Spec.ExternalCloudControllerManager.Master)) + if cluster.Spec.ExternalCloudControllerManager.Master != "" { + argv = append(argv, fmt.Sprintf("--master=%s", cluster.Spec.ExternalCloudControllerManager.Master)) } - if tf.cluster.Spec.ExternalCloudControllerManager.LogLevel != 0 { - argv = append(argv, fmt.Sprintf("--v=%d", tf.cluster.Spec.ExternalCloudControllerManager.LogLevel)) + if cluster.Spec.ExternalCloudControllerManager.LogLevel != 0 { + argv = append(argv, fmt.Sprintf("--v=%d", cluster.Spec.ExternalCloudControllerManager.LogLevel)) } else { argv = append(argv, "--v=2") } - if tf.cluster.Spec.ExternalCloudControllerManager.CloudProvider != "" { - argv = append(argv, fmt.Sprintf("--cloud-provider=%s", tf.cluster.Spec.ExternalCloudControllerManager.CloudProvider)) - } else if tf.cluster.Spec.CloudProvider != "" { - argv = append(argv, fmt.Sprintf("--cloud-provider=%s", tf.cluster.Spec.CloudProvider)) + if cluster.Spec.ExternalCloudControllerManager.CloudProvider != "" { + argv = append(argv, fmt.Sprintf("--cloud-provider=%s", cluster.Spec.ExternalCloudControllerManager.CloudProvider)) + } else if cluster.Spec.CloudProvider != "" { + argv = append(argv, fmt.Sprintf("--cloud-provider=%s", cluster.Spec.CloudProvider)) } else { return nil, fmt.Errorf("Cloud Provider is not set") } - if tf.cluster.Spec.ExternalCloudControllerManager.ClusterName != "" { - argv = append(argv, fmt.Sprintf("--cluster-name=%s", tf.cluster.Spec.ExternalCloudControllerManager.ClusterName)) + if cluster.Spec.ExternalCloudControllerManager.ClusterName != "" { + argv = append(argv, fmt.Sprintf("--cluster-name=%s", cluster.Spec.ExternalCloudControllerManager.ClusterName)) } - if tf.cluster.Spec.ExternalCloudControllerManager.ClusterCIDR != "" { - argv = append(argv, fmt.Sprintf("--cluster-cidr=%s", tf.cluster.Spec.ExternalCloudControllerManager.ClusterCIDR)) + if cluster.Spec.ExternalCloudControllerManager.ClusterCIDR != "" { + argv = append(argv, fmt.Sprintf("--cluster-cidr=%s", cluster.Spec.ExternalCloudControllerManager.ClusterCIDR)) } - if tf.cluster.Spec.ExternalCloudControllerManager.AllocateNodeCIDRs != nil { - argv = append(argv, fmt.Sprintf("--allocate-node-cidrs=%t", *tf.cluster.Spec.ExternalCloudControllerManager.AllocateNodeCIDRs)) + if cluster.Spec.ExternalCloudControllerManager.AllocateNodeCIDRs != nil { + argv = append(argv, fmt.Sprintf("--allocate-node-cidrs=%t", *cluster.Spec.ExternalCloudControllerManager.AllocateNodeCIDRs)) } - if tf.cluster.Spec.ExternalCloudControllerManager.ConfigureCloudRoutes != nil { - argv = append(argv, fmt.Sprintf("--configure-cloud-routes=%t", *tf.cluster.Spec.ExternalCloudControllerManager.ConfigureCloudRoutes)) + if cluster.Spec.ExternalCloudControllerManager.ConfigureCloudRoutes != nil { + argv = append(argv, fmt.Sprintf("--configure-cloud-routes=%t", *cluster.Spec.ExternalCloudControllerManager.ConfigureCloudRoutes)) } - if tf.cluster.Spec.ExternalCloudControllerManager.CIDRAllocatorType != nil && *tf.cluster.Spec.ExternalCloudControllerManager.CIDRAllocatorType != "" { - argv = append(argv, fmt.Sprintf("--cidr-allocator-type=%s", *tf.cluster.Spec.ExternalCloudControllerManager.CIDRAllocatorType)) + if cluster.Spec.ExternalCloudControllerManager.CIDRAllocatorType != nil && *cluster.Spec.ExternalCloudControllerManager.CIDRAllocatorType != "" { + argv = append(argv, fmt.Sprintf("--cidr-allocator-type=%s", *cluster.Spec.ExternalCloudControllerManager.CIDRAllocatorType)) } - if tf.cluster.Spec.ExternalCloudControllerManager.UseServiceAccountCredentials != nil { - argv = append(argv, fmt.Sprintf("--use-service-account-credentials=%t", *tf.cluster.Spec.ExternalCloudControllerManager.UseServiceAccountCredentials)) + if cluster.Spec.ExternalCloudControllerManager.UseServiceAccountCredentials != nil { + argv = append(argv, fmt.Sprintf("--use-service-account-credentials=%t", *cluster.Spec.ExternalCloudControllerManager.UseServiceAccountCredentials)) } else { argv = append(argv, fmt.Sprintf("--use-service-account-credentials=%t", true)) } @@ -271,20 +271,22 @@ func (tf *TemplateFunctions) CloudControllerConfigArgv() ([]string, error) { // DNSControllerArgv returns the args to the DNS controller func (tf *TemplateFunctions) DNSControllerArgv() ([]string, error) { + cluster := tf.Cluster + var argv []string argv = append(argv, "/usr/bin/dns-controller") // @check if the dns controller has custom configuration - if tf.cluster.Spec.ExternalDNS == nil { + if cluster.Spec.ExternalDNS == nil { argv = append(argv, []string{"--watch-ingress=false"}...) klog.V(4).Infof("watch-ingress=false set on dns-controller") } else { // @check if the watch ingress is set var watchIngress bool - if tf.cluster.Spec.ExternalDNS.WatchIngress != nil { - watchIngress = fi.BoolValue(tf.cluster.Spec.ExternalDNS.WatchIngress) + if cluster.Spec.ExternalDNS.WatchIngress != nil { + watchIngress = fi.BoolValue(cluster.Spec.ExternalDNS.WatchIngress) } if watchIngress { @@ -292,45 +294,45 @@ func (tf *TemplateFunctions) DNSControllerArgv() ([]string, error) { klog.Warningln("this may cause problems with previously defined services: https://github.com/kubernetes/kops/issues/2496") } argv = append(argv, fmt.Sprintf("--watch-ingress=%t", watchIngress)) - if tf.cluster.Spec.ExternalDNS.WatchNamespace != "" { - argv = append(argv, fmt.Sprintf("--watch-namespace=%s", tf.cluster.Spec.ExternalDNS.WatchNamespace)) + if cluster.Spec.ExternalDNS.WatchNamespace != "" { + argv = append(argv, fmt.Sprintf("--watch-namespace=%s", cluster.Spec.ExternalDNS.WatchNamespace)) } } - if dns.IsGossipHostname(tf.cluster.Spec.MasterInternalName) { + if dns.IsGossipHostname(cluster.Spec.MasterInternalName) { argv = append(argv, "--dns=gossip") // Configuration specifically for the DNS controller gossip - if tf.cluster.Spec.DNSControllerGossipConfig != nil { - if tf.cluster.Spec.DNSControllerGossipConfig.Protocol != nil { - argv = append(argv, "--gossip-protocol="+*tf.cluster.Spec.DNSControllerGossipConfig.Protocol) + if cluster.Spec.DNSControllerGossipConfig != nil { + if cluster.Spec.DNSControllerGossipConfig.Protocol != nil { + argv = append(argv, "--gossip-protocol="+*cluster.Spec.DNSControllerGossipConfig.Protocol) } - if tf.cluster.Spec.DNSControllerGossipConfig.Listen != nil { - argv = append(argv, "--gossip-listen="+*tf.cluster.Spec.DNSControllerGossipConfig.Listen) + if cluster.Spec.DNSControllerGossipConfig.Listen != nil { + argv = append(argv, "--gossip-listen="+*cluster.Spec.DNSControllerGossipConfig.Listen) } - if tf.cluster.Spec.DNSControllerGossipConfig.Secret != nil { - argv = append(argv, "--gossip-secret="+*tf.cluster.Spec.DNSControllerGossipConfig.Secret) + if cluster.Spec.DNSControllerGossipConfig.Secret != nil { + argv = append(argv, "--gossip-secret="+*cluster.Spec.DNSControllerGossipConfig.Secret) } - if tf.cluster.Spec.DNSControllerGossipConfig.Seed != nil { - argv = append(argv, "--gossip-seed="+*tf.cluster.Spec.DNSControllerGossipConfig.Seed) + if cluster.Spec.DNSControllerGossipConfig.Seed != nil { + argv = append(argv, "--gossip-seed="+*cluster.Spec.DNSControllerGossipConfig.Seed) } else { argv = append(argv, fmt.Sprintf("--gossip-seed=127.0.0.1:%d", wellknownports.ProtokubeGossipWeaveMesh)) } - if tf.cluster.Spec.DNSControllerGossipConfig.Secondary != nil { - if tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Protocol != nil { - argv = append(argv, "--gossip-protocol-secondary="+*tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Protocol) + if cluster.Spec.DNSControllerGossipConfig.Secondary != nil { + if cluster.Spec.DNSControllerGossipConfig.Secondary.Protocol != nil { + argv = append(argv, "--gossip-protocol-secondary="+*cluster.Spec.DNSControllerGossipConfig.Secondary.Protocol) } - if tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Listen != nil { - argv = append(argv, "--gossip-listen-secondary="+*tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Listen) + if cluster.Spec.DNSControllerGossipConfig.Secondary.Listen != nil { + argv = append(argv, "--gossip-listen-secondary="+*cluster.Spec.DNSControllerGossipConfig.Secondary.Listen) } - if tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Secret != nil { - argv = append(argv, "--gossip-secret-secondary="+*tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Secret) + if cluster.Spec.DNSControllerGossipConfig.Secondary.Secret != nil { + argv = append(argv, "--gossip-secret-secondary="+*cluster.Spec.DNSControllerGossipConfig.Secondary.Secret) } - if tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Seed != nil { - argv = append(argv, "--gossip-seed-secondary="+*tf.cluster.Spec.DNSControllerGossipConfig.Secondary.Seed) + if cluster.Spec.DNSControllerGossipConfig.Secondary.Seed != nil { + argv = append(argv, "--gossip-seed-secondary="+*cluster.Spec.DNSControllerGossipConfig.Secondary.Seed) } else { argv = append(argv, fmt.Sprintf("--gossip-seed-secondary=127.0.0.1:%d", wellknownports.ProtokubeGossipMemberlist)) } @@ -344,7 +346,7 @@ func (tf *TemplateFunctions) DNSControllerArgv() ([]string, error) { argv = append(argv, fmt.Sprintf("--gossip-seed-secondary=127.0.0.1:%d", wellknownports.ProtokubeGossipMemberlist)) } } else { - switch kops.CloudProviderID(tf.cluster.Spec.CloudProvider) { + switch kops.CloudProviderID(cluster.Spec.CloudProvider) { case kops.CloudProviderAWS: if strings.HasPrefix(os.Getenv("AWS_REGION"), "cn-") { argv = append(argv, "--dns=gossip") @@ -357,11 +359,11 @@ func (tf *TemplateFunctions) DNSControllerArgv() ([]string, error) { argv = append(argv, "--dns=digitalocean") default: - return nil, fmt.Errorf("unhandled cloudprovider %q", tf.cluster.Spec.CloudProvider) + return nil, fmt.Errorf("unhandled cloudprovider %q", cluster.Spec.CloudProvider) } } - zone := tf.cluster.Spec.DNSZone + zone := cluster.Spec.DNSZone if zone != "" { if strings.Contains(zone, ".") { // match by name @@ -381,9 +383,11 @@ func (tf *TemplateFunctions) DNSControllerArgv() ([]string, error) { // KopsControllerConfig returns the yaml configuration for kops-controller func (tf *TemplateFunctions) KopsControllerConfig() (string, error) { + cluster := tf.Cluster + config := &kopscontrollerconfig.Options{ - Cloud: tf.cluster.Spec.CloudProvider, - ConfigBase: tf.cluster.Spec.ConfigBase, + Cloud: cluster.Spec.CloudProvider, + ConfigBase: cluster.Spec.ConfigBase, } // To avoid indentation problems, we marshal as json. json is a subset of yaml @@ -397,7 +401,6 @@ func (tf *TemplateFunctions) KopsControllerConfig() (string, error) { // KopsControllerArgv returns the args to kops-controller func (tf *TemplateFunctions) KopsControllerArgv() ([]string, error) { - var argv []string argv = append(argv, "/usr/bin/kops-controller") @@ -411,19 +414,21 @@ func (tf *TemplateFunctions) KopsControllerArgv() ([]string, error) { } func (tf *TemplateFunctions) ExternalDNSArgv() ([]string, error) { + cluster := tf.Cluster + var argv []string - cloudProvider := tf.cluster.Spec.CloudProvider + cloudProvider := cluster.Spec.CloudProvider switch kops.CloudProviderID(cloudProvider) { case kops.CloudProviderAWS: argv = append(argv, "--provider=aws") case kops.CloudProviderGCE: - project := tf.cluster.Spec.Project + project := cluster.Spec.Project argv = append(argv, "--provider=google") argv = append(argv, "--google-project="+project) default: - return nil, fmt.Errorf("unhandled cloudprovider %q", tf.cluster.Spec.CloudProvider) + return nil, fmt.Errorf("unhandled cloudprovider %q", cluster.Spec.CloudProvider) } argv = append(argv, "--source=ingress") @@ -432,8 +437,10 @@ func (tf *TemplateFunctions) ExternalDNSArgv() ([]string, error) { } func (tf *TemplateFunctions) ProxyEnv() map[string]string { + cluster := tf.Cluster + envs := map[string]string{} - proxies := tf.cluster.Spec.EgressProxy + proxies := cluster.Spec.EgressProxy if proxies == nil { return envs } @@ -458,7 +465,7 @@ func (tf *TemplateFunctions) ProxyEnv() map[string]string { // KopsSystemEnv builds the env vars for a system component func (tf *TemplateFunctions) KopsSystemEnv() []corev1.EnvVar { - envMap := env.BuildSystemComponentEnvVars(&tf.cluster.Spec) + envMap := env.BuildSystemComponentEnvVars(&tf.Cluster.Spec) return envMap.ToEnvVars() } @@ -467,7 +474,7 @@ func (tf *TemplateFunctions) KopsSystemEnv() []corev1.EnvVar { // with tag specified to k8s version func (tf *TemplateFunctions) OpenStackCCM() string { var tag string - parsed, err := util.ParseKubernetesVersion(tf.cluster.Spec.KubernetesVersion) + parsed, err := util.ParseKubernetesVersion(tf.Cluster.Spec.KubernetesVersion) if err != nil { tag = "latest" } else { diff --git a/upup/pkg/fi/cloudup/template_functions_test.go b/upup/pkg/fi/cloudup/template_functions_test.go index c469b903939ba..821f74347c43a 100644 --- a/upup/pkg/fi/cloudup/template_functions_test.go +++ b/upup/pkg/fi/cloudup/template_functions_test.go @@ -200,9 +200,9 @@ func Test_TemplateFunctions_CloudControllerConfigArgv(t *testing.T) { } for _, testCase := range tests { t.Run(testCase.desc, func(t *testing.T) { - tf := &TemplateFunctions{ - cluster: testCase.cluster, - } + tf := &TemplateFunctions{} + tf.Cluster = testCase.cluster + actual, error := tf.CloudControllerConfigArgv() if !reflect.DeepEqual(error, testCase.expectedError) { t.Errorf("Error differs: %+v instead of %+v", error, testCase.expectedError) @@ -260,7 +260,8 @@ func Test_executeTemplate(t *testing.T) { tpl := template.New(filepath.Base(templateFileAbsolutePath)) funcMap := make(template.FuncMap) - templateFunctions := TemplateFunctions{cluster: testCase.cluster} + templateFunctions := TemplateFunctions{} + templateFunctions.Cluster = testCase.cluster templateFunctions.AddTo(funcMap, nil) tpl.Funcs(funcMap)