pkg/cai2hcl/converters/services/compute/compute_instance_helpers.go (274 lines of code) (raw):
package compute
import (
"strconv"
"strings"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/pkg/cai2hcl/converters/utils"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
compute "google.golang.org/api/compute/v0.beta"
)
func flattenAliasIpRange(ranges []*compute.AliasIpRange) []map[string]interface{} {
rangesSchema := make([]map[string]interface{}, 0, len(ranges))
for _, ipRange := range ranges {
rangesSchema = append(rangesSchema, map[string]interface{}{
"ip_cidr_range": ipRange.IpCidrRange,
"subnetwork_range_name": ipRange.SubnetworkRangeName,
})
}
return rangesSchema
}
func flattenScheduling(resp *compute.Scheduling) []map[string]interface{} {
schedulingMap := make(map[string]interface{}, 0)
if resp.InstanceTerminationAction != "" {
schedulingMap["instance_termination_action"] = resp.InstanceTerminationAction
}
if resp.MinNodeCpus != 0 {
schedulingMap["min_node_cpus"] = resp.MinNodeCpus
}
if resp.OnHostMaintenance != "MIGRATE" {
schedulingMap["on_host_maintenance"] = resp.OnHostMaintenance
}
if resp.AutomaticRestart != nil && !*resp.AutomaticRestart {
schedulingMap["automatic_restart"] = *resp.AutomaticRestart
}
if resp.Preemptible {
schedulingMap["preemptible"] = resp.Preemptible
}
if resp.NodeAffinities != nil && len(resp.NodeAffinities) > 0 {
nodeAffinities := []map[string]interface{}{}
for _, na := range resp.NodeAffinities {
nodeAffinities = append(nodeAffinities, map[string]interface{}{
"key": na.Key,
"operator": na.Operator,
"values": tpgresource.ConvertStringArrToInterface(na.Values),
})
}
schedulingMap["node_affinities"] = nodeAffinities
}
if resp.ProvisioningModel != "STANDARD" {
schedulingMap["provisioning_model"] = resp.ProvisioningModel
}
if resp.AvailabilityDomain != 0 {
schedulingMap["availability_domain"] = resp.AvailabilityDomain
}
if resp.MaxRunDuration != nil {
schedulingMap["max_run_duration"] = flattenComputeMaxRunDuration(resp.MaxRunDuration)
}
if resp.OnInstanceStopAction != nil {
schedulingMap["on_instance_stop_action"] = flattenOnInstanceStopAction(resp.OnInstanceStopAction)
}
if resp.HostErrorTimeoutSeconds != 0 {
schedulingMap["host_error_timeout_seconds"] = resp.HostErrorTimeoutSeconds
}
if resp.MaintenanceInterval != "" {
schedulingMap["maintenance_interval"] = resp.MaintenanceInterval
}
if resp.LocalSsdRecoveryTimeout != nil {
schedulingMap["local_ssd_recovery_timeout"] = flattenComputeLocalSsdRecoveryTimeout(resp.LocalSsdRecoveryTimeout)
}
if len(schedulingMap) == 0 {
return nil
}
return []map[string]interface{}{schedulingMap}
}
func flattenComputeMaxRunDuration(v *compute.Duration) []interface{} {
if v == nil {
return nil
}
transformed := make(map[string]interface{})
transformed["nanos"] = v.Nanos
transformed["seconds"] = v.Seconds
return []interface{}{transformed}
}
func flattenOnInstanceStopAction(v *compute.SchedulingOnInstanceStopAction) []interface{} {
if v == nil {
return nil
}
transformed := make(map[string]interface{})
transformed["discard_local_ssd"] = v.DiscardLocalSsd
return []interface{}{transformed}
}
func flattenComputeLocalSsdRecoveryTimeout(v *compute.Duration) []interface{} {
if v == nil {
return nil
}
transformed := make(map[string]interface{})
transformed["nanos"] = v.Nanos
transformed["seconds"] = v.Seconds
return []interface{}{transformed}
}
func flattenAccessConfigs(accessConfigs []*compute.AccessConfig) ([]map[string]interface{}, string) {
flattened := make([]map[string]interface{}, len(accessConfigs))
natIP := ""
for i, ac := range accessConfigs {
flattened[i] = map[string]interface{}{
"nat_ip": ac.NatIP,
"network_tier": ac.NetworkTier,
}
if ac.SetPublicPtr {
flattened[i]["public_ptr_domain_name"] = ac.PublicPtrDomainName
}
if natIP == "" {
natIP = ac.NatIP
}
if ac.SecurityPolicy != "" {
flattened[i]["security_policy"] = ac.SecurityPolicy
}
}
return flattened, natIP
}
func flattenIpv6AccessConfigs(ipv6AccessConfigs []*compute.AccessConfig) []map[string]interface{} {
flattened := make([]map[string]interface{}, len(ipv6AccessConfigs))
for i, ac := range ipv6AccessConfigs {
flattened[i] = map[string]interface{}{
"network_tier": ac.NetworkTier,
}
flattened[i]["public_ptr_domain_name"] = ac.PublicPtrDomainName
flattened[i]["external_ipv6"] = ac.ExternalIpv6
flattened[i]["external_ipv6_prefix_length"] = strconv.FormatInt(ac.ExternalIpv6PrefixLength, 10)
flattened[i]["name"] = ac.Name
if ac.SecurityPolicy != "" {
flattened[i]["security_policy"] = ac.SecurityPolicy
}
}
return flattened
}
func flattenNetworkInterfaces(networkInterfaces []*compute.NetworkInterface, project string) ([]map[string]interface{}, string, string, error) {
flattened := make([]map[string]interface{}, len(networkInterfaces))
var internalIP, externalIP string
for i, iface := range networkInterfaces {
var ac []map[string]interface{}
ac, externalIP = flattenAccessConfigs(iface.AccessConfigs)
flattened[i] = map[string]interface{}{
"network_ip": iface.NetworkIP,
"access_config": ac,
"alias_ip_range": flattenAliasIpRange(iface.AliasIpRanges),
"nic_type": iface.NicType,
"ipv6_access_config": flattenIpv6AccessConfigs(iface.Ipv6AccessConfigs),
"ipv6_address": iface.Ipv6Address,
}
if !strings.HasSuffix(iface.Network, "/default") {
flattened[i]["network"] = tpgresource.ConvertSelfLinkToV1(iface.Network)
}
if !strings.HasSuffix(iface.Subnetwork, "/default") {
flattened[i]["subnetwork"] = tpgresource.ConvertSelfLinkToV1(iface.Subnetwork)
}
subnetProject := utils.ParseFieldValue(iface.Subnetwork, "projects")
if subnetProject != project {
flattened[i]["subnetwork_project"] = subnetProject
}
if iface.StackType != "IPV4_ONLY" {
flattened[i]["stack_type"] = iface.StackType
}
if iface.QueueCount != 0 {
flattened[i]["queue_count"] = iface.QueueCount
}
if internalIP == "" {
internalIP = iface.NetworkIP
}
if iface.NetworkAttachment != "" {
networkAttachment, err := tpgresource.GetRelativePath(iface.NetworkAttachment)
if err != nil {
return nil, "", "", err
}
flattened[i]["network_attachment"] = networkAttachment
}
// the security_policy for a network_interface is found in one of its accessConfigs.
if len(iface.AccessConfigs) > 0 && iface.AccessConfigs[0].SecurityPolicy != "" {
flattened[i]["security_policy"] = iface.AccessConfigs[0].SecurityPolicy
} else if len(iface.Ipv6AccessConfigs) > 0 && iface.Ipv6AccessConfigs[0].SecurityPolicy != "" {
flattened[i]["security_policy"] = iface.Ipv6AccessConfigs[0].SecurityPolicy
}
}
return flattened, internalIP, externalIP, nil
}
func flattenServiceAccounts(serviceAccounts []*compute.ServiceAccount) []map[string]interface{} {
result := make([]map[string]interface{}, len(serviceAccounts))
for i, serviceAccount := range serviceAccounts {
result[i] = map[string]interface{}{
"email": serviceAccount.Email,
"scopes": serviceAccount.Scopes,
}
}
return result
}
func flattenGuestAccelerators(accelerators []*compute.AcceleratorConfig) []map[string]interface{} {
acceleratorsSchema := make([]map[string]interface{}, len(accelerators))
for i, accelerator := range accelerators {
acceleratorsSchema[i] = map[string]interface{}{
"count": accelerator.AcceleratorCount,
"type": accelerator.AcceleratorType,
}
}
return acceleratorsSchema
}
func flattenConfidentialInstanceConfig(ConfidentialInstanceConfig *compute.ConfidentialInstanceConfig) []map[string]interface{} {
if ConfidentialInstanceConfig == nil {
return nil
}
return []map[string]interface{}{{
"enable_confidential_compute": ConfidentialInstanceConfig.EnableConfidentialCompute,
"confidential_instance_type": ConfidentialInstanceConfig.ConfidentialInstanceType,
}}
}
func flattenAdvancedMachineFeatures(AdvancedMachineFeatures *compute.AdvancedMachineFeatures) []map[string]interface{} {
if AdvancedMachineFeatures == nil {
return nil
}
return []map[string]interface{}{{
"enable_nested_virtualization": AdvancedMachineFeatures.EnableNestedVirtualization,
"threads_per_core": AdvancedMachineFeatures.ThreadsPerCore,
"turbo_mode": AdvancedMachineFeatures.TurboMode,
"visible_core_count": AdvancedMachineFeatures.VisibleCoreCount,
"performance_monitoring_unit": AdvancedMachineFeatures.PerformanceMonitoringUnit,
"enable_uefi_networking": AdvancedMachineFeatures.EnableUefiNetworking,
}}
}
func flattenShieldedVmConfig(shieldedVmConfig *compute.ShieldedInstanceConfig) []map[string]bool {
if shieldedVmConfig == nil {
return nil
}
shieldedInstanceConfig := map[string]bool{}
if shieldedVmConfig.EnableSecureBoot {
shieldedInstanceConfig["enable_secure_boot"] = shieldedVmConfig.EnableSecureBoot
}
if !shieldedVmConfig.EnableVtpm {
shieldedInstanceConfig["enable_vtpm"] = shieldedVmConfig.EnableVtpm
}
if !shieldedVmConfig.EnableIntegrityMonitoring {
shieldedInstanceConfig["enable_integrity_monitoring"] = shieldedVmConfig.EnableIntegrityMonitoring
}
if len(shieldedInstanceConfig) == 0 {
return nil
}
return []map[string]bool{shieldedInstanceConfig}
}
func flattenEnableDisplay(displayDevice *compute.DisplayDevice) interface{} {
if displayDevice == nil {
return nil
}
return displayDevice.EnableDisplay
}
func flattenReservationAffinity(affinity *compute.ReservationAffinity) []map[string]interface{} {
if affinity == nil {
return nil
}
flattened := map[string]interface{}{
"type": affinity.ConsumeReservationType,
}
if affinity.ConsumeReservationType == "SPECIFIC_RESERVATION" {
flattened["specific_reservation"] = []map[string]interface{}{{
"key": affinity.Key,
"values": affinity.Values,
}}
}
return []map[string]interface{}{flattened}
}
func flattenNetworkPerformanceConfig(c *compute.NetworkPerformanceConfig) []map[string]interface{} {
if c == nil {
return nil
}
return []map[string]interface{}{
{
"total_egress_bandwidth_tier": c.TotalEgressBandwidthTier,
},
}
}