in pkg/tfplan2cai/converters/services/compute/compute_instance.go [77:205]
func expandComputeInstance(project string, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (*compute.Instance, error) {
// Get the machine type
var machineTypeUrl string
if mt, ok := d.GetOk("machine_type"); ok {
machineType, err := tpgresource.ParseMachineTypesFieldValue(mt.(string), d, config)
if err != nil {
return nil, fmt.Errorf(
"Error loading machine type: %s",
err)
}
machineTypeUrl = machineType.RelativeLink()
}
// Build up the list of disks
disks := []*compute.AttachedDisk{}
if _, hasBootDisk := d.GetOk("boot_disk"); hasBootDisk {
bootDisk, err := expandBootDisk(d, config, project)
if err != nil {
return nil, err
}
disks = append(disks, bootDisk)
}
if _, hasScratchDisk := d.GetOk("scratch_disk"); hasScratchDisk {
scratchDisks, err := expandScratchDisks(d, config, project)
if err != nil {
return nil, err
}
disks = append(disks, scratchDisks...)
}
attachedDisksCount := d.Get("attached_disk.#").(int)
for i := 0; i < attachedDisksCount; i++ {
diskConfig := d.Get(fmt.Sprintf("attached_disk.%d", i)).(map[string]interface{})
disk, err := expandAttachedDisk(diskConfig, d, config)
if err != nil {
return nil, err
}
disks = append(disks, disk)
}
sch := d.Get("scheduling").([]interface{})
var scheduling *compute.Scheduling
if len(sch) == 0 {
// TF doesn't do anything about defaults inside of nested objects, so if
// scheduling hasn't been set, then send it with its default values.
scheduling = &compute.Scheduling{
AutomaticRestart: googleapi.Bool(true),
}
} else {
prefix := "scheduling.0"
scheduling = &compute.Scheduling{
AutomaticRestart: googleapi.Bool(d.Get(prefix + ".automatic_restart").(bool)),
Preemptible: d.Get(prefix + ".preemptible").(bool),
OnHostMaintenance: d.Get(prefix + ".on_host_maintenance").(string),
ProvisioningModel: d.Get(prefix + ".provisioning_model").(string),
ForceSendFields: []string{"AutomaticRestart", "Preemptible"},
}
}
params, err := expandParams(d)
if err != nil {
return nil, fmt.Errorf("Error creating params: %s", err)
}
metadata, err := resourceInstanceMetadata(d)
if err != nil {
return nil, fmt.Errorf("Error creating metadata: %s", err)
}
PartnerMetadata, err := resourceInstancePartnerMetadata(d)
if err != nil {
return nil, fmt.Errorf("Error creating partner metadata: %s", err)
}
networkInterfaces, err := expandNetworkInterfaces(d, config)
if err != nil {
return nil, fmt.Errorf("Error creating network interfaces: %s", err)
}
networkPerformanceConfig, err := expandNetworkPerformanceConfig(d, config)
if err != nil {
return nil, fmt.Errorf("Error creating network performance config: %s", err)
}
accels, err := expandInstanceGuestAccelerators(d, config)
if err != nil {
return nil, fmt.Errorf("Error creating guest accelerators: %s", err)
}
reservationAffinity, err := expandReservationAffinity(d)
if err != nil {
return nil, fmt.Errorf("Error creating reservation affinity: %s", err)
}
// Create the instance information
return &compute.Instance{
CanIpForward: d.Get("can_ip_forward").(bool),
Description: d.Get("description").(string),
Disks: disks,
MachineType: machineTypeUrl,
Metadata: metadata,
PartnerMetadata: PartnerMetadata,
Name: d.Get("name").(string),
Zone: d.Get("zone").(string),
NetworkInterfaces: networkInterfaces,
NetworkPerformanceConfig: networkPerformanceConfig,
Tags: resourceInstanceTags(d),
Params: params,
Labels: tpgresource.ExpandLabels(d),
ServiceAccounts: expandServiceAccounts(d.Get("service_account").([]interface{})),
GuestAccelerators: accels,
MinCpuPlatform: d.Get("min_cpu_platform").(string),
Scheduling: scheduling,
DeletionProtection: d.Get("deletion_protection").(bool),
Hostname: d.Get("hostname").(string),
ForceSendFields: []string{"CanIpForward", "DeletionProtection"},
ConfidentialInstanceConfig: expandConfidentialInstanceConfig(d),
AdvancedMachineFeatures: expandAdvancedMachineFeatures(d),
ShieldedInstanceConfig: expandShieldedVmConfigs(d),
DisplayDevice: expandDisplayDevice(d),
ResourcePolicies: tpgresource.ConvertStringArr(d.Get("resource_policies").([]interface{})),
ReservationAffinity: reservationAffinity,
KeyRevocationActionType: d.Get("key_revocation_action_type").(string),
}, nil
}