Split out TerraformWriter

This commit is contained in:
John Gardiner Myers 2021-05-02 21:18:29 -07:00
parent 4e53018cf8
commit 57dec35f68
76 changed files with 629 additions and 510 deletions

View File

@ -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",

View File

@ -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",

View File

@ -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")
}

View File

@ -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

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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 {

View File

@ -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
}

View File

@ -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",

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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.

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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)
}

View File

@ -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 {

View File

@ -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

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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"`

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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",

View File

@ -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")
}

View File

@ -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"`

View File

@ -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)
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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)
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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")
}

View File

@ -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)
}

View File

@ -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",

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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",

View File

@ -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 != "" {

View File

@ -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 = {

View File

@ -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
}

View File

@ -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
}

View File

@ -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"),
},
},
},

View File

@ -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
}

View File

@ -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",
],
)

View File

@ -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"

View File

@ -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
}

View File

@ -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