func resourceArmVirtualMachineCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient) vmClient := client.vmClient log.Printf("[INFO] preparing arguments for Azure ARM Virtual Machine creation.") name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) tags := d.Get("tags").(map[string]interface{}) expandedTags := expandTags(tags) osDisk, err := expandAzureRmVirtualMachineOsDisk(d) if err != nil { return err } storageProfile := compute.StorageProfile{ OsDisk: osDisk, } if _, ok := d.GetOk("storage_image_reference"); ok { imageRef, err := expandAzureRmVirtualMachineImageReference(d) if err != nil { return err } storageProfile.ImageReference = imageRef } if _, ok := d.GetOk("storage_data_disk"); ok { dataDisks, err := expandAzureRmVirtualMachineDataDisk(d) if err != nil { return err } storageProfile.DataDisks = &dataDisks } networkProfile := expandAzureRmVirtualMachineNetworkProfile(d) vmSize := d.Get("vm_size").(string) properties := compute.VirtualMachineProperties{ NetworkProfile: &networkProfile, HardwareProfile: &compute.HardwareProfile{ VMSize: compute.VirtualMachineSizeTypes(vmSize), }, StorageProfile: &storageProfile, } osProfile, err := expandAzureRmVirtualMachineOsProfile(d) if err != nil { return err } properties.OsProfile = osProfile if v, ok := d.GetOk("availability_set_id"); ok { availabilitySet := v.(string) availSet := compute.SubResource{ ID: &availabilitySet, } properties.AvailabilitySet = &availSet } vm := compute.VirtualMachine{ Name: &name, Location: &location, Properties: &properties, Tags: expandedTags, } if _, ok := d.GetOk("plan"); ok { plan, err := expandAzureRmVirtualMachinePlan(d) if err != nil { return err } vm.Plan = plan } _, vmErr := vmClient.CreateOrUpdate(resGroup, name, vm, make(chan struct{})) if vmErr != nil { return vmErr } read, err := vmClient.Get(resGroup, name, "") if err != nil { return err } if read.ID == nil { return fmt.Errorf("Cannot read Virtual Machine %s (resource group %s) ID", name, resGroup) } d.SetId(*read.ID) return resourceArmVirtualMachineRead(d, meta) }
func resourceArmVirtualMachineCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*ArmClient) vmClient := client.vmClient log.Printf("[INFO] preparing arguments for Azure ARM Virtual Machine creation.") name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) tags := d.Get("tags").(map[string]interface{}) expandedTags := expandTags(tags) osDisk, err := expandAzureRmVirtualMachineOsDisk(d) if err != nil { return err } storageProfile := compute.StorageProfile{ OsDisk: osDisk, } if _, ok := d.GetOk("storage_image_reference"); ok { imageRef, err := expandAzureRmVirtualMachineImageReference(d) if err != nil { return err } storageProfile.ImageReference = imageRef } if _, ok := d.GetOk("storage_data_disk"); ok { dataDisks, err := expandAzureRmVirtualMachineDataDisk(d) if err != nil { return err } storageProfile.DataDisks = &dataDisks } networkProfile := expandAzureRmVirtualMachineNetworkProfile(d) vmSize := d.Get("vm_size").(string) properties := compute.VirtualMachineProperties{ NetworkProfile: &networkProfile, HardwareProfile: &compute.HardwareProfile{ VMSize: compute.VirtualMachineSizeTypes(vmSize), }, StorageProfile: &storageProfile, } osProfile, err := expandAzureRmVirtualMachineOsProfile(d) if err != nil { return err } properties.OsProfile = osProfile if v, ok := d.GetOk("availability_set_id"); ok { availabilitySet := v.(string) availSet := compute.SubResource{ ID: &availabilitySet, } properties.AvailabilitySet = &availSet } vm := compute.VirtualMachine{ Name: &name, Location: &location, Properties: &properties, Tags: expandedTags, } if _, ok := d.GetOk("plan"); ok { plan, err := expandAzureRmVirtualMachinePlan(d) if err != nil { return err } vm.Plan = plan } resp, vmErr := vmClient.CreateOrUpdate(resGroup, name, vm) if vmErr != nil { return vmErr } d.SetId(*resp.ID) log.Printf("[DEBUG] Waiting for Virtual Machine (%s) to become available", name) stateConf := &resource.StateChangeConf{ Pending: []string{"Creating", "Updating"}, Target: []string{"Succeeded"}, Refresh: virtualMachineStateRefreshFunc(client, resGroup, name), Timeout: 20 * time.Minute, MinTimeout: 10 * time.Second, } if _, err := stateConf.WaitForState(); err != nil { return fmt.Errorf("Error waiting for Virtual Machine (%s) to become available: %s", name, err) } return resourceArmVirtualMachineRead(d, meta) }