From a0a86aefe7c69bc8aa052cf8960827607e4e0f6a Mon Sep 17 00:00:00 2001 From: aznashwan Date: Fri, 22 May 2015 21:12:22 +0300 Subject: [PATCH] Updated with changes in sdk. --- builtin/providers/azure/config.go | 2 +- .../azure/resource_azure_dns_server.go | 48 ++++--- .../azure/resource_azure_hosted_service.go | 40 +++--- .../azure/resource_azure_instance.go | 56 ++++---- .../azure/resource_azure_local_network.go | 22 ++- .../azure/resource_azure_security_group.go | 4 +- .../resource_azure_security_group_rule.go | 6 +- .../azure/resource_azure_virtual_network.go | 135 ++++++++++-------- 8 files changed, 180 insertions(+), 133 deletions(-) diff --git a/builtin/providers/azure/config.go b/builtin/providers/azure/config.go index 7bd88d36236c..7ce927c3492a 100644 --- a/builtin/providers/azure/config.go +++ b/builtin/providers/azure/config.go @@ -43,7 +43,7 @@ func (c *Config) Client() (interface{}, error) { managementClient, err = management.NewClientFromConfig( c.SubscriptionID, c.ManagementCert, - management.ClientConfig{c.ManagementUrl}, + management.ClientConfig{ManagementURL: c.ManagementUrl}, ) } else { managementClient, err = management.NewClient( diff --git a/builtin/providers/azure/resource_azure_dns_server.go b/builtin/providers/azure/resource_azure_dns_server.go index 0719b0f90a92..0fd0abb30e43 100644 --- a/builtin/providers/azure/resource_azure_dns_server.go +++ b/builtin/providers/azure/resource_azure_dns_server.go @@ -55,22 +55,26 @@ func resourceAzureDnsServerCreate(d *schema.ResourceData, meta interface{}) erro log.Println("[DEBUG] Adding new DNS server definition to Azure.") name := d.Get("name").(string) address := d.Get("dns_address").(string) - netConf.Configuration.Dns.DnsServers = append( - netConf.Configuration.Dns.DnsServers, - virtualnetwork.DnsServer{ + netConf.Configuration.DNS.DNSServers = append( + netConf.Configuration.DNS.DNSServers, + virtualnetwork.DNSServer{ Name: name, IPAddress: address, }) // send the configuration back to Azure: log.Println("[INFO] Sending updated network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) - azureClient.mutex.Unlock() + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) + if err != nil { + return fmt.Errorf("Failed issuing update to network configuration: %s", err) + } + err = managementClient.WaitForOperation(reqID, nil) if err != nil { - return fmt.Errorf("Failed setting updated network configuration: %s", err) + return fmt.Errorf("Error setting network configuration: %s", err) } d.SetId(getRandomStringLabel(50)) + azureClient.mutex.Unlock() return nil } @@ -94,7 +98,7 @@ func resourceAzureDnsServerRead(d *schema.ResourceData, meta interface{}) error name := d.Get("name").(string) // search for our DNS and update it if the IP has been changed: - for _, dns := range netConf.Configuration.Dns.DnsServers { + for _, dns := range netConf.Configuration.DNS.DNSServers { if dns.Name == name { found = true d.Set("dns_address", dns.IPAddress) @@ -135,20 +139,24 @@ func resourceAzureDnsServerUpdate(d *schema.ResourceData, meta interface{}) erro } // search for our DNS and update its address value: - for i, dns := range netConf.Configuration.Dns.DnsServers { + for i, dns := range netConf.Configuration.DNS.DNSServers { found = true if dns.Name == name { - netConf.Configuration.Dns.DnsServers[i].IPAddress = d.Get("dns_address").(string) + netConf.Configuration.DNS.DNSServers[i].IPAddress = d.Get("dns_address").(string) } } // if the config has changes, send the configuration back to Azure: if found && caddress { log.Println("[INFO] Sending updated network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) + if err != nil { + return fmt.Errorf("Failed issuing update to network configuration: %s", err) + } + err = managementClient.WaitForOperation(reqID, nil) azureClient.mutex.Unlock() if err != nil { - return fmt.Errorf("Failed setting updated network configuration: %s", err) + return fmt.Errorf("Error setting network configuration: %s", err) } } } @@ -180,7 +188,7 @@ func resourceAzureDnsServerExists(d *schema.ResourceData, meta interface{}) (boo name := d.Get("name").(string) // search for the DNS server's definition: - for _, dns := range netConf.Configuration.Dns.DnsServers { + for _, dns := range netConf.Configuration.DNS.DNSServers { if dns.Name == name { return true, nil } @@ -209,21 +217,25 @@ func resourceAzureDnsServerDelete(d *schema.ResourceData, meta interface{}) erro name := d.Get("name").(string) // search for the DNS server's definition and remove it: - for i, dns := range netConf.Configuration.Dns.DnsServers { + for i, dns := range netConf.Configuration.DNS.DNSServers { if dns.Name == name { - netConf.Configuration.Dns.DnsServers = append( - netConf.Configuration.Dns.DnsServers[:i], - netConf.Configuration.Dns.DnsServers[i+1:]..., + netConf.Configuration.DNS.DNSServers = append( + netConf.Configuration.DNS.DNSServers[:i], + netConf.Configuration.DNS.DNSServers[i+1:]..., ) } } // send the configuration back to Azure: log.Println("[INFO] Sending updated network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) + if err != nil { + return fmt.Errorf("Failed issuing update to network configuration: %s", err) + } + err = managementClient.WaitForOperation(reqID, nil) azureClient.mutex.Unlock() if err != nil { - return fmt.Errorf("Failed setting updated network configuration: %s", err) + return fmt.Errorf("Error setting network configuration: %s", err) } d.SetId("") diff --git a/builtin/providers/azure/resource_azure_hosted_service.go b/builtin/providers/azure/resource_azure_hosted_service.go index 16dae9b43af4..2d5cf1b316db 100644 --- a/builtin/providers/azure/resource_azure_hosted_service.go +++ b/builtin/providers/azure/resource_azure_hosted_service.go @@ -4,6 +4,7 @@ import ( "fmt" "log" + "github.com/Azure/azure-sdk-for-go/management" "github.com/Azure/azure-sdk-for-go/management/hostedservice" "github.com/hashicorp/terraform/helper/schema" ) @@ -89,24 +90,19 @@ func resourceAzureHostedServiceCreate(d *schema.ResourceData, meta interface{}) label := getRandomStringLabel(50) d.SetId(label) - reqID, err := hostedServiceClient.CreateHostedService( - serviceName, - location, - reverseDNS, - label, - description, + err := hostedServiceClient.CreateHostedService( + hostedservice.CreateHostedServiceParameters{ + ServiceName: serviceName, + Location: location, + Label: label, + Description: description, + ReverseDNSFqdn: reverseDNS, + }, ) if err != nil { return fmt.Errorf("Failed defining new Azure hosted service: %s", err) } - log.Println("[DEBUG] Waiting for hosted service creation.") - log.Println("[INFO] Creating new Azure hosted service.") - err = managementClient.WaitAsyncOperation(reqID) - if err != nil { - return fmt.Errorf("Failed creating new Azure hosted service: %s", err) - } - return nil } @@ -121,12 +117,18 @@ func resourceAzureHostedServiceExists(d *schema.ResourceData, meta interface{}) log.Println("[INFO] Querying for hosted service existence.") serviceName := d.Get("service_name").(string) - exists, _, err := hostedServiceClient.CheckHostedServiceNameAvailability(serviceName) + _, err := hostedServiceClient.GetHostedService(serviceName) if err != nil { - return false, fmt.Errorf("Failed to query for hosted service name availability: %s", err) + if management.IsResourceNotFoundError(err) { + // it means that the hosted service has been deleted in the meantime... + d.SetId("") + return false, nil + } else { + return false, fmt.Errorf("Failed to query for hosted service name availability: %s", err) + } } - return exists, nil + return true, nil } // resourceAzureHostedServiceRead does all the necessary API calls @@ -147,12 +149,12 @@ func resourceAzureHostedServiceRead(d *schema.ResourceData, meta interface{}) er log.Println("[DEBUG] Reading hosted service query result data.") d.Set("service_name", hostedService.ServiceName) - d.Set("url", hostedService.Url) + d.Set("url", hostedService.URL) d.Set("location", hostedService.Location) d.SetId(hostedService.Label) d.Set("description", hostedService.Description) d.Set("status", hostedService.Status) - d.Set("reverse_dns_fqdn", hostedService.ReverseDnsFqdn) + d.Set("reverse_dns_fqdn", hostedService.ReverseDNSFqdn) d.Set("default_certificate_thumbprint", hostedService.DefaultWinRmCertificateThumbprint) return nil @@ -183,7 +185,7 @@ func resourceAzureHostedServiceDelete(d *schema.ResourceData, meta interface{}) } log.Println("[DEBUG] Awaiting confirmation on hosted service deletion.") - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error on hosted service deletion: %s", err) } diff --git a/builtin/providers/azure/resource_azure_instance.go b/builtin/providers/azure/resource_azure_instance.go index 4231b3024f8a..92638ad36b13 100644 --- a/builtin/providers/azure/resource_azure_instance.go +++ b/builtin/providers/azure/resource_azure_instance.go @@ -7,7 +7,7 @@ import ( "github.com/Azure/azure-sdk-for-go/management" "github.com/Azure/azure-sdk-for-go/management/hostedservice" "github.com/Azure/azure-sdk-for-go/management/virtualmachine" - "github.com/Azure/azure-sdk-for-go/management/vmutils" + // "github.com/Azure/azure-sdk-for-go/management/vmutils" "github.com/hashicorp/terraform/helper/schema" ) @@ -153,7 +153,7 @@ func resourceAzureInstanceCreate(d *schema.ResourceData, meta interface{}) error // general variables: label := getRandomStringLabel(50) d.SetId(label) - image := d.Get("image").(string) + // image := d.Get("image").(string) name := d.Get("name").(string) location := d.Get("location").(string) description := d.Get("descriptiom").(string) @@ -167,45 +167,47 @@ func resourceAzureInstanceCreate(d *schema.ResourceData, meta interface{}) error if err != nil { if serviceName == "" || management.IsResourceNotFoundError(err) { log.Println("[INFO] No hosted service with the given name exists, creating new one with the instance's name.") - reqID, err := hostedServiceClient.CreateHostedService( - name, - location, - "", - label, - description, + err := hostedServiceClient.CreateHostedService( + hostedservice.CreateHostedServiceParameters{ + ServiceName: name, + Location: location, + ReverseDNSFqdn: "", + Label: label, + Description: description, + }, ) if err != nil { return fmt.Errorf("Error defining new Azure hosted service: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) - if err != nil { - return fmt.Errorf("Error creating new Azure hosted service: %s", err) - } + // err = managementClient.WaitForOperation(reqID, nil) + // if err != nil { + // return fmt.Errorf("Error creating new Azure hosted service: %s", err) + // } } else { fmt.Errorf("Error querying for existing hosted service.") } } // create VM configuration: - role := vmutils.NewVmConfiguration(name, d.Get("size").(string)) + // role := vmutils.NewVmConfiguration(name, d.Get("size").(string)) // configure the VM's storage: // TODO(aznashwan): put things right here: - storAccount := d.Get("storage_account").(string) - storContainer := d.Get("storage_container").(string) - vhdURL := fmt.Sprintf("http://%s.blob.core.windows.net/%s/%s.vhd", storAccount, storContainer, name) + // storAccount := d.Get("storage_account").(string) + // storContainer := d.Get("storage_container").(string) + // vhdURL := fmt.Sprintf("http://%s.blob.core.windows.net/%s/%s.vhd", storAccount, storContainer, name) - err = vmutils.ConfigureDeploymentFromPlatformImage(&role, image, vhdURL, label) - if err != nil { - return fmt.Errorf("Failed to configure deployment: %s", err) - } + // err = vmutils.ConfigureDeploymentFromPlatformImage(&role, image, vhdURL, label) + // if err != nil { + // return fmt.Errorf("Failed to configure deployment: %s", err) + //} // configure VM details: - userName := d.Get("user_name").(string) - userPass := d.Get("user_password").(string) - vmutils.ConfigureForLinux(&role, name, userName, userPass) - vmutils.ConfigureWithPublicSSH(&role) + //userName := d.Get("user_name").(string) + //userPass := d.Get("user_password").(string) + //vmutils.ConfigureForLinux(&role, name, userName, userPass) + //vmutils.ConfigureWithPublicSSH(&role) // deploy the VM: // reqID, err := virtualmachine.NewClient(managementClient).CreateDeployment(role, serviceName) @@ -213,7 +215,7 @@ func resourceAzureInstanceCreate(d *schema.ResourceData, meta interface{}) error // return fmt.Errorf("Failed to initiate deployment creation: %s", err) // } - // err = managementClient.WaitAsyncOperation(reqID) + // err = managementClient.WaitForOperation(reqID, nil) // if err != nil { // return fmt.Errorf("Deployment creation failed: ", err) // } @@ -244,7 +246,7 @@ func resourceAzureInstanceRead(d *schema.ResourceData, meta interface{}) error { if role.InstanceName == name { d.Set("status", role.InstanceStatus) d.Set("power_state", role.PowerState) - d.Set("private_ip", role.IpAddress) + // d.Set("private_ip", role.IpAddress) d.Set("host_name", role.HostName) d.Set("agent_status", role.GuestAgentStatus) @@ -284,7 +286,7 @@ func resourceAzureInstanceDelete(d *schema.ResourceData, meta interface{}) error return fmt.Errorf("Failed to issue deployment deletion request: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Deployment deletion failed: %s", err) } diff --git a/builtin/providers/azure/resource_azure_local_network.go b/builtin/providers/azure/resource_azure_local_network.go index 99a768cba325..78cf15d95d1f 100644 --- a/builtin/providers/azure/resource_azure_local_network.go +++ b/builtin/providers/azure/resource_azure_local_network.go @@ -84,12 +84,16 @@ func resourceAzureLocalNetworkConnectionCreate(d *schema.ResourceData, meta inte // send the configuration back to Azure: log.Println("[INFO] Sending updated network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) - azureClient.mutex.Unlock() + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) if err != nil { return fmt.Errorf("Failed setting updated network configuration: %s", err) } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Failed updating the network configuration: %s", err) + } + azureClient.mutex.Unlock() d.SetId(getRandomStringLabel(50)) return nil } @@ -179,10 +183,14 @@ func resourceAzureLocalNetworkConnectionUpdate(d *schema.ResourceData, meta inte } else if cvpn || cprefixes { // else, send the configuration back to Azure: log.Println("[INFO] Sending updated network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) if err != nil { return fmt.Errorf("Failed setting updated network configuration: %s", err) } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Failed updating the network configuration: %s", err) + } } azureClient.mutex.Unlock() @@ -247,12 +255,16 @@ func resourceAzureLocalNetworkConnectionDelete(d *schema.ResourceData, meta inte // send the configuration back to Azure: log.Println("[INFO] Sending updated network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) - azureClient.mutex.Unlock() + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) if err != nil { return fmt.Errorf("Failed setting updated network configuration: %s", err) } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Failed updating the network configuration: %s", err) + } + azureClient.mutex.Unlock() d.SetId("") return nil } diff --git a/builtin/providers/azure/resource_azure_security_group.go b/builtin/providers/azure/resource_azure_security_group.go index 222596474886..cb28ff13298d 100644 --- a/builtin/providers/azure/resource_azure_security_group.go +++ b/builtin/providers/azure/resource_azure_security_group.go @@ -63,7 +63,7 @@ func resourceAzureSecurityGroupCreate(d *schema.ResourceData, meta interface{}) return fmt.Errorf("Error whilst sending network security group create request to Azure: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error creating network security group on Azure: %s", err) } @@ -126,7 +126,7 @@ func resourceAzureSecurityGroupDelete(d *schema.ResourceData, meta interface{}) if err != nil { return fmt.Errorf("Error whilst issuing Azure network security group deletion: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error in Azure network security group deletion: %s", err) } diff --git a/builtin/providers/azure/resource_azure_security_group_rule.go b/builtin/providers/azure/resource_azure_security_group_rule.go index 734470f13619..8aa96c22f86d 100644 --- a/builtin/providers/azure/resource_azure_security_group_rule.go +++ b/builtin/providers/azure/resource_azure_security_group_rule.go @@ -110,7 +110,7 @@ func resourceAzureSecurityGroupRuleCreate(d *schema.ResourceData, meta interface if err != nil { return fmt.Errorf("Error sending network security group rule creation request to Azure: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error creating network security group rule on Azure: %s", err) } @@ -234,7 +234,7 @@ func resourceAzureSecurityGroupRuleUpdate(d *schema.ResourceData, meta interface if err != nil { return fmt.Errorf("Error sending network security group rule update request to Azure: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error updating network security group rule on Azure: %s", err) } @@ -329,7 +329,7 @@ func resourceAzureSecurityGroupRuleDelete(d *schema.ResourceData, meta interface if err != nil { return fmt.Errorf("Error sending network security group rule delete request to Azure: %s", err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error deleting network security group rule off Azure: %s", err) } diff --git a/builtin/providers/azure/resource_azure_virtual_network.go b/builtin/providers/azure/resource_azure_virtual_network.go index 4ac92c802c1e..19053a6644ac 100644 --- a/builtin/providers/azure/resource_azure_virtual_network.go +++ b/builtin/providers/azure/resource_azure_virtual_network.go @@ -4,6 +4,7 @@ import ( "fmt" "log" + "github.com/Azure/azure-sdk-for-go/management" netsecgroup "github.com/Azure/azure-sdk-for-go/management/networksecuritygroup" "github.com/Azure/azure-sdk-for-go/management/virtualnetwork" "github.com/hashicorp/terraform/helper/schema" @@ -83,6 +84,7 @@ func resourceAzureVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) } managementClient := azureClient.managementClient networkClient := virtualnetwork.NewClient(managementClient) + netSecClient := netsecgroup.NewClient(managementClient) log.Println("[INFO] Retrieving current network configuration from Azure.") azureClient.mutex.Lock() @@ -105,11 +107,11 @@ func resourceAzureVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) } // fetch DNS references: - var dnsRefs []virtualnetwork.DnsServerRef + var dnsRefs []virtualnetwork.DNSServerRef if ndnses := d.Get("dns_servers_names.#").(int); ndnses > 0 { - dnsRefs = []virtualnetwork.DnsServerRef{} + dnsRefs = []virtualnetwork.DNSServerRef{} for i := 0; i < ndnses; i++ { - dnsRefs = append(dnsRefs, virtualnetwork.DnsServerRef{ + dnsRefs = append(dnsRefs, virtualnetwork.DNSServerRef{ Name: d.Get(fmt.Sprintf("dns_servers_names.%d", i)).(string), }) } @@ -125,6 +127,24 @@ func resourceAzureVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) Name: sub["name"].(string), AddressPrefix: sub["prefix"].(string), }) + for i := 0; i < nsubs; i++ { + log.Println(fmt.Sprintf("[DEBUG] Adding network security settings to subnet %d.", i+1)) + sub := d.Get(fmt.Sprintf("subnet.%d", i)).(map[string]interface{}) + if secGroup, ok := sub["security_group_name"].(string); ok { + reqID, err := netSecClient.AddNetworkSecurityToSubnet( + secGroup, + sub["name"].(string), + name, + ) + if err != nil { + return fmt.Errorf("Failed requesting addition of network security to subnet %d: %s", i+1, err) + } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Failed adding network security settings to subnet %d: %s", i+1, err) + } + } + } } } @@ -133,7 +153,7 @@ func resourceAzureVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) Name: name, Location: location, Subnets: subnets, - DnsServersRef: dnsRefs, + DNSServersRef: dnsRefs, AddressSpace: virtualnetwork.AddressSpace{ AddressPrefix: prefixes, }, @@ -142,33 +162,13 @@ func resourceAzureVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) // send the updated configuration back: log.Println("[INFO] Sending virtual network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) if err != nil { return fmt.Errorf("Failed updating network configuration: %s", err) } - - // fetch subnets: - if nsubs := d.Get("subnet.#").(int); nsubs > 0 { - log.Println("[INFO] Started applying network security rules to subnets:") - netSecClient := netsecgroup.NewClient(managementClient) - for i := 0; i < nsubs; i++ { - log.Println(fmt.Sprintf("[DEBUG] Adding network security settings to subnet %d.", i+1)) - sub := d.Get(fmt.Sprintf("subnet.%d", i)).(map[string]interface{}) - if secGroup, ok := sub["security_group_name"].(string); ok { - reqID, err := netSecClient.AddNetworkSecurityToSubnet( - secGroup, - sub["name"].(string), - name, - ) - if err != nil { - return fmt.Errorf("Failed requesting addition of network security to subnet %d: %s", i+1, err) - } - err = managementClient.WaitAsyncOperation(reqID) - if err != nil { - return fmt.Errorf("Failed adding network security settings to subnet %d: %s", i+1, err) - } - } - } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Failed updating the network configuration: %s", err) } d.SetId(getRandomStringLabel(50)) @@ -203,21 +203,28 @@ func resourceAzureVirtualNetworkRead(d *schema.ResourceData, meta interface{}) e // read subnets: subnets := make([]map[string]interface{}, 0, 1) for i, sub := range vnet.Subnets { - secGroup, err := secGroupClient.GetNetworkSecurityGroupForSubnet(sub.Name, name) - if err != nil { - return fmt.Errorf("Error whilst reading security groups for subnet %d: %s", i+1, err) + var secGroupName string + if secGroup, err := secGroupClient.GetNetworkSecurityGroupForSubnet(sub.Name, name); err != nil { + if management.IsResourceNotFoundError(err) { + // it means merely that no securoty group was attached. + secGroupName = secGroup.Name + } else { + return fmt.Errorf("Error whilst reading security groups for subnet %d: %s", i+1, err) + } + } else { + secGroupName = secGroup.Name } subnets = append(subnets, map[string]interface{}{ "name": sub.Name, "prefix": sub.AddressPrefix, - "security_group_name": secGroup.Name, + "security_group_name": secGroupName, }) } d.Set("subnet", subnets) // read dns server references: dnsRefs := []string{} - for _, dns := range vnet.DnsServersRef { + for _, dns := range vnet.DNSServersRef { dnsRefs = append(dnsRefs, dns.Name) } d.Set("dns_servers_names", dnsRefs) @@ -276,16 +283,16 @@ func resourceAzureVirtualNetworkUpdate(d *schema.ResourceData, meta interface{}) // apply dns server references, if required: if cdnses { - var dnsRefs []virtualnetwork.DnsServerRef + var dnsRefs []virtualnetwork.DNSServerRef if ndnses := d.Get("dns_servers_names.#").(int); ndnses > 0 { - dnsRefs = []virtualnetwork.DnsServerRef{} + dnsRefs = []virtualnetwork.DNSServerRef{} for i := 0; i < ndnses; i++ { - dnsRefs = append(dnsRefs, virtualnetwork.DnsServerRef{ + dnsRefs = append(dnsRefs, virtualnetwork.DNSServerRef{ Name: d.Get(fmt.Sprintf("dns_servers_names.%d", i)).(string), }) } } - vnets[i].DnsServersRef = dnsRefs + vnets[i].DNSServersRef = dnsRefs } // apply subnet changes if required: @@ -302,19 +309,22 @@ func resourceAzureVirtualNetworkUpdate(d *schema.ResourceData, meta interface{}) }) // check to see if we need to remove the old one: + found := true secGroup, err := secGroupClient.GetNetworkSecurityGroupForSubnet(subName, name) if err != nil { - return fmt.Errorf("Error getting current network security group for subnet %d: %s", i+1, err) + if management.IsResourceNotFoundError(err) { + found = false + } else { + return fmt.Errorf("Error getting current network security group for subnet %d: %s", i+1, err) + } } - // TODO(aznashwan): is this condition correct? - if secGroup.Name != "" { + if !found { // we must delte it first: reqID, err := secGroupClient.DeleteNetworkSecurityGroup(secGroup.Name) if err != nil { - // TODO(aznashwan): see if this is right condition: return fmt.Errorf("Error issuing removal security group settings from subnet %d for update: %s", i+1, err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error removing security group settings from subnet %d for update: %s", i+1, err) } @@ -328,7 +338,7 @@ func resourceAzureVirtualNetworkUpdate(d *schema.ResourceData, meta interface{}) if err != nil { return fmt.Errorf("Error issuing network security group settings application for subnet %d: %s", i, err) } - err = managementClient.WaitAsyncOperation(reqID) + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Error removing network security group settings for subnet %d: %s", i+1, err) } @@ -347,11 +357,14 @@ func resourceAzureVirtualNetworkUpdate(d *schema.ResourceData, meta interface{}) d.SetId("") } else if cprefixes || cdnses || csubnets { // if it was found and changes are due; return the new configuration to Azure: - err = networkClient.SetVirtualNetworkConfiguration(netConf) + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) + if err != nil { + return fmt.Errorf("Failed to issue set new Azure network configuration: %s", err) + } + err = managementClient.WaitForOperation(reqID, nil) if err != nil { return fmt.Errorf("Failed to set new Azure network configuration: %s", err) } - } azureClient.mutex.Unlock() @@ -418,17 +431,19 @@ func resourceAzureVirtualNetworkDelete(d *schema.ResourceData, meta interface{}) sub := d.Get(fmt.Sprintf("subnet.%d", i)).(map[string]interface{}) subName := sub["name"].(string) secGroupName := sub["security_group_name"].(string) - reqID, err := secGroupClient.RemoveNetworkSecurityGroupFromSubnet( - secGroupName, - subName, - name, - ) - if err != nil { - return fmt.Errorf("Error issuing network security group removal from subnet %d: %s", i+1, err) - } - err = managementClient.WaitAsyncOperation(reqID) - if err != nil { - return fmt.Errorf("Error removing network security group settings from subnet %d: %s", i+1, err) + if secGroupName != "" { + reqID, err := secGroupClient.RemoveNetworkSecurityGroupFromSubnet( + secGroupName, + subName, + name, + ) + if err != nil { + return fmt.Errorf("Error issuing network security group removal from subnet %d: %s", i+1, err) + } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Error removing network security group settings from subnet %d: %s", i+1, err) + } } } } @@ -452,13 +467,17 @@ func resourceAzureVirtualNetworkDelete(d *schema.ResourceData, meta interface{}) } else { // else; send the updated configuration back: log.Println("[INFO] Sending virtual network configuration back to Azure.") - err = networkClient.SetVirtualNetworkConfiguration(netConf) - azureClient.mutex.Unlock() + reqID, err := networkClient.SetVirtualNetworkConfiguration(netConf) if err != nil { return fmt.Errorf("Failed updating network configuration: %s", err) } + err = managementClient.WaitForOperation(reqID, nil) + if err != nil { + return fmt.Errorf("Failed to set new Azure network configuration: %s", err) + } } + azureClient.mutex.Unlock() d.SetId("") return nil }