From 57dec35f6888c107fa660c603b3f6fe30a44f720 Mon Sep 17 00:00:00 2001 From: John Gardiner Myers Date: Sun, 2 May 2021 21:18:29 -0700 Subject: [PATCH] Split out TerraformWriter --- upup/pkg/fi/cloudup/BUILD.bazel | 1 + upup/pkg/fi/cloudup/alitasks/BUILD.bazel | 1 + .../alitasks/eip_natgateway_association.go | 9 +- .../cloudup/alitasks/launchconfiguration.go | 13 +- upup/pkg/fi/cloudup/alitasks/loadbalancer.go | 5 +- .../cloudup/alitasks/loadbalancerlistener.go | 13 +- upup/pkg/fi/cloudup/alitasks/natgateway.go | 9 +- upup/pkg/fi/cloudup/alitasks/rampolicy.go | 11 +- upup/pkg/fi/cloudup/alitasks/ramrole.go | 5 +- upup/pkg/fi/cloudup/alitasks/scalinggroup.go | 9 +- upup/pkg/fi/cloudup/alitasks/securitygroup.go | 9 +- .../fi/cloudup/alitasks/securitygrouprule.go | 19 +- upup/pkg/fi/cloudup/alitasks/sshkey.go | 5 +- upup/pkg/fi/cloudup/alitasks/vpc.go | 5 +- upup/pkg/fi/cloudup/alitasks/vswitch.go | 13 +- upup/pkg/fi/cloudup/alitasks/vswitchSNAT.go | 5 +- upup/pkg/fi/cloudup/apply_cluster.go | 7 +- upup/pkg/fi/cloudup/awstasks/BUILD.bazel | 1 + .../fi/cloudup/awstasks/autoscalinggroup.go | 25 +-- .../awstasks/autoscalinglifecyclehook.go | 11 +- .../cloudup/awstasks/classic_load_balancer.go | 15 +- upup/pkg/fi/cloudup/awstasks/dhcp_options.go | 5 +- upup/pkg/fi/cloudup/awstasks/dnsname.go | 17 +- upup/pkg/fi/cloudup/awstasks/dnszone.go | 15 +- upup/pkg/fi/cloudup/awstasks/ebsvolume.go | 5 +- upup/pkg/fi/cloudup/awstasks/elastic_ip.go | 7 +- .../fi/cloudup/awstasks/eventbridgerule.go | 11 +- .../fi/cloudup/awstasks/eventbridgetarget.go | 5 +- .../fi/cloudup/awstasks/iaminstanceprofile.go | 7 +- .../awstasks/iaminstanceprofilerole.go | 7 +- .../fi/cloudup/awstasks/iamoidcprovider.go | 9 +- upup/pkg/fi/cloudup/awstasks/iamrole.go | 15 +- upup/pkg/fi/cloudup/awstasks/iamrolepolicy.go | 13 +- upup/pkg/fi/cloudup/awstasks/instance.go | 8 +- .../fi/cloudup/awstasks/internetgateway.go | 11 +- .../launchtemplate_target_terraform.go | 17 +- upup/pkg/fi/cloudup/awstasks/natgateway.go | 13 +- .../cloudup/awstasks/network_load_balancer.go | 17 +- upup/pkg/fi/cloudup/awstasks/route.go | 13 +- upup/pkg/fi/cloudup/awstasks/routetable.go | 9 +- .../cloudup/awstasks/routetableassociation.go | 9 +- upup/pkg/fi/cloudup/awstasks/securitygroup.go | 15 +- .../fi/cloudup/awstasks/securitygrouprule.go | 5 +- upup/pkg/fi/cloudup/awstasks/sqs.go | 9 +- upup/pkg/fi/cloudup/awstasks/sshkey.go | 13 +- upup/pkg/fi/cloudup/awstasks/subnet.go | 17 +- upup/pkg/fi/cloudup/awstasks/targetgroup.go | 9 +- upup/pkg/fi/cloudup/awstasks/vpc.go | 9 +- .../awstasks/vpc_dhcpoptions_association.go | 5 +- upup/pkg/fi/cloudup/awstasks/vpccidrblock.go | 5 +- upup/pkg/fi/cloudup/gcetasks/BUILD.bazel | 1 + upup/pkg/fi/cloudup/gcetasks/address.go | 5 +- upup/pkg/fi/cloudup/gcetasks/firewallrule.go | 5 +- .../pkg/fi/cloudup/gcetasks/forwardingrule.go | 15 +- upup/pkg/fi/cloudup/gcetasks/instance.go | 23 +-- .../cloudup/gcetasks/instancegroupmanager.go | 15 +- .../fi/cloudup/gcetasks/instancetemplate.go | 23 +-- upup/pkg/fi/cloudup/gcetasks/network.go | 5 +- upup/pkg/fi/cloudup/gcetasks/router.go | 5 +- upup/pkg/fi/cloudup/gcetasks/subnet.go | 13 +- upup/pkg/fi/cloudup/gcetasks/targetpool.go | 5 +- upup/pkg/fi/cloudup/spotinsttasks/BUILD.bazel | 1 + .../fi/cloudup/spotinsttasks/elastigroup.go | 25 +-- .../fi/cloudup/spotinsttasks/launch_spec.go | 19 +- upup/pkg/fi/cloudup/spotinsttasks/ocean.go | 39 ++-- upup/pkg/fi/cloudup/terraform/BUILD.bazel | 3 +- upup/pkg/fi/cloudup/terraform/hcl2.go | 19 +- upup/pkg/fi/cloudup/terraform/hcl2_test.go | 30 ++- upup/pkg/fi/cloudup/terraform/target.go | 156 +--------------- upup/pkg/fi/cloudup/terraform/target_hcl2.go | 9 +- .../fi/cloudup/terraform/target_hcl2_test.go | 15 +- upup/pkg/fi/cloudup/terraform/target_json.go | 6 +- .../fi/cloudup/terraformWriter/BUILD.bazel | 22 +++ .../{terraform => terraformWriter}/literal.go | 2 +- upup/pkg/fi/cloudup/terraformWriter/writer.go | 173 ++++++++++++++++++ .../writer_test.go} | 14 +- 76 files changed, 629 insertions(+), 510 deletions(-) create mode 100644 upup/pkg/fi/cloudup/terraformWriter/BUILD.bazel rename upup/pkg/fi/cloudup/{terraform => terraformWriter}/literal.go (99%) create mode 100644 upup/pkg/fi/cloudup/terraformWriter/writer.go rename upup/pkg/fi/cloudup/{terraform/target_test.go => terraformWriter/writer_test.go} (90%) diff --git a/upup/pkg/fi/cloudup/BUILD.bazel b/upup/pkg/fi/cloudup/BUILD.bazel index 26146bb59e..845b6a8d97 100644 --- a/upup/pkg/fi/cloudup/BUILD.bazel +++ b/upup/pkg/fi/cloudup/BUILD.bazel @@ -70,6 +70,7 @@ go_library( "//upup/pkg/fi/cloudup/gce:go_default_library", "//upup/pkg/fi/cloudup/openstack:go_default_library", "//upup/pkg/fi/cloudup/terraform:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//upup/pkg/fi/loader:go_default_library", "//util/pkg/architectures:go_default_library", "//util/pkg/env:go_default_library", diff --git a/upup/pkg/fi/cloudup/alitasks/BUILD.bazel b/upup/pkg/fi/cloudup/alitasks/BUILD.bazel index 32af1247cd..fda01b294d 100644 --- a/upup/pkg/fi/cloudup/alitasks/BUILD.bazel +++ b/upup/pkg/fi/cloudup/alitasks/BUILD.bazel @@ -44,6 +44,7 @@ go_library( "//upup/pkg/fi:go_default_library", "//upup/pkg/fi/cloudup/aliup:go_default_library", "//upup/pkg/fi/cloudup/terraform:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//vendor/github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests:go_default_library", "//vendor/github.com/aliyun/alibaba-cloud-sdk-go/services/slb:go_default_library", "//vendor/github.com/denverdino/aliyungo/common:go_default_library", diff --git a/upup/pkg/fi/cloudup/alitasks/eip_natgateway_association.go b/upup/pkg/fi/cloudup/alitasks/eip_natgateway_association.go index dd4f9241dd..733778d7ad 100644 --- a/upup/pkg/fi/cloudup/alitasks/eip_natgateway_association.go +++ b/upup/pkg/fi/cloudup/alitasks/eip_natgateway_association.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/aliup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) const ( @@ -141,8 +142,8 @@ type terraformEip struct { } type terraformEipAssociation struct { - InstanceID *terraform.Literal `json:"instance_id,omitempty" cty:"instance_id"` - AllocationID *terraform.Literal `json:"allocation_id,omitempty" cty:"allocation_id"` + InstanceID *terraformWriter.Literal `json:"instance_id,omitempty" cty:"instance_id"` + AllocationID *terraformWriter.Literal `json:"allocation_id,omitempty" cty:"allocation_id"` } func (_ *EIP) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *EIP) error { @@ -160,6 +161,6 @@ func (_ *EIP) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *EIP) return t.RenderResource("alicloud_eip_association", *e.Name+"_asso", associationtf) } -func (e *EIP) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_eip", *e.Name, "id") +func (e *EIP) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_eip", *e.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go b/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go index 3a602c89c3..36aa4f5634 100644 --- a/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go +++ b/upup/pkg/fi/cloudup/alitasks/launchconfiguration.go @@ -29,6 +29,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ess" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/pkg/featureflag" "k8s.io/kops/upup/pkg/fi" @@ -307,10 +308,10 @@ type terraformLaunchConfiguration struct { SystemDiskCategory *string `json:"system_disk_category,omitempty" cty:"system_disk_category"` UserData *string `json:"user_data,omitempty" cty:"user_data"` - RAMRole *terraform.Literal `json:"role_name,omitempty" cty:"role_name"` - ScalingGroup *terraform.Literal `json:"scaling_group_id,omitempty" cty:"scaling_group_id"` - SSHKey *terraform.Literal `json:"key_name,omitempty" cty:"key_name"` - SecurityGroup *terraform.Literal `json:"security_group_id,omitempty" cty:"security_group_id"` + RAMRole *terraformWriter.Literal `json:"role_name,omitempty" cty:"role_name"` + ScalingGroup *terraformWriter.Literal `json:"scaling_group_id,omitempty" cty:"scaling_group_id"` + SSHKey *terraformWriter.Literal `json:"key_name,omitempty" cty:"key_name"` + SecurityGroup *terraformWriter.Literal `json:"security_group_id,omitempty" cty:"security_group_id"` } func (_ *LaunchConfiguration) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *LaunchConfiguration) error { @@ -336,8 +337,8 @@ func (_ *LaunchConfiguration) RenderTerraform(t *terraform.TerraformTarget, a, e return t.RenderResource("alicloud_ess_scaling_configuration", *e.Name, tf) } -func (l *LaunchConfiguration) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_ess_scaling_configuration", fi.StringValue(l.Name), "id") +func (l *LaunchConfiguration) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_ess_scaling_configuration", fi.StringValue(l.Name), "id") } // deleteLaunchConfiguration tracks a LaunchConfiguration that we're going to delete diff --git a/upup/pkg/fi/cloudup/alitasks/loadbalancer.go b/upup/pkg/fi/cloudup/alitasks/loadbalancer.go index 48a52a1f65..33f700fc51 100644 --- a/upup/pkg/fi/cloudup/alitasks/loadbalancer.go +++ b/upup/pkg/fi/cloudup/alitasks/loadbalancer.go @@ -23,6 +23,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/slb" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/aliup" @@ -264,6 +265,6 @@ func (_ *LoadBalancer) RenderTerraform(t *terraform.TerraformTarget, a, e, chang return t.RenderResource("alicloud_slb", *e.Name, tf) } -func (l *LoadBalancer) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_slb", *l.Name, "id") +func (l *LoadBalancer) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_slb", *l.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/loadbalancerlistener.go b/upup/pkg/fi/cloudup/alitasks/loadbalancerlistener.go index 6ef0c479ba..5015a914b4 100644 --- a/upup/pkg/fi/cloudup/alitasks/loadbalancerlistener.go +++ b/upup/pkg/fi/cloudup/alitasks/loadbalancerlistener.go @@ -21,6 +21,7 @@ import ( "strconv" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/denverdino/aliyungo/slb" "k8s.io/kops/upup/pkg/fi" @@ -149,10 +150,10 @@ func (_ *LoadBalancerListener) RenderALI(t *aliup.ALIAPITarget, a, e, changes *L } type terraformLoadBalancerListener struct { - ListenerPort *int `json:"frontend_port,omitempty" cty:"frontend_port"` - BackendServerPort *int `json:"backend_port,omitempty" cty:"backend_port"` - Protocol *string `json:"protocol,omitempty" cty:"protocol"` - LoadBalancerId *terraform.Literal `json:"load_balancer_id,omitempty" cty:"load_balancer_id"` + ListenerPort *int `json:"frontend_port,omitempty" cty:"frontend_port"` + BackendServerPort *int `json:"backend_port,omitempty" cty:"backend_port"` + Protocol *string `json:"protocol,omitempty" cty:"protocol"` + LoadBalancerId *terraformWriter.Literal `json:"load_balancer_id,omitempty" cty:"load_balancer_id"` } func (_ *LoadBalancerListener) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *LoadBalancerListener) error { @@ -167,6 +168,6 @@ func (_ *LoadBalancerListener) RenderTerraform(t *terraform.TerraformTarget, a, return t.RenderResource("alicloud_slb_listener", *e.Name, tf) } -func (s *LoadBalancerListener) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_slb_listener", *s.Name, "frontend_port") +func (s *LoadBalancerListener) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_slb_listener", *s.Name, "frontend_port") } diff --git a/upup/pkg/fi/cloudup/alitasks/natgateway.go b/upup/pkg/fi/cloudup/alitasks/natgateway.go index 6f3c34ff6a..b5c1c4a8b4 100644 --- a/upup/pkg/fi/cloudup/alitasks/natgateway.go +++ b/upup/pkg/fi/cloudup/alitasks/natgateway.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/aliup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -114,8 +115,8 @@ func (_ *NatGateway) RenderALI(t *aliup.ALIAPITarget, a, e, changes *NatGateway) } type terraformNatGateway struct { - Name *string `json:"name,omitempty" cty:"name"` - VpcId *terraform.Literal `json:"vpc_id,omitempty" cty:"vpc_id"` + Name *string `json:"name,omitempty" cty:"name"` + VpcId *terraformWriter.Literal `json:"vpc_id,omitempty" cty:"vpc_id"` } func (_ *NatGateway) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *NatGateway) error { @@ -127,6 +128,6 @@ func (_ *NatGateway) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("alicloud_nat_gateway", *e.Name, tf) } -func (e *NatGateway) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_nat_gateway", *e.Name, "id") +func (e *NatGateway) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_nat_gateway", *e.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/rampolicy.go b/upup/pkg/fi/cloudup/alitasks/rampolicy.go index a82156ba06..67181f7f05 100644 --- a/upup/pkg/fi/cloudup/alitasks/rampolicy.go +++ b/upup/pkg/fi/cloudup/alitasks/rampolicy.go @@ -22,6 +22,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ram" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/klog/v2" "k8s.io/kops/upup/pkg/fi" @@ -146,9 +147,9 @@ type terraformRAMPolicy struct { } type terraformRAMPolicyAttach struct { - PolicyName *terraform.Literal `json:"policy_name,omitempty" cty:"policy_name"` - PolicyType *string `json:"policy_type,omitempty" cty:"policy_type"` - RoleName *terraform.Literal `json:"role_name,omitempty" cty:"role_name"` + PolicyName *terraformWriter.Literal `json:"policy_name,omitempty" cty:"policy_name"` + PolicyType *string `json:"policy_type,omitempty" cty:"policy_type"` + RoleName *terraformWriter.Literal `json:"role_name,omitempty" cty:"role_name"` } func (_ *RAMPolicy) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *RAMPolicy) error { @@ -176,6 +177,6 @@ func (_ *RAMPolicy) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return err } -func (s *RAMPolicy) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_ram_policy", *s.Name, "id") +func (s *RAMPolicy) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_ram_policy", *s.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/ramrole.go b/upup/pkg/fi/cloudup/alitasks/ramrole.go index 6d225c7cc0..a381de76da 100644 --- a/upup/pkg/fi/cloudup/alitasks/ramrole.go +++ b/upup/pkg/fi/cloudup/alitasks/ramrole.go @@ -22,6 +22,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ram" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/klog/v2" "k8s.io/kops/upup/pkg/fi" @@ -136,6 +137,6 @@ func (_ *RAMRole) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *R return t.RenderResource("alicloud_ram_role", *e.Name, tf) } -func (s *RAMRole) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_ram_role", *s.Name, "name") +func (s *RAMRole) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_ram_role", *s.Name, "name") } diff --git a/upup/pkg/fi/cloudup/alitasks/scalinggroup.go b/upup/pkg/fi/cloudup/alitasks/scalinggroup.go index 78e441270a..8a42e6b547 100644 --- a/upup/pkg/fi/cloudup/alitasks/scalinggroup.go +++ b/upup/pkg/fi/cloudup/alitasks/scalinggroup.go @@ -24,6 +24,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ess" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/aliup" @@ -181,8 +182,8 @@ type terraformScalingGroup struct { MaxSize *int `json:"max_size,omitempty" cty:"max_size"` MinSize *int `json:"min_size,omitempty" cty:"min_size"` - VSwitchs []*terraform.Literal `json:"vswitch_ids,omitempty" cty:"vswitch_ids"` - LoadBalancer []*terraform.Literal `json:"loadbalancer_ids,omitempty" cty:"loadbalancer_ids"` + VSwitchs []*terraformWriter.Literal `json:"vswitch_ids,omitempty" cty:"vswitch_ids"` + LoadBalancer []*terraformWriter.Literal `json:"loadbalancer_ids,omitempty" cty:"loadbalancer_ids"` } func (_ *ScalingGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *ScalingGroup) error { @@ -205,6 +206,6 @@ func (_ *ScalingGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, chang return t.RenderResource("alicloud_ess_scaling_group", *e.Name, tf) } -func (a *ScalingGroup) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_ess_scaling_group", *a.Name, "id") +func (a *ScalingGroup) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_ess_scaling_group", *a.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/securitygroup.go b/upup/pkg/fi/cloudup/alitasks/securitygroup.go index 5bc09ce991..4247d5924a 100644 --- a/upup/pkg/fi/cloudup/alitasks/securitygroup.go +++ b/upup/pkg/fi/cloudup/alitasks/securitygroup.go @@ -20,6 +20,7 @@ import ( "fmt" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ecs" @@ -184,8 +185,8 @@ func (s *SecurityGroup) getGroupTagsToDelete(currentTags map[string]string) map[ } type terraformSecurityGroup struct { - Name *string `json:"name,omitempty" cty:"name"` - VPCId *terraform.Literal `json:"vpc_id,omitempty" cty:"vpc_id"` + Name *string `json:"name,omitempty" cty:"name"` + VPCId *terraformWriter.Literal `json:"vpc_id,omitempty" cty:"vpc_id"` } func (_ *SecurityGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *SecurityGroup) error { @@ -197,6 +198,6 @@ func (_ *SecurityGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, chan return t.RenderResource("alicloud_security_group", *e.Name, tf) } -func (l *SecurityGroup) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_security_group", *l.Name, "id") +func (l *SecurityGroup) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_security_group", *l.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/securitygrouprule.go b/upup/pkg/fi/cloudup/alitasks/securitygrouprule.go index 9159c76e7e..0b0e9cd6cf 100644 --- a/upup/pkg/fi/cloudup/alitasks/securitygrouprule.go +++ b/upup/pkg/fi/cloudup/alitasks/securitygrouprule.go @@ -23,6 +23,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ecs" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/aliup" @@ -180,13 +181,13 @@ func (_ *SecurityGroupRule) RenderALI(t *aliup.ALIAPITarget, a, e, changes *Secu } type terraformSecurityGroupRole struct { - Name *string `json:"name,omitempty" cty:"name"` - Type *string `json:"type,omitempty" cty:"type"` - IpProtocol *string `json:"ip_protocol,omitempty" cty:"ip_protocol"` - SourceCidrIp *string `json:"cidr_ip,omitempty" cty:"cidr_ip"` - SecurityGroupId *terraform.Literal `json:"security_group_id,omitempty" cty:"security_group_id"` - SourceGroupId *terraform.Literal `json:"source_security_group_id,omitempty" cty:"source_security_group_id"` - PortRange *string `json:"port_range,omitempty" cty:"port_range"` + Name *string `json:"name,omitempty" cty:"name"` + Type *string `json:"type,omitempty" cty:"type"` + IpProtocol *string `json:"ip_protocol,omitempty" cty:"ip_protocol"` + SourceCidrIp *string `json:"cidr_ip,omitempty" cty:"cidr_ip"` + SecurityGroupId *terraformWriter.Literal `json:"security_group_id,omitempty" cty:"security_group_id"` + SourceGroupId *terraformWriter.Literal `json:"source_security_group_id,omitempty" cty:"source_security_group_id"` + PortRange *string `json:"port_range,omitempty" cty:"port_range"` } func (_ *SecurityGroupRule) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *SecurityGroupRule) error { @@ -217,6 +218,6 @@ func (_ *SecurityGroupRule) RenderTerraform(t *terraform.TerraformTarget, a, e, return t.RenderResource("alicloud_security_group_rule", *e.Name, tf) } -func (l *SecurityGroupRule) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_security_group_rule", *l.Name, "id") +func (l *SecurityGroupRule) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_security_group_rule", *l.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/sshkey.go b/upup/pkg/fi/cloudup/alitasks/sshkey.go index 4c62f04f5d..b4f40a46c7 100644 --- a/upup/pkg/fi/cloudup/alitasks/sshkey.go +++ b/upup/pkg/fi/cloudup/alitasks/sshkey.go @@ -22,6 +22,7 @@ import ( common "github.com/denverdino/aliyungo/common" ecs "github.com/denverdino/aliyungo/ecs" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/klog/v2" "k8s.io/kops/pkg/pki" @@ -163,6 +164,6 @@ func (_ *SSHKey) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *SS return t.RenderResource("alicloud_key_pair", *e.Name, tf) } -func (s *SSHKey) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_key_pair", *s.Name, "name") +func (s *SSHKey) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_key_pair", *s.Name, "name") } diff --git a/upup/pkg/fi/cloudup/alitasks/vpc.go b/upup/pkg/fi/cloudup/alitasks/vpc.go index 7c285db480..c56a80d498 100644 --- a/upup/pkg/fi/cloudup/alitasks/vpc.go +++ b/upup/pkg/fi/cloudup/alitasks/vpc.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/aliup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -173,6 +174,6 @@ func (_ *VPC) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VPC) return t.RenderResource("alicloud_vpc", *e.Name, tf) } -func (e *VPC) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_vpc", *e.Name, "id") +func (e *VPC) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_vpc", *e.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/vswitch.go b/upup/pkg/fi/cloudup/alitasks/vswitch.go index 896f23c7b5..22f4021ebc 100644 --- a/upup/pkg/fi/cloudup/alitasks/vswitch.go +++ b/upup/pkg/fi/cloudup/alitasks/vswitch.go @@ -20,6 +20,7 @@ import ( "fmt" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ecs" @@ -175,10 +176,10 @@ func (_ *VSwitch) RenderALI(t *aliup.ALIAPITarget, a, e, changes *VSwitch) error } type terraformVSwitch struct { - Name *string `json:"name,omitempty" cty:"name"` - CidrBlock *string `json:"cidr_block,omitempty" cty:"cidr_block"` - ZoneId *string `json:"availability_zone,omitempty" cty:"availability_zone"` - VPCId *terraform.Literal `json:"vpc_id,omitempty" cty:"vpc_id"` + Name *string `json:"name,omitempty" cty:"name"` + CidrBlock *string `json:"cidr_block,omitempty" cty:"cidr_block"` + ZoneId *string `json:"availability_zone,omitempty" cty:"availability_zone"` + VPCId *terraformWriter.Literal `json:"vpc_id,omitempty" cty:"vpc_id"` } func (_ *VSwitch) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VSwitch) error { @@ -192,6 +193,6 @@ func (_ *VSwitch) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *V return t.RenderResource("alicloud_vswitch", *e.Name, tf) } -func (v *VSwitch) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("alicloud_vswitch", *v.Name, "id") +func (v *VSwitch) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("alicloud_vswitch", *v.Name, "id") } diff --git a/upup/pkg/fi/cloudup/alitasks/vswitchSNAT.go b/upup/pkg/fi/cloudup/alitasks/vswitchSNAT.go index 53f997e98f..fa7978dfce 100644 --- a/upup/pkg/fi/cloudup/alitasks/vswitchSNAT.go +++ b/upup/pkg/fi/cloudup/alitasks/vswitchSNAT.go @@ -20,6 +20,7 @@ import ( "fmt" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ecs" @@ -183,8 +184,8 @@ func (_ *VSwitchSNAT) RenderALI(t *aliup.ALIAPITarget, a, e, changes *VSwitchSNA } type terraformVSwitchSNAT struct { - SnatTableId *string `json:"snat_table_id,omitempty" cty:"snat_table_id"` - VSwitchId *terraform.Literal `json:"source_vswitch_id,omitempty" cty:"source_vswitch_id"` + SnatTableId *string `json:"snat_table_id,omitempty" cty:"snat_table_id"` + VSwitchId *terraformWriter.Literal `json:"source_vswitch_id,omitempty" cty:"source_vswitch_id"` } func (_ *VSwitchSNAT) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VSwitchSNAT) error { diff --git a/upup/pkg/fi/cloudup/apply_cluster.go b/upup/pkg/fi/cloudup/apply_cluster.go index fed54b7cdf..fe566af79b 100644 --- a/upup/pkg/fi/cloudup/apply_cluster.go +++ b/upup/pkg/fi/cloudup/apply_cluster.go @@ -67,6 +67,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/openstack" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/hashing" "k8s.io/kops/util/pkg/mirrors" @@ -699,17 +700,17 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { tf := terraform.NewTerraformTarget(cloud, project, outDir, cluster.Spec.Target) // We include a few "util" variables in the TF output - if err := tf.AddOutputVariable("region", terraform.LiteralFromStringValue(cloud.Region())); err != nil { + if err := tf.AddOutputVariable("region", terraformWriter.LiteralFromStringValue(cloud.Region())); err != nil { return err } if project != "" { - if err := tf.AddOutputVariable("project", terraform.LiteralFromStringValue(project)); err != nil { + if err := tf.AddOutputVariable("project", terraformWriter.LiteralFromStringValue(project)); err != nil { return err } } - if err := tf.AddOutputVariable("cluster_name", terraform.LiteralFromStringValue(cluster.ObjectMeta.Name)); err != nil { + if err := tf.AddOutputVariable("cluster_name", terraformWriter.LiteralFromStringValue(cluster.ObjectMeta.Name)); err != nil { return err } diff --git a/upup/pkg/fi/cloudup/awstasks/BUILD.bazel b/upup/pkg/fi/cloudup/awstasks/BUILD.bazel index d466f3cd58..1797626e28 100644 --- a/upup/pkg/fi/cloudup/awstasks/BUILD.bazel +++ b/upup/pkg/fi/cloudup/awstasks/BUILD.bazel @@ -96,6 +96,7 @@ go_library( "//upup/pkg/fi/cloudup/awsup:go_default_library", "//upup/pkg/fi/cloudup/cloudformation:go_default_library", "//upup/pkg/fi/cloudup/terraform:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//upup/pkg/fi/utils:go_default_library", "//util/pkg/maps:go_default_library", "//util/pkg/slice:go_default_library", diff --git a/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go b/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go index 8df4137acb..58f83140de 100644 --- a/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go +++ b/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go @@ -29,6 +29,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/util/pkg/maps" ) @@ -805,16 +806,16 @@ type terraformASGTag struct { type terraformAutoscalingLaunchTemplateSpecification struct { // LaunchTemplateID is the ID of the template to use. - LaunchTemplateID *terraform.Literal `json:"id,omitempty" cty:"id"` + LaunchTemplateID *terraformWriter.Literal `json:"id,omitempty" cty:"id"` // Version is the version of the Launch Template to use. - Version *terraform.Literal `json:"version,omitempty" cty:"version"` + Version *terraformWriter.Literal `json:"version,omitempty" cty:"version"` } type terraformAutoscalingMixedInstancesPolicyLaunchTemplateSpecification struct { // LaunchTemplateID is the ID of the template to use - LaunchTemplateID *terraform.Literal `json:"launch_template_id,omitempty" cty:"launch_template_id"` + LaunchTemplateID *terraformWriter.Literal `json:"launch_template_id,omitempty" cty:"launch_template_id"` // Version is the version of the Launch Template to use - Version *terraform.Literal `json:"version,omitempty" cty:"version"` + Version *terraformWriter.Literal `json:"version,omitempty" cty:"version"` } type terraformAutoscalingMixedInstancesPolicyLaunchTemplateOverride struct { @@ -853,19 +854,19 @@ type terraformMixedInstancesPolicy struct { type terraformAutoscalingGroup struct { Name *string `json:"name,omitempty" cty:"name"` - LaunchConfigurationName *terraform.Literal `json:"launch_configuration,omitempty" cty:"launch_configuration"` + LaunchConfigurationName *terraformWriter.Literal `json:"launch_configuration,omitempty" cty:"launch_configuration"` LaunchTemplate *terraformAutoscalingLaunchTemplateSpecification `json:"launch_template,omitempty" cty:"launch_template"` MaxSize *int64 `json:"max_size,omitempty" cty:"max_size"` MinSize *int64 `json:"min_size,omitempty" cty:"min_size"` MixedInstancesPolicy []*terraformMixedInstancesPolicy `json:"mixed_instances_policy,omitempty" cty:"mixed_instances_policy"` - VPCZoneIdentifier []*terraform.Literal `json:"vpc_zone_identifier,omitempty" cty:"vpc_zone_identifier"` + VPCZoneIdentifier []*terraformWriter.Literal `json:"vpc_zone_identifier,omitempty" cty:"vpc_zone_identifier"` Tags []*terraformASGTag `json:"tag,omitempty" cty:"tag"` MetricsGranularity *string `json:"metrics_granularity,omitempty" cty:"metrics_granularity"` EnabledMetrics []*string `json:"enabled_metrics,omitempty" cty:"enabled_metrics"` SuspendedProcesses []*string `json:"suspended_processes,omitempty" cty:"suspended_processes"` InstanceProtection *bool `json:"protect_from_scale_in,omitempty" cty:"protect_from_scale_in"` - LoadBalancers []*terraform.Literal `json:"load_balancers,omitempty" cty:"load_balancers"` - TargetGroupARNs []*terraform.Literal `json:"target_group_arns,omitempty" cty:"target_group_arns"` + LoadBalancers []*terraformWriter.Literal `json:"load_balancers,omitempty" cty:"load_balancers"` + TargetGroupARNs []*terraformWriter.Literal `json:"target_group_arns,omitempty" cty:"target_group_arns"` } // RenderTerraform is responsible for rendering the terraform codebase @@ -895,12 +896,12 @@ func (_ *AutoscalingGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, c for _, k := range e.LoadBalancers { tf.LoadBalancers = append(tf.LoadBalancers, k.TerraformLink()) } - terraform.SortLiterals(tf.LoadBalancers) + terraformWriter.SortLiterals(tf.LoadBalancers) for _, tg := range e.TargetGroups { tf.TargetGroupARNs = append(tf.TargetGroupARNs, tg.TerraformLink()) } - terraform.SortLiterals(tf.TargetGroupARNs) + terraformWriter.SortLiterals(tf.TargetGroupARNs) if e.UseMixedInstancesPolicy() { // Temporary warning until https://github.com/terraform-providers/terraform-provider-aws/issues/9750 is resolved @@ -988,8 +989,8 @@ func (_ *AutoscalingGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, c } // TerraformLink fills in the property -func (e *AutoscalingGroup) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_autoscaling_group", fi.StringValue(e.Name), "id") +func (e *AutoscalingGroup) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_autoscaling_group", fi.StringValue(e.Name), "id") } type cloudformationASGTag struct { diff --git a/upup/pkg/fi/cloudup/awstasks/autoscalinglifecyclehook.go b/upup/pkg/fi/cloudup/awstasks/autoscalinglifecyclehook.go index e4b0281b3b..28356e832b 100644 --- a/upup/pkg/fi/cloudup/awstasks/autoscalinglifecyclehook.go +++ b/upup/pkg/fi/cloudup/awstasks/autoscalinglifecyclehook.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -120,11 +121,11 @@ func (*AutoscalingLifecycleHook) RenderAWS(t *awsup.AWSAPITarget, a, e, changes } type terraformASGLifecycleHook struct { - Name *string `json:"name" cty:"name"` - AutoScalingGroupName *terraform.Literal `json:"autoscaling_group_name" cty:"autoscaling_group_name"` - DefaultResult *string `json:"default_result" cty:"default_result"` - HeartbeatTimeout *int64 `json:"heartbeat_timeout" cty:"heartbeat_timeout"` - LifecycleTransition *string `json:"lifecycle_transition" cty:"lifecycle_transition"` + Name *string `json:"name" cty:"name"` + AutoScalingGroupName *terraformWriter.Literal `json:"autoscaling_group_name" cty:"autoscaling_group_name"` + DefaultResult *string `json:"default_result" cty:"default_result"` + HeartbeatTimeout *int64 `json:"heartbeat_timeout" cty:"heartbeat_timeout"` + LifecycleTransition *string `json:"lifecycle_transition" cty:"lifecycle_transition"` } func (_ *AutoscalingLifecycleHook) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *AutoscalingLifecycleHook) error { diff --git a/upup/pkg/fi/cloudup/awstasks/classic_load_balancer.go b/upup/pkg/fi/cloudup/awstasks/classic_load_balancer.go index 1104f64453..21bbb25553 100644 --- a/upup/pkg/fi/cloudup/awstasks/classic_load_balancer.go +++ b/upup/pkg/fi/cloudup/awstasks/classic_load_balancer.go @@ -31,6 +31,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/util/pkg/slice" ) @@ -699,8 +700,8 @@ func (a OrderLoadBalancersByName) Less(i, j int) bool { type terraformLoadBalancer struct { LoadBalancerName *string `json:"name" cty:"name"` Listener []*terraformLoadBalancerListener `json:"listener" cty:"listener"` - SecurityGroups []*terraform.Literal `json:"security_groups" cty:"security_groups"` - Subnets []*terraform.Literal `json:"subnets" cty:"subnets"` + SecurityGroups []*terraformWriter.Literal `json:"security_groups" cty:"security_groups"` + Subnets []*terraformWriter.Literal `json:"subnets" cty:"subnets"` Internal *bool `json:"internal,omitempty" cty:"internal"` HealthCheck *terraformLoadBalancerHealthCheck `json:"health_check,omitempty" cty:"health_check"` @@ -754,12 +755,12 @@ func (_ *ClassicLoadBalancer) RenderTerraform(t *terraform.TerraformTarget, a, e for _, subnet := range e.Subnets { tf.Subnets = append(tf.Subnets, subnet.TerraformLink()) } - terraform.SortLiterals(tf.Subnets) + terraformWriter.SortLiterals(tf.Subnets) for _, sg := range e.SecurityGroups { tf.SecurityGroups = append(tf.SecurityGroups, sg.TerraformLink()) } - terraform.SortLiterals(tf.SecurityGroups) + terraformWriter.SortLiterals(tf.SecurityGroups) for loadBalancerPort, listener := range e.Listeners { loadBalancerPortInt, err := strconv.ParseInt(loadBalancerPort, 10, 64) @@ -827,7 +828,7 @@ func (_ *ClassicLoadBalancer) RenderTerraform(t *terraform.TerraformTarget, a, e return t.RenderResource("aws_elb", *e.Name, tf) } -func (e *ClassicLoadBalancer) TerraformLink(params ...string) *terraform.Literal { +func (e *ClassicLoadBalancer) TerraformLink(params ...string) *terraformWriter.Literal { shared := fi.BoolValue(e.Shared) if shared { if e.LoadBalancerName == nil { @@ -835,14 +836,14 @@ func (e *ClassicLoadBalancer) TerraformLink(params ...string) *terraform.Literal } klog.V(4).Infof("reusing existing LB with name %q", *e.LoadBalancerName) - return terraform.LiteralFromStringValue(*e.LoadBalancerName) + return terraformWriter.LiteralFromStringValue(*e.LoadBalancerName) } prop := "id" if len(params) > 0 { prop = params[0] } - return terraform.LiteralProperty("aws_elb", *e.Name, prop) + return terraformWriter.LiteralProperty("aws_elb", *e.Name, prop) } type cloudformationClassicLoadBalancer struct { diff --git a/upup/pkg/fi/cloudup/awstasks/dhcp_options.go b/upup/pkg/fi/cloudup/awstasks/dhcp_options.go index e77a6d720d..dc8f76bc67 100644 --- a/upup/pkg/fi/cloudup/awstasks/dhcp_options.go +++ b/upup/pkg/fi/cloudup/awstasks/dhcp_options.go @@ -28,6 +28,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -189,8 +190,8 @@ func (_ *DHCPOptions) RenderTerraform(t *terraform.TerraformTarget, a, e, change return t.RenderResource("aws_vpc_dhcp_options", *e.Name, tf) } -func (e *DHCPOptions) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_vpc_dhcp_options", *e.Name, "id") +func (e *DHCPOptions) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_vpc_dhcp_options", *e.Name, "id") } type cloudformationDHCPOptions struct { diff --git a/upup/pkg/fi/cloudup/awstasks/dnsname.go b/upup/pkg/fi/cloudup/awstasks/dnsname.go index 19d479ecb4..1a3ecfc651 100644 --- a/upup/pkg/fi/cloudup/awstasks/dnsname.go +++ b/upup/pkg/fi/cloudup/awstasks/dnsname.go @@ -29,6 +29,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -49,7 +50,7 @@ type DNSTarget interface { getHostedZoneId() *string CloudformationAttrDNSName() *cloudformation.Literal CloudformationAttrCanonicalHostedZoneNameID() *cloudformation.Literal - TerraformLink(...string) *terraform.Literal + TerraformLink(...string) *terraformWriter.Literal } func (e *DNSName) Find(c *fi.Context) (*DNSName, error) { @@ -290,14 +291,14 @@ type terraformRoute53Record struct { TTL *string `json:"ttl,omitempty" cty:"ttl"` Records []string `json:"records,omitempty" cty:"records"` - Alias *terraformAlias `json:"alias,omitempty" cty:"alias"` - ZoneID *terraform.Literal `json:"zone_id" cty:"zone_id"` + Alias *terraformAlias `json:"alias,omitempty" cty:"alias"` + ZoneID *terraformWriter.Literal `json:"zone_id" cty:"zone_id"` } type terraformAlias struct { - Name *terraform.Literal `json:"name" cty:"name"` - ZoneID *terraform.Literal `json:"zone_id" cty:"zone_id"` - EvaluateTargetHealth *bool `json:"evaluate_target_health" cty:"evaluate_target_health"` + Name *terraformWriter.Literal `json:"name" cty:"name"` + ZoneID *terraformWriter.Literal `json:"zone_id" cty:"zone_id"` + EvaluateTargetHealth *bool `json:"evaluate_target_health" cty:"evaluate_target_health"` } func (_ *DNSName) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *DNSName) error { @@ -318,8 +319,8 @@ func (_ *DNSName) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *D return t.RenderResource("aws_route53_record", *e.Name, tf) } -func (e *DNSName) TerraformLink() *terraform.Literal { - return terraform.LiteralSelfLink("aws_route53_record", *e.Name) +func (e *DNSName) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralSelfLink("aws_route53_record", *e.Name) } type cloudformationRoute53Record struct { diff --git a/upup/pkg/fi/cloudup/awstasks/dnszone.go b/upup/pkg/fi/cloudup/awstasks/dnszone.go index 53d85210e4..4745f5528b 100644 --- a/upup/pkg/fi/cloudup/awstasks/dnszone.go +++ b/upup/pkg/fi/cloudup/awstasks/dnszone.go @@ -31,6 +31,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // DNSZone is a zone object in a dns provider @@ -226,9 +227,9 @@ func (_ *DNSZone) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *DNSZone) error } type terraformRoute53ZoneAssociation struct { - ZoneID *terraform.Literal `json:"zone_id" cty:"zone_id"` - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - Lifecycle *terraform.Lifecycle `json:"lifecycle,omitempty" cty:"lifecycle"` + ZoneID *terraformWriter.Literal `json:"zone_id" cty:"zone_id"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + Lifecycle *terraform.Lifecycle `json:"lifecycle,omitempty" cty:"lifecycle"` } func (_ *DNSZone) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *DNSZone) error { @@ -271,7 +272,7 @@ func (_ *DNSZone) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *D if assocNeeded { klog.Infof("No association between VPC %q and zone %q; adding", vpcName, aws.StringValue(z.HostedZone.Name)) tf := &terraformRoute53ZoneAssociation{ - ZoneID: terraform.LiteralFromStringValue(*e.ZoneID), + ZoneID: terraformWriter.LiteralFromStringValue(*e.ZoneID), VPCID: e.PrivateVPC.TerraformLink(), } return t.RenderResource("aws_route53_zone_association", *e.Name, tf) @@ -290,13 +291,13 @@ func (_ *DNSZone) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *D return fmt.Errorf("Creation of Route53 hosted zones is not supported for terraform") } -func (e *DNSZone) TerraformLink() *terraform.Literal { +func (e *DNSZone) TerraformLink() *terraformWriter.Literal { if e.ZoneID != nil { klog.V(4).Infof("reusing existing route53 zone with id %q", *e.ZoneID) - return terraform.LiteralFromStringValue(*e.ZoneID) + return terraformWriter.LiteralFromStringValue(*e.ZoneID) } - return terraform.LiteralSelfLink("aws_route53_zone", *e.Name) + return terraformWriter.LiteralSelfLink("aws_route53_zone", *e.Name) } type cloudformationRoute53Zone struct { diff --git a/upup/pkg/fi/cloudup/awstasks/ebsvolume.go b/upup/pkg/fi/cloudup/awstasks/ebsvolume.go index 835eade70f..0be4ee5513 100644 --- a/upup/pkg/fi/cloudup/awstasks/ebsvolume.go +++ b/upup/pkg/fi/cloudup/awstasks/ebsvolume.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/aws/aws-sdk-go/service/ec2" "k8s.io/klog/v2" @@ -243,9 +244,9 @@ func (_ *EBSVolume) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("aws_ebs_volume", tfName, tf) } -func (e *EBSVolume) TerraformLink() *terraform.Literal { +func (e *EBSVolume) TerraformLink() *terraformWriter.Literal { tfName, _ := e.TerraformName() - return terraform.LiteralSelfLink("aws_ebs_volume", tfName) + return terraformWriter.LiteralSelfLink("aws_ebs_volume", tfName) } // TerraformName returns the terraform-safe name, along with a boolean indicating of whether name-prefixing was needed. diff --git a/upup/pkg/fi/cloudup/awstasks/elastic_ip.go b/upup/pkg/fi/cloudup/awstasks/elastic_ip.go index 56db87e7c2..620b4fd106 100644 --- a/upup/pkg/fi/cloudup/awstasks/elastic_ip.go +++ b/upup/pkg/fi/cloudup/awstasks/elastic_ip.go @@ -22,6 +22,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" @@ -292,15 +293,15 @@ func (_ *ElasticIP) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("aws_eip", *e.Name, tf) } -func (e *ElasticIP) TerraformLink() *terraform.Literal { +func (e *ElasticIP) TerraformLink() *terraformWriter.Literal { if fi.BoolValue(e.Shared) { if e.ID == nil { klog.Fatalf("ID must be set, if ElasticIP is shared: %v", e) } - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } - return terraform.LiteralProperty("aws_eip", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_eip", *e.Name, "id") } type cloudformationElasticIP struct { diff --git a/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go b/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go index 74d6363642..d5b64a060e 100644 --- a/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go +++ b/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go @@ -27,6 +27,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -126,9 +127,9 @@ func (eb *EventBridgeRule) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Event } type terraformEventBridgeRule struct { - Name *string `json:"name" cty:"name"` - EventPattern *terraform.Literal `json:"event_pattern" cty:"event_pattern"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + Name *string `json:"name" cty:"name"` + EventPattern *terraformWriter.Literal `json:"event_pattern" cty:"event_pattern"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *EventBridgeRule) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *EventBridgeRule) error { @@ -146,8 +147,8 @@ func (_ *EventBridgeRule) RenderTerraform(t *terraform.TerraformTarget, a, e, ch return t.RenderResource("aws_cloudwatch_event_rule", *e.Name, tf) } -func (eb *EventBridgeRule) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_cloudwatch_event_rule", fi.StringValue(eb.Name), "id") +func (eb *EventBridgeRule) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_cloudwatch_event_rule", fi.StringValue(eb.Name), "id") } type cloudformationTarget struct { diff --git a/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go b/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go index 9d12b13345..5634961023 100644 --- a/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go +++ b/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go @@ -20,6 +20,7 @@ import ( "fmt" "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/eventbridge" @@ -127,8 +128,8 @@ func (eb *EventBridgeTarget) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Eve } type terraformEventBridgeTarget struct { - RuleName *terraform.Literal `json:"rule" cty:"rule"` - TargetArn *string `json:"arn" cty:"arn"` + RuleName *terraformWriter.Literal `json:"rule" cty:"rule"` + TargetArn *string `json:"arn" cty:"arn"` } func (_ *EventBridgeTarget) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *EventBridgeTarget) error { diff --git a/upup/pkg/fi/cloudup/awstasks/iaminstanceprofile.go b/upup/pkg/fi/cloudup/awstasks/iaminstanceprofile.go index e263421b5b..ea2262a552 100644 --- a/upup/pkg/fi/cloudup/awstasks/iaminstanceprofile.go +++ b/upup/pkg/fi/cloudup/awstasks/iaminstanceprofile.go @@ -23,6 +23,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" @@ -165,11 +166,11 @@ func (_ *IAMInstanceProfile) RenderTerraform(t *terraform.TerraformTarget, a, e, return nil } -func (e *IAMInstanceProfile) TerraformLink() *terraform.Literal { +func (e *IAMInstanceProfile) TerraformLink() *terraformWriter.Literal { if fi.BoolValue(e.Shared) { - return terraform.LiteralFromStringValue(fi.StringValue(e.Name)) + return terraformWriter.LiteralFromStringValue(fi.StringValue(e.Name)) } - return terraform.LiteralProperty("aws_iam_instance_profile", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_iam_instance_profile", *e.Name, "id") } func (_ *IAMInstanceProfile) RenderCloudformation(t *cloudformation.CloudformationTarget, a, e, changes *IAMInstanceProfile) error { diff --git a/upup/pkg/fi/cloudup/awstasks/iaminstanceprofilerole.go b/upup/pkg/fi/cloudup/awstasks/iaminstanceprofilerole.go index a96c1c19b5..284627e70c 100644 --- a/upup/pkg/fi/cloudup/awstasks/iaminstanceprofilerole.go +++ b/upup/pkg/fi/cloudup/awstasks/iaminstanceprofilerole.go @@ -27,6 +27,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -110,9 +111,9 @@ func (_ *IAMInstanceProfileRole) RenderAWS(t *awsup.AWSAPITarget, a, e, changes } type terraformIAMInstanceProfile struct { - Name *string `json:"name" cty:"name"` - Role *terraform.Literal `json:"role" cty:"role"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + Name *string `json:"name" cty:"name"` + Role *terraformWriter.Literal `json:"role" cty:"role"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *IAMInstanceProfileRole) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *IAMInstanceProfileRole) error { diff --git a/upup/pkg/fi/cloudup/awstasks/iamoidcprovider.go b/upup/pkg/fi/cloudup/awstasks/iamoidcprovider.go index 9995b9289a..1f3807b34c 100644 --- a/upup/pkg/fi/cloudup/awstasks/iamoidcprovider.go +++ b/upup/pkg/fi/cloudup/awstasks/iamoidcprovider.go @@ -28,6 +28,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -186,8 +187,8 @@ type terraformIAMOIDCProvider struct { ClientIDList []*string `json:"client_id_list" cty:"client_id_list"` ThumbprintList []*string `json:"thumbprint_list" cty:"thumbprint_list"` - AssumeRolePolicy *terraform.Literal `json:"assume_role_policy" cty:"assume_role_policy"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + AssumeRolePolicy *terraformWriter.Literal `json:"assume_role_policy" cty:"assume_role_policy"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (p *IAMOIDCProvider) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *IAMOIDCProvider) error { @@ -202,8 +203,8 @@ func (p *IAMOIDCProvider) RenderTerraform(t *terraform.TerraformTarget, a, e, ch return t.RenderResource("aws_iam_openid_connect_provider", *e.Name, tf) } -func (e *IAMOIDCProvider) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_iam_openid_connect_provider", *e.Name, "arn") +func (e *IAMOIDCProvider) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_iam_openid_connect_provider", *e.Name, "arn") } func (_ *IAMOIDCProvider) RenderCloudformation(t *cloudformation.CloudformationTarget, a, e, changes *IAMOIDCProvider) error { diff --git a/upup/pkg/fi/cloudup/awstasks/iamrole.go b/upup/pkg/fi/cloudup/awstasks/iamrole.go index 94b3e048fb..e207c10950 100644 --- a/upup/pkg/fi/cloudup/awstasks/iamrole.go +++ b/upup/pkg/fi/cloudup/awstasks/iamrole.go @@ -33,6 +33,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -251,10 +252,10 @@ func (_ *IAMRole) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *IAMRole) error } type terraformIAMRole struct { - Name *string `json:"name" cty:"name"` - AssumeRolePolicy *terraform.Literal `json:"assume_role_policy" cty:"assume_role_policy"` - PermissionsBoundary *string `json:"permissions_boundary,omitempty" cty:"permissions_boundary"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + Name *string `json:"name" cty:"name"` + AssumeRolePolicy *terraformWriter.Literal `json:"assume_role_policy" cty:"assume_role_policy"` + PermissionsBoundary *string `json:"permissions_boundary,omitempty" cty:"permissions_boundary"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *IAMRole) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *IAMRole) error { @@ -274,15 +275,15 @@ func (_ *IAMRole) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *I } if fi.StringValue(e.ExportWithID) != "" { - t.AddOutputVariable(*e.ExportWithID+"_role_arn", terraform.LiteralProperty("aws_iam_role", *e.Name, "arn")) + t.AddOutputVariable(*e.ExportWithID+"_role_arn", terraformWriter.LiteralProperty("aws_iam_role", *e.Name, "arn")) t.AddOutputVariable(*e.ExportWithID+"_role_name", e.TerraformLink()) } return t.RenderResource("aws_iam_role", *e.Name, tf) } -func (e *IAMRole) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_iam_role", *e.Name, "name") +func (e *IAMRole) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_iam_role", *e.Name, "name") } type cloudformationIAMRole struct { diff --git a/upup/pkg/fi/cloudup/awstasks/iamrolepolicy.go b/upup/pkg/fi/cloudup/awstasks/iamrolepolicy.go index 334bef04cb..50bcf7b62a 100644 --- a/upup/pkg/fi/cloudup/awstasks/iamrolepolicy.go +++ b/upup/pkg/fi/cloudup/awstasks/iamrolepolicy.go @@ -32,6 +32,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -294,10 +295,10 @@ func (e *IAMRolePolicy) policyDocumentString() (string, error) { } type terraformIAMRolePolicy struct { - Name *string `json:"name,omitempty" cty:"name"` - Role *terraform.Literal `json:"role" cty:"role"` - PolicyDocument *terraform.Literal `json:"policy,omitempty" cty:"policy"` - PolicyArn *string `json:"policy_arn,omitempty" cty:"policy_arn"` + Name *string `json:"name,omitempty" cty:"name"` + Role *terraformWriter.Literal `json:"role" cty:"role"` + PolicyDocument *terraformWriter.Literal `json:"policy,omitempty" cty:"policy"` + PolicyArn *string `json:"policy_arn,omitempty" cty:"policy_arn"` } func (_ *IAMRolePolicy) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *IAMRolePolicy) error { @@ -345,8 +346,8 @@ func (_ *IAMRolePolicy) RenderTerraform(t *terraform.TerraformTarget, a, e, chan return t.RenderResource("aws_iam_role_policy", *e.Name, tf) } -func (e *IAMRolePolicy) TerraformLink() *terraform.Literal { - return terraform.LiteralSelfLink("aws_iam_role_policy", *e.Name) +func (e *IAMRolePolicy) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralSelfLink("aws_iam_role_policy", *e.Name) } type cloudformationIAMRolePolicy struct { diff --git a/upup/pkg/fi/cloudup/awstasks/instance.go b/upup/pkg/fi/cloudup/awstasks/instance.go index 2a6f41551a..5c46d699de 100644 --- a/upup/pkg/fi/cloudup/awstasks/instance.go +++ b/upup/pkg/fi/cloudup/awstasks/instance.go @@ -27,7 +27,7 @@ import ( "k8s.io/klog/v2" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" - "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // MaxUserDataSize is the max size of the userdata @@ -297,14 +297,14 @@ func (_ *Instance) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Instance) err return t.AddAWSTags(*e.ID, e.Tags) } -func (e *Instance) TerraformLink() *terraform.Literal { +func (e *Instance) TerraformLink() *terraformWriter.Literal { if fi.BoolValue(e.Shared) { if e.ID == nil { klog.Fatalf("ID must be set, if NAT Instance is shared: %s", e) } - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } - return terraform.LiteralSelfLink("aws_instance", *e.Name) + return terraformWriter.LiteralSelfLink("aws_instance", *e.Name) } diff --git a/upup/pkg/fi/cloudup/awstasks/internetgateway.go b/upup/pkg/fi/cloudup/awstasks/internetgateway.go index 5123d77acd..bd076b95bb 100644 --- a/upup/pkg/fi/cloudup/awstasks/internetgateway.go +++ b/upup/pkg/fi/cloudup/awstasks/internetgateway.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -179,8 +180,8 @@ func (_ *InternetGateway) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Intern } type terraformInternetGateway struct { - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *InternetGateway) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *InternetGateway) error { @@ -218,7 +219,7 @@ func (_ *InternetGateway) RenderTerraform(t *terraform.TerraformTarget, a, e, ch return t.RenderResource("aws_internet_gateway", *e.Name, tf) } -func (e *InternetGateway) TerraformLink() *terraform.Literal { +func (e *InternetGateway) TerraformLink() *terraformWriter.Literal { shared := fi.BoolValue(e.Shared) if shared { if e.ID == nil { @@ -226,10 +227,10 @@ func (e *InternetGateway) TerraformLink() *terraform.Literal { } klog.V(4).Infof("reusing existing InternetGateway with id %q", *e.ID) - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } - return terraform.LiteralProperty("aws_internet_gateway", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_internet_gateway", *e.Name, "id") } type cloudformationInternetGateway struct { diff --git a/upup/pkg/fi/cloudup/awstasks/launchtemplate_target_terraform.go b/upup/pkg/fi/cloudup/awstasks/launchtemplate_target_terraform.go index ad6cb5e588..41a0804f2e 100644 --- a/upup/pkg/fi/cloudup/awstasks/launchtemplate_target_terraform.go +++ b/upup/pkg/fi/cloudup/awstasks/launchtemplate_target_terraform.go @@ -23,6 +23,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) type terraformLaunchTemplateNetworkInterface struct { @@ -31,7 +32,7 @@ type terraformLaunchTemplateNetworkInterface struct { // DeleteOnTermination indicates whether the network interface should be destroyed on instance termination. DeleteOnTermination *bool `json:"delete_on_termination,omitempty" cty:"delete_on_termination"` // SecurityGroups is a list of security group ids. - SecurityGroups []*terraform.Literal `json:"security_groups,omitempty" cty:"security_groups"` + SecurityGroups []*terraformWriter.Literal `json:"security_groups,omitempty" cty:"security_groups"` } type terraformLaunchTemplateMonitoring struct { @@ -56,7 +57,7 @@ type terraformLaunchTemplatePlacement struct { type terraformLaunchTemplateIAMProfile struct { // Name is the name of the profile - Name *terraform.Literal `json:"name,omitempty" cty:"name"` + Name *terraformWriter.Literal `json:"name,omitempty" cty:"name"` } type terraformLaunchTemplateMarketOptionsSpotOptions struct { @@ -144,7 +145,7 @@ type terraformLaunchTemplate struct { // InstanceType is the type of instance InstanceType *string `json:"instance_type,omitempty" cty:"instance_type"` // KeyName is the ssh key to use - KeyName *terraform.Literal `json:"key_name,omitempty" cty:"key_name"` + KeyName *terraformWriter.Literal `json:"key_name,omitempty" cty:"key_name"` // MarketOptions are the spot pricing options MarketOptions []*terraformLaunchTemplateMarketOptions `json:"instance_market_options,omitempty" cty:"instance_market_options"` // MetadataOptions are the instance metadata options. @@ -160,17 +161,17 @@ type terraformLaunchTemplate struct { // TagSpecifications are the tags to apply to a resource when it is created. TagSpecifications []*terraformLaunchTemplateTagSpecification `json:"tag_specifications,omitempty" cty:"tag_specifications"` // UserData is the user data for the instances - UserData *terraform.Literal `json:"user_data,omitempty" cty:"user_data"` + UserData *terraformWriter.Literal `json:"user_data,omitempty" cty:"user_data"` } // TerraformLink returns the terraform reference -func (t *LaunchTemplate) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_launch_template", fi.StringValue(t.Name), "id") +func (t *LaunchTemplate) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_launch_template", fi.StringValue(t.Name), "id") } // VersionLink returns the terraform version reference -func (t *LaunchTemplate) VersionLink() *terraform.Literal { - return terraform.LiteralProperty("aws_launch_template", fi.StringValue(t.Name), "latest_version") +func (t *LaunchTemplate) VersionLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_launch_template", fi.StringValue(t.Name), "latest_version") } // RenderTerraform is responsible for rendering the terraform json diff --git a/upup/pkg/fi/cloudup/awstasks/natgateway.go b/upup/pkg/fi/cloudup/awstasks/natgateway.go index 35d61052c0..ab5293c9bc 100644 --- a/upup/pkg/fi/cloudup/awstasks/natgateway.go +++ b/upup/pkg/fi/cloudup/awstasks/natgateway.go @@ -28,6 +28,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -361,9 +362,9 @@ func (_ *NatGateway) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *NatGateway) } type terraformNATGateway struct { - AllocationID *terraform.Literal `json:"allocation_id,omitempty" cty:"allocation_id"` - SubnetID *terraform.Literal `json:"subnet_id,omitempty" cty:"subnet_id"` - Tag map[string]string `json:"tags,omitempty" cty:"tags"` + AllocationID *terraformWriter.Literal `json:"allocation_id,omitempty" cty:"allocation_id"` + SubnetID *terraformWriter.Literal `json:"subnet_id,omitempty" cty:"subnet_id"` + Tag map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *NatGateway) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *NatGateway) error { @@ -385,16 +386,16 @@ func (_ *NatGateway) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("aws_nat_gateway", *e.Name, tf) } -func (e *NatGateway) TerraformLink() *terraform.Literal { +func (e *NatGateway) TerraformLink() *terraformWriter.Literal { if fi.BoolValue(e.Shared) { if e.ID == nil { klog.Fatalf("ID must be set, if NatGateway is shared: %s", e) } - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } - return terraform.LiteralProperty("aws_nat_gateway", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_nat_gateway", *e.Name, "id") } type cloudformationNATGateway struct { diff --git a/upup/pkg/fi/cloudup/awstasks/network_load_balancer.go b/upup/pkg/fi/cloudup/awstasks/network_load_balancer.go index c0adb79f1b..328612a6b5 100644 --- a/upup/pkg/fi/cloudup/awstasks/network_load_balancer.go +++ b/upup/pkg/fi/cloudup/awstasks/network_load_balancer.go @@ -31,6 +31,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // NetworkLoadBalancer manages an NLB. We find the existing NLB using the Name tag. @@ -736,13 +737,13 @@ type terraformNetworkLoadBalancer struct { } type terraformNetworkLoadBalancerSubnetMapping struct { - Subnet *terraform.Literal `json:"subnet_id" cty:"subnet_id"` - AllocationID *string `json:"allocation_id,omitempty" cty:"allocation_id"` - PrivateIPv4Address *string `json:"private_ipv4_address,omitempty" cty:"private_ipv4_address"` + Subnet *terraformWriter.Literal `json:"subnet_id" cty:"subnet_id"` + AllocationID *string `json:"allocation_id,omitempty" cty:"allocation_id"` + PrivateIPv4Address *string `json:"private_ipv4_address,omitempty" cty:"private_ipv4_address"` } type terraformNetworkLoadBalancerListener struct { - LoadBalancer *terraform.Literal `json:"load_balancer_arn" cty:"load_balancer_arn"` + LoadBalancer *terraformWriter.Literal `json:"load_balancer_arn" cty:"load_balancer_arn"` Port int64 `json:"port" cty:"port"` Protocol string `json:"protocol" cty:"protocol"` CertificateARN *string `json:"certificate_arn,omitempty" cty:"certificate_arn"` @@ -751,8 +752,8 @@ type terraformNetworkLoadBalancerListener struct { } type terraformNetworkLoadBalancerListenerAction struct { - Type string `json:"type" cty:"type"` - TargetGroupARN *terraform.Literal `json:"target_group_arn,omitempty" cty:"target_group_arn"` + Type string `json:"type" cty:"type"` + TargetGroupARN *terraformWriter.Literal `json:"target_group_arn,omitempty" cty:"target_group_arn"` } func (_ *NetworkLoadBalancer) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *NetworkLoadBalancer) error { @@ -816,12 +817,12 @@ func (_ *NetworkLoadBalancer) RenderTerraform(t *terraform.TerraformTarget, a, e return nil } -func (e *NetworkLoadBalancer) TerraformLink(params ...string) *terraform.Literal { +func (e *NetworkLoadBalancer) TerraformLink(params ...string) *terraformWriter.Literal { prop := "id" if len(params) > 0 { prop = params[0] } - return terraform.LiteralProperty("aws_lb", *e.Name, prop) + return terraformWriter.LiteralProperty("aws_lb", *e.Name, prop) } type cloudformationNetworkLoadBalancer struct { diff --git a/upup/pkg/fi/cloudup/awstasks/route.go b/upup/pkg/fi/cloudup/awstasks/route.go index 43303f275a..fa02b5c2fd 100644 --- a/upup/pkg/fi/cloudup/awstasks/route.go +++ b/upup/pkg/fi/cloudup/awstasks/route.go @@ -26,6 +26,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -236,12 +237,12 @@ func checkNotNil(s *string) *string { } type terraformRoute struct { - RouteTableID *terraform.Literal `json:"route_table_id" cty:"route_table_id"` - CIDR *string `json:"destination_cidr_block,omitempty" cty:"destination_cidr_block"` - InternetGatewayID *terraform.Literal `json:"gateway_id,omitempty" cty:"gateway_id"` - NATGatewayID *terraform.Literal `json:"nat_gateway_id,omitempty" cty:"nat_gateway_id"` - TransitGatewayID *string `json:"transit_gateway_id,omitempty" cty:"transit_gateway_id"` - InstanceID *terraform.Literal `json:"instance_id,omitempty" cty:"instance_id"` + RouteTableID *terraformWriter.Literal `json:"route_table_id" cty:"route_table_id"` + CIDR *string `json:"destination_cidr_block,omitempty" cty:"destination_cidr_block"` + InternetGatewayID *terraformWriter.Literal `json:"gateway_id,omitempty" cty:"gateway_id"` + NATGatewayID *terraformWriter.Literal `json:"nat_gateway_id,omitempty" cty:"nat_gateway_id"` + TransitGatewayID *string `json:"transit_gateway_id,omitempty" cty:"transit_gateway_id"` + InstanceID *terraformWriter.Literal `json:"instance_id,omitempty" cty:"instance_id"` } func (_ *Route) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Route) error { diff --git a/upup/pkg/fi/cloudup/awstasks/routetable.go b/upup/pkg/fi/cloudup/awstasks/routetable.go index 5cc7cbdb32..62b65cce6f 100644 --- a/upup/pkg/fi/cloudup/awstasks/routetable.go +++ b/upup/pkg/fi/cloudup/awstasks/routetable.go @@ -26,6 +26,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -191,8 +192,8 @@ func (_ *RouteTable) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *RouteTable) } type terraformRouteTable struct { - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *RouteTable) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *RouteTable) error { @@ -212,8 +213,8 @@ func (_ *RouteTable) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("aws_route_table", *e.Name, tf) } -func (e *RouteTable) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("aws_route_table", *e.Name, "id") +func (e *RouteTable) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("aws_route_table", *e.Name, "id") } type cloudformationRouteTable struct { diff --git a/upup/pkg/fi/cloudup/awstasks/routetableassociation.go b/upup/pkg/fi/cloudup/awstasks/routetableassociation.go index a095c20dd5..8b5197fb56 100644 --- a/upup/pkg/fi/cloudup/awstasks/routetableassociation.go +++ b/upup/pkg/fi/cloudup/awstasks/routetableassociation.go @@ -26,6 +26,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -187,8 +188,8 @@ func (_ *RouteTableAssociation) RenderAWS(t *awsup.AWSAPITarget, a, e, changes * } type terraformRouteTableAssociation struct { - SubnetID *terraform.Literal `json:"subnet_id" cty:"subnet_id"` - RouteTableID *terraform.Literal `json:"route_table_id" cty:"route_table_id"` + SubnetID *terraformWriter.Literal `json:"subnet_id" cty:"subnet_id"` + RouteTableID *terraformWriter.Literal `json:"route_table_id" cty:"route_table_id"` } func (_ *RouteTableAssociation) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *RouteTableAssociation) error { @@ -200,8 +201,8 @@ func (_ *RouteTableAssociation) RenderTerraform(t *terraform.TerraformTarget, a, return t.RenderResource("aws_route_table_association", *e.Name, tf) } -func (e *RouteTableAssociation) TerraformLink() *terraform.Literal { - return terraform.LiteralSelfLink("aws_route_table_association", *e.Name) +func (e *RouteTableAssociation) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralSelfLink("aws_route_table_association", *e.Name) } type cloudformationRouteTableAssociation struct { diff --git a/upup/pkg/fi/cloudup/awstasks/securitygroup.go b/upup/pkg/fi/cloudup/awstasks/securitygroup.go index 79a2c057ee..e161e33ab5 100644 --- a/upup/pkg/fi/cloudup/awstasks/securitygroup.go +++ b/upup/pkg/fi/cloudup/awstasks/securitygroup.go @@ -28,6 +28,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -184,10 +185,10 @@ func (_ *SecurityGroup) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Security } type terraformSecurityGroup struct { - Name *string `json:"name" cty:"name"` - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - Description *string `json:"description" cty:"description"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + Name *string `json:"name" cty:"name"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + Description *string `json:"description" cty:"description"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *SecurityGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *SecurityGroup) error { @@ -207,18 +208,18 @@ func (_ *SecurityGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, chan return t.RenderResource("aws_security_group", *e.Name, tf) } -func (e *SecurityGroup) TerraformLink() *terraform.Literal { +func (e *SecurityGroup) TerraformLink() *terraformWriter.Literal { shared := fi.BoolValue(e.Shared) if shared { // Not terraform owned / managed if e.ID != nil { - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } else { klog.Warningf("ID not set on shared subnet %v", e) } } - return terraform.LiteralProperty("aws_security_group", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_security_group", *e.Name, "id") } type cloudformationSecurityGroup struct { diff --git a/upup/pkg/fi/cloudup/awstasks/securitygrouprule.go b/upup/pkg/fi/cloudup/awstasks/securitygrouprule.go index 965609138e..312831b665 100644 --- a/upup/pkg/fi/cloudup/awstasks/securitygrouprule.go +++ b/upup/pkg/fi/cloudup/awstasks/securitygrouprule.go @@ -29,6 +29,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -293,8 +294,8 @@ func (_ *SecurityGroupRule) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Secu type terraformSecurityGroupIngress struct { Type *string `json:"type" cty:"type"` - SecurityGroup *terraform.Literal `json:"security_group_id" cty:"security_group_id"` - SourceGroup *terraform.Literal `json:"source_security_group_id,omitempty" cty:"source_security_group_id"` + SecurityGroup *terraformWriter.Literal `json:"security_group_id" cty:"security_group_id"` + SourceGroup *terraformWriter.Literal `json:"source_security_group_id,omitempty" cty:"source_security_group_id"` FromPort *int64 `json:"from_port,omitempty" cty:"from_port"` ToPort *int64 `json:"to_port,omitempty" cty:"to_port"` diff --git a/upup/pkg/fi/cloudup/awstasks/sqs.go b/upup/pkg/fi/cloudup/awstasks/sqs.go index 2b70ed1fe5..7cebcbebab 100644 --- a/upup/pkg/fi/cloudup/awstasks/sqs.go +++ b/upup/pkg/fi/cloudup/awstasks/sqs.go @@ -24,6 +24,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/sqs" @@ -176,10 +177,10 @@ func (q *SQS) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *SQS) error { } type terraformSQSQueue struct { - Name *string `json:"name" cty:"name"` - MessageRetentionSeconds int `json:"message_retention_seconds" cty:"message_retention_seconds"` - Policy *terraform.Literal `json:"policy" cty:"policy"` - Tags map[string]string `json:"tags" cty:"tags"` + Name *string `json:"name" cty:"name"` + MessageRetentionSeconds int `json:"message_retention_seconds" cty:"message_retention_seconds"` + Policy *terraformWriter.Literal `json:"policy" cty:"policy"` + Tags map[string]string `json:"tags" cty:"tags"` } func (_ *SQS) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *SQS) error { diff --git a/upup/pkg/fi/cloudup/awstasks/sshkey.go b/upup/pkg/fi/cloudup/awstasks/sshkey.go index e8199feb7b..18b7de3a18 100644 --- a/upup/pkg/fi/cloudup/awstasks/sshkey.go +++ b/upup/pkg/fi/cloudup/awstasks/sshkey.go @@ -23,6 +23,7 @@ import ( "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/ec2" "k8s.io/klog/v2" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/pkg/pki" "k8s.io/kops/upup/pkg/fi" @@ -182,9 +183,9 @@ func (_ *SSHKey) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *SSHKey) error { } type terraformSSHKey struct { - Name *string `json:"key_name" cty:"key_name"` - PublicKey *terraform.Literal `json:"public_key" cty:"public_key"` - Tags map[string]string `json:"tags" cty:"tags"` + Name *string `json:"key_name" cty:"key_name"` + PublicKey *terraformWriter.Literal `json:"public_key" cty:"public_key"` + Tags map[string]string `json:"tags" cty:"tags"` } func (_ *SSHKey) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *SSHKey) error { @@ -213,15 +214,15 @@ func (e *SSHKey) IsExistingKey() bool { return e.PublicKey == nil } -func (e *SSHKey) TerraformLink() *terraform.Literal { +func (e *SSHKey) TerraformLink() *terraformWriter.Literal { if e.NoSSHKey() { return nil } if e.IsExistingKey() { - return terraform.LiteralFromStringValue(*e.Name) + return terraformWriter.LiteralFromStringValue(*e.Name) } tfName := strings.Replace(*e.Name, ":", "", -1) - return terraform.LiteralProperty("aws_key_pair", tfName, "id") + return terraformWriter.LiteralProperty("aws_key_pair", tfName, "id") } func (_ *SSHKey) RenderCloudformation(t *cloudformation.CloudformationTarget, a, e, changes *SSHKey) error { diff --git a/upup/pkg/fi/cloudup/awstasks/subnet.go b/upup/pkg/fi/cloudup/awstasks/subnet.go index e0ff3a39dd..b1baf44e82 100644 --- a/upup/pkg/fi/cloudup/awstasks/subnet.go +++ b/upup/pkg/fi/cloudup/awstasks/subnet.go @@ -26,6 +26,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/upup/pkg/fi/utils" ) @@ -215,10 +216,10 @@ func subnetSlicesEqualIgnoreOrder(l, r []*Subnet) bool { } type terraformSubnet struct { - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - CIDR *string `json:"cidr_block" cty:"cidr_block"` - AvailabilityZone *string `json:"availability_zone" cty:"availability_zone"` - Tags map[string]string `json:"tags,omitempty" cty:"tags"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + CIDR *string `json:"cidr_block" cty:"cidr_block"` + AvailabilityZone *string `json:"availability_zone" cty:"availability_zone"` + Tags map[string]string `json:"tags,omitempty" cty:"tags"` } func (_ *Subnet) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Subnet) error { @@ -237,7 +238,7 @@ func (_ *Subnet) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Su // We probably shouldn't output subnet_ids only in this case - we normally output them by role, // but removing it now might break people. We could always output subnet_ids though, if we // ever get a request for that. - return t.AddOutputVariableArray("subnet_ids", terraform.LiteralFromStringValue(*e.ID)) + return t.AddOutputVariableArray("subnet_ids", terraformWriter.LiteralFromStringValue(*e.ID)) } tf := &terraformSubnet{ @@ -250,7 +251,7 @@ func (_ *Subnet) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Su return t.RenderResource("aws_subnet", *e.Name, tf) } -func (e *Subnet) TerraformLink() *terraform.Literal { +func (e *Subnet) TerraformLink() *terraformWriter.Literal { shared := fi.BoolValue(e.Shared) if shared { if e.ID == nil { @@ -258,10 +259,10 @@ func (e *Subnet) TerraformLink() *terraform.Literal { } klog.V(4).Infof("reusing existing subnet with id %q", *e.ID) - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } - return terraform.LiteralProperty("aws_subnet", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_subnet", *e.Name, "id") } type cloudformationSubnet struct { diff --git a/upup/pkg/fi/cloudup/awstasks/targetgroup.go b/upup/pkg/fi/cloudup/awstasks/targetgroup.go index 146200cc78..fa778fb66f 100644 --- a/upup/pkg/fi/cloudup/awstasks/targetgroup.go +++ b/upup/pkg/fi/cloudup/awstasks/targetgroup.go @@ -27,6 +27,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -210,7 +211,7 @@ type terraformTargetGroup struct { Name string `json:"name" cty:"name"` Port int64 `json:"port" cty:"port"` Protocol string `json:"protocol" cty:"protocol"` - VPCID terraform.Literal `json:"vpc_id" cty:"vpc_id"` + VPCID terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` Tags map[string]string `json:"tags,omitempty" cty:"tags"` HealthCheck terraformTargetGroupHealthCheck `json:"health_check" cty:"health_check"` } @@ -247,16 +248,16 @@ func (_ *TargetGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, change return t.RenderResource("aws_lb_target_group", *e.Name, tf) } -func (e *TargetGroup) TerraformLink(params ...string) *terraform.Literal { +func (e *TargetGroup) TerraformLink(params ...string) *terraformWriter.Literal { shared := fi.BoolValue(e.Shared) if shared { if e.ARN != nil { - return terraform.LiteralFromStringValue(*e.ARN) + return terraformWriter.LiteralFromStringValue(*e.ARN) } else { klog.Warningf("ID not set on shared Target Group %v", e) } } - return terraform.LiteralProperty("aws_lb_target_group", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_lb_target_group", *e.Name, "id") } type cloudformationTargetGroup struct { diff --git a/upup/pkg/fi/cloudup/awstasks/vpc.go b/upup/pkg/fi/cloudup/awstasks/vpc.go index c0677ba514..c585e2855c 100644 --- a/upup/pkg/fi/cloudup/awstasks/vpc.go +++ b/upup/pkg/fi/cloudup/awstasks/vpc.go @@ -28,6 +28,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -267,7 +268,7 @@ func (_ *VPC) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VPC) return nil } - if err := t.AddOutputVariable("vpc_cidr_block", terraform.LiteralProperty("aws_vpc", *e.Name, "cidr_block")); err != nil { + if err := t.AddOutputVariable("vpc_cidr_block", terraformWriter.LiteralProperty("aws_vpc", *e.Name, "cidr_block")); err != nil { // TODO: Should we try to output vpc_cidr_block for shared vpcs? return err } @@ -282,7 +283,7 @@ func (_ *VPC) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VPC) return t.RenderResource("aws_vpc", *e.Name, tf) } -func (e *VPC) TerraformLink() *terraform.Literal { +func (e *VPC) TerraformLink() *terraformWriter.Literal { shared := fi.BoolValue(e.Shared) if shared { if e.ID == nil { @@ -290,10 +291,10 @@ func (e *VPC) TerraformLink() *terraform.Literal { } klog.V(4).Infof("reusing existing VPC with id %q", *e.ID) - return terraform.LiteralFromStringValue(*e.ID) + return terraformWriter.LiteralFromStringValue(*e.ID) } - return terraform.LiteralProperty("aws_vpc", *e.Name, "id") + return terraformWriter.LiteralProperty("aws_vpc", *e.Name, "id") } type cloudformationVPC struct { diff --git a/upup/pkg/fi/cloudup/awstasks/vpc_dhcpoptions_association.go b/upup/pkg/fi/cloudup/awstasks/vpc_dhcpoptions_association.go index df8825b299..b62b058850 100644 --- a/upup/pkg/fi/cloudup/awstasks/vpc_dhcpoptions_association.go +++ b/upup/pkg/fi/cloudup/awstasks/vpc_dhcpoptions_association.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -102,8 +103,8 @@ func (_ *VPCDHCPOptionsAssociation) RenderAWS(t *awsup.AWSAPITarget, a, e, chang } type terraformVPCDHCPOptionsAssociation struct { - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - DHCPOptionsID *terraform.Literal `json:"dhcp_options_id" cty:"dhcp_options_id"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + DHCPOptionsID *terraformWriter.Literal `json:"dhcp_options_id" cty:"dhcp_options_id"` } func (_ *VPCDHCPOptionsAssociation) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VPCDHCPOptionsAssociation) error { diff --git a/upup/pkg/fi/cloudup/awstasks/vpccidrblock.go b/upup/pkg/fi/cloudup/awstasks/vpccidrblock.go index 9b7981b808..66632fce23 100644 --- a/upup/pkg/fi/cloudup/awstasks/vpccidrblock.go +++ b/upup/pkg/fi/cloudup/awstasks/vpccidrblock.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/cloudformation" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -124,8 +125,8 @@ func (_ *VPCCIDRBlock) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *VPCCIDRBl } type terraformVPCCIDRBlock struct { - VPCID *terraform.Literal `json:"vpc_id" cty:"vpc_id"` - CIDRBlock *string `json:"cidr_block" cty:"cidr_block"` + VPCID *terraformWriter.Literal `json:"vpc_id" cty:"vpc_id"` + CIDRBlock *string `json:"cidr_block" cty:"cidr_block"` } func (_ *VPCCIDRBlock) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *VPCCIDRBlock) error { diff --git a/upup/pkg/fi/cloudup/gcetasks/BUILD.bazel b/upup/pkg/fi/cloudup/gcetasks/BUILD.bazel index 2431da1d70..2faced95e2 100644 --- a/upup/pkg/fi/cloudup/gcetasks/BUILD.bazel +++ b/upup/pkg/fi/cloudup/gcetasks/BUILD.bazel @@ -40,6 +40,7 @@ go_library( "//upup/pkg/fi:go_default_library", "//upup/pkg/fi/cloudup/gce:go_default_library", "//upup/pkg/fi/cloudup/terraform:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/google.golang.org/api/storage/v1:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", diff --git a/upup/pkg/fi/cloudup/gcetasks/address.go b/upup/pkg/fi/cloudup/gcetasks/address.go index a7b321c969..e480324ecd 100644 --- a/upup/pkg/fi/cloudup/gcetasks/address.go +++ b/upup/pkg/fi/cloudup/gcetasks/address.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -163,8 +164,8 @@ func (_ *Address) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *A return t.RenderResource("google_compute_address", *e.Name, tf) } -func (e *Address) TerraformAddress() *terraform.Literal { +func (e *Address) TerraformAddress() *terraformWriter.Literal { name := fi.StringValue(e.Name) - return terraform.LiteralProperty("google_compute_address", name, "address") + return terraformWriter.LiteralProperty("google_compute_address", name, "address") } diff --git a/upup/pkg/fi/cloudup/gcetasks/firewallrule.go b/upup/pkg/fi/cloudup/gcetasks/firewallrule.go index 8464df77f8..4a097dae06 100644 --- a/upup/pkg/fi/cloudup/gcetasks/firewallrule.go +++ b/upup/pkg/fi/cloudup/gcetasks/firewallrule.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // FirewallRule represents a GCE firewall rules @@ -163,8 +164,8 @@ type terraformAllow struct { } type terraformFirewall struct { - Name string `json:"name" cty:"name"` - Network *terraform.Literal `json:"network" cty:"network"` + Name string `json:"name" cty:"name"` + Network *terraformWriter.Literal `json:"network" cty:"network"` Allowed []*terraformAllow `json:"allow,omitempty" cty:"allow"` diff --git a/upup/pkg/fi/cloudup/gcetasks/forwardingrule.go b/upup/pkg/fi/cloudup/gcetasks/forwardingrule.go index 2f29c64777..4606ac4cf2 100644 --- a/upup/pkg/fi/cloudup/gcetasks/forwardingrule.go +++ b/upup/pkg/fi/cloudup/gcetasks/forwardingrule.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // ForwardingRule represents a GCE ForwardingRule @@ -138,11 +139,11 @@ func (_ *ForwardingRule) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Forwardin } type terraformForwardingRule struct { - Name string `json:"name" cty:"name"` - PortRange string `json:"port_range,omitempty" cty:"port_range"` - Target *terraform.Literal `json:"target,omitempty" cty:"target"` - IPAddress *terraform.Literal `json:"ip_address,omitempty" cty:"ip_address"` - IPProtocol string `json:"ip_protocol,omitempty" cty:"ip_protocol"` + Name string `json:"name" cty:"name"` + PortRange string `json:"port_range,omitempty" cty:"port_range"` + Target *terraformWriter.Literal `json:"target,omitempty" cty:"target"` + IPAddress *terraformWriter.Literal `json:"ip_address,omitempty" cty:"ip_address"` + IPProtocol string `json:"ip_protocol,omitempty" cty:"ip_protocol"` } func (_ *ForwardingRule) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *ForwardingRule) error { @@ -165,8 +166,8 @@ func (_ *ForwardingRule) RenderTerraform(t *terraform.TerraformTarget, a, e, cha return t.RenderResource("google_compute_forwarding_rule", name, tf) } -func (e *ForwardingRule) TerraformLink() *terraform.Literal { +func (e *ForwardingRule) TerraformLink() *terraformWriter.Literal { name := fi.StringValue(e.Name) - return terraform.LiteralSelfLink("google_compute_forwarding_rule", name) + return terraformWriter.LiteralSelfLink("google_compute_forwarding_rule", name) } diff --git a/upup/pkg/fi/cloudup/gcetasks/instance.go b/upup/pkg/fi/cloudup/gcetasks/instance.go index f57dea4db9..47c421e6fe 100644 --- a/upup/pkg/fi/cloudup/gcetasks/instance.go +++ b/upup/pkg/fi/cloudup/gcetasks/instance.go @@ -26,6 +26,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) var scopeAliases map[string]string @@ -393,17 +394,17 @@ func ShortenImageURL(defaultProject string, imageURL string) (string, error) { } type terraformInstance struct { - Name string `json:"name" cty:"name"` - CanIPForward bool `json:"can_ip_forward" cty:"can_ip_forward"` - MachineType string `json:"machine_type,omitempty" cty:"machine_type"` - ServiceAccount *terraformServiceAccount `json:"service_account,omitempty" cty:"service_account"` - Scheduling *terraformScheduling `json:"scheduling,omitempty" cty:"scheduling"` - Disks []*terraformInstanceAttachedDisk `json:"disk,omitempty" cty:"disk"` - NetworkInterfaces []*terraformNetworkInterface `json:"network_interface,omitempty" cty:"network_interface"` - Metadata map[string]*terraform.Literal `json:"metadata,omitempty" cty:"metadata"` - MetadataStartupScript *terraform.Literal `json:"metadata_startup_script,omitempty" cty:"metadata_startup_script"` - Tags []string `json:"tags,omitempty" cty:"tags"` - Zone string `json:"zone,omitempty" cty:"zone"` + Name string `json:"name" cty:"name"` + CanIPForward bool `json:"can_ip_forward" cty:"can_ip_forward"` + MachineType string `json:"machine_type,omitempty" cty:"machine_type"` + ServiceAccount *terraformServiceAccount `json:"service_account,omitempty" cty:"service_account"` + Scheduling *terraformScheduling `json:"scheduling,omitempty" cty:"scheduling"` + Disks []*terraformInstanceAttachedDisk `json:"disk,omitempty" cty:"disk"` + NetworkInterfaces []*terraformNetworkInterface `json:"network_interface,omitempty" cty:"network_interface"` + Metadata map[string]*terraformWriter.Literal `json:"metadata,omitempty" cty:"metadata"` + MetadataStartupScript *terraformWriter.Literal `json:"metadata_startup_script,omitempty" cty:"metadata_startup_script"` + Tags []string `json:"tags,omitempty" cty:"tags"` + Zone string `json:"zone,omitempty" cty:"zone"` } type terraformInstanceAttachedDisk struct { diff --git a/upup/pkg/fi/cloudup/gcetasks/instancegroupmanager.go b/upup/pkg/fi/cloudup/gcetasks/instancegroupmanager.go index e6c0869e31..9860ed50f2 100644 --- a/upup/pkg/fi/cloudup/gcetasks/instancegroupmanager.go +++ b/upup/pkg/fi/cloudup/gcetasks/instancegroupmanager.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -171,16 +172,16 @@ func (_ *InstanceGroupManager) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Ins } type terraformInstanceGroupManager struct { - Name *string `json:"name" cty:"name"` - Zone *string `json:"zone" cty:"zone"` - BaseInstanceName *string `json:"base_instance_name" cty:"base_instance_name"` - Version *terraformVersion `json:"version" cty:"version"` - TargetSize *int64 `json:"target_size" cty:"target_size"` - TargetPools []*terraform.Literal `json:"target_pools,omitempty" cty:"target_pools"` + Name *string `json:"name" cty:"name"` + Zone *string `json:"zone" cty:"zone"` + BaseInstanceName *string `json:"base_instance_name" cty:"base_instance_name"` + Version *terraformVersion `json:"version" cty:"version"` + TargetSize *int64 `json:"target_size" cty:"target_size"` + TargetPools []*terraformWriter.Literal `json:"target_pools,omitempty" cty:"target_pools"` } type terraformVersion struct { - InstanceTemplate *terraform.Literal `json:"instance_template" cty:"instance_template"` + InstanceTemplate *terraformWriter.Literal `json:"instance_template" cty:"instance_template"` } func (_ *InstanceGroupManager) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *InstanceGroupManager) error { diff --git a/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go b/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go index fb2d882139..92e4de7870 100644 --- a/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go +++ b/upup/pkg/fi/cloudup/gcetasks/instancetemplate.go @@ -31,6 +31,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) const ( @@ -451,8 +452,8 @@ type terraformInstanceTemplate struct { Scheduling *terraformScheduling `json:"scheduling,omitempty" cty:"scheduling"` Disks []*terraformInstanceTemplateAttachedDisk `json:"disk,omitempty" cty:"disk"` NetworkInterfaces []*terraformNetworkInterface `json:"network_interface,omitempty" cty:"network_interface"` - Metadata map[string]*terraform.Literal `json:"metadata,omitempty" cty:"metadata"` - MetadataStartupScript *terraform.Literal `json:"metadata_startup_script,omitempty" cty:"metadata_startup_script"` + Metadata map[string]*terraformWriter.Literal `json:"metadata,omitempty" cty:"metadata"` + MetadataStartupScript *terraformWriter.Literal `json:"metadata_startup_script,omitempty" cty:"metadata_startup_script"` Tags []string `json:"tags,omitempty" cty:"tags"` } @@ -484,13 +485,13 @@ type terraformInstanceTemplateAttachedDisk struct { } type terraformNetworkInterface struct { - Network *terraform.Literal `json:"network,omitempty" cty:"network"` - Subnetwork *terraform.Literal `json:"subnetwork,omitempty" cty:"subnetwork"` + Network *terraformWriter.Literal `json:"network,omitempty" cty:"network"` + Subnetwork *terraformWriter.Literal `json:"subnetwork,omitempty" cty:"subnetwork"` AccessConfig []*terraformAccessConfig `json:"access_config" cty:"access_config"` } type terraformAccessConfig struct { - NatIP *terraform.Literal `json:"nat_ip,omitempty" cty:"nat_ip"` + NatIP *terraformWriter.Literal `json:"nat_ip,omitempty" cty:"nat_ip"` } func addNetworks(network *Network, subnet *Subnet, networkInterfaces []*compute.NetworkInterface) []*terraformNetworkInterface { @@ -507,7 +508,7 @@ func addNetworks(network *Network, subnet *Subnet, networkInterfaces []*compute. tac := &terraformAccessConfig{} natIP := gac.NatIP if natIP != "" { - tac.NatIP = terraform.LiteralFromStringValue(natIP) + tac.NatIP = terraformWriter.LiteralFromStringValue(natIP) } tf.AccessConfig = append(tf.AccessConfig, tac) @@ -518,11 +519,11 @@ func addNetworks(network *Network, subnet *Subnet, networkInterfaces []*compute. return ni } -func addMetadata(target *terraform.TerraformTarget, name string, metadata *compute.Metadata) (map[string]*terraform.Literal, error) { +func addMetadata(target *terraform.TerraformTarget, name string, metadata *compute.Metadata) (map[string]*terraformWriter.Literal, error) { if metadata == nil { return nil, nil } - m := make(map[string]*terraform.Literal) + m := make(map[string]*terraformWriter.Literal) for _, g := range metadata.Items { val := fi.StringValue(g.Value) if strings.Contains(val, "\n") { @@ -532,7 +533,7 @@ func addMetadata(target *terraform.TerraformTarget, name string, metadata *compu } m[g.Key] = tfResource } else { - m[g.Key] = terraform.LiteralFromStringValue(val) + m[g.Key] = terraformWriter.LiteralFromStringValue(val) } } return m, nil @@ -612,6 +613,6 @@ func (_ *InstanceTemplate) RenderTerraform(t *terraform.TerraformTarget, a, e, c return t.RenderResource("google_compute_instance_template", name, tf) } -func (i *InstanceTemplate) TerraformLink() *terraform.Literal { - return terraform.LiteralSelfLink("google_compute_instance_template", *i.Name) +func (i *InstanceTemplate) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralSelfLink("google_compute_instance_template", *i.Name) } diff --git a/upup/pkg/fi/cloudup/gcetasks/network.go b/upup/pkg/fi/cloudup/gcetasks/network.go index 8e2233fca3..d10d936784 100644 --- a/upup/pkg/fi/cloudup/gcetasks/network.go +++ b/upup/pkg/fi/cloudup/gcetasks/network.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -175,6 +176,6 @@ func (_ *Network) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *N return t.RenderResource("google_compute_network", *e.Name, tf) } -func (i *Network) TerraformName() *terraform.Literal { - return terraform.LiteralProperty("google_compute_network", *i.Name, "name") +func (i *Network) TerraformName() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("google_compute_network", *i.Name, "name") } diff --git a/upup/pkg/fi/cloudup/gcetasks/router.go b/upup/pkg/fi/cloudup/gcetasks/router.go index badfd655ad..90ae6d6a4b 100644 --- a/upup/pkg/fi/cloudup/gcetasks/router.go +++ b/upup/pkg/fi/cloudup/gcetasks/router.go @@ -41,6 +41,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) const ( @@ -202,6 +203,6 @@ func (*Router) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Rout } // TerraformName returns the Terraform name. -func (r *Router) TerraformName() *terraform.Literal { - return terraform.LiteralProperty("google_compute_router_nat", *r.Name, "name") +func (r *Router) TerraformName() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("google_compute_router_nat", *r.Name, "name") } diff --git a/upup/pkg/fi/cloudup/gcetasks/subnet.go b/upup/pkg/fi/cloudup/gcetasks/subnet.go index 3a9cf16ce0..ac9cf063d8 100644 --- a/upup/pkg/fi/cloudup/gcetasks/subnet.go +++ b/upup/pkg/fi/cloudup/gcetasks/subnet.go @@ -25,6 +25,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -202,10 +203,10 @@ func (e *Subnet) URL(project string, region string) string { } type terraformSubnet struct { - Name *string `json:"name" cty:"name"` - Network *terraform.Literal `json:"network" cty:"network"` - Region *string `json:"region" cty:"region"` - CIDR *string `json:"ip_cidr_range" cty:"ip_cidr_range"` + Name *string `json:"name" cty:"name"` + Network *terraformWriter.Literal `json:"network" cty:"network"` + Region *string `json:"region" cty:"region"` + CIDR *string `json:"ip_cidr_range" cty:"ip_cidr_range"` // SecondaryIPRange defines additional IP ranges SecondaryIPRange []terraformSubnetRange `json:"secondary_ip_range,omitempty" cty:"secondary_ip_range"` @@ -234,6 +235,6 @@ func (_ *Subnet) RenderSubnet(t *terraform.TerraformTarget, a, e, changes *Subne return t.RenderResource("google_compute_subnetwork", *e.Name, tf) } -func (i *Subnet) TerraformName() *terraform.Literal { - return terraform.LiteralProperty("google_compute_subnetwork", *i.Name, "name") +func (i *Subnet) TerraformName() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("google_compute_subnetwork", *i.Name, "name") } diff --git a/upup/pkg/fi/cloudup/gcetasks/targetpool.go b/upup/pkg/fi/cloudup/gcetasks/targetpool.go index cbd03e1d92..5118852321 100644 --- a/upup/pkg/fi/cloudup/gcetasks/targetpool.go +++ b/upup/pkg/fi/cloudup/gcetasks/targetpool.go @@ -24,6 +24,7 @@ import ( "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // TargetPool represents a GCE TargetPool @@ -117,8 +118,8 @@ func (_ *TargetPool) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("google_compute_target_pool", name, tf) } -func (e *TargetPool) TerraformLink() *terraform.Literal { +func (e *TargetPool) TerraformLink() *terraformWriter.Literal { name := fi.StringValue(e.Name) - return terraform.LiteralSelfLink("google_compute_target_pool", name) + return terraformWriter.LiteralSelfLink("google_compute_target_pool", name) } diff --git a/upup/pkg/fi/cloudup/spotinsttasks/BUILD.bazel b/upup/pkg/fi/cloudup/spotinsttasks/BUILD.bazel index 5286ffa32e..6f3f1221af 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/BUILD.bazel +++ b/upup/pkg/fi/cloudup/spotinsttasks/BUILD.bazel @@ -18,6 +18,7 @@ go_library( "//upup/pkg/fi/cloudup/awstasks:go_default_library", "//upup/pkg/fi/cloudup/awsup:go_default_library", "//upup/pkg/fi/cloudup/terraform:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//upup/pkg/fi/utils:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/elb:go_default_library", diff --git a/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go b/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go index bc4a9853c5..4b12fb1022 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go +++ b/upup/pkg/fi/cloudup/spotinsttasks/elastigroup.go @@ -37,6 +37,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awstasks" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" "k8s.io/kops/upup/pkg/fi/utils" ) @@ -1346,8 +1347,8 @@ type terraformElastigroup struct { Description *string `json:"description,omitempty" cty:"description"` Product *string `json:"product,omitempty" cty:"product"` Region *string `json:"region,omitempty" cty:"region"` - SubnetIDs []*terraform.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"` - LoadBalancers []*terraform.Literal `json:"elastic_load_balancers,omitempty" cty:"elastic_load_balancers"` + SubnetIDs []*terraformWriter.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"` + LoadBalancers []*terraformWriter.Literal `json:"elastic_load_balancers,omitempty" cty:"elastic_load_balancers"` NetworkInterfaces []*terraformElastigroupNetworkInterface `json:"network_interface,omitempty" cty:"network_interface"` RootBlockDevice *terraformElastigroupBlockDevice `json:"ebs_block_device,omitempty" cty:"ebs_block_device"` EphemeralBlockDevice []*terraformElastigroupBlockDevice `json:"ephemeral_block_device,omitempty" cty:"ephemeral_block_device"` @@ -1368,14 +1369,14 @@ type terraformElastigroup struct { OnDemand *string `json:"instance_types_ondemand,omitempty" cty:"instance_types_ondemand"` Spot []string `json:"instance_types_spot,omitempty" cty:"instance_types_spot"` - Monitoring *bool `json:"enable_monitoring,omitempty" cty:"enable_monitoring"` - EBSOptimized *bool `json:"ebs_optimized,omitempty" cty:"ebs_optimized"` - ImageID *string `json:"image_id,omitempty" cty:"image_id"` - HealthCheckType *string `json:"health_check_type,omitempty" cty:"health_check_type"` - SecurityGroups []*terraform.Literal `json:"security_groups,omitempty" cty:"security_groups"` - UserData *terraform.Literal `json:"user_data,omitempty" cty:"user_data"` - IAMInstanceProfile *terraform.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"` - KeyName *terraform.Literal `json:"key_name,omitempty" cty:"key_name"` + Monitoring *bool `json:"enable_monitoring,omitempty" cty:"enable_monitoring"` + EBSOptimized *bool `json:"ebs_optimized,omitempty" cty:"ebs_optimized"` + ImageID *string `json:"image_id,omitempty" cty:"image_id"` + HealthCheckType *string `json:"health_check_type,omitempty" cty:"health_check_type"` + SecurityGroups []*terraformWriter.Literal `json:"security_groups,omitempty" cty:"security_groups"` + UserData *terraformWriter.Literal `json:"user_data,omitempty" cty:"user_data"` + IAMInstanceProfile *terraformWriter.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"` + KeyName *terraformWriter.Literal `json:"key_name,omitempty" cty:"key_name"` } type terraformElastigroupBlockDevice struct { @@ -1665,8 +1666,8 @@ func (_ *Elastigroup) RenderTerraform(t *terraform.TerraformTarget, a, e, change return t.RenderResource("spotinst_elastigroup_aws", *e.Name, tf) } -func (e *Elastigroup) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("spotinst_elastigroup_aws", *e.Name, "id") +func (e *Elastigroup) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("spotinst_elastigroup_aws", *e.Name, "id") } func (e *Elastigroup) buildTags() []*aws.Tag { diff --git a/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go b/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go index 8b2c67a943..2c8de6746d 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go +++ b/upup/pkg/fi/cloudup/spotinsttasks/launch_spec.go @@ -32,6 +32,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awstasks" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -770,8 +771,8 @@ func (_ *LaunchSpec) update(cloud awsup.AWSCloud, a, e, changes *LaunchSpec) err } type terraformLaunchSpec struct { - Name *string `json:"name,omitempty" cty:"name"` - OceanID *terraform.Literal `json:"ocean_id,omitempty" cty:"ocean_id"` + Name *string `json:"name,omitempty" cty:"name"` + OceanID *terraformWriter.Literal `json:"ocean_id,omitempty" cty:"ocean_id"` Monitoring *bool `json:"monitoring,omitempty" cty:"monitoring"` EBSOptimized *bool `json:"ebs_optimized,omitempty" cty:"ebs_optimized"` @@ -779,12 +780,12 @@ type terraformLaunchSpec struct { AssociatePublicIPAddress *bool `json:"associate_public_ip_address,omitempty" cty:"associate_public_ip_address"` RestrictScaleDown *bool `json:"restrict_scale_down,omitempty" cty:"restrict_scale_down"` RootVolumeSize *int64 `json:"root_volume_size,omitempty" cty:"root_volume_size"` - UserData *terraform.Literal `json:"user_data,omitempty" cty:"user_data"` - IAMInstanceProfile *terraform.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"` - KeyName *terraform.Literal `json:"key_name,omitempty" cty:"key_name"` + UserData *terraformWriter.Literal `json:"user_data,omitempty" cty:"user_data"` + IAMInstanceProfile *terraformWriter.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"` + KeyName *terraformWriter.Literal `json:"key_name,omitempty" cty:"key_name"` InstanceTypes []string `json:"instance_types,omitempty" cty:"instance_types"` - SubnetIDs []*terraform.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"` - SecurityGroups []*terraform.Literal `json:"security_groups,omitempty" cty:"security_groups"` + SubnetIDs []*terraformWriter.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"` + SecurityGroups []*terraformWriter.Literal `json:"security_groups,omitempty" cty:"security_groups"` Taints []*terraformTaint `json:"taints,omitempty" cty:"taints"` Labels []*terraformKV `json:"labels,omitempty" cty:"labels"` Tags []*terraformKV `json:"tags,omitempty" cty:"tags"` @@ -981,8 +982,8 @@ func (_ *LaunchSpec) RenderTerraform(t *terraform.TerraformTarget, a, e, changes return t.RenderResource("spotinst_ocean_aws_launch_spec", *e.Name, tf) } -func (o *LaunchSpec) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("spotinst_ocean_aws_launch_spec", *o.Name, "id") +func (o *LaunchSpec) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("spotinst_ocean_aws_launch_spec", *o.Name, "id") } func (o *LaunchSpec) buildTags() []*aws.Tag { diff --git a/upup/pkg/fi/cloudup/spotinsttasks/ocean.go b/upup/pkg/fi/cloudup/spotinsttasks/ocean.go index b0c863d659..c885109f54 100644 --- a/upup/pkg/fi/cloudup/spotinsttasks/ocean.go +++ b/upup/pkg/fi/cloudup/spotinsttasks/ocean.go @@ -33,6 +33,7 @@ import ( "k8s.io/kops/upup/pkg/fi/cloudup/awstasks" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // +kops:fitask @@ -977,14 +978,14 @@ func (_ *Ocean) update(cloud awsup.AWSCloud, a, e, changes *Ocean) error { } type terraformOcean struct { - Name *string `json:"name,omitempty" cty:"name"` - ControllerClusterID *string `json:"controller_id,omitempty" cty:"controller_id"` - Region *string `json:"region,omitempty" cty:"region"` - InstanceTypesWhitelist []string `json:"whitelist,omitempty" cty:"whitelist"` - InstanceTypesBlacklist []string `json:"blacklist,omitempty" cty:"blacklist"` - SubnetIDs []*terraform.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"` - AutoScaler *terraformAutoScaler `json:"autoscaler,omitempty" cty:"autoscaler"` - Tags []*terraformKV `json:"tags,omitempty" cty:"tags"` + Name *string `json:"name,omitempty" cty:"name"` + ControllerClusterID *string `json:"controller_id,omitempty" cty:"controller_id"` + Region *string `json:"region,omitempty" cty:"region"` + InstanceTypesWhitelist []string `json:"whitelist,omitempty" cty:"whitelist"` + InstanceTypesBlacklist []string `json:"blacklist,omitempty" cty:"blacklist"` + SubnetIDs []*terraformWriter.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"` + AutoScaler *terraformAutoScaler `json:"autoscaler,omitempty" cty:"autoscaler"` + Tags []*terraformKV `json:"tags,omitempty" cty:"tags"` MinSize *int64 `json:"min_size,omitempty" cty:"min_size"` MaxSize *int64 `json:"max_size,omitempty" cty:"max_size"` @@ -995,15 +996,15 @@ type terraformOcean struct { DrainingTimeout *int64 `json:"draining_timeout,omitempty" cty:"draining_timeout"` GracePeriod *int64 `json:"grace_period,omitempty" cty:"grace_period"` - Monitoring *bool `json:"monitoring,omitempty" cty:"monitoring"` - EBSOptimized *bool `json:"ebs_optimized,omitempty" cty:"ebs_optimized"` - ImageID *string `json:"image_id,omitempty" cty:"image_id"` - AssociatePublicIPAddress *bool `json:"associate_public_ip_address,omitempty" cty:"associate_public_ip_address"` - RootVolumeSize *int64 `json:"root_volume_size,omitempty" cty:"root_volume_size"` - UserData *terraform.Literal `json:"user_data,omitempty" cty:"user_data"` - IAMInstanceProfile *terraform.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"` - KeyName *terraform.Literal `json:"key_name,omitempty" cty:"key_name"` - SecurityGroups []*terraform.Literal `json:"security_groups,omitempty" cty:"security_groups"` + Monitoring *bool `json:"monitoring,omitempty" cty:"monitoring"` + EBSOptimized *bool `json:"ebs_optimized,omitempty" cty:"ebs_optimized"` + ImageID *string `json:"image_id,omitempty" cty:"image_id"` + AssociatePublicIPAddress *bool `json:"associate_public_ip_address,omitempty" cty:"associate_public_ip_address"` + RootVolumeSize *int64 `json:"root_volume_size,omitempty" cty:"root_volume_size"` + UserData *terraformWriter.Literal `json:"user_data,omitempty" cty:"user_data"` + IAMInstanceProfile *terraformWriter.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"` + KeyName *terraformWriter.Literal `json:"key_name,omitempty" cty:"key_name"` + SecurityGroups []*terraformWriter.Literal `json:"security_groups,omitempty" cty:"security_groups"` } func (_ *Ocean) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Ocean) error { @@ -1171,8 +1172,8 @@ func (_ *Ocean) RenderTerraform(t *terraform.TerraformTarget, a, e, changes *Oce return t.RenderResource("spotinst_ocean_aws", *e.Name, tf) } -func (o *Ocean) TerraformLink() *terraform.Literal { - return terraform.LiteralProperty("spotinst_ocean_aws", *o.Name, "id") +func (o *Ocean) TerraformLink() *terraformWriter.Literal { + return terraformWriter.LiteralProperty("spotinst_ocean_aws", *o.Name, "id") } func (o *Ocean) buildTags() []*aws.Tag { diff --git a/upup/pkg/fi/cloudup/terraform/BUILD.bazel b/upup/pkg/fi/cloudup/terraform/BUILD.bazel index 1354d0f557..b12b4cbd56 100644 --- a/upup/pkg/fi/cloudup/terraform/BUILD.bazel +++ b/upup/pkg/fi/cloudup/terraform/BUILD.bazel @@ -5,7 +5,6 @@ go_library( srcs = [ "hcl2.go", "lifecycle.go", - "literal.go", "target.go", "target_hcl2.go", "target_json.go", @@ -16,6 +15,7 @@ go_library( "//pkg/apis/kops:go_default_library", "//pkg/featureflag:go_default_library", "//upup/pkg/fi:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//vendor/github.com/hashicorp/hcl/v2:go_default_library", "//vendor/github.com/hashicorp/hcl/v2/hclsyntax:go_default_library", "//vendor/github.com/hashicorp/hcl/v2/hclwrite:go_default_library", @@ -34,6 +34,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/diff:go_default_library", + "//upup/pkg/fi/cloudup/terraformWriter:go_default_library", "//vendor/github.com/hashicorp/hcl/v2/hclwrite:go_default_library", "//vendor/github.com/zclconf/go-cty/cty:go_default_library", "//vendor/github.com/zclconf/go-cty/cty/gocty:go_default_library", diff --git a/upup/pkg/fi/cloudup/terraform/hcl2.go b/upup/pkg/fi/cloudup/terraform/hcl2.go index 8656132176..de94c97028 100644 --- a/upup/pkg/fi/cloudup/terraform/hcl2.go +++ b/upup/pkg/fi/cloudup/terraform/hcl2.go @@ -26,6 +26,7 @@ import ( "github.com/hashicorp/hcl/v2/hclwrite" "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/gocty" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) // writeValue writes a cty Value to a body with a given key @@ -38,12 +39,12 @@ func writeValue(body *hclwrite.Body, key string, value cty.Value) { if value.LengthInt() == 0 { return } - literals := make([]*Literal, 0) + literals := make([]*terraformWriter.Literal, 0) for _, val := range value.AsValueSlice() { - refLiteral := reflect.New(reflect.TypeOf(Literal{})) + refLiteral := reflect.New(reflect.TypeOf(terraformWriter.Literal{})) err := gocty.FromCtyValue(val, refLiteral.Interface()) - if literal, ok := refLiteral.Interface().(*Literal); err == nil && ok { + if literal, ok := refLiteral.Interface().(*terraformWriter.Literal); err == nil && ok { literals = append(literals, literal) } } @@ -73,9 +74,9 @@ func writeValue(body *hclwrite.Body, key string, value cty.Value) { } } } else { - refLiteral := reflect.New(reflect.TypeOf(Literal{})) + refLiteral := reflect.New(reflect.TypeOf(terraformWriter.Literal{})) err := gocty.FromCtyValue(value, refLiteral.Interface()) - if literal, ok := refLiteral.Interface().(*Literal); err == nil && ok { + if literal, ok := refLiteral.Interface().(*terraformWriter.Literal); err == nil && ok { writeLiteral(body, key, literal) } else if value.Type().IsObjectType() { childBlock := body.AppendNewBlock(key, nil) @@ -101,7 +102,7 @@ func writeValue(body *hclwrite.Body, key string, value cty.Value) { // key = "value1" // key = res_type.res_name.res_prop // key = file("${module.path}/foo") -func writeLiteral(body *hclwrite.Body, key string, literal *Literal) { +func writeLiteral(body *hclwrite.Body, key string, literal *terraformWriter.Literal) { if literal.FilePath != "" { tokens := hclwrite.Tokens{ { @@ -127,7 +128,7 @@ func writeLiteral(body *hclwrite.Body, key string, literal *Literal) { // key = [type1.name1.attr1, type2.name2.attr2, "stringliteral"] // // The HCL2 library does not support this natively. See https://github.com/hashicorp/hcl/issues/347 -func writeLiteralList(body *hclwrite.Body, key string, literals []*Literal) { +func writeLiteralList(body *hclwrite.Body, key string, literals []*terraformWriter.Literal) { tokens := hclwrite.Tokens{ {Type: hclsyntax.TokenOBrack, Bytes: []byte("["), SpacesBefore: 1}, } @@ -186,10 +187,10 @@ func writeMap(body *hclwrite.Body, key string, values map[string]cty.Value) { v := values[k] - refLiteral := reflect.New(reflect.TypeOf(Literal{})) + refLiteral := reflect.New(reflect.TypeOf(terraformWriter.Literal{})) err := gocty.FromCtyValue(v, refLiteral.Interface()) // If this is a map of literals then do not surround the value with quotes - if literal, ok := refLiteral.Interface().(*Literal); err == nil && ok { + if literal, ok := refLiteral.Interface().(*terraformWriter.Literal); err == nil && ok { // For maps of literals we currently only support file references // If we ever need to support a map of strings to resource property references that can be added here if literal.FilePath != "" { diff --git a/upup/pkg/fi/cloudup/terraform/hcl2_test.go b/upup/pkg/fi/cloudup/terraform/hcl2_test.go index 4574579d1a..efa0c29b4a 100644 --- a/upup/pkg/fi/cloudup/terraform/hcl2_test.go +++ b/upup/pkg/fi/cloudup/terraform/hcl2_test.go @@ -24,6 +24,7 @@ import ( "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/gocty" "k8s.io/kops/pkg/diff" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) func TestWriteValue(t *testing.T) { @@ -113,17 +114,17 @@ foo { func TestWriteLiteral(t *testing.T) { cases := []struct { name string - literal *Literal + literal *terraformWriter.Literal expected string }{ { name: "string", - literal: &Literal{Value: "value"}, + literal: &terraformWriter.Literal{Value: "value"}, expected: `foo = "value"`, }, { name: "traversal", - literal: &Literal{ + literal: &terraformWriter.Literal{ ResourceType: "type", ResourceName: "name", ResourceProp: "prop", @@ -131,11 +132,8 @@ func TestWriteLiteral(t *testing.T) { expected: "foo = type.name.prop", }, { - name: "file", - literal: &Literal{ - FilePath: "${path.module}/foo", - FileFn: fileFnFile, - }, + name: "file", + literal: terraformWriter.LiteralFileExpression("${path.module}/foo", false), expected: `foo = file("${path.module}/foo")`, }, } @@ -155,7 +153,7 @@ func TestWriteLiteral(t *testing.T) { func TestWriteLiteralList(t *testing.T) { cases := []struct { name string - literals []*Literal + literals []*terraformWriter.Literal expected string }{ { @@ -164,7 +162,7 @@ func TestWriteLiteralList(t *testing.T) { }, { name: "one literal", - literals: []*Literal{ + literals: []*terraformWriter.Literal{ { ResourceType: "type", ResourceName: "name", @@ -175,7 +173,7 @@ func TestWriteLiteralList(t *testing.T) { }, { name: "two literals", - literals: []*Literal{ + literals: []*terraformWriter.Literal{ { ResourceType: "type1", ResourceName: "name1", @@ -191,7 +189,7 @@ func TestWriteLiteralList(t *testing.T) { }, { name: "one traversal literal, one string literal", - literals: []*Literal{ + literals: []*terraformWriter.Literal{ { ResourceType: "type", ResourceName: "name", @@ -268,14 +266,14 @@ tags = { func TestWriteMapLiterals(t *testing.T) { cases := []struct { name string - values map[string]Literal + values map[string]terraformWriter.Literal expected string }{ { name: "literal values", - values: map[string]Literal{ - "key1": {FilePath: "${module.path}/path/to/value1", FileFn: fileFnFile}, - "key2": {FilePath: "${module.path}/path/to/value2", FileFn: fileFnFileBase64}, + values: map[string]terraformWriter.Literal{ + "key1": *terraformWriter.LiteralFileExpression("${module.path}/path/to/value1", false), + "key2": *terraformWriter.LiteralFileExpression("${module.path}/path/to/value2", true), }, expected: ` metadata = { diff --git a/upup/pkg/fi/cloudup/terraform/target.go b/upup/pkg/fi/cloudup/terraform/target.go index 1772fd755d..7bd5efe118 100644 --- a/upup/pkg/fi/cloudup/terraform/target.go +++ b/upup/pkg/fi/cloudup/terraform/target.go @@ -21,77 +21,41 @@ import ( "io/ioutil" "os" "path" - "strconv" - "strings" - "sync" "k8s.io/klog/v2" "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/featureflag" "k8s.io/kops/upup/pkg/fi" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) type TerraformTarget struct { + terraformWriter.TerraformWriter Cloud fi.Cloud Project string ClusterName string outDir string - - // mutex protects the following items (resources & files) - mutex sync.Mutex - // resources is a list of TF items that should be created - resources []*terraformResource - // outputs is a list of our TF output variables - outputs map[string]*terraformOutputVariable - // files is a map of TF resource files that should be created - files map[string][]byte // extra config to add to the provider block clusterSpecTarget *kops.TargetSpec } func NewTerraformTarget(cloud fi.Cloud, project string, outDir string, clusterSpecTarget *kops.TargetSpec) *TerraformTarget { - return &TerraformTarget{ + target := TerraformTarget{ Cloud: cloud, Project: project, outDir: outDir, - files: make(map[string][]byte), - outputs: make(map[string]*terraformOutputVariable), clusterSpecTarget: clusterSpecTarget, } + target.InitTerraformWriter() + return &target } var _ fi.Target = &TerraformTarget{} -type terraformResource struct { - ResourceType string - ResourceName string - Item interface{} -} - -type terraformOutputVariable struct { - Key string - Value *Literal - ValueArray []*Literal -} - -type terraformOutputValue struct { - Value *Literal - ValueArray []*Literal -} - -// A TF name can't have dots in it (if we want to refer to it from a literal), -// so we replace them -func tfSanitize(name string) string { - if _, err := strconv.Atoi(string(name[0])); err == nil { - panic(fmt.Sprintf("Terraform resource names cannot start with a digit. This is a bug in Kops, please report this in a GitHub Issue. Name: %v", name)) - } - return strings.NewReplacer(".", "-", "/", "--", ":", "_").Replace(name) -} - -func (t *TerraformTarget) AddFileResource(resourceType string, resourceName string, key string, r fi.Resource, base64 bool) (*Literal, error) { +func (t *TerraformTarget) AddFileResource(resourceType string, resourceName string, key string, r fi.Resource, base64 bool) (*terraformWriter.Literal, error) { d, err := fi.ResourceAsBytes(r) if err != nil { id := resourceType + "_" + resourceName + "_" + key @@ -101,76 +65,11 @@ func (t *TerraformTarget) AddFileResource(resourceType string, resourceName stri return t.AddFileBytes(resourceType, resourceName, key, d, base64) } -func (t *TerraformTarget) AddFileBytes(resourceType string, resourceName string, key string, data []byte, base64 bool) (*Literal, error) { - id := resourceType + "_" + resourceName + "_" + key - - t.mutex.Lock() - defer t.mutex.Unlock() - - p := path.Join("data", id) - t.files[p] = data - - modulePath := path.Join("${path.module}", p) - l := LiteralFileExpression(modulePath, base64) - return l, nil -} - func (t *TerraformTarget) ProcessDeletions() bool { // Terraform tracks & performs deletions itself return false } -func (t *TerraformTarget) RenderResource(resourceType string, resourceName string, e interface{}) error { - res := &terraformResource{ - ResourceType: resourceType, - ResourceName: resourceName, - Item: e, - } - - t.mutex.Lock() - defer t.mutex.Unlock() - - t.resources = append(t.resources, res) - - return nil -} - -func (t *TerraformTarget) AddOutputVariable(key string, literal *Literal) error { - v := &terraformOutputVariable{ - Key: key, - Value: literal, - } - - t.mutex.Lock() - defer t.mutex.Unlock() - - if t.outputs[key] != nil { - return fmt.Errorf("duplicate variable: %q", key) - } - t.outputs[key] = v - - return nil -} - -func (t *TerraformTarget) AddOutputVariableArray(key string, literal *Literal) error { - t.mutex.Lock() - defer t.mutex.Unlock() - - if t.outputs[key] == nil { - v := &terraformOutputVariable{ - Key: key, - } - t.outputs[key] = v - } - if t.outputs[key].Value != nil { - return fmt.Errorf("variable %q is both an array and a scalar", key) - } - - t.outputs[key].ValueArray = append(t.outputs[key].ValueArray, literal) - - return nil -} - // tfGetProviderExtraConfig is a helper function to get extra config with safety checks on the pointers. func tfGetProviderExtraConfig(c *kops.TargetSpec) map[string]string { if c != nil && @@ -192,7 +91,7 @@ func (t *TerraformTarget) Finish(taskMap map[string]fi.Task) error { return err } - for relativePath, contents := range t.files { + for relativePath, contents := range t.Files { p := path.Join(t.outDir, relativePath) err = os.MkdirAll(path.Dir(p), os.FileMode(0755)) @@ -209,44 +108,3 @@ func (t *TerraformTarget) Finish(taskMap map[string]fi.Task) error { return nil } - -func (t *TerraformTarget) getResourcesByType() (map[string]map[string]interface{}, error) { - resourcesByType := make(map[string]map[string]interface{}) - - for _, res := range t.resources { - resources := resourcesByType[res.ResourceType] - if resources == nil { - resources = make(map[string]interface{}) - resourcesByType[res.ResourceType] = resources - } - - tfName := tfSanitize(res.ResourceName) - - if resources[tfName] != nil { - return nil, fmt.Errorf("duplicate resource found: %s.%s", res.ResourceType, tfName) - } - - resources[tfName] = res.Item - } - - return resourcesByType, nil -} - -func (t *TerraformTarget) getOutputs() (map[string]terraformOutputValue, error) { - values := map[string]terraformOutputValue{} - for _, v := range t.outputs { - tfName := tfSanitize(v.Key) - if _, found := values[tfName]; found { - return nil, fmt.Errorf("duplicate variable found: %s", tfName) - } - deduped, err := dedupLiterals(v.ValueArray) - if err != nil { - return nil, err - } - values[tfName] = terraformOutputValue{ - Value: v.Value, - ValueArray: deduped, - } - } - return values, nil -} diff --git a/upup/pkg/fi/cloudup/terraform/target_hcl2.go b/upup/pkg/fi/cloudup/terraform/target_hcl2.go index 4233f00e51..4ab72f7640 100644 --- a/upup/pkg/fi/cloudup/terraform/target_hcl2.go +++ b/upup/pkg/fi/cloudup/terraform/target_hcl2.go @@ -26,13 +26,14 @@ import ( "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/featureflag" "k8s.io/kops/upup/pkg/fi" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) func (t *TerraformTarget) finishHCL2(taskMap map[string]fi.Task) error { f := hclwrite.NewEmptyFile() rootBody := f.Body() - outputs, err := t.getOutputs() + outputs, err := t.GetOutputs() if err != nil { return err } @@ -50,7 +51,7 @@ func (t *TerraformTarget) finishHCL2(taskMap map[string]fi.Task) error { } rootBody.AppendNewline() - resourcesByType, err := t.getResourcesByType() + resourcesByType, err := t.GetResourcesByType() if err != nil { return err } @@ -117,7 +118,7 @@ func (t *TerraformTarget) finishHCL2(taskMap map[string]fi.Task) error { } bytes := hclwrite.Format(f.Bytes()) - t.files["kubernetes.tf"] = bytes + t.Files["kubernetes.tf"] = bytes return nil } @@ -134,7 +135,7 @@ func (t *TerraformTarget) finishHCL2(taskMap map[string]fi.Task) error { // output "key2" { // value = "value2" // } -func writeLocalsOutputs(body *hclwrite.Body, outputs map[string]terraformOutputValue) error { +func writeLocalsOutputs(body *hclwrite.Body, outputs map[string]terraformWriter.OutputValue) error { if len(outputs) == 0 { return nil } diff --git a/upup/pkg/fi/cloudup/terraform/target_hcl2_test.go b/upup/pkg/fi/cloudup/terraform/target_hcl2_test.go index 20a7612ce5..a64a07d082 100644 --- a/upup/pkg/fi/cloudup/terraform/target_hcl2_test.go +++ b/upup/pkg/fi/cloudup/terraform/target_hcl2_test.go @@ -22,12 +22,13 @@ import ( "github.com/hashicorp/hcl/v2/hclwrite" "k8s.io/kops/pkg/diff" + "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" ) func TestWriteLocalsOutputs(t *testing.T) { cases := []struct { name string - values map[string]terraformOutputValue + values map[string]terraformWriter.OutputValue expected string errExpected bool }{ @@ -37,9 +38,9 @@ func TestWriteLocalsOutputs(t *testing.T) { }, { name: "single output", - values: map[string]terraformOutputValue{ + values: map[string]terraformWriter.OutputValue{ "key1": { - Value: LiteralFromStringValue("value1"), + Value: terraformWriter.LiteralFromStringValue("value1"), }, }, expected: ` @@ -53,11 +54,11 @@ output "key1" { }, { name: "list output", - values: map[string]terraformOutputValue{ + values: map[string]terraformWriter.OutputValue{ "key1": { - ValueArray: []*Literal{ - LiteralFromStringValue("value1"), - LiteralFromStringValue("value2"), + ValueArray: []*terraformWriter.Literal{ + terraformWriter.LiteralFromStringValue("value1"), + terraformWriter.LiteralFromStringValue("value2"), }, }, }, diff --git a/upup/pkg/fi/cloudup/terraform/target_json.go b/upup/pkg/fi/cloudup/terraform/target_json.go index ba18a063bc..5368c8c474 100644 --- a/upup/pkg/fi/cloudup/terraform/target_json.go +++ b/upup/pkg/fi/cloudup/terraform/target_json.go @@ -25,7 +25,7 @@ import ( ) func (t *TerraformTarget) finishJSON(taskMap map[string]fi.Task) error { - resourcesByType, err := t.getResourcesByType() + resourcesByType, err := t.GetResourcesByType() if err != nil { return err } @@ -48,7 +48,7 @@ func (t *TerraformTarget) finishJSON(taskMap map[string]fi.Task) error { providersByName["aws"] = providerAWS } - outputs, err := t.getOutputs() + outputs, err := t.GetOutputs() if err != nil { return err } @@ -110,6 +110,6 @@ func (t *TerraformTarget) finishJSON(taskMap map[string]fi.Task) error { return fmt.Errorf("error marshaling terraform data to json: %v", err) } - t.files["kubernetes.tf.json"] = jsonBytes + t.Files["kubernetes.tf.json"] = jsonBytes return nil } diff --git a/upup/pkg/fi/cloudup/terraformWriter/BUILD.bazel b/upup/pkg/fi/cloudup/terraformWriter/BUILD.bazel new file mode 100644 index 0000000000..0441f12020 --- /dev/null +++ b/upup/pkg/fi/cloudup/terraformWriter/BUILD.bazel @@ -0,0 +1,22 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "literal.go", + "writer.go", + ], + importpath = "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter", + visibility = ["//visibility:public"], + deps = ["//vendor/k8s.io/klog/v2:go_default_library"], +) + +go_test( + name = "go_default_test", + srcs = ["writer_test.go"], + embed = [":go_default_library"], + deps = [ + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", + ], +) diff --git a/upup/pkg/fi/cloudup/terraform/literal.go b/upup/pkg/fi/cloudup/terraformWriter/literal.go similarity index 99% rename from upup/pkg/fi/cloudup/terraform/literal.go rename to upup/pkg/fi/cloudup/terraformWriter/literal.go index 9dbb5b65a7..b04cbe9747 100644 --- a/upup/pkg/fi/cloudup/terraform/literal.go +++ b/upup/pkg/fi/cloudup/terraformWriter/literal.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package terraform +package terraformWriter import ( "encoding/json" diff --git a/upup/pkg/fi/cloudup/terraformWriter/writer.go b/upup/pkg/fi/cloudup/terraformWriter/writer.go new file mode 100644 index 0000000000..5869902d63 --- /dev/null +++ b/upup/pkg/fi/cloudup/terraformWriter/writer.go @@ -0,0 +1,173 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package terraformWriter + +import ( + "fmt" + "path" + "strconv" + "strings" + "sync" +) + +type TerraformWriter struct { + // mutex protects the following items (resources & Files) + mutex sync.Mutex + // resources is a list of TF items that should be created + resources []*terraformResource + // outputs is a list of our TF output variables + outputs map[string]*terraformOutputVariable + // Files is a map of TF resource Files that should be created + Files map[string][]byte +} + +type OutputValue struct { + Value *Literal + ValueArray []*Literal +} + +type terraformResource struct { + ResourceType string + ResourceName string + Item interface{} +} + +type terraformOutputVariable struct { + Key string + Value *Literal + ValueArray []*Literal +} + +// A TF name can't have dots in it (if we want to refer to it from a literal), +// so we replace them +func tfSanitize(name string) string { + if _, err := strconv.Atoi(string(name[0])); err == nil { + panic(fmt.Sprintf("Terraform resource names cannot start with a digit. This is a bug in Kops, please report this in a GitHub Issue. Name: %v", name)) + } + return strings.NewReplacer(".", "-", "/", "--", ":", "_").Replace(name) +} + +func (t *TerraformWriter) InitTerraformWriter() { + t.Files = make(map[string][]byte) + t.outputs = make(map[string]*terraformOutputVariable) +} + +func (t *TerraformWriter) AddFileBytes(resourceType string, resourceName string, key string, data []byte, base64 bool) (*Literal, error) { + id := resourceType + "_" + resourceName + "_" + key + + t.mutex.Lock() + defer t.mutex.Unlock() + + p := path.Join("data", id) + t.Files[p] = data + + modulePath := path.Join("${path.module}", p) + l := LiteralFileExpression(modulePath, base64) + return l, nil +} + +func (t *TerraformWriter) RenderResource(resourceType string, resourceName string, e interface{}) error { + res := &terraformResource{ + ResourceType: resourceType, + ResourceName: resourceName, + Item: e, + } + + t.mutex.Lock() + defer t.mutex.Unlock() + + t.resources = append(t.resources, res) + + return nil +} + +func (t *TerraformWriter) AddOutputVariable(key string, literal *Literal) error { + v := &terraformOutputVariable{ + Key: key, + Value: literal, + } + + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.outputs[key] != nil { + return fmt.Errorf("duplicate variable: %q", key) + } + t.outputs[key] = v + + return nil +} + +func (t *TerraformWriter) AddOutputVariableArray(key string, literal *Literal) error { + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.outputs[key] == nil { + v := &terraformOutputVariable{ + Key: key, + } + t.outputs[key] = v + } + if t.outputs[key].Value != nil { + return fmt.Errorf("variable %q is both an array and a scalar", key) + } + + t.outputs[key].ValueArray = append(t.outputs[key].ValueArray, literal) + + return nil +} + +func (t *TerraformWriter) GetResourcesByType() (map[string]map[string]interface{}, error) { + resourcesByType := make(map[string]map[string]interface{}) + + for _, res := range t.resources { + resources := resourcesByType[res.ResourceType] + if resources == nil { + resources = make(map[string]interface{}) + resourcesByType[res.ResourceType] = resources + } + + tfName := tfSanitize(res.ResourceName) + + if resources[tfName] != nil { + return nil, fmt.Errorf("duplicate resource found: %s.%s", res.ResourceType, tfName) + } + + resources[tfName] = res.Item + } + + return resourcesByType, nil +} + +func (t *TerraformWriter) GetOutputs() (map[string]OutputValue, error) { + values := map[string]OutputValue{} + for _, v := range t.outputs { + tfName := tfSanitize(v.Key) + if _, found := values[tfName]; found { + return nil, fmt.Errorf("duplicate variable found: %s", tfName) + } + deduped, err := dedupLiterals(v.ValueArray) + if err != nil { + return nil, err + } + values[tfName] = OutputValue{ + Value: v.Value, + ValueArray: deduped, + } + } + return values, nil +} diff --git a/upup/pkg/fi/cloudup/terraform/target_test.go b/upup/pkg/fi/cloudup/terraformWriter/writer_test.go similarity index 90% rename from upup/pkg/fi/cloudup/terraform/target_test.go rename to upup/pkg/fi/cloudup/terraformWriter/writer_test.go index addefa4304..a91d45d0a3 100644 --- a/upup/pkg/fi/cloudup/terraform/target_test.go +++ b/upup/pkg/fi/cloudup/terraformWriter/writer_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package terraform +package terraformWriter import ( "testing" @@ -27,7 +27,7 @@ func TestGetOutputs(t *testing.T) { cases := []struct { name string values map[string]*terraformOutputVariable - expected map[string]terraformOutputValue + expected map[string]OutputValue errExpected bool }{ { @@ -41,7 +41,7 @@ func TestGetOutputs(t *testing.T) { Value: LiteralFromStringValue("value1"), }, }, - expected: map[string]terraformOutputValue{ + expected: map[string]OutputValue{ "key1": { Value: LiteralFromStringValue("value1"), }, @@ -58,7 +58,7 @@ func TestGetOutputs(t *testing.T) { }, }, }, - expected: map[string]terraformOutputValue{ + expected: map[string]OutputValue{ "key1": { ValueArray: []*Literal{ LiteralFromStringValue("value1"), @@ -93,7 +93,7 @@ func TestGetOutputs(t *testing.T) { }, }, }, - expected: map[string]terraformOutputValue{ + expected: map[string]OutputValue{ "key1": { ValueArray: []*Literal{ LiteralFromStringValue("value1"), @@ -105,10 +105,10 @@ func TestGetOutputs(t *testing.T) { } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - target := TerraformTarget{ + target := TerraformWriter{ outputs: tc.values, } - actual, err := target.getOutputs() + actual, err := target.GetOutputs() if tc.errExpected { assert.Error(t, err) return