diff --git a/builtin/providers/azurerm/config.go b/builtin/providers/azurerm/config.go index 0a84852d0b..535f03392b 100644 --- a/builtin/providers/azurerm/config.go +++ b/builtin/providers/azurerm/config.go @@ -4,10 +4,7 @@ import ( "fmt" "log" "net/http" - "time" - "github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest" - "github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/azure-sdk-for-go/arm/cdn" "github.com/Azure/azure-sdk-for-go/arm/compute" "github.com/Azure/azure-sdk-for-go/arm/network" @@ -15,6 +12,8 @@ import ( "github.com/Azure/azure-sdk-for-go/arm/scheduler" "github.com/Azure/azure-sdk-for-go/arm/storage" mainStorage "github.com/Azure/azure-sdk-for-go/storage" + "github.com/Azure/go-autorest/autorest" + "github.com/Azure/go-autorest/autorest/azure" "github.com/hashicorp/terraform/terraform" riviera "github.com/jen20/riviera/azure" ) @@ -77,22 +76,6 @@ func withRequestLogging() autorest.SendDecorator { } } -func withPollWatcher() autorest.SendDecorator { - return func(s autorest.Sender) autorest.Sender { - return autorest.SenderFunc(func(r *http.Request) (*http.Response, error) { - fmt.Printf("[DEBUG] Sending Azure RM Request %q to %q\n", r.Method, r.URL) - resp, err := s.Do(r) - fmt.Printf("[DEBUG] Received Azure RM Request status code %s for %s\n", resp.Status, r.URL) - if autorest.ResponseRequiresPolling(resp) { - fmt.Printf("[DEBUG] Azure RM request will poll %s after %d seconds\n", - autorest.GetPollingLocation(resp), - int(autorest.GetPollingDelay(resp, time.Duration(0))/time.Second)) - } - return resp, err - }) - } -} - func setUserAgent(client *autorest.Client) { var version string if terraform.VersionPrerelease != "" { @@ -130,7 +113,23 @@ func (c *Config) getArmClient() (*ArmClient, error) { } client.rivieraClient = rivieraClient - spt, err := azure.NewServicePrincipalToken(c.ClientID, c.ClientSecret, c.TenantID, azure.AzureResourceManagerScope) + oauthConfig, err := azure.PublicCloud.OAuthConfigForTenant(c.TenantID) + if err != nil { + return nil, err + } + + // This is necessary because no-one thought about API usability. OAuthConfigForTenant + // returns a pointer, which can be nil. NewServicePrincipalToken does not take a pointer. + // Consequently we have to nil check this and do _something_ if it is nil, which should + // be either an invariant of OAuthConfigForTenant (guarantee the token is not nil if + // there is no error), or NewServicePrincipalToken should error out if the configuration + // is required and is nil. This is the worst of all worlds, however. + if oauthConfig == nil { + return nil, fmt.Errorf("Unable to configure OAuthConfig for tenant %s", c.TenantID) + } + + spt, err := azure.NewServicePrincipalToken(*oauthConfig, c.ClientID, c.ClientSecret, + azure.PublicCloud.ResourceManagerEndpoint) if err != nil { return nil, err } @@ -284,7 +283,7 @@ func (c *Config) getArmClient() (*ArmClient, error) { ssc := storage.NewAccountsClient(c.SubscriptionID) setUserAgent(&ssc.Client) ssc.Authorizer = spt - ssc.Sender = autorest.CreateSender(withRequestLogging(), withPollWatcher()) + ssc.Sender = autorest.CreateSender(withRequestLogging()) client.storageServiceClient = ssc suc := storage.NewUsageOperationsClient(c.SubscriptionID) @@ -349,6 +348,7 @@ func (armClient *ArmClient) getBlobStorageClientForStorageAccount(resourceGroupN blobClient := storageClient.GetBlobService() return &blobClient, true, nil } + func (armClient *ArmClient) getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.QueueServiceClient, bool, error) { key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName) if err != nil { diff --git a/builtin/providers/azurerm/provider.go b/builtin/providers/azurerm/provider.go index f0852ee8af..4709d95a41 100644 --- a/builtin/providers/azurerm/provider.go +++ b/builtin/providers/azurerm/provider.go @@ -2,12 +2,9 @@ package azurerm import ( "fmt" - "log" - "net/http" "reflect" "strings" - "github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest" "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform/helper/mutexkv" "github.com/hashicorp/terraform/helper/resource" @@ -21,25 +18,25 @@ import ( func Provider() terraform.ResourceProvider { return &schema.Provider{ Schema: map[string]*schema.Schema{ - "subscription_id": &schema.Schema{ + "subscription_id": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_SUBSCRIPTION_ID", ""), }, - "client_id": &schema.Schema{ + "client_id": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_CLIENT_ID", ""), }, - "client_secret": &schema.Schema{ + "client_secret": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_CLIENT_SECRET", ""), }, - "tenant_id": &schema.Schema{ + "tenant_id": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_TENANT_ID", ""), @@ -47,37 +44,40 @@ func Provider() terraform.ResourceProvider { }, ResourcesMap: map[string]*schema.Resource{ - "azurerm_availability_set": resourceArmAvailabilitySet(), - "azurerm_cdn_endpoint": resourceArmCdnEndpoint(), - "azurerm_cdn_profile": resourceArmCdnProfile(), - "azurerm_dns_a_record": resourceArmDnsARecord(), - "azurerm_dns_aaaa_record": resourceArmDnsAAAARecord(), - "azurerm_dns_cname_record": resourceArmDnsCNameRecord(), - "azurerm_dns_mx_record": resourceArmDnsMxRecord(), - "azurerm_dns_ns_record": resourceArmDnsNsRecord(), - "azurerm_dns_srv_record": resourceArmDnsSrvRecord(), - "azurerm_dns_txt_record": resourceArmDnsTxtRecord(), - "azurerm_dns_zone": resourceArmDnsZone(), - "azurerm_local_network_gateway": resourceArmLocalNetworkGateway(), - "azurerm_network_interface": resourceArmNetworkInterface(), - "azurerm_network_security_group": resourceArmNetworkSecurityGroup(), - "azurerm_network_security_rule": resourceArmNetworkSecurityRule(), - "azurerm_public_ip": resourceArmPublicIp(), - "azurerm_resource_group": resourceArmResourceGroup(), - "azurerm_route": resourceArmRoute(), - "azurerm_route_table": resourceArmRouteTable(), - "azurerm_search_service": resourceArmSearchService(), - "azurerm_sql_database": resourceArmSqlDatabase(), - "azurerm_sql_firewall_rule": resourceArmSqlFirewallRule(), - "azurerm_sql_server": resourceArmSqlServer(), - "azurerm_storage_account": resourceArmStorageAccount(), - "azurerm_storage_blob": resourceArmStorageBlob(), - "azurerm_storage_container": resourceArmStorageContainer(), - "azurerm_storage_queue": resourceArmStorageQueue(), - "azurerm_subnet": resourceArmSubnet(), - "azurerm_template_deployment": resourceArmTemplateDeployment(), - "azurerm_virtual_machine": resourceArmVirtualMachine(), - "azurerm_virtual_network": resourceArmVirtualNetwork(), + // These resources use the Azure ARM SDK + "azurerm_availability_set": resourceArmAvailabilitySet(), + //"azurerm_cdn_endpoint": resourceArmCdnEndpoint(), + //"azurerm_cdn_profile": resourceArmCdnProfile(), + //"azurerm_local_network_gateway": resourceArmLocalNetworkGateway(), + //"azurerm_network_interface": resourceArmNetworkInterface(), + //"azurerm_network_security_group": resourceArmNetworkSecurityGroup(), + //"azurerm_network_security_rule": resourceArmNetworkSecurityRule(), + //"azurerm_public_ip": resourceArmPublicIp(), + //"azurerm_route": resourceArmRoute(), + //"azurerm_route_table": resourceArmRouteTable(), + //"azurerm_storage_account": resourceArmStorageAccount(), + "azurerm_storage_blob": resourceArmStorageBlob(), + //"azurerm_storage_container": resourceArmStorageContainer(), + "azurerm_storage_queue": resourceArmStorageQueue(), + //"azurerm_subnet": resourceArmSubnet(), + //"azurerm_template_deployment": resourceArmTemplateDeployment(), + //"azurerm_virtual_machine": resourceArmVirtualMachine(), + //"azurerm_virtual_network": resourceArmVirtualNetwork(), + + // These resources use the Riviera SDK + "azurerm_dns_a_record": resourceArmDnsARecord(), + "azurerm_dns_aaaa_record": resourceArmDnsAAAARecord(), + "azurerm_dns_cname_record": resourceArmDnsCNameRecord(), + "azurerm_dns_mx_record": resourceArmDnsMxRecord(), + "azurerm_dns_ns_record": resourceArmDnsNsRecord(), + "azurerm_dns_srv_record": resourceArmDnsSrvRecord(), + "azurerm_dns_txt_record": resourceArmDnsTxtRecord(), + "azurerm_dns_zone": resourceArmDnsZone(), + "azurerm_resource_group": resourceArmResourceGroup(), + "azurerm_search_service": resourceArmSearchService(), + "azurerm_sql_database": resourceArmSqlDatabase(), + "azurerm_sql_firewall_rule": resourceArmSqlFirewallRule(), + "azurerm_sql_server": resourceArmSqlServer(), }, ConfigureFunc: providerConfigure, } @@ -197,39 +197,6 @@ func azureRMNormalizeLocation(location interface{}) string { return strings.Replace(strings.ToLower(input), " ", "", -1) } -// pollIndefinitelyAsNeeded is a terrible hack which is necessary because the Azure -// Storage API (and perhaps others) can have response times way beyond the default -// retry timeouts, with no apparent upper bound. This effectively causes the client -// to continue polling when it reaches the configured timeout. My investigations -// suggest that this is neccesary when deleting and recreating a storage account with -// the same name in a short (though undetermined) time period. -// -// It is possible that this will give Terraform the appearance of being slow in -// future: I have attempted to mitigate this by logging whenever this happens. We -// may want to revisit this with configurable timeouts in the future as clearly -// unbounded wait loops is not ideal. It does seem preferable to the current situation -// where our polling loop will time out _with an operation in progress_, but no ID -// for the resource - so the state will not know about it, and conflicts will occur -// on the next run. -func pollIndefinitelyAsNeeded(client autorest.Client, response *http.Response, acceptableCodes ...int) (*http.Response, error) { - var resp *http.Response - var err error - - for { - resp, err = client.PollAsNeeded(response, acceptableCodes...) - if err != nil { - if resp.StatusCode != http.StatusAccepted { - log.Printf("[DEBUG] Starting new polling loop for %q", response.Request.URL.Path) - continue - } - - return resp, err - } - - return resp, nil - } -} - // armMutexKV is the instance of MutexKV for ARM resources var armMutexKV = mutexkv.NewMutexKV() diff --git a/builtin/providers/azurerm/resource_arm_availability_set.go b/builtin/providers/azurerm/resource_arm_availability_set.go index 74efc886d0..3e37a0a3f2 100644 --- a/builtin/providers/azurerm/resource_arm_availability_set.go +++ b/builtin/providers/azurerm/resource_arm_availability_set.go @@ -17,26 +17,26 @@ func resourceArmAvailabilitySet() *schema.Resource { Delete: resourceArmAvailabilitySetDelete, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "resource_group_name": &schema.Schema{ + "resource_group_name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "location": &schema.Schema{ + "location": { Type: schema.TypeString, Required: true, ForceNew: true, StateFunc: azureRMNormalizeLocation, }, - "platform_update_domain_count": &schema.Schema{ + "platform_update_domain_count": { Type: schema.TypeInt, Optional: true, Default: 5, @@ -50,7 +50,7 @@ func resourceArmAvailabilitySet() *schema.Resource { }, }, - "platform_fault_domain_count": &schema.Schema{ + "platform_fault_domain_count": { Type: schema.TypeInt, Optional: true, Default: 3, @@ -78,8 +78,8 @@ func resourceArmAvailabilitySetCreate(d *schema.ResourceData, meta interface{}) name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) - updateDomainCount := d.Get("platform_update_domain_count").(int) - faultDomainCount := d.Get("platform_fault_domain_count").(int) + updateDomainCount := d.Get("platform_update_domain_count").(int32) + faultDomainCount := d.Get("platform_fault_domain_count").(int32) tags := d.Get("tags").(map[string]interface{}) availSet := compute.AvailabilitySet{ diff --git a/builtin/providers/azurerm/resource_arm_cdn_endpoint.go b/builtin/providers/azurerm/resource_arm_cdn_endpoint.go index 42d0f78f1a..01c290fa9e 100644 --- a/builtin/providers/azurerm/resource_arm_cdn_endpoint.go +++ b/builtin/providers/azurerm/resource_arm_cdn_endpoint.go @@ -1,451 +1,451 @@ package azurerm -import ( - "bytes" - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/cdn" - "github.com/hashicorp/terraform/helper/hashcode" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmCdnEndpoint() *schema.Resource { - return &schema.Resource{ - Create: resourceArmCdnEndpointCreate, - Read: resourceArmCdnEndpointRead, - Update: resourceArmCdnEndpointUpdate, - Delete: resourceArmCdnEndpointDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "profile_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "origin_host_header": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "is_http_allowed": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: true, - }, - - "is_https_allowed": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: true, - }, - - "origin": &schema.Schema{ - Type: schema.TypeSet, - Required: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "host_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "http_port": &schema.Schema{ - Type: schema.TypeInt, - Optional: true, - Computed: true, - }, - - "https_port": &schema.Schema{ - Type: schema.TypeInt, - Optional: true, - Computed: true, - }, - }, - }, - Set: resourceArmCdnEndpointOriginHash, - }, - - "origin_path": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "querystring_caching_behaviour": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Default: "IgnoreQueryString", - ValidateFunc: validateCdnEndpointQuerystringCachingBehaviour, - }, - - "content_types_to_compress": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - - "is_compression_enabled": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: false, - }, - - "host_name": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmCdnEndpointCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - cdnEndpointsClient := client.cdnEndpointsClient - - log.Printf("[INFO] preparing arguments for Azure ARM CDN EndPoint creation.") - - name := d.Get("name").(string) - location := d.Get("location").(string) - resGroup := d.Get("resource_group_name").(string) - profileName := d.Get("profile_name").(string) - http_allowed := d.Get("is_http_allowed").(bool) - https_allowed := d.Get("is_https_allowed").(bool) - compression_enabled := d.Get("is_compression_enabled").(bool) - caching_behaviour := d.Get("querystring_caching_behaviour").(string) - tags := d.Get("tags").(map[string]interface{}) - - properties := cdn.EndpointPropertiesCreateUpdateParameters{ - IsHTTPAllowed: &http_allowed, - IsHTTPSAllowed: &https_allowed, - IsCompressionEnabled: &compression_enabled, - QueryStringCachingBehavior: cdn.QueryStringCachingBehavior(caching_behaviour), - } - - origins, originsErr := expandAzureRmCdnEndpointOrigins(d) - if originsErr != nil { - return fmt.Errorf("Error Building list of CDN Endpoint Origins: %s", originsErr) - } - if len(origins) > 0 { - properties.Origins = &origins - } - - if v, ok := d.GetOk("origin_host_header"); ok { - host_header := v.(string) - properties.OriginHostHeader = &host_header - } - - if v, ok := d.GetOk("origin_path"); ok { - origin_path := v.(string) - properties.OriginPath = &origin_path - } - - if v, ok := d.GetOk("content_types_to_compress"); ok { - var content_types []string - ctypes := v.(*schema.Set).List() - for _, ct := range ctypes { - str := ct.(string) - content_types = append(content_types, str) - } - - properties.ContentTypesToCompress = &content_types - } - - cdnEndpoint := cdn.EndpointCreateParameters{ - Location: &location, - Properties: &properties, - Tags: expandTags(tags), - } - - resp, err := cdnEndpointsClient.Create(name, cdnEndpoint, profileName, resGroup) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for CDN Endpoint (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating", "Creating"}, - Target: []string{"Succeeded"}, - Refresh: cdnEndpointStateRefreshFunc(client, resGroup, profileName, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for CDN Endpoint (%s) to become available: %s", name, err) - } - - return resourceArmCdnEndpointRead(d, meta) -} - -func resourceArmCdnEndpointRead(d *schema.ResourceData, meta interface{}) error { - cdnEndpointsClient := meta.(*ArmClient).cdnEndpointsClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["endpoints"] - profileName := id.Path["profiles"] - if profileName == "" { - profileName = id.Path["Profiles"] - } - log.Printf("[INFO] Trying to find the AzureRM CDN Endpoint %s (Profile: %s, RG: %s)", name, profileName, resGroup) - resp, err := cdnEndpointsClient.Get(name, profileName, resGroup) - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure CDN Endpoint %s: %s", name, err) - } - - d.Set("name", resp.Name) - d.Set("host_name", resp.Properties.HostName) - d.Set("is_compression_enabled", resp.Properties.IsCompressionEnabled) - d.Set("is_http_allowed", resp.Properties.IsHTTPAllowed) - d.Set("is_https_allowed", resp.Properties.IsHTTPSAllowed) - d.Set("querystring_caching_behaviour", resp.Properties.QueryStringCachingBehavior) - if resp.Properties.OriginHostHeader != nil && *resp.Properties.OriginHostHeader != "" { - d.Set("origin_host_header", resp.Properties.OriginHostHeader) - } - if resp.Properties.OriginPath != nil && *resp.Properties.OriginPath != "" { - d.Set("origin_path", resp.Properties.OriginPath) - } - if resp.Properties.ContentTypesToCompress != nil && len(*resp.Properties.ContentTypesToCompress) > 0 { - d.Set("content_types_to_compress", flattenAzureRMCdnEndpointContentTypes(resp.Properties.ContentTypesToCompress)) - } - d.Set("origin", flattenAzureRMCdnEndpointOrigin(resp.Properties.Origins)) - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmCdnEndpointUpdate(d *schema.ResourceData, meta interface{}) error { - cdnEndpointsClient := meta.(*ArmClient).cdnEndpointsClient - - if !d.HasChange("tags") { - return nil - } - - name := d.Get("name").(string) - resGroup := d.Get("resource_group_name").(string) - profileName := d.Get("profile_name").(string) - http_allowed := d.Get("is_http_allowed").(bool) - https_allowed := d.Get("is_https_allowed").(bool) - compression_enabled := d.Get("is_compression_enabled").(bool) - caching_behaviour := d.Get("querystring_caching_behaviour").(string) - newTags := d.Get("tags").(map[string]interface{}) - - properties := cdn.EndpointPropertiesCreateUpdateParameters{ - IsHTTPAllowed: &http_allowed, - IsHTTPSAllowed: &https_allowed, - IsCompressionEnabled: &compression_enabled, - QueryStringCachingBehavior: cdn.QueryStringCachingBehavior(caching_behaviour), - } - - if d.HasChange("origin") { - origins, originsErr := expandAzureRmCdnEndpointOrigins(d) - if originsErr != nil { - return fmt.Errorf("Error Building list of CDN Endpoint Origins: %s", originsErr) - } - if len(origins) > 0 { - properties.Origins = &origins - } - } - - if d.HasChange("origin_host_header") { - host_header := d.Get("origin_host_header").(string) - properties.OriginHostHeader = &host_header - } - - if d.HasChange("origin_path") { - origin_path := d.Get("origin_path").(string) - properties.OriginPath = &origin_path - } - - if d.HasChange("content_types_to_compress") { - var content_types []string - ctypes := d.Get("content_types_to_compress").(*schema.Set).List() - for _, ct := range ctypes { - str := ct.(string) - content_types = append(content_types, str) - } - - properties.ContentTypesToCompress = &content_types - } - - updateProps := cdn.EndpointUpdateParameters{ - Tags: expandTags(newTags), - Properties: &properties, - } - - _, err := cdnEndpointsClient.Update(name, updateProps, profileName, resGroup) - if err != nil { - return fmt.Errorf("Error issuing Azure ARM update request to update CDN Endpoint %q: %s", name, err) - } - - return resourceArmCdnEndpointRead(d, meta) -} - -func resourceArmCdnEndpointDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).cdnEndpointsClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - profileName := id.Path["profiles"] - if profileName == "" { - profileName = id.Path["Profiles"] - } - name := id.Path["endpoints"] - - accResp, err := client.DeleteIfExists(name, profileName, resGroup) - if err != nil { - if accResp.StatusCode == http.StatusNotFound { - return nil - } - return fmt.Errorf("Error issuing AzureRM delete request for CDN Endpoint %q: %s", name, err) - } - _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response, http.StatusNotFound) - if err != nil { - return fmt.Errorf("Error polling for AzureRM delete request for CDN Endpoint %q: %s", name, err) - } - - return err -} - -func cdnEndpointStateRefreshFunc(client *ArmClient, resourceGroupName string, profileName string, name string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.cdnEndpointsClient.Get(name, profileName, resourceGroupName) - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in cdnEndpointStateRefreshFunc to Azure ARM for CDN Endpoint '%s' (RG: '%s'): %s", name, resourceGroupName, err) - } - return res, string(res.Properties.ProvisioningState), nil - } -} - -func validateCdnEndpointQuerystringCachingBehaviour(v interface{}, k string) (ws []string, errors []error) { - value := strings.ToLower(v.(string)) - cachingTypes := map[string]bool{ - "ignorequerystring": true, - "bypasscaching": true, - "usequerystring": true, - } - - if !cachingTypes[value] { - errors = append(errors, fmt.Errorf("CDN Endpoint querystringCachingBehaviours can only be IgnoreQueryString, BypassCaching or UseQueryString")) - } - return -} - -func resourceArmCdnEndpointOriginHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["host_name"].(string))) - - return hashcode.String(buf.String()) -} - -func expandAzureRmCdnEndpointOrigins(d *schema.ResourceData) ([]cdn.DeepCreatedOrigin, error) { - configs := d.Get("origin").(*schema.Set).List() - origins := make([]cdn.DeepCreatedOrigin, 0, len(configs)) - - for _, configRaw := range configs { - data := configRaw.(map[string]interface{}) - - host_name := data["host_name"].(string) - - properties := cdn.DeepCreatedOriginProperties{ - HostName: &host_name, - } - - if v, ok := data["https_port"]; ok { - https_port := v.(int) - properties.HTTPSPort = &https_port - - } - - if v, ok := data["http_port"]; ok { - http_port := v.(int) - properties.HTTPPort = &http_port - } - - name := data["name"].(string) - - origin := cdn.DeepCreatedOrigin{ - Name: &name, - Properties: &properties, - } - - origins = append(origins, origin) - } - - return origins, nil -} - -func flattenAzureRMCdnEndpointOrigin(list *[]cdn.DeepCreatedOrigin) []map[string]interface{} { - result := make([]map[string]interface{}, 0, len(*list)) - for _, i := range *list { - l := map[string]interface{}{ - "name": *i.Name, - "host_name": *i.Properties.HostName, - } - - if i.Properties.HTTPPort != nil { - l["http_port"] = *i.Properties.HTTPPort - } - if i.Properties.HTTPSPort != nil { - l["https_port"] = *i.Properties.HTTPSPort - } - result = append(result, l) - } - return result -} - -func flattenAzureRMCdnEndpointContentTypes(list *[]string) []interface{} { - vs := make([]interface{}, 0, len(*list)) - for _, v := range *list { - vs = append(vs, v) - } - return vs -} +//import ( +// "bytes" +// "fmt" +// "log" +// "net/http" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/cdn" +// "github.com/hashicorp/terraform/helper/hashcode" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmCdnEndpoint() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmCdnEndpointCreate, +// Read: resourceArmCdnEndpointRead, +// Update: resourceArmCdnEndpointUpdate, +// Delete: resourceArmCdnEndpointDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "profile_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "origin_host_header": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "is_http_allowed": &schema.Schema{ +// Type: schema.TypeBool, +// Optional: true, +// Default: true, +// }, +// +// "is_https_allowed": &schema.Schema{ +// Type: schema.TypeBool, +// Optional: true, +// Default: true, +// }, +// +// "origin": &schema.Schema{ +// Type: schema.TypeSet, +// Required: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "host_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "http_port": &schema.Schema{ +// Type: schema.TypeInt, +// Optional: true, +// Computed: true, +// }, +// +// "https_port": &schema.Schema{ +// Type: schema.TypeInt, +// Optional: true, +// Computed: true, +// }, +// }, +// }, +// Set: resourceArmCdnEndpointOriginHash, +// }, +// +// "origin_path": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "querystring_caching_behaviour": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Default: "IgnoreQueryString", +// ValidateFunc: validateCdnEndpointQuerystringCachingBehaviour, +// }, +// +// "content_types_to_compress": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// +// "is_compression_enabled": &schema.Schema{ +// Type: schema.TypeBool, +// Optional: true, +// Default: false, +// }, +// +// "host_name": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmCdnEndpointCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// cdnEndpointsClient := client.cdnEndpointsClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM CDN EndPoint creation.") +// +// name := d.Get("name").(string) +// location := d.Get("location").(string) +// resGroup := d.Get("resource_group_name").(string) +// profileName := d.Get("profile_name").(string) +// http_allowed := d.Get("is_http_allowed").(bool) +// https_allowed := d.Get("is_https_allowed").(bool) +// compression_enabled := d.Get("is_compression_enabled").(bool) +// caching_behaviour := d.Get("querystring_caching_behaviour").(string) +// tags := d.Get("tags").(map[string]interface{}) +// +// properties := cdn.EndpointPropertiesCreateUpdateParameters{ +// IsHTTPAllowed: &http_allowed, +// IsHTTPSAllowed: &https_allowed, +// IsCompressionEnabled: &compression_enabled, +// QueryStringCachingBehavior: cdn.QueryStringCachingBehavior(caching_behaviour), +// } +// +// origins, originsErr := expandAzureRmCdnEndpointOrigins(d) +// if originsErr != nil { +// return fmt.Errorf("Error Building list of CDN Endpoint Origins: %s", originsErr) +// } +// if len(origins) > 0 { +// properties.Origins = &origins +// } +// +// if v, ok := d.GetOk("origin_host_header"); ok { +// host_header := v.(string) +// properties.OriginHostHeader = &host_header +// } +// +// if v, ok := d.GetOk("origin_path"); ok { +// origin_path := v.(string) +// properties.OriginPath = &origin_path +// } +// +// if v, ok := d.GetOk("content_types_to_compress"); ok { +// var content_types []string +// ctypes := v.(*schema.Set).List() +// for _, ct := range ctypes { +// str := ct.(string) +// content_types = append(content_types, str) +// } +// +// properties.ContentTypesToCompress = &content_types +// } +// +// cdnEndpoint := cdn.EndpointCreateParameters{ +// Location: &location, +// Properties: &properties, +// Tags: expandTags(tags), +// } +// +// resp, err := cdnEndpointsClient.Create(name, cdnEndpoint, profileName, resGroup) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for CDN Endpoint (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating", "Creating"}, +// Target: []string{"Succeeded"}, +// Refresh: cdnEndpointStateRefreshFunc(client, resGroup, profileName, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for CDN Endpoint (%s) to become available: %s", name, err) +// } +// +// return resourceArmCdnEndpointRead(d, meta) +//} +// +//func resourceArmCdnEndpointRead(d *schema.ResourceData, meta interface{}) error { +// cdnEndpointsClient := meta.(*ArmClient).cdnEndpointsClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["endpoints"] +// profileName := id.Path["profiles"] +// if profileName == "" { +// profileName = id.Path["Profiles"] +// } +// log.Printf("[INFO] Trying to find the AzureRM CDN Endpoint %s (Profile: %s, RG: %s)", name, profileName, resGroup) +// resp, err := cdnEndpointsClient.Get(name, profileName, resGroup) +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure CDN Endpoint %s: %s", name, err) +// } +// +// d.Set("name", resp.Name) +// d.Set("host_name", resp.Properties.HostName) +// d.Set("is_compression_enabled", resp.Properties.IsCompressionEnabled) +// d.Set("is_http_allowed", resp.Properties.IsHTTPAllowed) +// d.Set("is_https_allowed", resp.Properties.IsHTTPSAllowed) +// d.Set("querystring_caching_behaviour", resp.Properties.QueryStringCachingBehavior) +// if resp.Properties.OriginHostHeader != nil && *resp.Properties.OriginHostHeader != "" { +// d.Set("origin_host_header", resp.Properties.OriginHostHeader) +// } +// if resp.Properties.OriginPath != nil && *resp.Properties.OriginPath != "" { +// d.Set("origin_path", resp.Properties.OriginPath) +// } +// if resp.Properties.ContentTypesToCompress != nil && len(*resp.Properties.ContentTypesToCompress) > 0 { +// d.Set("content_types_to_compress", flattenAzureRMCdnEndpointContentTypes(resp.Properties.ContentTypesToCompress)) +// } +// d.Set("origin", flattenAzureRMCdnEndpointOrigin(resp.Properties.Origins)) +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmCdnEndpointUpdate(d *schema.ResourceData, meta interface{}) error { +// cdnEndpointsClient := meta.(*ArmClient).cdnEndpointsClient +// +// if !d.HasChange("tags") { +// return nil +// } +// +// name := d.Get("name").(string) +// resGroup := d.Get("resource_group_name").(string) +// profileName := d.Get("profile_name").(string) +// http_allowed := d.Get("is_http_allowed").(bool) +// https_allowed := d.Get("is_https_allowed").(bool) +// compression_enabled := d.Get("is_compression_enabled").(bool) +// caching_behaviour := d.Get("querystring_caching_behaviour").(string) +// newTags := d.Get("tags").(map[string]interface{}) +// +// properties := cdn.EndpointPropertiesCreateUpdateParameters{ +// IsHTTPAllowed: &http_allowed, +// IsHTTPSAllowed: &https_allowed, +// IsCompressionEnabled: &compression_enabled, +// QueryStringCachingBehavior: cdn.QueryStringCachingBehavior(caching_behaviour), +// } +// +// if d.HasChange("origin") { +// origins, originsErr := expandAzureRmCdnEndpointOrigins(d) +// if originsErr != nil { +// return fmt.Errorf("Error Building list of CDN Endpoint Origins: %s", originsErr) +// } +// if len(origins) > 0 { +// properties.Origins = &origins +// } +// } +// +// if d.HasChange("origin_host_header") { +// host_header := d.Get("origin_host_header").(string) +// properties.OriginHostHeader = &host_header +// } +// +// if d.HasChange("origin_path") { +// origin_path := d.Get("origin_path").(string) +// properties.OriginPath = &origin_path +// } +// +// if d.HasChange("content_types_to_compress") { +// var content_types []string +// ctypes := d.Get("content_types_to_compress").(*schema.Set).List() +// for _, ct := range ctypes { +// str := ct.(string) +// content_types = append(content_types, str) +// } +// +// properties.ContentTypesToCompress = &content_types +// } +// +// updateProps := cdn.EndpointUpdateParameters{ +// Tags: expandTags(newTags), +// Properties: &properties, +// } +// +// _, err := cdnEndpointsClient.Update(name, updateProps, profileName, resGroup) +// if err != nil { +// return fmt.Errorf("Error issuing Azure ARM update request to update CDN Endpoint %q: %s", name, err) +// } +// +// return resourceArmCdnEndpointRead(d, meta) +//} +// +//func resourceArmCdnEndpointDelete(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient).cdnEndpointsClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// profileName := id.Path["profiles"] +// if profileName == "" { +// profileName = id.Path["Profiles"] +// } +// name := id.Path["endpoints"] +// +// accResp, err := client.DeleteIfExists(name, profileName, resGroup) +// if err != nil { +// if accResp.StatusCode == http.StatusNotFound { +// return nil +// } +// return fmt.Errorf("Error issuing AzureRM delete request for CDN Endpoint %q: %s", name, err) +// } +// _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response, http.StatusNotFound) +// if err != nil { +// return fmt.Errorf("Error polling for AzureRM delete request for CDN Endpoint %q: %s", name, err) +// } +// +// return err +//} +// +//func cdnEndpointStateRefreshFunc(client *ArmClient, resourceGroupName string, profileName string, name string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.cdnEndpointsClient.Get(name, profileName, resourceGroupName) +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in cdnEndpointStateRefreshFunc to Azure ARM for CDN Endpoint '%s' (RG: '%s'): %s", name, resourceGroupName, err) +// } +// return res, string(res.Properties.ProvisioningState), nil +// } +//} +// +//func validateCdnEndpointQuerystringCachingBehaviour(v interface{}, k string) (ws []string, errors []error) { +// value := strings.ToLower(v.(string)) +// cachingTypes := map[string]bool{ +// "ignorequerystring": true, +// "bypasscaching": true, +// "usequerystring": true, +// } +// +// if !cachingTypes[value] { +// errors = append(errors, fmt.Errorf("CDN Endpoint querystringCachingBehaviours can only be IgnoreQueryString, BypassCaching or UseQueryString")) +// } +// return +//} +// +//func resourceArmCdnEndpointOriginHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["host_name"].(string))) +// +// return hashcode.String(buf.String()) +//} +// +//func expandAzureRmCdnEndpointOrigins(d *schema.ResourceData) ([]cdn.DeepCreatedOrigin, error) { +// configs := d.Get("origin").(*schema.Set).List() +// origins := make([]cdn.DeepCreatedOrigin, 0, len(configs)) +// +// for _, configRaw := range configs { +// data := configRaw.(map[string]interface{}) +// +// host_name := data["host_name"].(string) +// +// properties := cdn.DeepCreatedOriginProperties{ +// HostName: &host_name, +// } +// +// if v, ok := data["https_port"]; ok { +// https_port := v.(int) +// properties.HTTPSPort = &https_port +// +// } +// +// if v, ok := data["http_port"]; ok { +// http_port := v.(int) +// properties.HTTPPort = &http_port +// } +// +// name := data["name"].(string) +// +// origin := cdn.DeepCreatedOrigin{ +// Name: &name, +// Properties: &properties, +// } +// +// origins = append(origins, origin) +// } +// +// return origins, nil +//} +// +//func flattenAzureRMCdnEndpointOrigin(list *[]cdn.DeepCreatedOrigin) []map[string]interface{} { +// result := make([]map[string]interface{}, 0, len(*list)) +// for _, i := range *list { +// l := map[string]interface{}{ +// "name": *i.Name, +// "host_name": *i.Properties.HostName, +// } +// +// if i.Properties.HTTPPort != nil { +// l["http_port"] = *i.Properties.HTTPPort +// } +// if i.Properties.HTTPSPort != nil { +// l["https_port"] = *i.Properties.HTTPSPort +// } +// result = append(result, l) +// } +// return result +//} +// +//func flattenAzureRMCdnEndpointContentTypes(list *[]string) []interface{} { +// vs := make([]interface{}, 0, len(*list)) +// for _, v := range *list { +// vs = append(vs, v) +// } +// return vs +//} diff --git a/builtin/providers/azurerm/resource_arm_cdn_endpoint_test.go b/builtin/providers/azurerm/resource_arm_cdn_endpoint_test.go index f7a7d86ab8..bd2a93fc5f 100644 --- a/builtin/providers/azurerm/resource_arm_cdn_endpoint_test.go +++ b/builtin/providers/azurerm/resource_arm_cdn_endpoint_test.go @@ -1,215 +1,215 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMCdnEndpoint_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMCdnEndpoint_basic, ri, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMCdnEndpointDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMCdnEndpointExists("azurerm_cdn_endpoint.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMCdnEndpoints_withTags(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMCdnEndpoint_withTags, ri, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMCdnEndpoint_withTagsUpdate, ri, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMCdnEndpointDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMCdnEndpointExists("azurerm_cdn_endpoint.test"), - resource.TestCheckResourceAttr( - "azurerm_cdn_endpoint.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_cdn_endpoint.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_cdn_endpoint.test", "tags.cost_center", "MSFT"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMCdnEndpointExists("azurerm_cdn_endpoint.test"), - resource.TestCheckResourceAttr( - "azurerm_cdn_endpoint.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_cdn_endpoint.test", "tags.environment", "staging"), - ), - }, - }, - }) -} - -func testCheckAzureRMCdnEndpointExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - profileName := rs.Primary.Attributes["profile_name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for cdn endpoint: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).cdnEndpointsClient - - resp, err := conn.Get(name, profileName, resourceGroup) - if err != nil { - return fmt.Errorf("Bad: Get on cdnEndpointsClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: CDN Endpoint %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMCdnEndpointDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).cdnEndpointsClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_cdn_endpoint" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - profileName := rs.Primary.Attributes["profile_name"] - - resp, err := conn.Get(name, profileName, resourceGroup) - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("CDN Endpoint still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMCdnEndpoint_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_cdn_profile" "test" { - name = "acctestcdnprof%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - sku = "Standard" -} - -resource "azurerm_cdn_endpoint" "test" { - name = "acctestcdnend%d" - profile_name = "${azurerm_cdn_profile.test.name}" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - origin { - name = "acceptanceTestCdnOrigin1" - host_name = "www.example.com" - https_port = 443 - http_port = 80 - } -} -` - -var testAccAzureRMCdnEndpoint_withTags = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_cdn_profile" "test" { - name = "acctestcdnprof%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - sku = "Standard" -} - -resource "azurerm_cdn_endpoint" "test" { - name = "acctestcdnend%d" - profile_name = "${azurerm_cdn_profile.test.name}" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - origin { - name = "acceptanceTestCdnOrigin2" - host_name = "www.example.com" - https_port = 443 - http_port = 80 - } - - tags { - environment = "Production" - cost_center = "MSFT" - } -} -` - -var testAccAzureRMCdnEndpoint_withTagsUpdate = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_cdn_profile" "test" { - name = "acctestcdnprof%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - sku = "Standard" -} - -resource "azurerm_cdn_endpoint" "test" { - name = "acctestcdnend%d" - profile_name = "${azurerm_cdn_profile.test.name}" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - origin { - name = "acceptanceTestCdnOrigin2" - host_name = "www.example.com" - https_port = 443 - http_port = 80 - } - - tags { - environment = "staging" - } -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMCdnEndpoint_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMCdnEndpoint_basic, ri, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMCdnEndpointDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMCdnEndpointExists("azurerm_cdn_endpoint.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMCdnEndpoints_withTags(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMCdnEndpoint_withTags, ri, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMCdnEndpoint_withTagsUpdate, ri, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMCdnEndpointDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMCdnEndpointExists("azurerm_cdn_endpoint.test"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_endpoint.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_endpoint.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_endpoint.test", "tags.cost_center", "MSFT"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMCdnEndpointExists("azurerm_cdn_endpoint.test"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_endpoint.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_endpoint.test", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMCdnEndpointExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// profileName := rs.Primary.Attributes["profile_name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for cdn endpoint: %s", name) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).cdnEndpointsClient +// +// resp, err := conn.Get(name, profileName, resourceGroup) +// if err != nil { +// return fmt.Errorf("Bad: Get on cdnEndpointsClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: CDN Endpoint %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMCdnEndpointDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).cdnEndpointsClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_cdn_endpoint" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// profileName := rs.Primary.Attributes["profile_name"] +// +// resp, err := conn.Get(name, profileName, resourceGroup) +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("CDN Endpoint still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMCdnEndpoint_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_cdn_profile" "test" { +// name = "acctestcdnprof%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// sku = "Standard" +//} +// +//resource "azurerm_cdn_endpoint" "test" { +// name = "acctestcdnend%d" +// profile_name = "${azurerm_cdn_profile.test.name}" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// origin { +// name = "acceptanceTestCdnOrigin1" +// host_name = "www.example.com" +// https_port = 443 +// http_port = 80 +// } +//} +//` +// +//var testAccAzureRMCdnEndpoint_withTags = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_cdn_profile" "test" { +// name = "acctestcdnprof%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// sku = "Standard" +//} +// +//resource "azurerm_cdn_endpoint" "test" { +// name = "acctestcdnend%d" +// profile_name = "${azurerm_cdn_profile.test.name}" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// origin { +// name = "acceptanceTestCdnOrigin2" +// host_name = "www.example.com" +// https_port = 443 +// http_port = 80 +// } +// +// tags { +// environment = "Production" +// cost_center = "MSFT" +// } +//} +//` +// +//var testAccAzureRMCdnEndpoint_withTagsUpdate = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_cdn_profile" "test" { +// name = "acctestcdnprof%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// sku = "Standard" +//} +// +//resource "azurerm_cdn_endpoint" "test" { +// name = "acctestcdnend%d" +// profile_name = "${azurerm_cdn_profile.test.name}" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// origin { +// name = "acceptanceTestCdnOrigin2" +// host_name = "www.example.com" +// https_port = 443 +// http_port = 80 +// } +// +// tags { +// environment = "staging" +// } +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_cdn_profile.go b/builtin/providers/azurerm/resource_arm_cdn_profile.go index 49681e2eff..c3044b9409 100644 --- a/builtin/providers/azurerm/resource_arm_cdn_profile.go +++ b/builtin/providers/azurerm/resource_arm_cdn_profile.go @@ -1,186 +1,186 @@ package azurerm -import ( - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/cdn" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmCdnProfile() *schema.Resource { - return &schema.Resource{ - Create: resourceArmCdnProfileCreate, - Read: resourceArmCdnProfileRead, - Update: resourceArmCdnProfileUpdate, - Delete: resourceArmCdnProfileDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "sku": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validateCdnProfileSku, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmCdnProfileCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - cdnProfilesClient := client.cdnProfilesClient - - log.Printf("[INFO] preparing arguments for Azure ARM CDN Profile creation.") - - name := d.Get("name").(string) - location := d.Get("location").(string) - resGroup := d.Get("resource_group_name").(string) - sku := d.Get("sku").(string) - tags := d.Get("tags").(map[string]interface{}) - - properties := cdn.ProfilePropertiesCreateParameters{ - Sku: &cdn.Sku{ - Name: cdn.SkuName(sku), - }, - } - - cdnProfile := cdn.ProfileCreateParameters{ - Location: &location, - Properties: &properties, - Tags: expandTags(tags), - } - - resp, err := cdnProfilesClient.Create(name, cdnProfile, resGroup) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for CDN Profile (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating", "Creating"}, - Target: []string{"Succeeded"}, - Refresh: cdnProfileStateRefreshFunc(client, resGroup, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for CDN Profile (%s) to become available: %s", name, err) - } - - return resourceArmCdnProfileRead(d, meta) -} - -func resourceArmCdnProfileRead(d *schema.ResourceData, meta interface{}) error { - cdnProfilesClient := meta.(*ArmClient).cdnProfilesClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["Profiles"] - - resp, err := cdnProfilesClient.Get(name, resGroup) - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure CDN Profile %s: %s", name, err) - } - - if resp.Properties != nil && resp.Properties.Sku != nil { - d.Set("sku", string(resp.Properties.Sku.Name)) - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmCdnProfileUpdate(d *schema.ResourceData, meta interface{}) error { - cdnProfilesClient := meta.(*ArmClient).cdnProfilesClient - - if !d.HasChange("tags") { - return nil - } - - name := d.Get("name").(string) - resGroup := d.Get("resource_group_name").(string) - newTags := d.Get("tags").(map[string]interface{}) - - props := cdn.ProfileUpdateParameters{ - Tags: expandTags(newTags), - } - - _, err := cdnProfilesClient.Update(name, props, resGroup) - if err != nil { - return fmt.Errorf("Error issuing Azure ARM update request to update CDN Profile %q: %s", name, err) - } - - return resourceArmCdnProfileRead(d, meta) -} - -func resourceArmCdnProfileDelete(d *schema.ResourceData, meta interface{}) error { - cdnProfilesClient := meta.(*ArmClient).cdnProfilesClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["Profiles"] - - _, err = cdnProfilesClient.DeleteIfExists(name, resGroup) - - return err -} - -func cdnProfileStateRefreshFunc(client *ArmClient, resourceGroupName string, cdnProfileName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.cdnProfilesClient.Get(cdnProfileName, resourceGroupName) - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in cdnProfileStateRefreshFunc to Azure ARM for CND Profile '%s' (RG: '%s'): %s", cdnProfileName, resourceGroupName, err) - } - return res, string(res.Properties.ProvisioningState), nil - } -} - -func validateCdnProfileSku(v interface{}, k string) (ws []string, errors []error) { - value := strings.ToLower(v.(string)) - skus := map[string]bool{ - "standard": true, - "premium": true, - } - - if !skus[value] { - errors = append(errors, fmt.Errorf("CDN Profile SKU can only be Standard or Premium")) - } - return -} +//import ( +// "fmt" +// "log" +// "net/http" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/cdn" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmCdnProfile() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmCdnProfileCreate, +// Read: resourceArmCdnProfileRead, +// Update: resourceArmCdnProfileUpdate, +// Delete: resourceArmCdnProfileDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "sku": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// ValidateFunc: validateCdnProfileSku, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmCdnProfileCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// cdnProfilesClient := client.cdnProfilesClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM CDN Profile creation.") +// +// name := d.Get("name").(string) +// location := d.Get("location").(string) +// resGroup := d.Get("resource_group_name").(string) +// sku := d.Get("sku").(string) +// tags := d.Get("tags").(map[string]interface{}) +// +// properties := cdn.ProfilePropertiesCreateParameters{ +// Sku: &cdn.Sku{ +// Name: cdn.SkuName(sku), +// }, +// } +// +// cdnProfile := cdn.ProfileCreateParameters{ +// Location: &location, +// Properties: &properties, +// Tags: expandTags(tags), +// } +// +// resp, err := cdnProfilesClient.Create(name, cdnProfile, resGroup) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for CDN Profile (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating", "Creating"}, +// Target: []string{"Succeeded"}, +// Refresh: cdnProfileStateRefreshFunc(client, resGroup, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for CDN Profile (%s) to become available: %s", name, err) +// } +// +// return resourceArmCdnProfileRead(d, meta) +//} +// +//func resourceArmCdnProfileRead(d *schema.ResourceData, meta interface{}) error { +// cdnProfilesClient := meta.(*ArmClient).cdnProfilesClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["Profiles"] +// +// resp, err := cdnProfilesClient.Get(name, resGroup) +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure CDN Profile %s: %s", name, err) +// } +// +// if resp.Properties != nil && resp.Properties.Sku != nil { +// d.Set("sku", string(resp.Properties.Sku.Name)) +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmCdnProfileUpdate(d *schema.ResourceData, meta interface{}) error { +// cdnProfilesClient := meta.(*ArmClient).cdnProfilesClient +// +// if !d.HasChange("tags") { +// return nil +// } +// +// name := d.Get("name").(string) +// resGroup := d.Get("resource_group_name").(string) +// newTags := d.Get("tags").(map[string]interface{}) +// +// props := cdn.ProfileUpdateParameters{ +// Tags: expandTags(newTags), +// } +// +// _, err := cdnProfilesClient.Update(name, props, resGroup) +// if err != nil { +// return fmt.Errorf("Error issuing Azure ARM update request to update CDN Profile %q: %s", name, err) +// } +// +// return resourceArmCdnProfileRead(d, meta) +//} +// +//func resourceArmCdnProfileDelete(d *schema.ResourceData, meta interface{}) error { +// cdnProfilesClient := meta.(*ArmClient).cdnProfilesClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["Profiles"] +// +// _, err = cdnProfilesClient.DeleteIfExists(name, resGroup) +// +// return err +//} +// +//func cdnProfileStateRefreshFunc(client *ArmClient, resourceGroupName string, cdnProfileName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.cdnProfilesClient.Get(cdnProfileName, resourceGroupName) +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in cdnProfileStateRefreshFunc to Azure ARM for CND Profile '%s' (RG: '%s'): %s", cdnProfileName, resourceGroupName, err) +// } +// return res, string(res.Properties.ProvisioningState), nil +// } +//} +// +//func validateCdnProfileSku(v interface{}, k string) (ws []string, errors []error) { +// value := strings.ToLower(v.(string)) +// skus := map[string]bool{ +// "standard": true, +// "premium": true, +// } +// +// if !skus[value] { +// errors = append(errors, fmt.Errorf("CDN Profile SKU can only be Standard or Premium")) +// } +// return +//} diff --git a/builtin/providers/azurerm/resource_arm_cdn_profile_test.go b/builtin/providers/azurerm/resource_arm_cdn_profile_test.go index 82582959b6..c72c560b28 100644 --- a/builtin/providers/azurerm/resource_arm_cdn_profile_test.go +++ b/builtin/providers/azurerm/resource_arm_cdn_profile_test.go @@ -1,207 +1,207 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestResourceAzureRMCdnProfileSKU_validation(t *testing.T) { - cases := []struct { - Value string - ErrCount int - }{ - { - Value: "Random", - ErrCount: 1, - }, - { - Value: "Standard", - ErrCount: 0, - }, - { - Value: "Premium", - ErrCount: 0, - }, - { - Value: "STANDARD", - ErrCount: 0, - }, - { - Value: "PREMIUM", - ErrCount: 0, - }, - } - - for _, tc := range cases { - _, errors := validateCdnProfileSku(tc.Value, "azurerm_cdn_profile") - - if len(errors) != tc.ErrCount { - t.Fatalf("Expected the Azure RM CDN Profile SKU to trigger a validation error") - } - } -} - -func TestAccAzureRMCdnProfile_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMCdnProfile_basic, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMCdnProfileDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMCdnProfileExists("azurerm_cdn_profile.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMCdnProfile_withTags(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMCdnProfile_withTags, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMCdnProfile_withTagsUpdate, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMCdnProfileDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMCdnProfileExists("azurerm_cdn_profile.test"), - resource.TestCheckResourceAttr( - "azurerm_cdn_profile.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_cdn_profile.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_cdn_profile.test", "tags.cost_center", "MSFT"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMCdnProfileExists("azurerm_cdn_profile.test"), - resource.TestCheckResourceAttr( - "azurerm_cdn_profile.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_cdn_profile.test", "tags.environment", "staging"), - ), - }, - }, - }) -} - -func testCheckAzureRMCdnProfileExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for cdn profile: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).cdnProfilesClient - - resp, err := conn.Get(name, resourceGroup) - if err != nil { - return fmt.Errorf("Bad: Get on cdnProfilesClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: CDN Profile %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMCdnProfileDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).cdnProfilesClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_cdn_profile" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(name, resourceGroup) - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("CDN Profile still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMCdnProfile_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_cdn_profile" "test" { - name = "acctestcdnprof%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - sku = "Standard" -} -` - -var testAccAzureRMCdnProfile_withTags = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_cdn_profile" "test" { - name = "acctestcdnprof%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - sku = "Standard" - - tags { - environment = "Production" - cost_center = "MSFT" - } -} -` - -var testAccAzureRMCdnProfile_withTagsUpdate = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_cdn_profile" "test" { - name = "acctestcdnprof%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - sku = "Standard" - - tags { - environment = "staging" - } -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestResourceAzureRMCdnProfileSKU_validation(t *testing.T) { +// cases := []struct { +// Value string +// ErrCount int +// }{ +// { +// Value: "Random", +// ErrCount: 1, +// }, +// { +// Value: "Standard", +// ErrCount: 0, +// }, +// { +// Value: "Premium", +// ErrCount: 0, +// }, +// { +// Value: "STANDARD", +// ErrCount: 0, +// }, +// { +// Value: "PREMIUM", +// ErrCount: 0, +// }, +// } +// +// for _, tc := range cases { +// _, errors := validateCdnProfileSku(tc.Value, "azurerm_cdn_profile") +// +// if len(errors) != tc.ErrCount { +// t.Fatalf("Expected the Azure RM CDN Profile SKU to trigger a validation error") +// } +// } +//} +// +//func TestAccAzureRMCdnProfile_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMCdnProfile_basic, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMCdnProfileDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMCdnProfileExists("azurerm_cdn_profile.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMCdnProfile_withTags(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMCdnProfile_withTags, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMCdnProfile_withTagsUpdate, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMCdnProfileDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMCdnProfileExists("azurerm_cdn_profile.test"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_profile.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_profile.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_profile.test", "tags.cost_center", "MSFT"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMCdnProfileExists("azurerm_cdn_profile.test"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_profile.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_cdn_profile.test", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMCdnProfileExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for cdn profile: %s", name) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).cdnProfilesClient +// +// resp, err := conn.Get(name, resourceGroup) +// if err != nil { +// return fmt.Errorf("Bad: Get on cdnProfilesClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: CDN Profile %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMCdnProfileDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).cdnProfilesClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_cdn_profile" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(name, resourceGroup) +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("CDN Profile still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMCdnProfile_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_cdn_profile" "test" { +// name = "acctestcdnprof%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// sku = "Standard" +//} +//` +// +//var testAccAzureRMCdnProfile_withTags = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_cdn_profile" "test" { +// name = "acctestcdnprof%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// sku = "Standard" +// +// tags { +// environment = "Production" +// cost_center = "MSFT" +// } +//} +//` +// +//var testAccAzureRMCdnProfile_withTagsUpdate = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_cdn_profile" "test" { +// name = "acctestcdnprof%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// sku = "Standard" +// +// tags { +// environment = "staging" +// } +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_local_network_gateway.go b/builtin/providers/azurerm/resource_arm_local_network_gateway.go index ae91d665fc..9eeda50708 100644 --- a/builtin/providers/azurerm/resource_arm_local_network_gateway.go +++ b/builtin/providers/azurerm/resource_arm_local_network_gateway.go @@ -1,136 +1,136 @@ package azurerm -import ( - "fmt" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/Azure/azure-sdk-for-go/core/http" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmLocalNetworkGateway() *schema.Resource { - return &schema.Resource{ - Create: resourceArmLocalNetworkGatewayCreate, - Read: resourceArmLocalNetworkGatewayRead, - Update: resourceArmLocalNetworkGatewayCreate, - Delete: resourceArmLocalNetworkGatewayDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ForceNew: true, - }, - - "gateway_address": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "address_space": &schema.Schema{ - Type: schema.TypeList, - Required: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - }, - } -} - -func resourceArmLocalNetworkGatewayCreate(d *schema.ResourceData, meta interface{}) error { - lnetClient := meta.(*ArmClient).localNetConnClient - - name := d.Get("name").(string) - location := d.Get("location").(string) - resGroup := d.Get("resource_group_name").(string) - ipAddress := d.Get("gateway_address").(string) - - // fetch the 'address_space_prefixes: - prefixes := []string{} - for _, pref := range d.Get("address_space").([]interface{}) { - prefixes = append(prefixes, pref.(string)) - } - - resp, err := lnetClient.CreateOrUpdate(resGroup, name, network.LocalNetworkGateway{ - Name: &name, - Location: &location, - Properties: &network.LocalNetworkGatewayPropertiesFormat{ - LocalNetworkAddressSpace: &network.AddressSpace{ - AddressPrefixes: &prefixes, - }, - GatewayIPAddress: &ipAddress, - }, - }) - if err != nil { - return fmt.Errorf("Error creating Azure ARM Local Network Gateway '%s': %s", name, err) - } - - d.SetId(*resp.ID) - - return resourceArmLocalNetworkGatewayRead(d, meta) -} - -// resourceArmLocalNetworkGatewayRead goes ahead and reads the state of the corresponding ARM local network gateway. -func resourceArmLocalNetworkGatewayRead(d *schema.ResourceData, meta interface{}) error { - lnetClient := meta.(*ArmClient).localNetConnClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - name := id.Path["localNetworkGateways"] - resGroup := id.ResourceGroup - - resp, err := lnetClient.Get(resGroup, name) - if err != nil { - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - - return fmt.Errorf("Error reading the state of Azure ARM local network gateway '%s': %s", name, err) - } - - d.Set("gateway_address", resp.Properties.GatewayIPAddress) - - prefs := []string{} - if ps := *resp.Properties.LocalNetworkAddressSpace.AddressPrefixes; ps != nil { - prefs = ps - } - d.Set("address_space", prefs) - - return nil -} - -// resourceArmLocalNetworkGatewayDelete deletes the specified ARM local network gateway. -func resourceArmLocalNetworkGatewayDelete(d *schema.ResourceData, meta interface{}) error { - lnetClient := meta.(*ArmClient).localNetConnClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - name := id.Path["localNetworkGateways"] - resGroup := id.ResourceGroup - - _, err = lnetClient.Delete(resGroup, name) - if err != nil { - return fmt.Errorf("Error issuing Azure ARM delete request of local network gateway '%s': %s", name, err) - } - - return nil -} +//import ( +// "fmt" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/Azure/azure-sdk-for-go/core/http" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmLocalNetworkGateway() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmLocalNetworkGatewayCreate, +// Read: resourceArmLocalNetworkGatewayRead, +// Update: resourceArmLocalNetworkGatewayCreate, +// Delete: resourceArmLocalNetworkGatewayDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// ForceNew: true, +// }, +// +// "gateway_address": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "address_space": &schema.Schema{ +// Type: schema.TypeList, +// Required: true, +// Elem: &schema.Schema{ +// Type: schema.TypeString, +// }, +// }, +// }, +// } +//} +// +//func resourceArmLocalNetworkGatewayCreate(d *schema.ResourceData, meta interface{}) error { +// lnetClient := meta.(*ArmClient).localNetConnClient +// +// name := d.Get("name").(string) +// location := d.Get("location").(string) +// resGroup := d.Get("resource_group_name").(string) +// ipAddress := d.Get("gateway_address").(string) +// +// // fetch the 'address_space_prefixes: +// prefixes := []string{} +// for _, pref := range d.Get("address_space").([]interface{}) { +// prefixes = append(prefixes, pref.(string)) +// } +// +// resp, err := lnetClient.CreateOrUpdate(resGroup, name, network.LocalNetworkGateway{ +// Name: &name, +// Location: &location, +// Properties: &network.LocalNetworkGatewayPropertiesFormat{ +// LocalNetworkAddressSpace: &network.AddressSpace{ +// AddressPrefixes: &prefixes, +// }, +// GatewayIPAddress: &ipAddress, +// }, +// }) +// if err != nil { +// return fmt.Errorf("Error creating Azure ARM Local Network Gateway '%s': %s", name, err) +// } +// +// d.SetId(*resp.ID) +// +// return resourceArmLocalNetworkGatewayRead(d, meta) +//} +// +//// resourceArmLocalNetworkGatewayRead goes ahead and reads the state of the corresponding ARM local network gateway. +//func resourceArmLocalNetworkGatewayRead(d *schema.ResourceData, meta interface{}) error { +// lnetClient := meta.(*ArmClient).localNetConnClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// name := id.Path["localNetworkGateways"] +// resGroup := id.ResourceGroup +// +// resp, err := lnetClient.Get(resGroup, name) +// if err != nil { +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// +// return fmt.Errorf("Error reading the state of Azure ARM local network gateway '%s': %s", name, err) +// } +// +// d.Set("gateway_address", resp.Properties.GatewayIPAddress) +// +// prefs := []string{} +// if ps := *resp.Properties.LocalNetworkAddressSpace.AddressPrefixes; ps != nil { +// prefs = ps +// } +// d.Set("address_space", prefs) +// +// return nil +//} +// +//// resourceArmLocalNetworkGatewayDelete deletes the specified ARM local network gateway. +//func resourceArmLocalNetworkGatewayDelete(d *schema.ResourceData, meta interface{}) error { +// lnetClient := meta.(*ArmClient).localNetConnClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// name := id.Path["localNetworkGateways"] +// resGroup := id.ResourceGroup +// +// _, err = lnetClient.Delete(resGroup, name) +// if err != nil { +// return fmt.Errorf("Error issuing Azure ARM delete request of local network gateway '%s': %s", name, err) +// } +// +// return nil +//} diff --git a/builtin/providers/azurerm/resource_arm_local_network_gateway_test.go b/builtin/providers/azurerm/resource_arm_local_network_gateway_test.go index 889a57e6eb..55b9e1e624 100644 --- a/builtin/providers/azurerm/resource_arm_local_network_gateway_test.go +++ b/builtin/providers/azurerm/resource_arm_local_network_gateway_test.go @@ -1,108 +1,108 @@ package azurerm -import ( - "fmt" - "testing" - - "github.com/Azure/azure-sdk-for-go/core/http" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMLocalNetworkGateway_basic(t *testing.T) { - name := "azurerm_local_network_gateway.test" - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMLocalNetworkGatewayDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMLocalNetworkGatewayConfig_basic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMLocalNetworkGatewayExists(name), - resource.TestCheckResourceAttr(name, "gateway_address", "127.0.0.1"), - resource.TestCheckResourceAttr(name, "address_space.0", "127.0.0.0/8"), - ), - }, - }, - }) -} - -// testCheckAzureRMLocalNetworkGatewayExists returns the resurce.TestCheckFunc -// which checks whether or not the expected local network gateway exists both -// in the schema, and on Azure. -func testCheckAzureRMLocalNetworkGatewayExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // first check within the schema for the local network gateway: - res, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Local network gateway '%s' not found.", name) - } - - // then, extract the name and the resource group: - id, err := parseAzureResourceID(res.Primary.ID) - if err != nil { - return err - } - localNetName := id.Path["localNetworkGateways"] - resGrp := id.ResourceGroup - - // and finally, check that it exists on Azure: - lnetClient := testAccProvider.Meta().(*ArmClient).localNetConnClient - - resp, err := lnetClient.Get(resGrp, localNetName) - if err != nil { - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Local network gateway '%s' (resource group '%s') does not exist on Azure.", localNetName, resGrp) - } - - return fmt.Errorf("Error reading the state of local network gateway '%s'.", localNetName) - } - - return nil - } -} - -func testCheckAzureRMLocalNetworkGatewayDestroy(s *terraform.State) error { - for _, res := range s.RootModule().Resources { - if res.Type != "azurerm_local_network_gateway" { - continue - } - - id, err := parseAzureResourceID(res.Primary.ID) - if err != nil { - return err - } - localNetName := id.Path["localNetworkGateways"] - resGrp := id.ResourceGroup - - lnetClient := testAccProvider.Meta().(*ArmClient).localNetConnClient - resp, err := lnetClient.Get(resGrp, localNetName) - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Local network gateway still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMLocalNetworkGatewayConfig_basic = ` -resource "azurerm_resource_group" "test" { - name = "tftestingResourceGroup" - location = "West US" -} - -resource "azurerm_local_network_gateway" "test" { - name = "tftestingLocalNetworkGateway" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" - gateway_address = "127.0.0.1" - address_space = ["127.0.0.0/8"] -} -` +//import ( +// "fmt" +// "testing" +// +// "github.com/Azure/azure-sdk-for-go/core/http" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMLocalNetworkGateway_basic(t *testing.T) { +// name := "azurerm_local_network_gateway.test" +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMLocalNetworkGatewayDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMLocalNetworkGatewayConfig_basic, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMLocalNetworkGatewayExists(name), +// resource.TestCheckResourceAttr(name, "gateway_address", "127.0.0.1"), +// resource.TestCheckResourceAttr(name, "address_space.0", "127.0.0.0/8"), +// ), +// }, +// }, +// }) +//} +// +//// testCheckAzureRMLocalNetworkGatewayExists returns the resurce.TestCheckFunc +//// which checks whether or not the expected local network gateway exists both +//// in the schema, and on Azure. +//func testCheckAzureRMLocalNetworkGatewayExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // first check within the schema for the local network gateway: +// res, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Local network gateway '%s' not found.", name) +// } +// +// // then, extract the name and the resource group: +// id, err := parseAzureResourceID(res.Primary.ID) +// if err != nil { +// return err +// } +// localNetName := id.Path["localNetworkGateways"] +// resGrp := id.ResourceGroup +// +// // and finally, check that it exists on Azure: +// lnetClient := testAccProvider.Meta().(*ArmClient).localNetConnClient +// +// resp, err := lnetClient.Get(resGrp, localNetName) +// if err != nil { +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Local network gateway '%s' (resource group '%s') does not exist on Azure.", localNetName, resGrp) +// } +// +// return fmt.Errorf("Error reading the state of local network gateway '%s'.", localNetName) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMLocalNetworkGatewayDestroy(s *terraform.State) error { +// for _, res := range s.RootModule().Resources { +// if res.Type != "azurerm_local_network_gateway" { +// continue +// } +// +// id, err := parseAzureResourceID(res.Primary.ID) +// if err != nil { +// return err +// } +// localNetName := id.Path["localNetworkGateways"] +// resGrp := id.ResourceGroup +// +// lnetClient := testAccProvider.Meta().(*ArmClient).localNetConnClient +// resp, err := lnetClient.Get(resGrp, localNetName) +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Local network gateway still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMLocalNetworkGatewayConfig_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "tftestingResourceGroup" +// location = "West US" +//} +// +//resource "azurerm_local_network_gateway" "test" { +// name = "tftestingLocalNetworkGateway" +// location = "${azurerm_resource_group.test.location}" +// resource_group_name = "${azurerm_resource_group.test.name}" +// gateway_address = "127.0.0.1" +// address_space = ["127.0.0.0/8"] +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_network_interface_card.go b/builtin/providers/azurerm/resource_arm_network_interface_card.go index 174afc55b9..3207d3e876 100644 --- a/builtin/providers/azurerm/resource_arm_network_interface_card.go +++ b/builtin/providers/azurerm/resource_arm_network_interface_card.go @@ -1,431 +1,431 @@ package azurerm -import ( - "bytes" - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/hashcode" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmNetworkInterface() *schema.Resource { - return &schema.Resource{ - Create: resourceArmNetworkInterfaceCreate, - Read: resourceArmNetworkInterfaceRead, - Update: resourceArmNetworkInterfaceCreate, - Delete: resourceArmNetworkInterfaceDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "network_security_group_id": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "mac_address": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "private_ip_address": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "virtual_machine_id": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "ip_configuration": &schema.Schema{ - Type: schema.TypeSet, - Required: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "subnet_id": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "private_ip_address": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "private_ip_address_allocation": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkInterfacePrivateIpAddressAllocation, - }, - - "public_ip_address_id": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "load_balancer_backend_address_pools_ids": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - - "load_balancer_inbound_nat_rules_ids": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - }, - }, - Set: resourceArmNetworkInterfaceIpConfigurationHash, - }, - - "dns_servers": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - - "internal_dns_name_label": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "applied_dns_servers": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - - "internal_fqdn": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "enable_ip_forwarding": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: false, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmNetworkInterfaceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - ifaceClient := client.ifaceClient - - log.Printf("[INFO] preparing arguments for Azure ARM Network Interface creation.") - - name := d.Get("name").(string) - location := d.Get("location").(string) - resGroup := d.Get("resource_group_name").(string) - enableIpForwarding := d.Get("enable_ip_forwarding").(bool) - tags := d.Get("tags").(map[string]interface{}) - - properties := network.InterfacePropertiesFormat{ - EnableIPForwarding: &enableIpForwarding, - } - - if v, ok := d.GetOk("network_security_group_id"); ok { - nsgId := v.(string) - properties.NetworkSecurityGroup = &network.SecurityGroup{ - ID: &nsgId, - } - } - - dns, hasDns := d.GetOk("dns_servers") - nameLabel, hasNameLabel := d.GetOk("internal_dns_name_label") - if hasDns || hasNameLabel { - ifaceDnsSettings := network.InterfaceDNSSettings{} - - if hasDns { - var dnsServers []string - dns := dns.(*schema.Set).List() - for _, v := range dns { - str := v.(string) - dnsServers = append(dnsServers, str) - } - ifaceDnsSettings.DNSServers = &dnsServers - } - - if hasNameLabel { - name_label := nameLabel.(string) - ifaceDnsSettings.InternalDNSNameLabel = &name_label - - } - - properties.DNSSettings = &ifaceDnsSettings - } - - ipConfigs, sgErr := expandAzureRmNetworkInterfaceIpConfigurations(d) - if sgErr != nil { - return fmt.Errorf("Error Building list of Network Interface IP Configurations: %s", sgErr) - } - if len(ipConfigs) > 0 { - properties.IPConfigurations = &ipConfigs - } - - iface := network.Interface{ - Name: &name, - Location: &location, - Properties: &properties, - Tags: expandTags(tags), - } - - resp, err := ifaceClient.CreateOrUpdate(resGroup, name, iface) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Network Interface (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: networkInterfaceStateRefreshFunc(client, resGroup, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Network Interface (%s) to become available: %s", name, err) - } - - return resourceArmNetworkInterfaceRead(d, meta) -} - -func resourceArmNetworkInterfaceRead(d *schema.ResourceData, meta interface{}) error { - ifaceClient := meta.(*ArmClient).ifaceClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["networkInterfaces"] - - resp, err := ifaceClient.Get(resGroup, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Network Interface %s: %s", name, err) - } - - iface := *resp.Properties - - if iface.MacAddress != nil { - if *iface.MacAddress != "" { - d.Set("mac_address", iface.MacAddress) - } - } - - if iface.IPConfigurations != nil && len(*iface.IPConfigurations) > 0 { - var privateIPAddress *string - ///TODO: Change this to a loop when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed - if (*iface.IPConfigurations)[0].Properties != nil { - privateIPAddress = (*iface.IPConfigurations)[0].Properties.PrivateIPAddress - } - - if *privateIPAddress != "" { - d.Set("private_ip_address", *privateIPAddress) - } - } - - if iface.VirtualMachine != nil { - if *iface.VirtualMachine.ID != "" { - d.Set("virtual_machine_id", *iface.VirtualMachine.ID) - } - } - - if iface.DNSSettings != nil { - if iface.DNSSettings.AppliedDNSServers != nil && len(*iface.DNSSettings.AppliedDNSServers) > 0 { - dnsServers := make([]string, 0, len(*iface.DNSSettings.AppliedDNSServers)) - for _, dns := range *iface.DNSSettings.AppliedDNSServers { - dnsServers = append(dnsServers, dns) - } - - if err := d.Set("applied_dns_servers", dnsServers); err != nil { - return err - } - } - - if iface.DNSSettings.InternalFqdn != nil && *iface.DNSSettings.InternalFqdn != "" { - d.Set("internal_fqdn", iface.DNSSettings.InternalFqdn) - } - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmNetworkInterfaceDelete(d *schema.ResourceData, meta interface{}) error { - ifaceClient := meta.(*ArmClient).ifaceClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["networkInterfaces"] - - _, err = ifaceClient.Delete(resGroup, name) - - return err -} - -func networkInterfaceStateRefreshFunc(client *ArmClient, resourceGroupName string, ifaceName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.ifaceClient.Get(resourceGroupName, ifaceName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in networkInterfaceStateRefreshFunc to Azure ARM for network interace '%s' (RG: '%s'): %s", ifaceName, resourceGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} - -func resourceArmNetworkInterfaceIpConfigurationHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["subnet_id"].(string))) - if m["private_ip_address"] != nil { - buf.WriteString(fmt.Sprintf("%s-", m["private_ip_address"].(string))) - } - buf.WriteString(fmt.Sprintf("%s-", m["private_ip_address_allocation"].(string))) - if m["public_ip_address_id"] != nil { - buf.WriteString(fmt.Sprintf("%s-", m["public_ip_address_id"].(string))) - } - - return hashcode.String(buf.String()) -} - -func validateNetworkInterfacePrivateIpAddressAllocation(v interface{}, k string) (ws []string, errors []error) { - value := strings.ToLower(v.(string)) - allocations := map[string]bool{ - "static": true, - "dynamic": true, - } - - if !allocations[value] { - errors = append(errors, fmt.Errorf("Network Interface Allocations can only be Static or Dynamic")) - } - return -} - -func expandAzureRmNetworkInterfaceIpConfigurations(d *schema.ResourceData) ([]network.InterfaceIPConfiguration, error) { - configs := d.Get("ip_configuration").(*schema.Set).List() - ipConfigs := make([]network.InterfaceIPConfiguration, 0, len(configs)) - - for _, configRaw := range configs { - data := configRaw.(map[string]interface{}) - - subnet_id := data["subnet_id"].(string) - private_ip_allocation_method := data["private_ip_address_allocation"].(string) - - properties := network.InterfaceIPConfigurationPropertiesFormat{ - Subnet: &network.Subnet{ - ID: &subnet_id, - }, - PrivateIPAllocationMethod: &private_ip_allocation_method, - } - - if v := data["private_ip_address"].(string); v != "" { - properties.PrivateIPAddress = &v - } - - if v := data["public_ip_address_id"].(string); v != "" { - properties.PublicIPAddress = &network.PublicIPAddress{ - ID: &v, - } - } - - if v, ok := data["load_balancer_backend_address_pools_ids"]; ok { - var ids []network.BackendAddressPool - pools := v.(*schema.Set).List() - for _, p := range pools { - pool_id := p.(string) - id := network.BackendAddressPool{ - ID: &pool_id, - } - - ids = append(ids, id) - } - - properties.LoadBalancerBackendAddressPools = &ids - } - - if v, ok := data["load_balancer_inbound_nat_rules_ids"]; ok { - var natRules []network.InboundNatRule - rules := v.(*schema.Set).List() - for _, r := range rules { - rule_id := r.(string) - rule := network.InboundNatRule{ - ID: &rule_id, - } - - natRules = append(natRules, rule) - } - - properties.LoadBalancerInboundNatRules = &natRules - } - - name := data["name"].(string) - ipConfig := network.InterfaceIPConfiguration{ - Name: &name, - Properties: &properties, - } - - ipConfigs = append(ipConfigs, ipConfig) - } - - return ipConfigs, nil -} +//import ( +// "bytes" +// "fmt" +// "log" +// "net/http" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/hashcode" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmNetworkInterface() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmNetworkInterfaceCreate, +// Read: resourceArmNetworkInterfaceRead, +// Update: resourceArmNetworkInterfaceCreate, +// Delete: resourceArmNetworkInterfaceDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "network_security_group_id": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "mac_address": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "private_ip_address": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "virtual_machine_id": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "ip_configuration": &schema.Schema{ +// Type: schema.TypeSet, +// Required: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "subnet_id": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "private_ip_address": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "private_ip_address_allocation": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkInterfacePrivateIpAddressAllocation, +// }, +// +// "public_ip_address_id": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "load_balancer_backend_address_pools_ids": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// +// "load_balancer_inbound_nat_rules_ids": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// }, +// }, +// Set: resourceArmNetworkInterfaceIpConfigurationHash, +// }, +// +// "dns_servers": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// +// "internal_dns_name_label": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "applied_dns_servers": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// +// "internal_fqdn": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "enable_ip_forwarding": &schema.Schema{ +// Type: schema.TypeBool, +// Optional: true, +// Default: false, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmNetworkInterfaceCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// ifaceClient := client.ifaceClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM Network Interface creation.") +// +// name := d.Get("name").(string) +// location := d.Get("location").(string) +// resGroup := d.Get("resource_group_name").(string) +// enableIpForwarding := d.Get("enable_ip_forwarding").(bool) +// tags := d.Get("tags").(map[string]interface{}) +// +// properties := network.InterfacePropertiesFormat{ +// EnableIPForwarding: &enableIpForwarding, +// } +// +// if v, ok := d.GetOk("network_security_group_id"); ok { +// nsgId := v.(string) +// properties.NetworkSecurityGroup = &network.SecurityGroup{ +// ID: &nsgId, +// } +// } +// +// dns, hasDns := d.GetOk("dns_servers") +// nameLabel, hasNameLabel := d.GetOk("internal_dns_name_label") +// if hasDns || hasNameLabel { +// ifaceDnsSettings := network.InterfaceDNSSettings{} +// +// if hasDns { +// var dnsServers []string +// dns := dns.(*schema.Set).List() +// for _, v := range dns { +// str := v.(string) +// dnsServers = append(dnsServers, str) +// } +// ifaceDnsSettings.DNSServers = &dnsServers +// } +// +// if hasNameLabel { +// name_label := nameLabel.(string) +// ifaceDnsSettings.InternalDNSNameLabel = &name_label +// +// } +// +// properties.DNSSettings = &ifaceDnsSettings +// } +// +// ipConfigs, sgErr := expandAzureRmNetworkInterfaceIpConfigurations(d) +// if sgErr != nil { +// return fmt.Errorf("Error Building list of Network Interface IP Configurations: %s", sgErr) +// } +// if len(ipConfigs) > 0 { +// properties.IPConfigurations = &ipConfigs +// } +// +// iface := network.Interface{ +// Name: &name, +// Location: &location, +// Properties: &properties, +// Tags: expandTags(tags), +// } +// +// resp, err := ifaceClient.CreateOrUpdate(resGroup, name, iface) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Network Interface (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: networkInterfaceStateRefreshFunc(client, resGroup, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Network Interface (%s) to become available: %s", name, err) +// } +// +// return resourceArmNetworkInterfaceRead(d, meta) +//} +// +//func resourceArmNetworkInterfaceRead(d *schema.ResourceData, meta interface{}) error { +// ifaceClient := meta.(*ArmClient).ifaceClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["networkInterfaces"] +// +// resp, err := ifaceClient.Get(resGroup, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Network Interface %s: %s", name, err) +// } +// +// iface := *resp.Properties +// +// if iface.MacAddress != nil { +// if *iface.MacAddress != "" { +// d.Set("mac_address", iface.MacAddress) +// } +// } +// +// if iface.IPConfigurations != nil && len(*iface.IPConfigurations) > 0 { +// var privateIPAddress *string +// ///TODO: Change this to a loop when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed +// if (*iface.IPConfigurations)[0].Properties != nil { +// privateIPAddress = (*iface.IPConfigurations)[0].Properties.PrivateIPAddress +// } +// +// if *privateIPAddress != "" { +// d.Set("private_ip_address", *privateIPAddress) +// } +// } +// +// if iface.VirtualMachine != nil { +// if *iface.VirtualMachine.ID != "" { +// d.Set("virtual_machine_id", *iface.VirtualMachine.ID) +// } +// } +// +// if iface.DNSSettings != nil { +// if iface.DNSSettings.AppliedDNSServers != nil && len(*iface.DNSSettings.AppliedDNSServers) > 0 { +// dnsServers := make([]string, 0, len(*iface.DNSSettings.AppliedDNSServers)) +// for _, dns := range *iface.DNSSettings.AppliedDNSServers { +// dnsServers = append(dnsServers, dns) +// } +// +// if err := d.Set("applied_dns_servers", dnsServers); err != nil { +// return err +// } +// } +// +// if iface.DNSSettings.InternalFqdn != nil && *iface.DNSSettings.InternalFqdn != "" { +// d.Set("internal_fqdn", iface.DNSSettings.InternalFqdn) +// } +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmNetworkInterfaceDelete(d *schema.ResourceData, meta interface{}) error { +// ifaceClient := meta.(*ArmClient).ifaceClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["networkInterfaces"] +// +// _, err = ifaceClient.Delete(resGroup, name) +// +// return err +//} +// +//func networkInterfaceStateRefreshFunc(client *ArmClient, resourceGroupName string, ifaceName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.ifaceClient.Get(resourceGroupName, ifaceName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in networkInterfaceStateRefreshFunc to Azure ARM for network interace '%s' (RG: '%s'): %s", ifaceName, resourceGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} +// +//func resourceArmNetworkInterfaceIpConfigurationHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["subnet_id"].(string))) +// if m["private_ip_address"] != nil { +// buf.WriteString(fmt.Sprintf("%s-", m["private_ip_address"].(string))) +// } +// buf.WriteString(fmt.Sprintf("%s-", m["private_ip_address_allocation"].(string))) +// if m["public_ip_address_id"] != nil { +// buf.WriteString(fmt.Sprintf("%s-", m["public_ip_address_id"].(string))) +// } +// +// return hashcode.String(buf.String()) +//} +// +//func validateNetworkInterfacePrivateIpAddressAllocation(v interface{}, k string) (ws []string, errors []error) { +// value := strings.ToLower(v.(string)) +// allocations := map[string]bool{ +// "static": true, +// "dynamic": true, +// } +// +// if !allocations[value] { +// errors = append(errors, fmt.Errorf("Network Interface Allocations can only be Static or Dynamic")) +// } +// return +//} +// +//func expandAzureRmNetworkInterfaceIpConfigurations(d *schema.ResourceData) ([]network.InterfaceIPConfiguration, error) { +// configs := d.Get("ip_configuration").(*schema.Set).List() +// ipConfigs := make([]network.InterfaceIPConfiguration, 0, len(configs)) +// +// for _, configRaw := range configs { +// data := configRaw.(map[string]interface{}) +// +// subnet_id := data["subnet_id"].(string) +// private_ip_allocation_method := data["private_ip_address_allocation"].(string) +// +// properties := network.InterfaceIPConfigurationPropertiesFormat{ +// Subnet: &network.Subnet{ +// ID: &subnet_id, +// }, +// PrivateIPAllocationMethod: &private_ip_allocation_method, +// } +// +// if v := data["private_ip_address"].(string); v != "" { +// properties.PrivateIPAddress = &v +// } +// +// if v := data["public_ip_address_id"].(string); v != "" { +// properties.PublicIPAddress = &network.PublicIPAddress{ +// ID: &v, +// } +// } +// +// if v, ok := data["load_balancer_backend_address_pools_ids"]; ok { +// var ids []network.BackendAddressPool +// pools := v.(*schema.Set).List() +// for _, p := range pools { +// pool_id := p.(string) +// id := network.BackendAddressPool{ +// ID: &pool_id, +// } +// +// ids = append(ids, id) +// } +// +// properties.LoadBalancerBackendAddressPools = &ids +// } +// +// if v, ok := data["load_balancer_inbound_nat_rules_ids"]; ok { +// var natRules []network.InboundNatRule +// rules := v.(*schema.Set).List() +// for _, r := range rules { +// rule_id := r.(string) +// rule := network.InboundNatRule{ +// ID: &rule_id, +// } +// +// natRules = append(natRules, rule) +// } +// +// properties.LoadBalancerInboundNatRules = &natRules +// } +// +// name := data["name"].(string) +// ipConfig := network.InterfaceIPConfiguration{ +// Name: &name, +// Properties: &properties, +// } +// +// ipConfigs = append(ipConfigs, ipConfig) +// } +// +// return ipConfigs, nil +//} diff --git a/builtin/providers/azurerm/resource_arm_network_interface_card_test.go b/builtin/providers/azurerm/resource_arm_network_interface_card_test.go index 156b4bdf55..83149871ec 100644 --- a/builtin/providers/azurerm/resource_arm_network_interface_card_test.go +++ b/builtin/providers/azurerm/resource_arm_network_interface_card_test.go @@ -1,86 +1,16 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMNetworkInterface_basic(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkInterface_basic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMNetworkInterfaceenableIPForwarding(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkInterface_ipForwarding, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), - resource.TestCheckResourceAttr( - "azurerm_network_interface.test", "enable_ip_forwarding", "true"), - ), - }, - }, - }) -} - -func TestAccAzureRMNetworkInterface_withTags(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkInterface_withTags, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), - resource.TestCheckResourceAttr( - "azurerm_network_interface.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_network_interface.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_network_interface.test", "tags.cost_center", "MSFT"), - ), - }, - - resource.TestStep{ - Config: testAccAzureRMNetworkInterface_withTagsUpdate, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), - resource.TestCheckResourceAttr( - "azurerm_network_interface.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_network_interface.test", "tags.environment", "staging"), - ), - }, - }, - }) -} - -///TODO: Re-enable this test when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed -//func TestAccAzureRMNetworkInterface_addingIpConfigurations(t *testing.T) { +// +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMNetworkInterface_basic(t *testing.T) { // // resource.Test(t, resource.TestCase{ // PreCheck: func() { testAccPreCheck(t) }, @@ -91,221 +21,149 @@ func TestAccAzureRMNetworkInterface_withTags(t *testing.T) { // Config: testAccAzureRMNetworkInterface_basic, // Check: resource.ComposeTestCheckFunc( // testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), -// resource.TestCheckResourceAttr( -// "azurerm_network_interface.test", "ip_configuration.#", "1"), -// ), -// }, -// -// resource.TestStep{ -// Config: testAccAzureRMNetworkInterface_extraIpConfiguration, -// Check: resource.ComposeTestCheckFunc( -// testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), -// resource.TestCheckResourceAttr( -// "azurerm_network_interface.test", "ip_configuration.#", "2"), // ), // }, // }, // }) //} - -func testCheckAzureRMNetworkInterfaceExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for availability set: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).ifaceClient - - resp, err := conn.Get(resourceGroup, name, "") - if err != nil { - return fmt.Errorf("Bad: Get on ifaceClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Network Interface %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMNetworkInterfaceDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).ifaceClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_network_interface" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Network Interface still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMNetworkInterface_basic = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acceptanceTestVirtualNetwork1" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "testsubnet" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acceptanceTestNetworkInterface1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } -} -` - -var testAccAzureRMNetworkInterface_ipForwarding = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acceptanceTestVirtualNetwork1" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "testsubnet" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acceptanceTestNetworkInterface1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - enable_ip_forwarding = true - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } -} -` - -var testAccAzureRMNetworkInterface_withTags = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acceptanceTestVirtualNetwork1" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "testsubnet" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acceptanceTestNetworkInterface1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } - - tags { - environment = "Production" - cost_center = "MSFT" - } -} -` - -var testAccAzureRMNetworkInterface_withTagsUpdate = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acceptanceTestVirtualNetwork1" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "testsubnet" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acceptanceTestNetworkInterface1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } - - tags { - environment = "staging" - } -} -` - -//TODO: Re-enable this test when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed -//var testAccAzureRMNetworkInterface_extraIpConfiguration = ` +// +//func TestAccAzureRMNetworkInterfaceenableIPForwarding(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkInterface_ipForwarding, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_interface.test", "enable_ip_forwarding", "true"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMNetworkInterface_withTags(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkInterface_withTags, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_interface.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_network_interface.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_network_interface.test", "tags.cost_center", "MSFT"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccAzureRMNetworkInterface_withTagsUpdate, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_interface.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_network_interface.test", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +/////TODO: Re-enable this test when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed +////func TestAccAzureRMNetworkInterface_addingIpConfigurations(t *testing.T) { +//// +//// resource.Test(t, resource.TestCase{ +//// PreCheck: func() { testAccPreCheck(t) }, +//// Providers: testAccProviders, +//// CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, +//// Steps: []resource.TestStep{ +//// resource.TestStep{ +//// Config: testAccAzureRMNetworkInterface_basic, +//// Check: resource.ComposeTestCheckFunc( +//// testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), +//// resource.TestCheckResourceAttr( +//// "azurerm_network_interface.test", "ip_configuration.#", "1"), +//// ), +//// }, +//// +//// resource.TestStep{ +//// Config: testAccAzureRMNetworkInterface_extraIpConfiguration, +//// Check: resource.ComposeTestCheckFunc( +//// testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), +//// resource.TestCheckResourceAttr( +//// "azurerm_network_interface.test", "ip_configuration.#", "2"), +//// ), +//// }, +//// }, +//// }) +////} +// +//func testCheckAzureRMNetworkInterfaceExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for availability set: %s", name) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).ifaceClient +// +// resp, err := conn.Get(resourceGroup, name, "") +// if err != nil { +// return fmt.Errorf("Bad: Get on ifaceClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Network Interface %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMNetworkInterfaceDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).ifaceClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_network_interface" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, name, "") +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Network Interface still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMNetworkInterface_basic = ` //resource "azurerm_resource_group" "test" { // name = "acceptanceTestResourceGroup1" // location = "West US" @@ -325,11 +183,71 @@ resource "azurerm_network_interface" "test" { // address_prefix = "10.0.2.0/24" //} // -//resource "azurerm_subnet" "test1" { -// name = "testsubnet1" +//resource "azurerm_network_interface" "test" { +// name = "acceptanceTestNetworkInterface1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +//} +//` +// +//var testAccAzureRMNetworkInterface_ipForwarding = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acceptanceTestVirtualNetwork1" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "testsubnet" // resource_group_name = "${azurerm_resource_group.test.name}" // virtual_network_name = "${azurerm_virtual_network.test.name}" -// address_prefix = "10.0.1.0/24" +// address_prefix = "10.0.2.0/24" +//} +// +//resource "azurerm_network_interface" "test" { +// name = "acceptanceTestNetworkInterface1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// enable_ip_forwarding = true +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +//} +//` +// +//var testAccAzureRMNetworkInterface_withTags = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acceptanceTestVirtualNetwork1" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "testsubnet" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" //} // //resource "azurerm_network_interface" "test" { @@ -343,11 +261,94 @@ resource "azurerm_network_interface" "test" { // private_ip_address_allocation = "dynamic" // } // -// ip_configuration { -// name = "testconfiguration2" -// subnet_id = "${azurerm_subnet.test1.id}" -// private_ip_address_allocation = "dynamic" -// primary = true +// tags { +// environment = "Production" +// cost_center = "MSFT" // } //} //` +// +//var testAccAzureRMNetworkInterface_withTagsUpdate = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acceptanceTestVirtualNetwork1" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "testsubnet" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" +//} +// +//resource "azurerm_network_interface" "test" { +// name = "acceptanceTestNetworkInterface1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +// +// tags { +// environment = "staging" +// } +//} +//` +// +////TODO: Re-enable this test when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed +////var testAccAzureRMNetworkInterface_extraIpConfiguration = ` +////resource "azurerm_resource_group" "test" { +//// name = "acceptanceTestResourceGroup1" +//// location = "West US" +////} +//// +////resource "azurerm_virtual_network" "test" { +//// name = "acceptanceTestVirtualNetwork1" +//// address_space = ["10.0.0.0/16"] +//// location = "West US" +//// resource_group_name = "${azurerm_resource_group.test.name}" +////} +//// +////resource "azurerm_subnet" "test" { +//// name = "testsubnet" +//// resource_group_name = "${azurerm_resource_group.test.name}" +//// virtual_network_name = "${azurerm_virtual_network.test.name}" +//// address_prefix = "10.0.2.0/24" +////} +//// +////resource "azurerm_subnet" "test1" { +//// name = "testsubnet1" +//// resource_group_name = "${azurerm_resource_group.test.name}" +//// virtual_network_name = "${azurerm_virtual_network.test.name}" +//// address_prefix = "10.0.1.0/24" +////} +//// +////resource "azurerm_network_interface" "test" { +//// name = "acceptanceTestNetworkInterface1" +//// location = "West US" +//// resource_group_name = "${azurerm_resource_group.test.name}" +//// +//// ip_configuration { +//// name = "testconfiguration1" +//// subnet_id = "${azurerm_subnet.test.id}" +//// private_ip_address_allocation = "dynamic" +//// } +//// +//// ip_configuration { +//// name = "testconfiguration2" +//// subnet_id = "${azurerm_subnet.test1.id}" +//// private_ip_address_allocation = "dynamic" +//// primary = true +//// } +////} +////` diff --git a/builtin/providers/azurerm/resource_arm_network_security_group.go b/builtin/providers/azurerm/resource_arm_network_security_group.go index cc73f509c7..4d9569c412 100644 --- a/builtin/providers/azurerm/resource_arm_network_security_group.go +++ b/builtin/providers/azurerm/resource_arm_network_security_group.go @@ -1,301 +1,301 @@ package azurerm -import ( - "bytes" - "fmt" - "log" - "net/http" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/hashcode" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmNetworkSecurityGroup() *schema.Resource { - return &schema.Resource{ - Create: resourceArmNetworkSecurityGroupCreate, - Read: resourceArmNetworkSecurityGroupRead, - Update: resourceArmNetworkSecurityGroupCreate, - Delete: resourceArmNetworkSecurityGroupDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "security_rule": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "description": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { - value := v.(string) - if len(value) > 140 { - errors = append(errors, fmt.Errorf( - "The network security rule description can be no longer than 140 chars")) - } - return - }, - }, - - "protocol": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkSecurityRuleProtocol, - }, - - "source_port_range": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "destination_port_range": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "source_address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "destination_address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "access": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkSecurityRuleAccess, - }, - - "priority": &schema.Schema{ - Type: schema.TypeInt, - Required: true, - ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { - value := v.(int) - if value < 100 || value > 4096 { - errors = append(errors, fmt.Errorf( - "The `priority` can only be between 100 and 4096")) - } - return - }, - }, - - "direction": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkSecurityRuleDirection, - }, - }, - }, - Set: resourceArmNetworkSecurityGroupRuleHash, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmNetworkSecurityGroupCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - secClient := client.secGroupClient - - name := d.Get("name").(string) - location := d.Get("location").(string) - resGroup := d.Get("resource_group_name").(string) - tags := d.Get("tags").(map[string]interface{}) - - sgRules, sgErr := expandAzureRmSecurityRules(d) - if sgErr != nil { - return fmt.Errorf("Error Building list of Network Security Group Rules: %s", sgErr) - } - - sg := network.SecurityGroup{ - Name: &name, - Location: &location, - Properties: &network.SecurityGroupPropertiesFormat{ - SecurityRules: &sgRules, - }, - Tags: expandTags(tags), - } - - resp, err := secClient.CreateOrUpdate(resGroup, name, sg) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Network Security Group (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: securityGroupStateRefreshFunc(client, resGroup, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Network Securty Group (%s) to become available: %s", name, err) - } - - return resourceArmNetworkSecurityGroupRead(d, meta) -} - -func resourceArmNetworkSecurityGroupRead(d *schema.ResourceData, meta interface{}) error { - secGroupClient := meta.(*ArmClient).secGroupClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["networkSecurityGroups"] - - resp, err := secGroupClient.Get(resGroup, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Network Security Group %s: %s", name, err) - } - - if resp.Properties.SecurityRules != nil { - d.Set("security_rule", flattenNetworkSecurityRules(resp.Properties.SecurityRules)) - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmNetworkSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { - secGroupClient := meta.(*ArmClient).secGroupClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["networkSecurityGroups"] - - _, err = secGroupClient.Delete(resGroup, name) - - return err -} - -func resourceArmNetworkSecurityGroupRuleHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["protocol"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["source_port_range"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["destination_port_range"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["source_address_prefix"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["destination_address_prefix"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["access"].(string))) - buf.WriteString(fmt.Sprintf("%d-", m["priority"].(int))) - buf.WriteString(fmt.Sprintf("%s-", m["direction"].(string))) - - return hashcode.String(buf.String()) -} - -func securityGroupStateRefreshFunc(client *ArmClient, resourceGroupName string, securityGroupName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.secGroupClient.Get(resourceGroupName, securityGroupName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in securityGroupStateRefreshFunc to Azure ARM for network security group '%s' (RG: '%s'): %s", securityGroupName, resourceGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} - -func flattenNetworkSecurityRules(rules *[]network.SecurityRule) []map[string]interface{} { - result := make([]map[string]interface{}, 0, len(*rules)) - for _, rule := range *rules { - sgRule := make(map[string]interface{}) - sgRule["name"] = *rule.Name - sgRule["destination_address_prefix"] = *rule.Properties.DestinationAddressPrefix - sgRule["destination_port_range"] = *rule.Properties.DestinationPortRange - sgRule["source_address_prefix"] = *rule.Properties.SourceAddressPrefix - sgRule["source_port_range"] = *rule.Properties.SourcePortRange - sgRule["priority"] = int(*rule.Properties.Priority) - sgRule["access"] = rule.Properties.Access - sgRule["direction"] = rule.Properties.Direction - sgRule["protocol"] = rule.Properties.Protocol - - if rule.Properties.Description != nil { - sgRule["description"] = *rule.Properties.Description - } - - result = append(result, sgRule) - } - return result -} - -func expandAzureRmSecurityRules(d *schema.ResourceData) ([]network.SecurityRule, error) { - sgRules := d.Get("security_rule").(*schema.Set).List() - rules := make([]network.SecurityRule, 0, len(sgRules)) - - for _, sgRaw := range sgRules { - data := sgRaw.(map[string]interface{}) - - source_port_range := data["source_port_range"].(string) - destination_port_range := data["destination_port_range"].(string) - source_address_prefix := data["source_address_prefix"].(string) - destination_address_prefix := data["destination_address_prefix"].(string) - priority := data["priority"].(int) - - properties := network.SecurityRulePropertiesFormat{ - SourcePortRange: &source_port_range, - DestinationPortRange: &destination_port_range, - SourceAddressPrefix: &source_address_prefix, - DestinationAddressPrefix: &destination_address_prefix, - Priority: &priority, - Access: network.SecurityRuleAccess(data["access"].(string)), - Direction: network.SecurityRuleDirection(data["direction"].(string)), - Protocol: network.SecurityRuleProtocol(data["protocol"].(string)), - } - - if v := data["description"].(string); v != "" { - properties.Description = &v - } - - name := data["name"].(string) - rule := network.SecurityRule{ - Name: &name, - Properties: &properties, - } - - rules = append(rules, rule) - } - - return rules, nil -} +//import ( +// "bytes" +// "fmt" +// "log" +// "net/http" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/hashcode" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmNetworkSecurityGroup() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmNetworkSecurityGroupCreate, +// Read: resourceArmNetworkSecurityGroupRead, +// Update: resourceArmNetworkSecurityGroupCreate, +// Delete: resourceArmNetworkSecurityGroupDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "security_rule": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "description": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { +// value := v.(string) +// if len(value) > 140 { +// errors = append(errors, fmt.Errorf( +// "The network security rule description can be no longer than 140 chars")) +// } +// return +// }, +// }, +// +// "protocol": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkSecurityRuleProtocol, +// }, +// +// "source_port_range": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "destination_port_range": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "source_address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "destination_address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "access": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkSecurityRuleAccess, +// }, +// +// "priority": &schema.Schema{ +// Type: schema.TypeInt, +// Required: true, +// ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { +// value := v.(int) +// if value < 100 || value > 4096 { +// errors = append(errors, fmt.Errorf( +// "The `priority` can only be between 100 and 4096")) +// } +// return +// }, +// }, +// +// "direction": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkSecurityRuleDirection, +// }, +// }, +// }, +// Set: resourceArmNetworkSecurityGroupRuleHash, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmNetworkSecurityGroupCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// secClient := client.secGroupClient +// +// name := d.Get("name").(string) +// location := d.Get("location").(string) +// resGroup := d.Get("resource_group_name").(string) +// tags := d.Get("tags").(map[string]interface{}) +// +// sgRules, sgErr := expandAzureRmSecurityRules(d) +// if sgErr != nil { +// return fmt.Errorf("Error Building list of Network Security Group Rules: %s", sgErr) +// } +// +// sg := network.SecurityGroup{ +// Name: &name, +// Location: &location, +// Properties: &network.SecurityGroupPropertiesFormat{ +// SecurityRules: &sgRules, +// }, +// Tags: expandTags(tags), +// } +// +// resp, err := secClient.CreateOrUpdate(resGroup, name, sg) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Network Security Group (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: securityGroupStateRefreshFunc(client, resGroup, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Network Securty Group (%s) to become available: %s", name, err) +// } +// +// return resourceArmNetworkSecurityGroupRead(d, meta) +//} +// +//func resourceArmNetworkSecurityGroupRead(d *schema.ResourceData, meta interface{}) error { +// secGroupClient := meta.(*ArmClient).secGroupClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["networkSecurityGroups"] +// +// resp, err := secGroupClient.Get(resGroup, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Network Security Group %s: %s", name, err) +// } +// +// if resp.Properties.SecurityRules != nil { +// d.Set("security_rule", flattenNetworkSecurityRules(resp.Properties.SecurityRules)) +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmNetworkSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { +// secGroupClient := meta.(*ArmClient).secGroupClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["networkSecurityGroups"] +// +// _, err = secGroupClient.Delete(resGroup, name) +// +// return err +//} +// +//func resourceArmNetworkSecurityGroupRuleHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["protocol"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["source_port_range"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["destination_port_range"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["source_address_prefix"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["destination_address_prefix"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["access"].(string))) +// buf.WriteString(fmt.Sprintf("%d-", m["priority"].(int))) +// buf.WriteString(fmt.Sprintf("%s-", m["direction"].(string))) +// +// return hashcode.String(buf.String()) +//} +// +//func securityGroupStateRefreshFunc(client *ArmClient, resourceGroupName string, securityGroupName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.secGroupClient.Get(resourceGroupName, securityGroupName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in securityGroupStateRefreshFunc to Azure ARM for network security group '%s' (RG: '%s'): %s", securityGroupName, resourceGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} +// +//func flattenNetworkSecurityRules(rules *[]network.SecurityRule) []map[string]interface{} { +// result := make([]map[string]interface{}, 0, len(*rules)) +// for _, rule := range *rules { +// sgRule := make(map[string]interface{}) +// sgRule["name"] = *rule.Name +// sgRule["destination_address_prefix"] = *rule.Properties.DestinationAddressPrefix +// sgRule["destination_port_range"] = *rule.Properties.DestinationPortRange +// sgRule["source_address_prefix"] = *rule.Properties.SourceAddressPrefix +// sgRule["source_port_range"] = *rule.Properties.SourcePortRange +// sgRule["priority"] = int(*rule.Properties.Priority) +// sgRule["access"] = rule.Properties.Access +// sgRule["direction"] = rule.Properties.Direction +// sgRule["protocol"] = rule.Properties.Protocol +// +// if rule.Properties.Description != nil { +// sgRule["description"] = *rule.Properties.Description +// } +// +// result = append(result, sgRule) +// } +// return result +//} +// +//func expandAzureRmSecurityRules(d *schema.ResourceData) ([]network.SecurityRule, error) { +// sgRules := d.Get("security_rule").(*schema.Set).List() +// rules := make([]network.SecurityRule, 0, len(sgRules)) +// +// for _, sgRaw := range sgRules { +// data := sgRaw.(map[string]interface{}) +// +// source_port_range := data["source_port_range"].(string) +// destination_port_range := data["destination_port_range"].(string) +// source_address_prefix := data["source_address_prefix"].(string) +// destination_address_prefix := data["destination_address_prefix"].(string) +// priority := data["priority"].(int) +// +// properties := network.SecurityRulePropertiesFormat{ +// SourcePortRange: &source_port_range, +// DestinationPortRange: &destination_port_range, +// SourceAddressPrefix: &source_address_prefix, +// DestinationAddressPrefix: &destination_address_prefix, +// Priority: &priority, +// Access: network.SecurityRuleAccess(data["access"].(string)), +// Direction: network.SecurityRuleDirection(data["direction"].(string)), +// Protocol: network.SecurityRuleProtocol(data["protocol"].(string)), +// } +// +// if v := data["description"].(string); v != "" { +// properties.Description = &v +// } +// +// name := data["name"].(string) +// rule := network.SecurityRule{ +// Name: &name, +// Properties: &properties, +// } +// +// rules = append(rules, rule) +// } +// +// return rules, nil +//} diff --git a/builtin/providers/azurerm/resource_arm_network_security_group_test.go b/builtin/providers/azurerm/resource_arm_network_security_group_test.go index 64c4f9944f..d05ff88bf0 100644 --- a/builtin/providers/azurerm/resource_arm_network_security_group_test.go +++ b/builtin/providers/azurerm/resource_arm_network_security_group_test.go @@ -1,265 +1,265 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMNetworkSecurityGroup_basic(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityGroup_basic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMNetworkSecurityGroup_withTags(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityGroup_withTags, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "tags.cost_center", "MSFT"), - ), - }, - - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityGroup_withTagsUpdate, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "tags.environment", "staging"), - ), - }, - }, - }) -} - -func TestAccAzureRMNetworkSecurityGroup_addingExtraRules(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityGroup_basic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "security_rule.#", "1"), - ), - }, - - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityGroup_anotherRule, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), - resource.TestCheckResourceAttr( - "azurerm_network_security_group.test", "security_rule.#", "2"), - ), - }, - }, - }) -} - -func testCheckAzureRMNetworkSecurityGroupExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - sgName := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for network security group: %s", sgName) - } - - conn := testAccProvider.Meta().(*ArmClient).secGroupClient - - resp, err := conn.Get(resourceGroup, sgName, "") - if err != nil { - return fmt.Errorf("Bad: Get on secGroupClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Network Security Group %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMNetworkSecurityGroupDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).secGroupClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_network_security_group" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Network Security Group still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMNetworkSecurityGroup_basic = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_network_security_group" "test" { - name = "acceptanceTestSecurityGroup1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - security_rule { - name = "test123" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - } -} -` - -var testAccAzureRMNetworkSecurityGroup_anotherRule = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_network_security_group" "test" { - name = "acceptanceTestSecurityGroup1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - security_rule { - name = "test123" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - } - - security_rule { - name = "testDeny" - priority = 101 - direction = "Inbound" - access = "Deny" - protocol = "Udp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - } -} -` - -var testAccAzureRMNetworkSecurityGroup_withTags = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_network_security_group" "test" { - name = "acceptanceTestSecurityGroup1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - security_rule { - name = "test123" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - } - - - tags { - environment = "Production" - cost_center = "MSFT" - } -} -` - -var testAccAzureRMNetworkSecurityGroup_withTagsUpdate = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_network_security_group" "test" { - name = "acceptanceTestSecurityGroup1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - security_rule { - name = "test123" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - } - - tags { - environment = "staging" - } -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMNetworkSecurityGroup_basic(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityGroup_basic, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMNetworkSecurityGroup_withTags(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityGroup_withTags, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "tags.cost_center", "MSFT"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityGroup_withTagsUpdate, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMNetworkSecurityGroup_addingExtraRules(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityGroup_basic, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "security_rule.#", "1"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityGroup_anotherRule, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), +// resource.TestCheckResourceAttr( +// "azurerm_network_security_group.test", "security_rule.#", "2"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMNetworkSecurityGroupExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// sgName := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for network security group: %s", sgName) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).secGroupClient +// +// resp, err := conn.Get(resourceGroup, sgName, "") +// if err != nil { +// return fmt.Errorf("Bad: Get on secGroupClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Network Security Group %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMNetworkSecurityGroupDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).secGroupClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_network_security_group" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, name, "") +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Network Security Group still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMNetworkSecurityGroup_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test" { +// name = "acceptanceTestSecurityGroup1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// security_rule { +// name = "test123" +// priority = 100 +// direction = "Inbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// } +//} +//` +// +//var testAccAzureRMNetworkSecurityGroup_anotherRule = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test" { +// name = "acceptanceTestSecurityGroup1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// security_rule { +// name = "test123" +// priority = 100 +// direction = "Inbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// } +// +// security_rule { +// name = "testDeny" +// priority = 101 +// direction = "Inbound" +// access = "Deny" +// protocol = "Udp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// } +//} +//` +// +//var testAccAzureRMNetworkSecurityGroup_withTags = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test" { +// name = "acceptanceTestSecurityGroup1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// security_rule { +// name = "test123" +// priority = 100 +// direction = "Inbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// } +// +// +// tags { +// environment = "Production" +// cost_center = "MSFT" +// } +//} +//` +// +//var testAccAzureRMNetworkSecurityGroup_withTagsUpdate = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test" { +// name = "acceptanceTestSecurityGroup1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// security_rule { +// name = "test123" +// priority = 100 +// direction = "Inbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// } +// +// tags { +// environment = "staging" +// } +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_network_security_rule.go b/builtin/providers/azurerm/resource_arm_network_security_rule.go index 491e331bc0..b155fce6fe 100644 --- a/builtin/providers/azurerm/resource_arm_network_security_rule.go +++ b/builtin/providers/azurerm/resource_arm_network_security_rule.go @@ -1,219 +1,219 @@ package azurerm -import ( - "fmt" - "log" - "net/http" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmNetworkSecurityRule() *schema.Resource { - return &schema.Resource{ - Create: resourceArmNetworkSecurityRuleCreate, - Read: resourceArmNetworkSecurityRuleRead, - Update: resourceArmNetworkSecurityRuleCreate, - Delete: resourceArmNetworkSecurityRuleDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "network_security_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "description": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { - value := v.(string) - if len(value) > 140 { - errors = append(errors, fmt.Errorf( - "The network security rule description can be no longer than 140 chars")) - } - return - }, - }, - - "protocol": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkSecurityRuleProtocol, - }, - - "source_port_range": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "destination_port_range": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "source_address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "destination_address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "access": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkSecurityRuleAccess, - }, - - "priority": &schema.Schema{ - Type: schema.TypeInt, - Required: true, - ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { - value := v.(int) - if value < 100 || value > 4096 { - errors = append(errors, fmt.Errorf( - "The `priority` can only be between 100 and 4096")) - } - return - }, - }, - - "direction": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateNetworkSecurityRuleDirection, - }, - }, - } -} - -func resourceArmNetworkSecurityRuleCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - secClient := client.secRuleClient - - name := d.Get("name").(string) - nsgName := d.Get("network_security_group_name").(string) - resGroup := d.Get("resource_group_name").(string) - - source_port_range := d.Get("source_port_range").(string) - destination_port_range := d.Get("destination_port_range").(string) - source_address_prefix := d.Get("source_address_prefix").(string) - destination_address_prefix := d.Get("destination_address_prefix").(string) - priority := d.Get("priority").(int) - access := d.Get("access").(string) - direction := d.Get("direction").(string) - protocol := d.Get("protocol").(string) - - armMutexKV.Lock(nsgName) - defer armMutexKV.Unlock(nsgName) - - properties := network.SecurityRulePropertiesFormat{ - SourcePortRange: &source_port_range, - DestinationPortRange: &destination_port_range, - SourceAddressPrefix: &source_address_prefix, - DestinationAddressPrefix: &destination_address_prefix, - Priority: &priority, - Access: network.SecurityRuleAccess(access), - Direction: network.SecurityRuleDirection(direction), - Protocol: network.SecurityRuleProtocol(protocol), - } - - if v, ok := d.GetOk("description"); ok { - description := v.(string) - properties.Description = &description - } - - sgr := network.SecurityRule{ - Name: &name, - Properties: &properties, - } - - resp, err := secClient.CreateOrUpdate(resGroup, nsgName, name, sgr) - if err != nil { - return err - } - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Network Security Rule (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: securityRuleStateRefreshFunc(client, resGroup, nsgName, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Network Securty Rule (%s) to become available: %s", name, err) - } - - return resourceArmNetworkSecurityRuleRead(d, meta) -} - -func resourceArmNetworkSecurityRuleRead(d *schema.ResourceData, meta interface{}) error { - secRuleClient := meta.(*ArmClient).secRuleClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - networkSGName := id.Path["networkSecurityGroups"] - sgRuleName := id.Path["securityRules"] - - resp, err := secRuleClient.Get(resGroup, networkSGName, sgRuleName) - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Network Security Rule %s: %s", sgRuleName, err) - } - - return nil -} - -func resourceArmNetworkSecurityRuleDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - secRuleClient := client.secRuleClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - nsgName := id.Path["networkSecurityGroups"] - sgRuleName := id.Path["securityRules"] - - armMutexKV.Lock(nsgName) - defer armMutexKV.Unlock(nsgName) - - _, err = secRuleClient.Delete(resGroup, nsgName, sgRuleName) - - return err -} - -func securityRuleStateRefreshFunc(client *ArmClient, resourceGroupName string, networkSecurityGroupName string, securityRuleName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.secRuleClient.Get(resourceGroupName, networkSecurityGroupName, securityRuleName) - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in securityGroupStateRefreshFunc to Azure ARM for network security rule '%s' (RG: '%s') (NSG: '%s'): %s", securityRuleName, resourceGroupName, networkSecurityGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} +//import ( +// "fmt" +// "log" +// "net/http" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmNetworkSecurityRule() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmNetworkSecurityRuleCreate, +// Read: resourceArmNetworkSecurityRuleRead, +// Update: resourceArmNetworkSecurityRuleCreate, +// Delete: resourceArmNetworkSecurityRuleDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "network_security_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "description": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { +// value := v.(string) +// if len(value) > 140 { +// errors = append(errors, fmt.Errorf( +// "The network security rule description can be no longer than 140 chars")) +// } +// return +// }, +// }, +// +// "protocol": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkSecurityRuleProtocol, +// }, +// +// "source_port_range": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "destination_port_range": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "source_address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "destination_address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "access": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkSecurityRuleAccess, +// }, +// +// "priority": &schema.Schema{ +// Type: schema.TypeInt, +// Required: true, +// ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { +// value := v.(int) +// if value < 100 || value > 4096 { +// errors = append(errors, fmt.Errorf( +// "The `priority` can only be between 100 and 4096")) +// } +// return +// }, +// }, +// +// "direction": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateNetworkSecurityRuleDirection, +// }, +// }, +// } +//} +// +//func resourceArmNetworkSecurityRuleCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// secClient := client.secRuleClient +// +// name := d.Get("name").(string) +// nsgName := d.Get("network_security_group_name").(string) +// resGroup := d.Get("resource_group_name").(string) +// +// source_port_range := d.Get("source_port_range").(string) +// destination_port_range := d.Get("destination_port_range").(string) +// source_address_prefix := d.Get("source_address_prefix").(string) +// destination_address_prefix := d.Get("destination_address_prefix").(string) +// priority := d.Get("priority").(int) +// access := d.Get("access").(string) +// direction := d.Get("direction").(string) +// protocol := d.Get("protocol").(string) +// +// armMutexKV.Lock(nsgName) +// defer armMutexKV.Unlock(nsgName) +// +// properties := network.SecurityRulePropertiesFormat{ +// SourcePortRange: &source_port_range, +// DestinationPortRange: &destination_port_range, +// SourceAddressPrefix: &source_address_prefix, +// DestinationAddressPrefix: &destination_address_prefix, +// Priority: &priority, +// Access: network.SecurityRuleAccess(access), +// Direction: network.SecurityRuleDirection(direction), +// Protocol: network.SecurityRuleProtocol(protocol), +// } +// +// if v, ok := d.GetOk("description"); ok { +// description := v.(string) +// properties.Description = &description +// } +// +// sgr := network.SecurityRule{ +// Name: &name, +// Properties: &properties, +// } +// +// resp, err := secClient.CreateOrUpdate(resGroup, nsgName, name, sgr) +// if err != nil { +// return err +// } +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Network Security Rule (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: securityRuleStateRefreshFunc(client, resGroup, nsgName, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Network Securty Rule (%s) to become available: %s", name, err) +// } +// +// return resourceArmNetworkSecurityRuleRead(d, meta) +//} +// +//func resourceArmNetworkSecurityRuleRead(d *schema.ResourceData, meta interface{}) error { +// secRuleClient := meta.(*ArmClient).secRuleClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// networkSGName := id.Path["networkSecurityGroups"] +// sgRuleName := id.Path["securityRules"] +// +// resp, err := secRuleClient.Get(resGroup, networkSGName, sgRuleName) +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Network Security Rule %s: %s", sgRuleName, err) +// } +// +// return nil +//} +// +//func resourceArmNetworkSecurityRuleDelete(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// secRuleClient := client.secRuleClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// nsgName := id.Path["networkSecurityGroups"] +// sgRuleName := id.Path["securityRules"] +// +// armMutexKV.Lock(nsgName) +// defer armMutexKV.Unlock(nsgName) +// +// _, err = secRuleClient.Delete(resGroup, nsgName, sgRuleName) +// +// return err +//} +// +//func securityRuleStateRefreshFunc(client *ArmClient, resourceGroupName string, networkSecurityGroupName string, securityRuleName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.secRuleClient.Get(resourceGroupName, networkSecurityGroupName, securityRuleName) +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in securityGroupStateRefreshFunc to Azure ARM for network security rule '%s' (RG: '%s') (NSG: '%s'): %s", securityRuleName, resourceGroupName, networkSecurityGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} diff --git a/builtin/providers/azurerm/resource_arm_network_security_rule_test.go b/builtin/providers/azurerm/resource_arm_network_security_rule_test.go index b3b9c9d02d..114911574e 100644 --- a/builtin/providers/azurerm/resource_arm_network_security_rule_test.go +++ b/builtin/providers/azurerm/resource_arm_network_security_rule_test.go @@ -1,203 +1,203 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMNetworkSecurityRule_basic(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkSecurityRuleDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityRule_basic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityRuleExists("azurerm_network_security_rule.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMNetworkSecurityRule_addingRules(t *testing.T) { - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMNetworkSecurityRuleDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityRule_updateBasic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityRuleExists("azurerm_network_security_rule.test1"), - ), - }, - - resource.TestStep{ - Config: testAccAzureRMNetworkSecurityRule_updateExtraRule, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMNetworkSecurityRuleExists("azurerm_network_security_rule.test2"), - ), - }, - }, - }) -} - -func testCheckAzureRMNetworkSecurityRuleExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - sgName := rs.Primary.Attributes["network_security_group_name"] - sgrName := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for network security rule: %s", sgName) - } - - conn := testAccProvider.Meta().(*ArmClient).secRuleClient - - resp, err := conn.Get(resourceGroup, sgName, sgrName) - if err != nil { - return fmt.Errorf("Bad: Get on secRuleClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Network Security Rule %q (resource group: %q) (network security group: %q) does not exist", sgrName, sgName, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMNetworkSecurityRuleDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).secRuleClient - - for _, rs := range s.RootModule().Resources { - - if rs.Type != "azurerm_network_security_rule" { - continue - } - - sgName := rs.Primary.Attributes["network_security_group_name"] - sgrName := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, sgName, sgrName) - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Network Security Rule still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMNetworkSecurityRule_basic = ` -resource "azurerm_resource_group" "test" { - name = "acceptanceTestResourceGroup1" - location = "West US" -} - -resource "azurerm_network_security_group" "test" { - name = "acceptanceTestSecurityGroup1" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_network_security_rule" "test" { - name = "test123" - priority = 100 - direction = "Outbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - resource_group_name = "${azurerm_resource_group.test.name}" - network_security_group_name = "${azurerm_network_security_group.test.name}" -} -` - -var testAccAzureRMNetworkSecurityRule_updateBasic = ` -resource "azurerm_resource_group" "test1" { - name = "acceptanceTestResourceGroup2" - location = "West US" -} - -resource "azurerm_network_security_group" "test1" { - name = "acceptanceTestSecurityGroup2" - location = "West US" - resource_group_name = "${azurerm_resource_group.test1.name}" -} - -resource "azurerm_network_security_rule" "test1" { - name = "test123" - priority = 100 - direction = "Outbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - resource_group_name = "${azurerm_resource_group.test1.name}" - network_security_group_name = "${azurerm_network_security_group.test1.name}" -} -` - -var testAccAzureRMNetworkSecurityRule_updateExtraRule = ` -resource "azurerm_resource_group" "test1" { - name = "acceptanceTestResourceGroup2" - location = "West US" -} - -resource "azurerm_network_security_group" "test1" { - name = "acceptanceTestSecurityGroup2" - location = "West US" - resource_group_name = "${azurerm_resource_group.test1.name}" -} - -resource "azurerm_network_security_rule" "test1" { - name = "test123" - priority = 100 - direction = "Outbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - resource_group_name = "${azurerm_resource_group.test1.name}" - network_security_group_name = "${azurerm_network_security_group.test1.name}" -} - -resource "azurerm_network_security_rule" "test2" { - name = "testing456" - priority = 101 - direction = "Inbound" - access = "Deny" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "*" - source_address_prefix = "*" - destination_address_prefix = "*" - resource_group_name = "${azurerm_resource_group.test1.name}" - network_security_group_name = "${azurerm_network_security_group.test1.name}" -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMNetworkSecurityRule_basic(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkSecurityRuleDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityRule_basic, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityRuleExists("azurerm_network_security_rule.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMNetworkSecurityRule_addingRules(t *testing.T) { +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMNetworkSecurityRuleDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityRule_updateBasic, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityRuleExists("azurerm_network_security_rule.test1"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccAzureRMNetworkSecurityRule_updateExtraRule, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMNetworkSecurityRuleExists("azurerm_network_security_rule.test2"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMNetworkSecurityRuleExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// sgName := rs.Primary.Attributes["network_security_group_name"] +// sgrName := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for network security rule: %s", sgName) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).secRuleClient +// +// resp, err := conn.Get(resourceGroup, sgName, sgrName) +// if err != nil { +// return fmt.Errorf("Bad: Get on secRuleClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Network Security Rule %q (resource group: %q) (network security group: %q) does not exist", sgrName, sgName, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMNetworkSecurityRuleDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).secRuleClient +// +// for _, rs := range s.RootModule().Resources { +// +// if rs.Type != "azurerm_network_security_rule" { +// continue +// } +// +// sgName := rs.Primary.Attributes["network_security_group_name"] +// sgrName := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, sgName, sgrName) +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Network Security Rule still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMNetworkSecurityRule_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acceptanceTestResourceGroup1" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test" { +// name = "acceptanceTestSecurityGroup1" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_network_security_rule" "test" { +// name = "test123" +// priority = 100 +// direction = "Outbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// resource_group_name = "${azurerm_resource_group.test.name}" +// network_security_group_name = "${azurerm_network_security_group.test.name}" +//} +//` +// +//var testAccAzureRMNetworkSecurityRule_updateBasic = ` +//resource "azurerm_resource_group" "test1" { +// name = "acceptanceTestResourceGroup2" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test1" { +// name = "acceptanceTestSecurityGroup2" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test1.name}" +//} +// +//resource "azurerm_network_security_rule" "test1" { +// name = "test123" +// priority = 100 +// direction = "Outbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// resource_group_name = "${azurerm_resource_group.test1.name}" +// network_security_group_name = "${azurerm_network_security_group.test1.name}" +//} +//` +// +//var testAccAzureRMNetworkSecurityRule_updateExtraRule = ` +//resource "azurerm_resource_group" "test1" { +// name = "acceptanceTestResourceGroup2" +// location = "West US" +//} +// +//resource "azurerm_network_security_group" "test1" { +// name = "acceptanceTestSecurityGroup2" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test1.name}" +//} +// +//resource "azurerm_network_security_rule" "test1" { +// name = "test123" +// priority = 100 +// direction = "Outbound" +// access = "Allow" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// resource_group_name = "${azurerm_resource_group.test1.name}" +// network_security_group_name = "${azurerm_network_security_group.test1.name}" +//} +// +//resource "azurerm_network_security_rule" "test2" { +// name = "testing456" +// priority = 101 +// direction = "Inbound" +// access = "Deny" +// protocol = "Tcp" +// source_port_range = "*" +// destination_port_range = "*" +// source_address_prefix = "*" +// destination_address_prefix = "*" +// resource_group_name = "${azurerm_resource_group.test1.name}" +// network_security_group_name = "${azurerm_network_security_group.test1.name}" +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_public_ip.go b/builtin/providers/azurerm/resource_arm_public_ip.go index 5b3c8999c6..c9011e08c1 100644 --- a/builtin/providers/azurerm/resource_arm_public_ip.go +++ b/builtin/providers/azurerm/resource_arm_public_ip.go @@ -1,251 +1,251 @@ package azurerm -import ( - "fmt" - "log" - "net/http" - "regexp" - "strings" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmPublicIp() *schema.Resource { - return &schema.Resource{ - Create: resourceArmPublicIpCreate, - Read: resourceArmPublicIpRead, - Update: resourceArmPublicIpCreate, - Delete: resourceArmPublicIpDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "public_ip_address_allocation": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validatePublicIpAllocation, - }, - - "idle_timeout_in_minutes": &schema.Schema{ - Type: schema.TypeInt, - Optional: true, - ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { - value := v.(int) - if value < 4 || value > 30 { - errors = append(errors, fmt.Errorf( - "The idle timeout must be between 4 and 30 minutes")) - } - return - }, - }, - - "domain_name_label": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ValidateFunc: validatePublicIpDomainNameLabel, - }, - - "reverse_fqdn": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - }, - - "fqdn": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "ip_address": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmPublicIpCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - publicIPClient := client.publicIPClient - - log.Printf("[INFO] preparing arguments for Azure ARM Public IP 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{}) - - properties := network.PublicIPAddressPropertiesFormat{ - PublicIPAllocationMethod: network.IPAllocationMethod(d.Get("public_ip_address_allocation").(string)), - } - - dnl, hasDnl := d.GetOk("domain_name_label") - rfqdn, hasRfqdn := d.GetOk("reverse_fqdn") - - if hasDnl || hasRfqdn { - dnsSettings := network.PublicIPAddressDNSSettings{} - - if hasRfqdn { - reverse_fqdn := rfqdn.(string) - dnsSettings.ReverseFqdn = &reverse_fqdn - } - - if hasDnl { - domain_name_label := dnl.(string) - dnsSettings.DomainNameLabel = &domain_name_label - - } - - properties.DNSSettings = &dnsSettings - } - - if v, ok := d.GetOk("idle_timeout_in_minutes"); ok { - idle_timeout := v.(int) - properties.IdleTimeoutInMinutes = &idle_timeout - } - - publicIp := network.PublicIPAddress{ - Name: &name, - Location: &location, - Properties: &properties, - Tags: expandTags(tags), - } - - resp, err := publicIPClient.CreateOrUpdate(resGroup, name, publicIp) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Public IP (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: publicIPStateRefreshFunc(client, resGroup, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Public IP (%s) to become available: %s", name, err) - } - - return resourceArmPublicIpRead(d, meta) -} - -func resourceArmPublicIpRead(d *schema.ResourceData, meta interface{}) error { - publicIPClient := meta.(*ArmClient).publicIPClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["publicIPAddresses"] - - resp, err := publicIPClient.Get(resGroup, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure public ip %s: %s", name, err) - } - - if resp.Properties.DNSSettings != nil && resp.Properties.DNSSettings.Fqdn != nil && *resp.Properties.DNSSettings.Fqdn != "" { - d.Set("fqdn", resp.Properties.DNSSettings.Fqdn) - } - - if resp.Properties.IPAddress != nil && *resp.Properties.IPAddress != "" { - d.Set("ip_address", resp.Properties.IPAddress) - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmPublicIpDelete(d *schema.ResourceData, meta interface{}) error { - publicIPClient := meta.(*ArmClient).publicIPClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["publicIPAddresses"] - - _, err = publicIPClient.Delete(resGroup, name) - - return err -} - -func publicIPStateRefreshFunc(client *ArmClient, resourceGroupName string, publicIpName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.publicIPClient.Get(resourceGroupName, publicIpName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in publicIPStateRefreshFunc to Azure ARM for public ip '%s' (RG: '%s'): %s", publicIpName, resourceGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} - -func validatePublicIpAllocation(v interface{}, k string) (ws []string, errors []error) { - value := strings.ToLower(v.(string)) - allocations := map[string]bool{ - "static": true, - "dynamic": true, - } - - if !allocations[value] { - errors = append(errors, fmt.Errorf("Public IP Allocation can only be Static of Dynamic")) - } - return -} - -func validatePublicIpDomainNameLabel(v interface{}, k string) (ws []string, errors []error) { - value := v.(string) - if !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "only alphanumeric characters and hyphens allowed in %q: %q", - k, value)) - } - - if len(value) > 61 { - errors = append(errors, fmt.Errorf( - "%q cannot be longer than 61 characters: %q", k, value)) - } - - if len(value) == 0 { - errors = append(errors, fmt.Errorf( - "%q cannot be an empty string: %q", k, value)) - } - if regexp.MustCompile(`-$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q cannot end with a hyphen: %q", k, value)) - } - - return - -} +//import ( +// "fmt" +// "log" +// "net/http" +// "regexp" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmPublicIp() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmPublicIpCreate, +// Read: resourceArmPublicIpRead, +// Update: resourceArmPublicIpCreate, +// Delete: resourceArmPublicIpDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "public_ip_address_allocation": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validatePublicIpAllocation, +// }, +// +// "idle_timeout_in_minutes": &schema.Schema{ +// Type: schema.TypeInt, +// Optional: true, +// ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { +// value := v.(int) +// if value < 4 || value > 30 { +// errors = append(errors, fmt.Errorf( +// "The idle timeout must be between 4 and 30 minutes")) +// } +// return +// }, +// }, +// +// "domain_name_label": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// ValidateFunc: validatePublicIpDomainNameLabel, +// }, +// +// "reverse_fqdn": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// +// "fqdn": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "ip_address": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmPublicIpCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// publicIPClient := client.publicIPClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM Public IP 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{}) +// +// properties := network.PublicIPAddressPropertiesFormat{ +// PublicIPAllocationMethod: network.IPAllocationMethod(d.Get("public_ip_address_allocation").(string)), +// } +// +// dnl, hasDnl := d.GetOk("domain_name_label") +// rfqdn, hasRfqdn := d.GetOk("reverse_fqdn") +// +// if hasDnl || hasRfqdn { +// dnsSettings := network.PublicIPAddressDNSSettings{} +// +// if hasRfqdn { +// reverse_fqdn := rfqdn.(string) +// dnsSettings.ReverseFqdn = &reverse_fqdn +// } +// +// if hasDnl { +// domain_name_label := dnl.(string) +// dnsSettings.DomainNameLabel = &domain_name_label +// +// } +// +// properties.DNSSettings = &dnsSettings +// } +// +// if v, ok := d.GetOk("idle_timeout_in_minutes"); ok { +// idle_timeout := v.(int) +// properties.IdleTimeoutInMinutes = &idle_timeout +// } +// +// publicIp := network.PublicIPAddress{ +// Name: &name, +// Location: &location, +// Properties: &properties, +// Tags: expandTags(tags), +// } +// +// resp, err := publicIPClient.CreateOrUpdate(resGroup, name, publicIp) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Public IP (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: publicIPStateRefreshFunc(client, resGroup, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Public IP (%s) to become available: %s", name, err) +// } +// +// return resourceArmPublicIpRead(d, meta) +//} +// +//func resourceArmPublicIpRead(d *schema.ResourceData, meta interface{}) error { +// publicIPClient := meta.(*ArmClient).publicIPClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["publicIPAddresses"] +// +// resp, err := publicIPClient.Get(resGroup, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure public ip %s: %s", name, err) +// } +// +// if resp.Properties.DNSSettings != nil && resp.Properties.DNSSettings.Fqdn != nil && *resp.Properties.DNSSettings.Fqdn != "" { +// d.Set("fqdn", resp.Properties.DNSSettings.Fqdn) +// } +// +// if resp.Properties.IPAddress != nil && *resp.Properties.IPAddress != "" { +// d.Set("ip_address", resp.Properties.IPAddress) +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmPublicIpDelete(d *schema.ResourceData, meta interface{}) error { +// publicIPClient := meta.(*ArmClient).publicIPClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["publicIPAddresses"] +// +// _, err = publicIPClient.Delete(resGroup, name) +// +// return err +//} +// +//func publicIPStateRefreshFunc(client *ArmClient, resourceGroupName string, publicIpName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.publicIPClient.Get(resourceGroupName, publicIpName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in publicIPStateRefreshFunc to Azure ARM for public ip '%s' (RG: '%s'): %s", publicIpName, resourceGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} +// +//func validatePublicIpAllocation(v interface{}, k string) (ws []string, errors []error) { +// value := strings.ToLower(v.(string)) +// allocations := map[string]bool{ +// "static": true, +// "dynamic": true, +// } +// +// if !allocations[value] { +// errors = append(errors, fmt.Errorf("Public IP Allocation can only be Static of Dynamic")) +// } +// return +//} +// +//func validatePublicIpDomainNameLabel(v interface{}, k string) (ws []string, errors []error) { +// value := v.(string) +// if !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(value) { +// errors = append(errors, fmt.Errorf( +// "only alphanumeric characters and hyphens allowed in %q: %q", +// k, value)) +// } +// +// if len(value) > 61 { +// errors = append(errors, fmt.Errorf( +// "%q cannot be longer than 61 characters: %q", k, value)) +// } +// +// if len(value) == 0 { +// errors = append(errors, fmt.Errorf( +// "%q cannot be an empty string: %q", k, value)) +// } +// if regexp.MustCompile(`-$`).MatchString(value) { +// errors = append(errors, fmt.Errorf( +// "%q cannot end with a hyphen: %q", k, value)) +// } +// +// return +// +//} diff --git a/builtin/providers/azurerm/resource_arm_public_ip_test.go b/builtin/providers/azurerm/resource_arm_public_ip_test.go index eaf4a36461..bd9f08fd7e 100644 --- a/builtin/providers/azurerm/resource_arm_public_ip_test.go +++ b/builtin/providers/azurerm/resource_arm_public_ip_test.go @@ -1,316 +1,316 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestResourceAzureRMPublicIpAllocation_validation(t *testing.T) { - cases := []struct { - Value string - ErrCount int - }{ - { - Value: "Random", - ErrCount: 1, - }, - { - Value: "Static", - ErrCount: 0, - }, - { - Value: "Dynamic", - ErrCount: 0, - }, - { - Value: "STATIC", - ErrCount: 0, - }, - { - Value: "static", - ErrCount: 0, - }, - } - - for _, tc := range cases { - _, errors := validatePublicIpAllocation(tc.Value, "azurerm_public_ip") - - if len(errors) != tc.ErrCount { - t.Fatalf("Expected the Azure RM Public IP allocation to trigger a validation error") - } - } -} - -func TestResourceAzureRMPublicIpDomainNameLabel_validation(t *testing.T) { - cases := []struct { - Value string - ErrCount int - }{ - { - Value: "tEsting123", - ErrCount: 1, - }, - { - Value: "testing123!", - ErrCount: 1, - }, - { - Value: "testing123-", - ErrCount: 1, - }, - { - Value: acctest.RandString(80), - ErrCount: 1, - }, - } - - for _, tc := range cases { - _, errors := validatePublicIpDomainNameLabel(tc.Value, "azurerm_public_ip") - - if len(errors) != tc.ErrCount { - t.Fatalf("Expected the Azure RM Public IP Domain Name Label to trigger a validation error") - } - } -} - -func TestAccAzureRMPublicIpStatic_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMVPublicIpStatic_basic, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMPublicIpDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMPublicIpStatic_withTags(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_withTags, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_withTagsUpdate, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMPublicIpDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), - resource.TestCheckResourceAttr( - "azurerm_public_ip.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_public_ip.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_public_ip.test", "tags.cost_center", "MSFT"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), - resource.TestCheckResourceAttr( - "azurerm_public_ip.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_public_ip.test", "tags.environment", "staging"), - ), - }, - }, - }) -} - -func TestAccAzureRMPublicIpStatic_update(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_basic, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_update, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMPublicIpDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), - resource.TestCheckResourceAttr( - "azurerm_public_ip.test", "domain_name_label", "mylabel01"), - ), - }, - }, - }) -} - -func TestAccAzureRMPublicIpDynamic_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMVPublicIpDynamic_basic, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMPublicIpDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), - ), - }, - }, - }) -} - -func testCheckAzureRMPublicIpExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - availSetName := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for public ip: %s", availSetName) - } - - conn := testAccProvider.Meta().(*ArmClient).publicIPClient - - resp, err := conn.Get(resourceGroup, availSetName, "") - if err != nil { - return fmt.Errorf("Bad: Get on publicIPClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Public IP %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMPublicIpDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).publicIPClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_public_ip" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Public IP still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMVPublicIpStatic_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_public_ip" "test" { - name = "acctestpublicip-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - public_ip_address_allocation = "static" -} -` - -var testAccAzureRMVPublicIpStatic_update = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_public_ip" "test" { - name = "acctestpublicip-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - public_ip_address_allocation = "static" - domain_name_label = "mylabel01" -} -` - -var testAccAzureRMVPublicIpDynamic_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_public_ip" "test" { - name = "acctestpublicip-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - public_ip_address_allocation = "dynamic" -} -` - -var testAccAzureRMVPublicIpStatic_withTags = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_public_ip" "test" { - name = "acctestpublicip-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - public_ip_address_allocation = "static" - - tags { - environment = "Production" - cost_center = "MSFT" - } -} -` - -var testAccAzureRMVPublicIpStatic_withTagsUpdate = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} -resource "azurerm_public_ip" "test" { - name = "acctestpublicip-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - public_ip_address_allocation = "static" - - tags { - environment = "staging" - } -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestResourceAzureRMPublicIpAllocation_validation(t *testing.T) { +// cases := []struct { +// Value string +// ErrCount int +// }{ +// { +// Value: "Random", +// ErrCount: 1, +// }, +// { +// Value: "Static", +// ErrCount: 0, +// }, +// { +// Value: "Dynamic", +// ErrCount: 0, +// }, +// { +// Value: "STATIC", +// ErrCount: 0, +// }, +// { +// Value: "static", +// ErrCount: 0, +// }, +// } +// +// for _, tc := range cases { +// _, errors := validatePublicIpAllocation(tc.Value, "azurerm_public_ip") +// +// if len(errors) != tc.ErrCount { +// t.Fatalf("Expected the Azure RM Public IP allocation to trigger a validation error") +// } +// } +//} +// +//func TestResourceAzureRMPublicIpDomainNameLabel_validation(t *testing.T) { +// cases := []struct { +// Value string +// ErrCount int +// }{ +// { +// Value: "tEsting123", +// ErrCount: 1, +// }, +// { +// Value: "testing123!", +// ErrCount: 1, +// }, +// { +// Value: "testing123-", +// ErrCount: 1, +// }, +// { +// Value: acctest.RandString(80), +// ErrCount: 1, +// }, +// } +// +// for _, tc := range cases { +// _, errors := validatePublicIpDomainNameLabel(tc.Value, "azurerm_public_ip") +// +// if len(errors) != tc.ErrCount { +// t.Fatalf("Expected the Azure RM Public IP Domain Name Label to trigger a validation error") +// } +// } +//} +// +//func TestAccAzureRMPublicIpStatic_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMVPublicIpStatic_basic, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMPublicIpDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMPublicIpStatic_withTags(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_withTags, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_withTagsUpdate, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMPublicIpDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), +// resource.TestCheckResourceAttr( +// "azurerm_public_ip.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_public_ip.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_public_ip.test", "tags.cost_center", "MSFT"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), +// resource.TestCheckResourceAttr( +// "azurerm_public_ip.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_public_ip.test", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMPublicIpStatic_update(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_basic, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMVPublicIpStatic_update, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMPublicIpDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), +// resource.TestCheckResourceAttr( +// "azurerm_public_ip.test", "domain_name_label", "mylabel01"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMPublicIpDynamic_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMVPublicIpDynamic_basic, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMPublicIpDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMPublicIpExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// availSetName := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for public ip: %s", availSetName) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).publicIPClient +// +// resp, err := conn.Get(resourceGroup, availSetName, "") +// if err != nil { +// return fmt.Errorf("Bad: Get on publicIPClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Public IP %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMPublicIpDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).publicIPClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_public_ip" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, name, "") +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Public IP still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMVPublicIpStatic_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_public_ip" "test" { +// name = "acctestpublicip-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// public_ip_address_allocation = "static" +//} +//` +// +//var testAccAzureRMVPublicIpStatic_update = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_public_ip" "test" { +// name = "acctestpublicip-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// public_ip_address_allocation = "static" +// domain_name_label = "mylabel01" +//} +//` +// +//var testAccAzureRMVPublicIpDynamic_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_public_ip" "test" { +// name = "acctestpublicip-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// public_ip_address_allocation = "dynamic" +//} +//` +// +//var testAccAzureRMVPublicIpStatic_withTags = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_public_ip" "test" { +// name = "acctestpublicip-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// public_ip_address_allocation = "static" +// +// tags { +// environment = "Production" +// cost_center = "MSFT" +// } +//} +//` +// +//var testAccAzureRMVPublicIpStatic_withTagsUpdate = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +//resource "azurerm_public_ip" "test" { +// name = "acctestpublicip-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// public_ip_address_allocation = "static" +// +// tags { +// environment = "staging" +// } +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_route.go b/builtin/providers/azurerm/resource_arm_route.go index ee2b71b35e..965d7e3a35 100644 --- a/builtin/providers/azurerm/resource_arm_route.go +++ b/builtin/providers/azurerm/resource_arm_route.go @@ -1,161 +1,161 @@ package azurerm -import ( - "fmt" - "log" - "net/http" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmRoute() *schema.Resource { - return &schema.Resource{ - Create: resourceArmRouteCreate, - Read: resourceArmRouteRead, - Update: resourceArmRouteCreate, - Delete: resourceArmRouteDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "route_table_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "next_hop_type": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateRouteTableNextHopType, - }, - - "next_hop_in_ip_address": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - }, - } -} - -func resourceArmRouteCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - routesClient := client.routesClient - - name := d.Get("name").(string) - rtName := d.Get("route_table_name").(string) - resGroup := d.Get("resource_group_name").(string) - - addressPrefix := d.Get("address_prefix").(string) - nextHopType := d.Get("next_hop_type").(string) - - armMutexKV.Lock(rtName) - defer armMutexKV.Unlock(rtName) - - properties := network.RoutePropertiesFormat{ - AddressPrefix: &addressPrefix, - NextHopType: network.RouteNextHopType(nextHopType), - } - - if v, ok := d.GetOk("next_hop_in_ip_address"); ok { - nextHopInIpAddress := v.(string) - properties.NextHopIPAddress = &nextHopInIpAddress - } - - route := network.Route{ - Name: &name, - Properties: &properties, - } - - resp, err := routesClient.CreateOrUpdate(resGroup, rtName, name, route) - if err != nil { - return err - } - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Route (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: routeStateRefreshFunc(client, resGroup, rtName, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Route (%s) to become available: %s", name, err) - } - - return resourceArmRouteRead(d, meta) -} - -func resourceArmRouteRead(d *schema.ResourceData, meta interface{}) error { - routesClient := meta.(*ArmClient).routesClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - rtName := id.Path["routeTables"] - routeName := id.Path["routes"] - - resp, err := routesClient.Get(resGroup, rtName, routeName) - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Route %s: %s", routeName, err) - } - - return nil -} - -func resourceArmRouteDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - routesClient := client.routesClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - rtName := id.Path["routeTables"] - routeName := id.Path["routes"] - - armMutexKV.Lock(rtName) - defer armMutexKV.Unlock(rtName) - - _, err = routesClient.Delete(resGroup, rtName, routeName) - - return err -} - -func routeStateRefreshFunc(client *ArmClient, resourceGroupName string, routeTableName string, routeName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.routesClient.Get(resourceGroupName, routeTableName, routeName) - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in routeStateRefreshFunc to Azure ARM for route '%s' (RG: '%s') (NSG: '%s'): %s", routeName, resourceGroupName, routeTableName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} +//import ( +// "fmt" +// "log" +// "net/http" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmRoute() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmRouteCreate, +// Read: resourceArmRouteRead, +// Update: resourceArmRouteCreate, +// Delete: resourceArmRouteDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "route_table_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "next_hop_type": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateRouteTableNextHopType, +// }, +// +// "next_hop_in_ip_address": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// }, +// } +//} +// +//func resourceArmRouteCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// routesClient := client.routesClient +// +// name := d.Get("name").(string) +// rtName := d.Get("route_table_name").(string) +// resGroup := d.Get("resource_group_name").(string) +// +// addressPrefix := d.Get("address_prefix").(string) +// nextHopType := d.Get("next_hop_type").(string) +// +// armMutexKV.Lock(rtName) +// defer armMutexKV.Unlock(rtName) +// +// properties := network.RoutePropertiesFormat{ +// AddressPrefix: &addressPrefix, +// NextHopType: network.RouteNextHopType(nextHopType), +// } +// +// if v, ok := d.GetOk("next_hop_in_ip_address"); ok { +// nextHopInIpAddress := v.(string) +// properties.NextHopIPAddress = &nextHopInIpAddress +// } +// +// route := network.Route{ +// Name: &name, +// Properties: &properties, +// } +// +// resp, err := routesClient.CreateOrUpdate(resGroup, rtName, name, route) +// if err != nil { +// return err +// } +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Route (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: routeStateRefreshFunc(client, resGroup, rtName, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Route (%s) to become available: %s", name, err) +// } +// +// return resourceArmRouteRead(d, meta) +//} +// +//func resourceArmRouteRead(d *schema.ResourceData, meta interface{}) error { +// routesClient := meta.(*ArmClient).routesClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// rtName := id.Path["routeTables"] +// routeName := id.Path["routes"] +// +// resp, err := routesClient.Get(resGroup, rtName, routeName) +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Route %s: %s", routeName, err) +// } +// +// return nil +//} +// +//func resourceArmRouteDelete(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// routesClient := client.routesClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// rtName := id.Path["routeTables"] +// routeName := id.Path["routes"] +// +// armMutexKV.Lock(rtName) +// defer armMutexKV.Unlock(rtName) +// +// _, err = routesClient.Delete(resGroup, rtName, routeName) +// +// return err +//} +// +//func routeStateRefreshFunc(client *ArmClient, resourceGroupName string, routeTableName string, routeName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.routesClient.Get(resourceGroupName, routeTableName, routeName) +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in routeStateRefreshFunc to Azure ARM for route '%s' (RG: '%s') (NSG: '%s'): %s", routeName, resourceGroupName, routeTableName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} diff --git a/builtin/providers/azurerm/resource_arm_route_table.go b/builtin/providers/azurerm/resource_arm_route_table.go index 5e6a663db4..7e67575459 100644 --- a/builtin/providers/azurerm/resource_arm_route_table.go +++ b/builtin/providers/azurerm/resource_arm_route_table.go @@ -1,258 +1,258 @@ package azurerm -import ( - "bytes" - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/hashcode" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmRouteTable() *schema.Resource { - return &schema.Resource{ - Create: resourceArmRouteTableCreate, - Read: resourceArmRouteTableRead, - Update: resourceArmRouteTableCreate, - Delete: resourceArmRouteTableDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "route": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "next_hop_type": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateRouteTableNextHopType, - }, - - "next_hop_in_ip_address": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - }, - }, - Set: resourceArmRouteTableRouteHash, - }, - - "subnets": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmRouteTableCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - routeTablesClient := client.routeTablesClient - - log.Printf("[INFO] preparing arguments for Azure ARM Route Table 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{}) - - routeSet := network.RouteTable{ - Name: &name, - Location: &location, - Tags: expandTags(tags), - } - - if _, ok := d.GetOk("route"); ok { - properties := network.RouteTablePropertiesFormat{} - routes, routeErr := expandAzureRmRouteTableRoutes(d) - if routeErr != nil { - return fmt.Errorf("Error Building list of Route Table Routes: %s", routeErr) - } - if len(routes) > 0 { - routeSet.Properties = &properties - } - - } - - resp, err := routeTablesClient.CreateOrUpdate(resGroup, name, routeSet) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Route Table (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: routeTableStateRefreshFunc(client, resGroup, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting forRoute Table (%s) to become available: %s", name, err) - } - - return resourceArmRouteTableRead(d, meta) -} - -func resourceArmRouteTableRead(d *schema.ResourceData, meta interface{}) error { - routeTablesClient := meta.(*ArmClient).routeTablesClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["routeTables"] - - resp, err := routeTablesClient.Get(resGroup, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Route Table %s: %s", name, err) - } - - if resp.Properties.Subnets != nil { - if len(*resp.Properties.Subnets) > 0 { - subnets := make([]string, 0, len(*resp.Properties.Subnets)) - for _, subnet := range *resp.Properties.Subnets { - id := subnet.ID - subnets = append(subnets, *id) - } - - if err := d.Set("subnets", subnets); err != nil { - return err - } - } - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmRouteTableDelete(d *schema.ResourceData, meta interface{}) error { - routeTablesClient := meta.(*ArmClient).routeTablesClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["routeTables"] - - _, err = routeTablesClient.Delete(resGroup, name) - - return err -} - -func expandAzureRmRouteTableRoutes(d *schema.ResourceData) ([]network.Route, error) { - configs := d.Get("route").(*schema.Set).List() - routes := make([]network.Route, 0, len(configs)) - - for _, configRaw := range configs { - data := configRaw.(map[string]interface{}) - - address_prefix := data["address_prefix"].(string) - next_hop_type := data["next_hop_type"].(string) - - properties := network.RoutePropertiesFormat{ - AddressPrefix: &address_prefix, - NextHopType: network.RouteNextHopType(next_hop_type), - } - - if v := data["next_hop_in_ip_address"].(string); v != "" { - properties.NextHopIPAddress = &v - } - - name := data["name"].(string) - route := network.Route{ - Name: &name, - Properties: &properties, - } - - routes = append(routes, route) - } - - return routes, nil -} - -func routeTableStateRefreshFunc(client *ArmClient, resourceGroupName string, routeTableName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.routeTablesClient.Get(resourceGroupName, routeTableName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in routeTableStateRefreshFunc to Azure ARM for route table '%s' (RG: '%s'): %s", routeTableName, resourceGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} - -func resourceArmRouteTableRouteHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["address_prefix"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["next_hop_type"].(string))) - - return hashcode.String(buf.String()) -} - -func validateRouteTableNextHopType(v interface{}, k string) (ws []string, errors []error) { - value := strings.ToLower(v.(string)) - hopTypes := map[string]bool{ - "virtualnetworkgateway": true, - "vnetlocal": true, - "internet": true, - "virtualappliance": true, - "none": true, - } - - if !hopTypes[value] { - errors = append(errors, fmt.Errorf("Route Table NextHopType Protocol can only be VirtualNetworkGateway, VnetLocal, Internet or VirtualAppliance")) - } - return -} +//import ( +// "bytes" +// "fmt" +// "log" +// "net/http" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/hashcode" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmRouteTable() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmRouteTableCreate, +// Read: resourceArmRouteTableRead, +// Update: resourceArmRouteTableCreate, +// Delete: resourceArmRouteTableDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "route": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "next_hop_type": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateRouteTableNextHopType, +// }, +// +// "next_hop_in_ip_address": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// }, +// }, +// Set: resourceArmRouteTableRouteHash, +// }, +// +// "subnets": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmRouteTableCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// routeTablesClient := client.routeTablesClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM Route Table 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{}) +// +// routeSet := network.RouteTable{ +// Name: &name, +// Location: &location, +// Tags: expandTags(tags), +// } +// +// if _, ok := d.GetOk("route"); ok { +// properties := network.RouteTablePropertiesFormat{} +// routes, routeErr := expandAzureRmRouteTableRoutes(d) +// if routeErr != nil { +// return fmt.Errorf("Error Building list of Route Table Routes: %s", routeErr) +// } +// if len(routes) > 0 { +// routeSet.Properties = &properties +// } +// +// } +// +// resp, err := routeTablesClient.CreateOrUpdate(resGroup, name, routeSet) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Route Table (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: routeTableStateRefreshFunc(client, resGroup, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting forRoute Table (%s) to become available: %s", name, err) +// } +// +// return resourceArmRouteTableRead(d, meta) +//} +// +//func resourceArmRouteTableRead(d *schema.ResourceData, meta interface{}) error { +// routeTablesClient := meta.(*ArmClient).routeTablesClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["routeTables"] +// +// resp, err := routeTablesClient.Get(resGroup, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Route Table %s: %s", name, err) +// } +// +// if resp.Properties.Subnets != nil { +// if len(*resp.Properties.Subnets) > 0 { +// subnets := make([]string, 0, len(*resp.Properties.Subnets)) +// for _, subnet := range *resp.Properties.Subnets { +// id := subnet.ID +// subnets = append(subnets, *id) +// } +// +// if err := d.Set("subnets", subnets); err != nil { +// return err +// } +// } +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmRouteTableDelete(d *schema.ResourceData, meta interface{}) error { +// routeTablesClient := meta.(*ArmClient).routeTablesClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["routeTables"] +// +// _, err = routeTablesClient.Delete(resGroup, name) +// +// return err +//} +// +//func expandAzureRmRouteTableRoutes(d *schema.ResourceData) ([]network.Route, error) { +// configs := d.Get("route").(*schema.Set).List() +// routes := make([]network.Route, 0, len(configs)) +// +// for _, configRaw := range configs { +// data := configRaw.(map[string]interface{}) +// +// address_prefix := data["address_prefix"].(string) +// next_hop_type := data["next_hop_type"].(string) +// +// properties := network.RoutePropertiesFormat{ +// AddressPrefix: &address_prefix, +// NextHopType: network.RouteNextHopType(next_hop_type), +// } +// +// if v := data["next_hop_in_ip_address"].(string); v != "" { +// properties.NextHopIPAddress = &v +// } +// +// name := data["name"].(string) +// route := network.Route{ +// Name: &name, +// Properties: &properties, +// } +// +// routes = append(routes, route) +// } +// +// return routes, nil +//} +// +//func routeTableStateRefreshFunc(client *ArmClient, resourceGroupName string, routeTableName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.routeTablesClient.Get(resourceGroupName, routeTableName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in routeTableStateRefreshFunc to Azure ARM for route table '%s' (RG: '%s'): %s", routeTableName, resourceGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} +// +//func resourceArmRouteTableRouteHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["address_prefix"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["next_hop_type"].(string))) +// +// return hashcode.String(buf.String()) +//} +// +//func validateRouteTableNextHopType(v interface{}, k string) (ws []string, errors []error) { +// value := strings.ToLower(v.(string)) +// hopTypes := map[string]bool{ +// "virtualnetworkgateway": true, +// "vnetlocal": true, +// "internet": true, +// "virtualappliance": true, +// "none": true, +// } +// +// if !hopTypes[value] { +// errors = append(errors, fmt.Errorf("Route Table NextHopType Protocol can only be VirtualNetworkGateway, VnetLocal, Internet or VirtualAppliance")) +// } +// return +//} diff --git a/builtin/providers/azurerm/resource_arm_route_table_test.go b/builtin/providers/azurerm/resource_arm_route_table_test.go index e6d9782463..92b9d01044 100644 --- a/builtin/providers/azurerm/resource_arm_route_table_test.go +++ b/builtin/providers/azurerm/resource_arm_route_table_test.go @@ -1,294 +1,294 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestResourceAzureRMRouteTableNextHopType_validation(t *testing.T) { - cases := []struct { - Value string - ErrCount int - }{ - { - Value: "Random", - ErrCount: 1, - }, - { - Value: "VirtualNetworkGateway", - ErrCount: 0, - }, - { - Value: "VNETLocal", - ErrCount: 0, - }, - { - Value: "Internet", - ErrCount: 0, - }, - { - Value: "VirtualAppliance", - ErrCount: 0, - }, - { - Value: "None", - ErrCount: 0, - }, - { - Value: "VIRTUALNETWORKGATEWAY", - ErrCount: 0, - }, - { - Value: "virtualnetworkgateway", - ErrCount: 0, - }, - } - - for _, tc := range cases { - _, errors := validateRouteTableNextHopType(tc.Value, "azurerm_route_table") - - if len(errors) != tc.ErrCount { - t.Fatalf("Expected the Azure RM Route Table nextHopType to trigger a validation error") - } - } -} - -func TestAccAzureRMRouteTable_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMRouteTable_basic, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMRouteTableDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteTableExists("azurerm_route_table.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMRouteTable_withTags(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMRouteTable_withTags, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMRouteTable_withTagsUpdate, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMRouteTableDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteTableExists("azurerm_route_table.test"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "tags.cost_center", "MSFT"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteTableExists("azurerm_route_table.test"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "tags.environment", "staging"), - ), - }, - }, - }) -} - -func TestAccAzureRMRouteTable_multipleRoutes(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMRouteTable_basic, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMRouteTable_multipleRoutes, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMRouteTableDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteTableExists("azurerm_route_table.test"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "route.#", "1"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteTableExists("azurerm_route_table.test"), - resource.TestCheckResourceAttr( - "azurerm_route_table.test", "route.#", "2"), - ), - }, - }, - }) -} - -func testCheckAzureRMRouteTableExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for route table: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).routeTablesClient - - resp, err := conn.Get(resourceGroup, name, "") - if err != nil { - return fmt.Errorf("Bad: Get on routeTablesClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Route Table %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMRouteTableDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).routeTablesClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_route_table" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Route Table still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMRouteTable_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_route_table" "test" { - name = "acctestrt%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - route { - name = "route1" - address_prefix = "*" - next_hop_type = "internet" - } -} -` - -var testAccAzureRMRouteTable_multipleRoutes = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_route_table" "test" { - name = "acctestrt%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - route { - name = "route1" - address_prefix = "*" - next_hop_type = "internet" - } - - route { - name = "route2" - address_prefix = "*" - next_hop_type = "virtualappliance" - } -} -` - -var testAccAzureRMRouteTable_withTags = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_route_table" "test" { - name = "acctestrt%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - route { - name = "route1" - address_prefix = "*" - next_hop_type = "internet" - } - - tags { - environment = "Production" - cost_center = "MSFT" - } -} -` - -var testAccAzureRMRouteTable_withTagsUpdate = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_route_table" "test" { - name = "acctestrt%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - route { - name = "route1" - address_prefix = "*" - next_hop_type = "internet" - } - - tags { - environment = "staging" - } -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestResourceAzureRMRouteTableNextHopType_validation(t *testing.T) { +// cases := []struct { +// Value string +// ErrCount int +// }{ +// { +// Value: "Random", +// ErrCount: 1, +// }, +// { +// Value: "VirtualNetworkGateway", +// ErrCount: 0, +// }, +// { +// Value: "VNETLocal", +// ErrCount: 0, +// }, +// { +// Value: "Internet", +// ErrCount: 0, +// }, +// { +// Value: "VirtualAppliance", +// ErrCount: 0, +// }, +// { +// Value: "None", +// ErrCount: 0, +// }, +// { +// Value: "VIRTUALNETWORKGATEWAY", +// ErrCount: 0, +// }, +// { +// Value: "virtualnetworkgateway", +// ErrCount: 0, +// }, +// } +// +// for _, tc := range cases { +// _, errors := validateRouteTableNextHopType(tc.Value, "azurerm_route_table") +// +// if len(errors) != tc.ErrCount { +// t.Fatalf("Expected the Azure RM Route Table nextHopType to trigger a validation error") +// } +// } +//} +// +//func TestAccAzureRMRouteTable_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMRouteTable_basic, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMRouteTableDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteTableExists("azurerm_route_table.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMRouteTable_withTags(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMRouteTable_withTags, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMRouteTable_withTagsUpdate, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMRouteTableDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteTableExists("azurerm_route_table.test"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "tags.cost_center", "MSFT"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteTableExists("azurerm_route_table.test"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMRouteTable_multipleRoutes(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMRouteTable_basic, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMRouteTable_multipleRoutes, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMRouteTableDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteTableExists("azurerm_route_table.test"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "route.#", "1"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteTableExists("azurerm_route_table.test"), +// resource.TestCheckResourceAttr( +// "azurerm_route_table.test", "route.#", "2"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMRouteTableExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for route table: %s", name) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).routeTablesClient +// +// resp, err := conn.Get(resourceGroup, name, "") +// if err != nil { +// return fmt.Errorf("Bad: Get on routeTablesClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Route Table %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMRouteTableDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).routeTablesClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_route_table" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, name, "") +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Route Table still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMRouteTable_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_route_table" "test" { +// name = "acctestrt%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// route { +// name = "route1" +// address_prefix = "*" +// next_hop_type = "internet" +// } +//} +//` +// +//var testAccAzureRMRouteTable_multipleRoutes = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_route_table" "test" { +// name = "acctestrt%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// route { +// name = "route1" +// address_prefix = "*" +// next_hop_type = "internet" +// } +// +// route { +// name = "route2" +// address_prefix = "*" +// next_hop_type = "virtualappliance" +// } +//} +//` +// +//var testAccAzureRMRouteTable_withTags = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_route_table" "test" { +// name = "acctestrt%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// route { +// name = "route1" +// address_prefix = "*" +// next_hop_type = "internet" +// } +// +// tags { +// environment = "Production" +// cost_center = "MSFT" +// } +//} +//` +// +//var testAccAzureRMRouteTable_withTagsUpdate = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_route_table" "test" { +// name = "acctestrt%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// route { +// name = "route1" +// address_prefix = "*" +// next_hop_type = "internet" +// } +// +// tags { +// environment = "staging" +// } +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_route_test.go b/builtin/providers/azurerm/resource_arm_route_test.go index 660564ac7c..b98a6302b7 100644 --- a/builtin/providers/azurerm/resource_arm_route_test.go +++ b/builtin/providers/azurerm/resource_arm_route_test.go @@ -1,159 +1,159 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMRoute_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMRoute_basic, ri, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMRouteDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteExists("azurerm_route.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMRoute_multipleRoutes(t *testing.T) { - - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMRoute_basic, ri, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMRoute_multipleRoutes, ri, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMRouteDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteExists("azurerm_route.test"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMRouteExists("azurerm_route.test1"), - ), - }, - }, - }) -} - -func testCheckAzureRMRouteExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - rtName := rs.Primary.Attributes["route_table_name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for route: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).routesClient - - resp, err := conn.Get(resourceGroup, rtName, name) - if err != nil { - return fmt.Errorf("Bad: Get on routesClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Route %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMRouteDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).routesClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_route" { - continue - } - - name := rs.Primary.Attributes["name"] - rtName := rs.Primary.Attributes["route_table_name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, rtName, name) - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Route still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMRoute_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_route_table" "test" { - name = "acctestrt%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_route" "test" { - name = "acctestroute%d" - resource_group_name = "${azurerm_resource_group.test.name}" - route_table_name = "${azurerm_route_table.test.name}" - - address_prefix = "10.1.0.0/16" - next_hop_type = "vnetlocal" -} -` - -var testAccAzureRMRoute_multipleRoutes = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_route_table" "test" { - name = "acctestrt%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_route" "test1" { - name = "acctestroute%d" - resource_group_name = "${azurerm_resource_group.test.name}" - route_table_name = "${azurerm_route_table.test.name}" - - address_prefix = "10.2.0.0/16" - next_hop_type = "none" -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMRoute_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMRoute_basic, ri, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMRouteDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteExists("azurerm_route.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMRoute_multipleRoutes(t *testing.T) { +// +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMRoute_basic, ri, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMRoute_multipleRoutes, ri, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMRouteDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteExists("azurerm_route.test"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMRouteExists("azurerm_route.test1"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMRouteExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// rtName := rs.Primary.Attributes["route_table_name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for route: %s", name) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).routesClient +// +// resp, err := conn.Get(resourceGroup, rtName, name) +// if err != nil { +// return fmt.Errorf("Bad: Get on routesClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Route %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMRouteDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).routesClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_route" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// rtName := rs.Primary.Attributes["route_table_name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, rtName, name) +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Route still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMRoute_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_route_table" "test" { +// name = "acctestrt%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_route" "test" { +// name = "acctestroute%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// route_table_name = "${azurerm_route_table.test.name}" +// +// address_prefix = "10.1.0.0/16" +// next_hop_type = "vnetlocal" +//} +//` +// +//var testAccAzureRMRoute_multipleRoutes = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_route_table" "test" { +// name = "acctestrt%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_route" "test1" { +// name = "acctestroute%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// route_table_name = "${azurerm_route_table.test.name}" +// +// address_prefix = "10.2.0.0/16" +// next_hop_type = "none" +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_storage_account.go b/builtin/providers/azurerm/resource_arm_storage_account.go index 121ebb7c74..059e9165ee 100644 --- a/builtin/providers/azurerm/resource_arm_storage_account.go +++ b/builtin/providers/azurerm/resource_arm_storage_account.go @@ -1,309 +1,309 @@ package azurerm -import ( - "fmt" - "net/http" - "regexp" - "strings" - - "github.com/Azure/azure-sdk-for-go/arm/storage" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmStorageAccount() *schema.Resource { - return &schema.Resource{ - Create: resourceArmStorageAccountCreate, - Read: resourceArmStorageAccountRead, - Update: resourceArmStorageAccountUpdate, - Delete: resourceArmStorageAccountDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validateArmStorageAccountName, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "account_type": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ValidateFunc: validateArmStorageAccountType, - }, - - "primary_location": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "secondary_location": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "primary_blob_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "secondary_blob_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "primary_queue_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "secondary_queue_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "primary_table_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "secondary_table_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - // NOTE: The API does not appear to expose a secondary file endpoint - "primary_file_endpoint": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "primary_access_key": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "secondary_access_key": &schema.Schema{ - Type: schema.TypeString, - Computed: true, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmStorageAccountCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).storageServiceClient - - resourceGroupName := d.Get("resource_group_name").(string) - storageAccountName := d.Get("name").(string) - accountType := d.Get("account_type").(string) - location := d.Get("location").(string) - tags := d.Get("tags").(map[string]interface{}) - - opts := storage.AccountCreateParameters{ - Location: &location, - Properties: &storage.AccountPropertiesCreateParameters{ - AccountType: storage.AccountType(accountType), - }, - Tags: expandTags(tags), - } - - accResp, err := client.Create(resourceGroupName, storageAccountName, opts) - if err != nil { - return fmt.Errorf("Error creating Azure Storage Account '%s': %s", storageAccountName, err) - } - _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response.Response, http.StatusOK) - if err != nil { - return fmt.Errorf("Error creating Azure Storage Account %q: %s", storageAccountName, err) - } - - // The only way to get the ID back apparently is to read the resource again - account, err := client.GetProperties(resourceGroupName, storageAccountName) - if err != nil { - return fmt.Errorf("Error retrieving Azure Storage Account %q: %s", storageAccountName, err) - } - - d.SetId(*account.ID) - - return resourceArmStorageAccountRead(d, meta) -} - -// resourceArmStorageAccountUpdate is unusual in the ARM API where most resources have a combined -// and idempotent operation for CreateOrUpdate. In particular updating all of the parameters -// available requires a call to Update per parameter... -func resourceArmStorageAccountUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).storageServiceClient - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - storageAccountName := id.Path["storageAccounts"] - resourceGroupName := id.ResourceGroup - - d.Partial(true) - - if d.HasChange("account_type") { - accountType := d.Get("account_type").(string) - - opts := storage.AccountUpdateParameters{ - Properties: &storage.AccountPropertiesUpdateParameters{ - AccountType: storage.AccountType(accountType), - }, - } - accResp, err := client.Update(resourceGroupName, storageAccountName, opts) - if err != nil { - return fmt.Errorf("Error updating Azure Storage Account type %q: %s", storageAccountName, err) - } - _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response.Response, http.StatusOK) - if err != nil { - return fmt.Errorf("Error updating Azure Storage Account type %q: %s", storageAccountName, err) - } - - d.SetPartial("account_type") - } - - if d.HasChange("tags") { - tags := d.Get("tags").(map[string]interface{}) - - opts := storage.AccountUpdateParameters{ - Tags: expandTags(tags), - } - accResp, err := client.Update(resourceGroupName, storageAccountName, opts) - if err != nil { - return fmt.Errorf("Error updating Azure Storage Account tags %q: %s", storageAccountName, err) - } - _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response.Response, http.StatusOK) - if err != nil { - return fmt.Errorf("Error updating Azure Storage Account tags %q: %s", storageAccountName, err) - } - - d.SetPartial("tags") - } - - d.Partial(false) - return nil -} - -func resourceArmStorageAccountRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).storageServiceClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - name := id.Path["storageAccounts"] - resGroup := id.ResourceGroup - - resp, err := client.GetProperties(resGroup, name) - if err != nil { - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - - return fmt.Errorf("Error reading the state of AzureRM Storage Account %q: %s", name, err) - } - - keys, err := client.ListKeys(resGroup, name) - if err != nil { - return err - } - - d.Set("primary_access_key", keys.Key1) - d.Set("secondary_access_key", keys.Key2) - d.Set("location", resp.Location) - d.Set("account_type", resp.Properties.AccountType) - d.Set("primary_location", resp.Properties.PrimaryLocation) - d.Set("secondary_location", resp.Properties.SecondaryLocation) - - if resp.Properties.PrimaryEndpoints != nil { - d.Set("primary_blob_endpoint", resp.Properties.PrimaryEndpoints.Blob) - d.Set("primary_queue_endpoint", resp.Properties.PrimaryEndpoints.Queue) - d.Set("primary_table_endpoint", resp.Properties.PrimaryEndpoints.Table) - d.Set("primary_file_endpoint", resp.Properties.PrimaryEndpoints.File) - } - - if resp.Properties.SecondaryEndpoints != nil { - if resp.Properties.SecondaryEndpoints.Blob != nil { - d.Set("secondary_blob_endpoint", resp.Properties.SecondaryEndpoints.Blob) - } else { - d.Set("secondary_blob_endpoint", "") - } - if resp.Properties.SecondaryEndpoints.Queue != nil { - d.Set("secondary_queue_endpoint", resp.Properties.SecondaryEndpoints.Queue) - } else { - d.Set("secondary_queue_endpoint", "") - } - if resp.Properties.SecondaryEndpoints.Table != nil { - d.Set("secondary_table_endpoint", resp.Properties.SecondaryEndpoints.Table) - } else { - d.Set("secondary_table_endpoint", "") - } - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmStorageAccountDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient).storageServiceClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - name := id.Path["storageAccounts"] - resGroup := id.ResourceGroup - - accResp, err := client.Delete(resGroup, name) - if err != nil { - return fmt.Errorf("Error issuing AzureRM delete request for storage account %q: %s", name, err) - } - _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response, http.StatusNotFound) - if err != nil { - return fmt.Errorf("Error polling for AzureRM delete request for storage account %q: %s", name, err) - } - - return nil -} - -func validateArmStorageAccountName(v interface{}, k string) (ws []string, es []error) { - input := v.(string) - - if !regexp.MustCompile(`\A([a-z0-9]{3,24})\z`).MatchString(input) { - es = append(es, fmt.Errorf("name can only consist of lowercase letters and numbers, and must be between 3 and 24 characters long")) - } - - return -} - -func validateArmStorageAccountType(v interface{}, k string) (ws []string, es []error) { - validAccountTypes := []string{"standard_lrs", "standard_zrs", - "standard_grs", "standard_ragrs", "premium_lrs"} - - input := strings.ToLower(v.(string)) - - for _, valid := range validAccountTypes { - if valid == input { - return - } - } - - es = append(es, fmt.Errorf("Invalid storage account type %q", input)) - return -} +//import ( +// "fmt" +// "net/http" +// "regexp" +// "strings" +// +// "github.com/Azure/azure-sdk-for-go/arm/storage" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmStorageAccount() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmStorageAccountCreate, +// Read: resourceArmStorageAccountRead, +// Update: resourceArmStorageAccountUpdate, +// Delete: resourceArmStorageAccountDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// ValidateFunc: validateArmStorageAccountName, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "account_type": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ValidateFunc: validateArmStorageAccountType, +// }, +// +// "primary_location": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "secondary_location": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "primary_blob_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "secondary_blob_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "primary_queue_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "secondary_queue_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "primary_table_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "secondary_table_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// // NOTE: The API does not appear to expose a secondary file endpoint +// "primary_file_endpoint": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "primary_access_key": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "secondary_access_key": &schema.Schema{ +// Type: schema.TypeString, +// Computed: true, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmStorageAccountCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient).storageServiceClient +// +// resourceGroupName := d.Get("resource_group_name").(string) +// storageAccountName := d.Get("name").(string) +// accountType := d.Get("account_type").(string) +// location := d.Get("location").(string) +// tags := d.Get("tags").(map[string]interface{}) +// +// opts := storage.AccountCreateParameters{ +// Location: &location, +// Properties: &storage.AccountPropertiesCreateParameters{ +// AccountType: storage.AccountType(accountType), +// }, +// Tags: expandTags(tags), +// } +// +// accResp, err := client.Create(resourceGroupName, storageAccountName, opts) +// if err != nil { +// return fmt.Errorf("Error creating Azure Storage Account '%s': %s", storageAccountName, err) +// } +// _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response.Response, http.StatusOK) +// if err != nil { +// return fmt.Errorf("Error creating Azure Storage Account %q: %s", storageAccountName, err) +// } +// +// // The only way to get the ID back apparently is to read the resource again +// account, err := client.GetProperties(resourceGroupName, storageAccountName) +// if err != nil { +// return fmt.Errorf("Error retrieving Azure Storage Account %q: %s", storageAccountName, err) +// } +// +// d.SetId(*account.ID) +// +// return resourceArmStorageAccountRead(d, meta) +//} +// +//// resourceArmStorageAccountUpdate is unusual in the ARM API where most resources have a combined +//// and idempotent operation for CreateOrUpdate. In particular updating all of the parameters +//// available requires a call to Update per parameter... +//func resourceArmStorageAccountUpdate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient).storageServiceClient +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// storageAccountName := id.Path["storageAccounts"] +// resourceGroupName := id.ResourceGroup +// +// d.Partial(true) +// +// if d.HasChange("account_type") { +// accountType := d.Get("account_type").(string) +// +// opts := storage.AccountUpdateParameters{ +// Properties: &storage.AccountPropertiesUpdateParameters{ +// AccountType: storage.AccountType(accountType), +// }, +// } +// accResp, err := client.Update(resourceGroupName, storageAccountName, opts) +// if err != nil { +// return fmt.Errorf("Error updating Azure Storage Account type %q: %s", storageAccountName, err) +// } +// _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response.Response, http.StatusOK) +// if err != nil { +// return fmt.Errorf("Error updating Azure Storage Account type %q: %s", storageAccountName, err) +// } +// +// d.SetPartial("account_type") +// } +// +// if d.HasChange("tags") { +// tags := d.Get("tags").(map[string]interface{}) +// +// opts := storage.AccountUpdateParameters{ +// Tags: expandTags(tags), +// } +// accResp, err := client.Update(resourceGroupName, storageAccountName, opts) +// if err != nil { +// return fmt.Errorf("Error updating Azure Storage Account tags %q: %s", storageAccountName, err) +// } +// _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response.Response, http.StatusOK) +// if err != nil { +// return fmt.Errorf("Error updating Azure Storage Account tags %q: %s", storageAccountName, err) +// } +// +// d.SetPartial("tags") +// } +// +// d.Partial(false) +// return nil +//} +// +//func resourceArmStorageAccountRead(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient).storageServiceClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// name := id.Path["storageAccounts"] +// resGroup := id.ResourceGroup +// +// resp, err := client.GetProperties(resGroup, name) +// if err != nil { +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// +// return fmt.Errorf("Error reading the state of AzureRM Storage Account %q: %s", name, err) +// } +// +// keys, err := client.ListKeys(resGroup, name) +// if err != nil { +// return err +// } +// +// d.Set("primary_access_key", keys.Key1) +// d.Set("secondary_access_key", keys.Key2) +// d.Set("location", resp.Location) +// d.Set("account_type", resp.Properties.AccountType) +// d.Set("primary_location", resp.Properties.PrimaryLocation) +// d.Set("secondary_location", resp.Properties.SecondaryLocation) +// +// if resp.Properties.PrimaryEndpoints != nil { +// d.Set("primary_blob_endpoint", resp.Properties.PrimaryEndpoints.Blob) +// d.Set("primary_queue_endpoint", resp.Properties.PrimaryEndpoints.Queue) +// d.Set("primary_table_endpoint", resp.Properties.PrimaryEndpoints.Table) +// d.Set("primary_file_endpoint", resp.Properties.PrimaryEndpoints.File) +// } +// +// if resp.Properties.SecondaryEndpoints != nil { +// if resp.Properties.SecondaryEndpoints.Blob != nil { +// d.Set("secondary_blob_endpoint", resp.Properties.SecondaryEndpoints.Blob) +// } else { +// d.Set("secondary_blob_endpoint", "") +// } +// if resp.Properties.SecondaryEndpoints.Queue != nil { +// d.Set("secondary_queue_endpoint", resp.Properties.SecondaryEndpoints.Queue) +// } else { +// d.Set("secondary_queue_endpoint", "") +// } +// if resp.Properties.SecondaryEndpoints.Table != nil { +// d.Set("secondary_table_endpoint", resp.Properties.SecondaryEndpoints.Table) +// } else { +// d.Set("secondary_table_endpoint", "") +// } +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmStorageAccountDelete(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient).storageServiceClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// name := id.Path["storageAccounts"] +// resGroup := id.ResourceGroup +// +// accResp, err := client.Delete(resGroup, name) +// if err != nil { +// return fmt.Errorf("Error issuing AzureRM delete request for storage account %q: %s", name, err) +// } +// _, err = pollIndefinitelyAsNeeded(client.Client, accResp.Response, http.StatusNotFound) +// if err != nil { +// return fmt.Errorf("Error polling for AzureRM delete request for storage account %q: %s", name, err) +// } +// +// return nil +//} +// +//func validateArmStorageAccountName(v interface{}, k string) (ws []string, es []error) { +// input := v.(string) +// +// if !regexp.MustCompile(`\A([a-z0-9]{3,24})\z`).MatchString(input) { +// es = append(es, fmt.Errorf("name can only consist of lowercase letters and numbers, and must be between 3 and 24 characters long")) +// } +// +// return +//} +// +//func validateArmStorageAccountType(v interface{}, k string) (ws []string, es []error) { +// validAccountTypes := []string{"standard_lrs", "standard_zrs", +// "standard_grs", "standard_ragrs", "premium_lrs"} +// +// input := strings.ToLower(v.(string)) +// +// for _, valid := range validAccountTypes { +// if valid == input { +// return +// } +// } +// +// es = append(es, fmt.Errorf("Invalid storage account type %q", input)) +// return +//} diff --git a/builtin/providers/azurerm/resource_arm_storage_account_test.go b/builtin/providers/azurerm/resource_arm_storage_account_test.go index 6cad5a1f50..9bcc694f28 100644 --- a/builtin/providers/azurerm/resource_arm_storage_account_test.go +++ b/builtin/providers/azurerm/resource_arm_storage_account_test.go @@ -1,166 +1,166 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestValidateArmStorageAccountType(t *testing.T) { - testCases := []struct { - input string - shouldError bool - }{ - {"standard_lrs", false}, - {"invalid", true}, - } - - for _, test := range testCases { - _, es := validateArmStorageAccountType(test.input, "account_type") - - if test.shouldError && len(es) == 0 { - t.Fatalf("Expected validating account_type %q to fail", test.input) - } - } -} - -func TestValidateArmStorageAccountName(t *testing.T) { - testCases := []struct { - input string - shouldError bool - }{ - {"ab", true}, - {"ABC", true}, - {"abc", false}, - {"123456789012345678901234", false}, - {"1234567890123456789012345", true}, - {"abc12345", false}, - } - - for _, test := range testCases { - _, es := validateArmStorageAccountName(test.input, "name") - - if test.shouldError && len(es) == 0 { - t.Fatalf("Expected validating name %q to fail", test.input) - } - } -} - -func TestAccAzureRMStorageAccount_basic(t *testing.T) { - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMStorageAccountDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccAzureRMStorageAccount_basic, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMStorageAccountExists("azurerm_storage_account.testsa"), - resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "account_type", "Standard_LRS"), - resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.#", "1"), - resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.environment", "production"), - ), - }, - - resource.TestStep{ - Config: testAccAzureRMStorageAccount_update, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMStorageAccountExists("azurerm_storage_account.testsa"), - resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "account_type", "Standard_GRS"), - resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.#", "1"), - resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.environment", "staging"), - ), - }, - }, - }) -} - -func testCheckAzureRMStorageAccountExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - storageAccount := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - // Ensure resource group exists in API - conn := testAccProvider.Meta().(*ArmClient).storageServiceClient - - resp, err := conn.GetProperties(resourceGroup, storageAccount) - if err != nil { - return fmt.Errorf("Bad: Get on storageServiceClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: StorageAccount %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMStorageAccountDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).storageServiceClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_storage_account" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.GetProperties(resourceGroup, name) - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Storage Account still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMStorageAccount_basic = ` -resource "azurerm_resource_group" "testrg" { - name = "testAccAzureRMStorageAccountBasic" - location = "westus" -} - -resource "azurerm_storage_account" "testsa" { - name = "unlikely23exst2acct1435" - resource_group_name = "${azurerm_resource_group.testrg.name}" - - location = "westus" - account_type = "Standard_LRS" - - tags { - environment = "production" - } -}` - -var testAccAzureRMStorageAccount_update = ` -resource "azurerm_resource_group" "testrg" { - name = "testAccAzureRMStorageAccountBasic" - location = "westus" -} - -resource "azurerm_storage_account" "testsa" { - name = "unlikely23exst2acct1435" - resource_group_name = "${azurerm_resource_group.testrg.name}" - - location = "westus" - account_type = "Standard_GRS" - - tags { - environment = "staging" - } -}` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestValidateArmStorageAccountType(t *testing.T) { +// testCases := []struct { +// input string +// shouldError bool +// }{ +// {"standard_lrs", false}, +// {"invalid", true}, +// } +// +// for _, test := range testCases { +// _, es := validateArmStorageAccountType(test.input, "account_type") +// +// if test.shouldError && len(es) == 0 { +// t.Fatalf("Expected validating account_type %q to fail", test.input) +// } +// } +//} +// +//func TestValidateArmStorageAccountName(t *testing.T) { +// testCases := []struct { +// input string +// shouldError bool +// }{ +// {"ab", true}, +// {"ABC", true}, +// {"abc", false}, +// {"123456789012345678901234", false}, +// {"1234567890123456789012345", true}, +// {"abc12345", false}, +// } +// +// for _, test := range testCases { +// _, es := validateArmStorageAccountName(test.input, "name") +// +// if test.shouldError && len(es) == 0 { +// t.Fatalf("Expected validating name %q to fail", test.input) +// } +// } +//} +// +//func TestAccAzureRMStorageAccount_basic(t *testing.T) { +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMStorageAccountDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccAzureRMStorageAccount_basic, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMStorageAccountExists("azurerm_storage_account.testsa"), +// resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "account_type", "Standard_LRS"), +// resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.#", "1"), +// resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.environment", "production"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccAzureRMStorageAccount_update, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMStorageAccountExists("azurerm_storage_account.testsa"), +// resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "account_type", "Standard_GRS"), +// resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.#", "1"), +// resource.TestCheckResourceAttr("azurerm_storage_account.testsa", "tags.environment", "staging"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMStorageAccountExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// storageAccount := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// // Ensure resource group exists in API +// conn := testAccProvider.Meta().(*ArmClient).storageServiceClient +// +// resp, err := conn.GetProperties(resourceGroup, storageAccount) +// if err != nil { +// return fmt.Errorf("Bad: Get on storageServiceClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: StorageAccount %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMStorageAccountDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).storageServiceClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_storage_account" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.GetProperties(resourceGroup, name) +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Storage Account still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMStorageAccount_basic = ` +//resource "azurerm_resource_group" "testrg" { +// name = "testAccAzureRMStorageAccountBasic" +// location = "westus" +//} +// +//resource "azurerm_storage_account" "testsa" { +// name = "unlikely23exst2acct1435" +// resource_group_name = "${azurerm_resource_group.testrg.name}" +// +// location = "westus" +// account_type = "Standard_LRS" +// +// tags { +// environment = "production" +// } +//}` +// +//var testAccAzureRMStorageAccount_update = ` +//resource "azurerm_resource_group" "testrg" { +// name = "testAccAzureRMStorageAccountBasic" +// location = "westus" +//} +// +//resource "azurerm_storage_account" "testsa" { +// name = "unlikely23exst2acct1435" +// resource_group_name = "${azurerm_resource_group.testrg.name}" +// +// location = "westus" +// account_type = "Standard_GRS" +// +// tags { +// environment = "staging" +// } +//}` diff --git a/builtin/providers/azurerm/resource_arm_storage_blob.go b/builtin/providers/azurerm/resource_arm_storage_blob.go index 9889f4398a..83f3c83822 100644 --- a/builtin/providers/azurerm/resource_arm_storage_blob.go +++ b/builtin/providers/azurerm/resource_arm_storage_blob.go @@ -16,12 +16,12 @@ func resourceArmStorageBlob() *schema.Resource { Delete: resourceArmStorageBlobDelete, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "resource_group_name": &schema.Schema{ + "resource_group_name": { Type: schema.TypeString, Required: true, ForceNew: true, @@ -31,25 +31,25 @@ func resourceArmStorageBlob() *schema.Resource { Required: true, ForceNew: true, }, - "storage_container_name": &schema.Schema{ + "storage_container_name": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "type": &schema.Schema{ + "type": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validateArmStorageBlobType, }, - "size": &schema.Schema{ + "size": { Type: schema.TypeInt, Optional: true, ForceNew: true, Default: 0, ValidateFunc: validateArmStorageBlobSize, }, - "url": &schema.Schema{ + "url": { Type: schema.TypeString, Computed: true, }, @@ -204,7 +204,7 @@ func resourceArmStorageBlobDelete(d *schema.ResourceData, meta interface{}) erro storageContainerName := d.Get("storage_container_name").(string) log.Printf("[INFO] Deleting storage blob %q", name) - if _, err = blobClient.DeleteBlobIfExists(storageContainerName, name); err != nil { + if _, err = blobClient.DeleteBlobIfExists(storageContainerName, name, map[string]string{}); err != nil { return fmt.Errorf("Error deleting storage blob %q: %s", name, err) } diff --git a/builtin/providers/azurerm/resource_arm_storage_container.go b/builtin/providers/azurerm/resource_arm_storage_container.go index 1e6591e308..1b3c3bd9b2 100644 --- a/builtin/providers/azurerm/resource_arm_storage_container.go +++ b/builtin/providers/azurerm/resource_arm_storage_container.go @@ -1,227 +1,227 @@ package azurerm -import ( - "fmt" - "log" - "strings" - - "regexp" - - "github.com/Azure/azure-sdk-for-go/storage" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmStorageContainer() *schema.Resource { - return &schema.Resource{ - Create: resourceArmStorageContainerCreate, - Read: resourceArmStorageContainerRead, - Exists: resourceArmStorageContainerExists, - Delete: resourceArmStorageContainerDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validateArmStorageContainerName, - }, - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - "storage_account_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - "container_access_type": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ForceNew: true, - Default: "private", - ValidateFunc: validateArmStorageContainerAccessType, - }, - "properties": &schema.Schema{ - Type: schema.TypeMap, - Computed: true, - }, - }, - } -} - -//Following the naming convention as laid out in the docs -func validateArmStorageContainerName(v interface{}, k string) (ws []string, errors []error) { - value := v.(string) - if !regexp.MustCompile(`^[0-9a-z-]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "only lowercase alphanumeric characters and hyphens allowed in %q: %q", - k, value)) - } - if len(value) < 3 || len(value) > 63 { - errors = append(errors, fmt.Errorf( - "%q must be between 3 and 63 characters: %q", k, value)) - } - if regexp.MustCompile(`^-`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q cannot begin with a hyphen: %q", k, value)) - } - return -} - -func validateArmStorageContainerAccessType(v interface{}, k string) (ws []string, errors []error) { - value := strings.ToLower(v.(string)) - validTypes := map[string]struct{}{ - "private": struct{}{}, - "blob": struct{}{}, - "container": struct{}{}, - } - - if _, ok := validTypes[value]; !ok { - errors = append(errors, fmt.Errorf("Storage container access type %q is invalid, must be %q, %q or %q", value, "private", "blob", "page")) - } - return -} - -func resourceArmStorageContainerCreate(d *schema.ResourceData, meta interface{}) error { - armClient := meta.(*ArmClient) - - resourceGroupName := d.Get("resource_group_name").(string) - storageAccountName := d.Get("storage_account_name").(string) - - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) - if err != nil { - return err - } - if !accountExists { - return fmt.Errorf("Storage Account %q Not Found", storageAccountName) - } - - name := d.Get("name").(string) - - var accessType storage.ContainerAccessType - if d.Get("container_access_type").(string) == "private" { - accessType = storage.ContainerAccessType("") - } else { - accessType = storage.ContainerAccessType(d.Get("container_access_type").(string)) - } - - log.Printf("[INFO] Creating container %q in storage account %q.", name, storageAccountName) - _, err = blobClient.CreateContainerIfNotExists(name, accessType) - if err != nil { - return fmt.Errorf("Error creating container %q in storage account %q: %s", name, storageAccountName, err) - } - - d.SetId(name) - return resourceArmStorageContainerRead(d, meta) -} - -// resourceAzureStorageContainerRead does all the necessary API calls to -// read the status of the storage container off Azure. -func resourceArmStorageContainerRead(d *schema.ResourceData, meta interface{}) error { - armClient := meta.(*ArmClient) - - resourceGroupName := d.Get("resource_group_name").(string) - storageAccountName := d.Get("storage_account_name").(string) - - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) - if err != nil { - return err - } - if !accountExists { - log.Printf("[DEBUG] Storage account %q not found, removing container %q from state", storageAccountName, d.Id()) - d.SetId("") - return nil - } - - name := d.Get("name").(string) - containers, err := blobClient.ListContainers(storage.ListContainersParameters{ - Prefix: name, - Timeout: 90, - }) - if err != nil { - return fmt.Errorf("Failed to retrieve storage containers in account %q: %s", name, err) - } - - var found bool - for _, cont := range containers.Containers { - if cont.Name == name { - found = true - - props := make(map[string]interface{}) - props["last_modified"] = cont.Properties.LastModified - props["lease_status"] = cont.Properties.LeaseStatus - props["lease_state"] = cont.Properties.LeaseState - props["lease_duration"] = cont.Properties.LeaseDuration - - d.Set("properties", props) - } - } - - if !found { - log.Printf("[INFO] Storage container %q does not exist in account %q, removing from state...", name, storageAccountName) - d.SetId("") - } - - return nil -} - -func resourceArmStorageContainerExists(d *schema.ResourceData, meta interface{}) (bool, error) { - armClient := meta.(*ArmClient) - - resourceGroupName := d.Get("resource_group_name").(string) - storageAccountName := d.Get("storage_account_name").(string) - - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) - if err != nil { - return false, err - } - if !accountExists { - log.Printf("[DEBUG] Storage account %q not found, removing container %q from state", storageAccountName, d.Id()) - d.SetId("") - return false, nil - } - - name := d.Get("name").(string) - - log.Printf("[INFO] Checking existence of storage container %q in storage account %q", name, storageAccountName) - exists, err := blobClient.ContainerExists(name) - if err != nil { - return false, fmt.Errorf("Error querying existence of storage container %q in storage account %q: %s", name, storageAccountName, err) - } - - if !exists { - log.Printf("[INFO] Storage container %q does not exist in account %q, removing from state...", name, storageAccountName) - d.SetId("") - } - - return exists, nil -} - -// resourceAzureStorageContainerDelete does all the necessary API calls to -// delete a storage container off Azure. -func resourceArmStorageContainerDelete(d *schema.ResourceData, meta interface{}) error { - armClient := meta.(*ArmClient) - - resourceGroupName := d.Get("resource_group_name").(string) - storageAccountName := d.Get("storage_account_name").(string) - - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) - if err != nil { - return err - } - if !accountExists { - log.Printf("[INFO]Storage Account %q doesn't exist so the container won't exist", storageAccountName) - return nil - } - - name := d.Get("name").(string) - - log.Printf("[INFO] Deleting storage container %q in account %q", name, storageAccountName) - if _, err := blobClient.DeleteContainerIfExists(name); err != nil { - return fmt.Errorf("Error deleting storage container %q from storage account %q: %s", name, storageAccountName, err) - } - - d.SetId("") - return nil -} +//import ( +// "fmt" +// "log" +// "strings" +// +// "regexp" +// +// "github.com/Azure/azure-sdk-for-go/storage" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmStorageContainer() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmStorageContainerCreate, +// Read: resourceArmStorageContainerRead, +// Exists: resourceArmStorageContainerExists, +// Delete: resourceArmStorageContainerDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// ValidateFunc: validateArmStorageContainerName, +// }, +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// "storage_account_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// "container_access_type": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// ForceNew: true, +// Default: "private", +// ValidateFunc: validateArmStorageContainerAccessType, +// }, +// "properties": &schema.Schema{ +// Type: schema.TypeMap, +// Computed: true, +// }, +// }, +// } +//} +// +////Following the naming convention as laid out in the docs +//func validateArmStorageContainerName(v interface{}, k string) (ws []string, errors []error) { +// value := v.(string) +// if !regexp.MustCompile(`^[0-9a-z-]+$`).MatchString(value) { +// errors = append(errors, fmt.Errorf( +// "only lowercase alphanumeric characters and hyphens allowed in %q: %q", +// k, value)) +// } +// if len(value) < 3 || len(value) > 63 { +// errors = append(errors, fmt.Errorf( +// "%q must be between 3 and 63 characters: %q", k, value)) +// } +// if regexp.MustCompile(`^-`).MatchString(value) { +// errors = append(errors, fmt.Errorf( +// "%q cannot begin with a hyphen: %q", k, value)) +// } +// return +//} +// +//func validateArmStorageContainerAccessType(v interface{}, k string) (ws []string, errors []error) { +// value := strings.ToLower(v.(string)) +// validTypes := map[string]struct{}{ +// "private": struct{}{}, +// "blob": struct{}{}, +// "container": struct{}{}, +// } +// +// if _, ok := validTypes[value]; !ok { +// errors = append(errors, fmt.Errorf("Storage container access type %q is invalid, must be %q, %q or %q", value, "private", "blob", "page")) +// } +// return +//} +// +//func resourceArmStorageContainerCreate(d *schema.ResourceData, meta interface{}) error { +// armClient := meta.(*ArmClient) +// +// resourceGroupName := d.Get("resource_group_name").(string) +// storageAccountName := d.Get("storage_account_name").(string) +// +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) +// if err != nil { +// return err +// } +// if !accountExists { +// return fmt.Errorf("Storage Account %q Not Found", storageAccountName) +// } +// +// name := d.Get("name").(string) +// +// var accessType storage.ContainerAccessType +// if d.Get("container_access_type").(string) == "private" { +// accessType = storage.ContainerAccessType("") +// } else { +// accessType = storage.ContainerAccessType(d.Get("container_access_type").(string)) +// } +// +// log.Printf("[INFO] Creating container %q in storage account %q.", name, storageAccountName) +// _, err = blobClient.CreateContainerIfNotExists(name, accessType) +// if err != nil { +// return fmt.Errorf("Error creating container %q in storage account %q: %s", name, storageAccountName, err) +// } +// +// d.SetId(name) +// return resourceArmStorageContainerRead(d, meta) +//} +// +//// resourceAzureStorageContainerRead does all the necessary API calls to +//// read the status of the storage container off Azure. +//func resourceArmStorageContainerRead(d *schema.ResourceData, meta interface{}) error { +// armClient := meta.(*ArmClient) +// +// resourceGroupName := d.Get("resource_group_name").(string) +// storageAccountName := d.Get("storage_account_name").(string) +// +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) +// if err != nil { +// return err +// } +// if !accountExists { +// log.Printf("[DEBUG] Storage account %q not found, removing container %q from state", storageAccountName, d.Id()) +// d.SetId("") +// return nil +// } +// +// name := d.Get("name").(string) +// containers, err := blobClient.ListContainers(storage.ListContainersParameters{ +// Prefix: name, +// Timeout: 90, +// }) +// if err != nil { +// return fmt.Errorf("Failed to retrieve storage containers in account %q: %s", name, err) +// } +// +// var found bool +// for _, cont := range containers.Containers { +// if cont.Name == name { +// found = true +// +// props := make(map[string]interface{}) +// props["last_modified"] = cont.Properties.LastModified +// props["lease_status"] = cont.Properties.LeaseStatus +// props["lease_state"] = cont.Properties.LeaseState +// props["lease_duration"] = cont.Properties.LeaseDuration +// +// d.Set("properties", props) +// } +// } +// +// if !found { +// log.Printf("[INFO] Storage container %q does not exist in account %q, removing from state...", name, storageAccountName) +// d.SetId("") +// } +// +// return nil +//} +// +//func resourceArmStorageContainerExists(d *schema.ResourceData, meta interface{}) (bool, error) { +// armClient := meta.(*ArmClient) +// +// resourceGroupName := d.Get("resource_group_name").(string) +// storageAccountName := d.Get("storage_account_name").(string) +// +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) +// if err != nil { +// return false, err +// } +// if !accountExists { +// log.Printf("[DEBUG] Storage account %q not found, removing container %q from state", storageAccountName, d.Id()) +// d.SetId("") +// return false, nil +// } +// +// name := d.Get("name").(string) +// +// log.Printf("[INFO] Checking existence of storage container %q in storage account %q", name, storageAccountName) +// exists, err := blobClient.ContainerExists(name) +// if err != nil { +// return false, fmt.Errorf("Error querying existence of storage container %q in storage account %q: %s", name, storageAccountName, err) +// } +// +// if !exists { +// log.Printf("[INFO] Storage container %q does not exist in account %q, removing from state...", name, storageAccountName) +// d.SetId("") +// } +// +// return exists, nil +//} +// +//// resourceAzureStorageContainerDelete does all the necessary API calls to +//// delete a storage container off Azure. +//func resourceArmStorageContainerDelete(d *schema.ResourceData, meta interface{}) error { +// armClient := meta.(*ArmClient) +// +// resourceGroupName := d.Get("resource_group_name").(string) +// storageAccountName := d.Get("storage_account_name").(string) +// +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName) +// if err != nil { +// return err +// } +// if !accountExists { +// log.Printf("[INFO]Storage Account %q doesn't exist so the container won't exist", storageAccountName) +// return nil +// } +// +// name := d.Get("name").(string) +// +// log.Printf("[INFO] Deleting storage container %q in account %q", name, storageAccountName) +// if _, err := blobClient.DeleteContainerIfExists(name); err != nil { +// return fmt.Errorf("Error deleting storage container %q from storage account %q: %s", name, storageAccountName, err) +// } +// +// d.SetId("") +// return nil +//} diff --git a/builtin/providers/azurerm/resource_arm_storage_container_test.go b/builtin/providers/azurerm/resource_arm_storage_container_test.go index 68dcdd60c6..17e29a258c 100644 --- a/builtin/providers/azurerm/resource_arm_storage_container_test.go +++ b/builtin/providers/azurerm/resource_arm_storage_container_test.go @@ -1,241 +1,241 @@ package azurerm -import ( - "fmt" - "log" - "strings" - "testing" - - "github.com/Azure/azure-sdk-for-go/storage" - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMStorageContainer_basic(t *testing.T) { - var c storage.Container - - ri := acctest.RandInt() - rs := strings.ToLower(acctest.RandString(11)) - config := fmt.Sprintf(testAccAzureRMStorageContainer_basic, ri, rs) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMStorageContainerDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMStorageContainerExists("azurerm_storage_container.test", &c), - ), - }, - }, - }) -} - -func TestAccAzureRMStorageContainer_disappears(t *testing.T) { - var c storage.Container - - ri := acctest.RandInt() - rs := strings.ToLower(acctest.RandString(11)) - config := fmt.Sprintf(testAccAzureRMStorageContainer_basic, ri, rs) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMStorageContainerDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMStorageContainerExists("azurerm_storage_container.test", &c), - testAccARMStorageContainerDisappears("azurerm_storage_container.test", &c), - ), - ExpectNonEmptyPlan: true, - }, - }, - }) -} - -func testCheckAzureRMStorageContainerExists(name string, c *storage.Container) resource.TestCheckFunc { - return func(s *terraform.State) error { - - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - storageAccountName := rs.Primary.Attributes["storage_account_name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for storage container: %s", name) - } - - armClient := testAccProvider.Meta().(*ArmClient) - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) - if err != nil { - return err - } - if !accountExists { - return fmt.Errorf("Bad: Storage Account %q does not exist", storageAccountName) - } - - containers, err := blobClient.ListContainers(storage.ListContainersParameters{ - Prefix: name, - Timeout: 90, - }) - - if len(containers.Containers) == 0 { - return fmt.Errorf("Bad: Storage Container %q (storage account: %q) does not exist", name, storageAccountName) - } - - var found bool - for _, container := range containers.Containers { - if container.Name == name { - found = true - *c = container - } - } - - if !found { - return fmt.Errorf("Bad: Storage Container %q (storage account: %q) does not exist", name, storageAccountName) - } - - return nil - } -} - -func testAccARMStorageContainerDisappears(name string, c *storage.Container) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - armClient := testAccProvider.Meta().(*ArmClient) - - storageAccountName := rs.Primary.Attributes["storage_account_name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for storage container: %s", c.Name) - } - - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) - if err != nil { - return err - } - if !accountExists { - log.Printf("[INFO]Storage Account %q doesn't exist so the container won't exist", storageAccountName) - return nil - } - - _, err = blobClient.DeleteContainerIfExists(c.Name) - if err != nil { - return err - } - - return nil - } -} - -func testCheckAzureRMStorageContainerDestroy(s *terraform.State) error { - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_storage_container" { - continue - } - - name := rs.Primary.Attributes["name"] - storageAccountName := rs.Primary.Attributes["storage_account_name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for storage container: %s", name) - } - - armClient := testAccProvider.Meta().(*ArmClient) - blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) - if err != nil { - //If we can't get keys then the blob can't exist - return nil - } - if !accountExists { - return nil - } - - containers, err := blobClient.ListContainers(storage.ListContainersParameters{ - Prefix: name, - Timeout: 90, - }) - - if err != nil { - return nil - } - - var found bool - for _, container := range containers.Containers { - if container.Name == name { - found = true - } - } - - if found { - return fmt.Errorf("Bad: Storage Container %q (storage account: %q) still exist", name, storageAccountName) - } - } - - return nil -} - -func TestValidateArmStorageContainerName(t *testing.T) { - validNames := []string{ - "valid-name", - "valid02-name", - } - for _, v := range validNames { - _, errors := validateArmStorageContainerName(v, "name") - if len(errors) != 0 { - t.Fatalf("%q should be a valid Storage Container Name: %q", v, errors) - } - } - - invalidNames := []string{ - "InvalidName1", - "-invalidname1", - "invalid_name", - "invalid!", - "ww", - strings.Repeat("w", 65), - } - for _, v := range invalidNames { - _, errors := validateArmStorageContainerName(v, "name") - if len(errors) == 0 { - t.Fatalf("%q should be an invalid Storage Container Name", v) - } - } -} - -var testAccAzureRMStorageContainer_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "westus" -} - -resource "azurerm_storage_account" "test" { - name = "acctestacc%s" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "westus" - account_type = "Standard_LRS" - - tags { - environment = "staging" - } -} - -resource "azurerm_storage_container" "test" { - name = "vhds" - resource_group_name = "${azurerm_resource_group.test.name}" - storage_account_name = "${azurerm_storage_account.test.name}" - container_access_type = "private" -} -` +//import ( +// "fmt" +// "log" +// "strings" +// "testing" +// +// "github.com/Azure/azure-sdk-for-go/storage" +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMStorageContainer_basic(t *testing.T) { +// var c storage.Container +// +// ri := acctest.RandInt() +// rs := strings.ToLower(acctest.RandString(11)) +// config := fmt.Sprintf(testAccAzureRMStorageContainer_basic, ri, rs) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMStorageContainerDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMStorageContainerExists("azurerm_storage_container.test", &c), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMStorageContainer_disappears(t *testing.T) { +// var c storage.Container +// +// ri := acctest.RandInt() +// rs := strings.ToLower(acctest.RandString(11)) +// config := fmt.Sprintf(testAccAzureRMStorageContainer_basic, ri, rs) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMStorageContainerDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMStorageContainerExists("azurerm_storage_container.test", &c), +// testAccARMStorageContainerDisappears("azurerm_storage_container.test", &c), +// ), +// ExpectNonEmptyPlan: true, +// }, +// }, +// }) +//} +// +//func testCheckAzureRMStorageContainerExists(name string, c *storage.Container) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// storageAccountName := rs.Primary.Attributes["storage_account_name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for storage container: %s", name) +// } +// +// armClient := testAccProvider.Meta().(*ArmClient) +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) +// if err != nil { +// return err +// } +// if !accountExists { +// return fmt.Errorf("Bad: Storage Account %q does not exist", storageAccountName) +// } +// +// containers, err := blobClient.ListContainers(storage.ListContainersParameters{ +// Prefix: name, +// Timeout: 90, +// }) +// +// if len(containers.Containers) == 0 { +// return fmt.Errorf("Bad: Storage Container %q (storage account: %q) does not exist", name, storageAccountName) +// } +// +// var found bool +// for _, container := range containers.Containers { +// if container.Name == name { +// found = true +// *c = container +// } +// } +// +// if !found { +// return fmt.Errorf("Bad: Storage Container %q (storage account: %q) does not exist", name, storageAccountName) +// } +// +// return nil +// } +//} +// +//func testAccARMStorageContainerDisappears(name string, c *storage.Container) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// armClient := testAccProvider.Meta().(*ArmClient) +// +// storageAccountName := rs.Primary.Attributes["storage_account_name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for storage container: %s", c.Name) +// } +// +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) +// if err != nil { +// return err +// } +// if !accountExists { +// log.Printf("[INFO]Storage Account %q doesn't exist so the container won't exist", storageAccountName) +// return nil +// } +// +// _, err = blobClient.DeleteContainerIfExists(c.Name) +// if err != nil { +// return err +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMStorageContainerDestroy(s *terraform.State) error { +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_storage_container" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// storageAccountName := rs.Primary.Attributes["storage_account_name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for storage container: %s", name) +// } +// +// armClient := testAccProvider.Meta().(*ArmClient) +// blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) +// if err != nil { +// //If we can't get keys then the blob can't exist +// return nil +// } +// if !accountExists { +// return nil +// } +// +// containers, err := blobClient.ListContainers(storage.ListContainersParameters{ +// Prefix: name, +// Timeout: 90, +// }) +// +// if err != nil { +// return nil +// } +// +// var found bool +// for _, container := range containers.Containers { +// if container.Name == name { +// found = true +// } +// } +// +// if found { +// return fmt.Errorf("Bad: Storage Container %q (storage account: %q) still exist", name, storageAccountName) +// } +// } +// +// return nil +//} +// +//func TestValidateArmStorageContainerName(t *testing.T) { +// validNames := []string{ +// "valid-name", +// "valid02-name", +// } +// for _, v := range validNames { +// _, errors := validateArmStorageContainerName(v, "name") +// if len(errors) != 0 { +// t.Fatalf("%q should be a valid Storage Container Name: %q", v, errors) +// } +// } +// +// invalidNames := []string{ +// "InvalidName1", +// "-invalidname1", +// "invalid_name", +// "invalid!", +// "ww", +// strings.Repeat("w", 65), +// } +// for _, v := range invalidNames { +// _, errors := validateArmStorageContainerName(v, "name") +// if len(errors) == 0 { +// t.Fatalf("%q should be an invalid Storage Container Name", v) +// } +// } +//} +// +//var testAccAzureRMStorageContainer_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "westus" +//} +// +//resource "azurerm_storage_account" "test" { +// name = "acctestacc%s" +// resource_group_name = "${azurerm_resource_group.test.name}" +// location = "westus" +// account_type = "Standard_LRS" +// +// tags { +// environment = "staging" +// } +//} +// +//resource "azurerm_storage_container" "test" { +// name = "vhds" +// resource_group_name = "${azurerm_resource_group.test.name}" +// storage_account_name = "${azurerm_storage_account.test.name}" +// container_access_type = "private" +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_storage_queue.go b/builtin/providers/azurerm/resource_arm_storage_queue.go index f1bd4e644d..c4515186ee 100644 --- a/builtin/providers/azurerm/resource_arm_storage_queue.go +++ b/builtin/providers/azurerm/resource_arm_storage_queue.go @@ -16,13 +16,13 @@ func resourceArmStorageQueue() *schema.Resource { Delete: resourceArmStorageQueueDelete, Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ + "name": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validateArmStorageQueueName, }, - "resource_group_name": &schema.Schema{ + "resource_group_name": { Type: schema.TypeString, Required: true, ForceNew: true, diff --git a/builtin/providers/azurerm/resource_arm_subnet.go b/builtin/providers/azurerm/resource_arm_subnet.go index 58acbc6ccb..701fdf0fef 100644 --- a/builtin/providers/azurerm/resource_arm_subnet.go +++ b/builtin/providers/azurerm/resource_arm_subnet.go @@ -1,188 +1,188 @@ package azurerm -import ( - "fmt" - "log" - "net/http" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmSubnet() *schema.Resource { - return &schema.Resource{ - Create: resourceArmSubnetCreate, - Read: resourceArmSubnetRead, - Update: resourceArmSubnetCreate, - Delete: resourceArmSubnetDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "virtual_network_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "network_security_group_id": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "route_table_id": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "ip_configurations": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - }, - } -} - -func resourceArmSubnetCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - subnetClient := client.subnetClient - - log.Printf("[INFO] preparing arguments for Azure ARM Subnet creation.") - - name := d.Get("name").(string) - vnetName := d.Get("virtual_network_name").(string) - resGroup := d.Get("resource_group_name").(string) - addressPrefix := d.Get("address_prefix").(string) - - armMutexKV.Lock(vnetName) - defer armMutexKV.Unlock(vnetName) - - properties := network.SubnetPropertiesFormat{ - AddressPrefix: &addressPrefix, - } - - if v, ok := d.GetOk("network_security_group_id"); ok { - nsgId := v.(string) - properties.NetworkSecurityGroup = &network.SecurityGroup{ - ID: &nsgId, - } - } - - if v, ok := d.GetOk("route_table_id"); ok { - rtId := v.(string) - properties.RouteTable = &network.RouteTable{ - ID: &rtId, - } - } - - subnet := network.Subnet{ - Name: &name, - Properties: &properties, - } - - resp, err := subnetClient.CreateOrUpdate(resGroup, vnetName, name, subnet) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Subnet (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: subnetRuleStateRefreshFunc(client, resGroup, vnetName, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Subnet (%s) to become available: %s", name, err) - } - - return resourceArmSubnetRead(d, meta) -} - -func resourceArmSubnetRead(d *schema.ResourceData, meta interface{}) error { - subnetClient := meta.(*ArmClient).subnetClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - vnetName := id.Path["virtualNetworks"] - name := id.Path["subnets"] - - resp, err := subnetClient.Get(resGroup, vnetName, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Subnet %s: %s", name, err) - } - - if resp.Properties.IPConfigurations != nil && len(*resp.Properties.IPConfigurations) > 0 { - ips := make([]string, 0, len(*resp.Properties.IPConfigurations)) - for _, ip := range *resp.Properties.IPConfigurations { - ips = append(ips, *ip.ID) - } - - if err := d.Set("ip_configurations", ips); err != nil { - return err - } - } - - return nil -} - -func resourceArmSubnetDelete(d *schema.ResourceData, meta interface{}) error { - subnetClient := meta.(*ArmClient).subnetClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["subnets"] - vnetName := id.Path["virtualNetworks"] - - armMutexKV.Lock(vnetName) - defer armMutexKV.Unlock(vnetName) - - _, err = subnetClient.Delete(resGroup, vnetName, name) - - return err -} - -func subnetRuleStateRefreshFunc(client *ArmClient, resourceGroupName string, virtualNetworkName string, subnetName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.subnetClient.Get(resourceGroupName, virtualNetworkName, subnetName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in subnetRuleStateRefreshFunc to Azure ARM for subnet '%s' (RG: '%s') (VNN: '%s'): %s", subnetName, resourceGroupName, virtualNetworkName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} +//import ( +// "fmt" +// "log" +// "net/http" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmSubnet() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmSubnetCreate, +// Read: resourceArmSubnetRead, +// Update: resourceArmSubnetCreate, +// Delete: resourceArmSubnetDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "virtual_network_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "network_security_group_id": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "route_table_id": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "ip_configurations": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// }, +// } +//} +// +//func resourceArmSubnetCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// subnetClient := client.subnetClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM Subnet creation.") +// +// name := d.Get("name").(string) +// vnetName := d.Get("virtual_network_name").(string) +// resGroup := d.Get("resource_group_name").(string) +// addressPrefix := d.Get("address_prefix").(string) +// +// armMutexKV.Lock(vnetName) +// defer armMutexKV.Unlock(vnetName) +// +// properties := network.SubnetPropertiesFormat{ +// AddressPrefix: &addressPrefix, +// } +// +// if v, ok := d.GetOk("network_security_group_id"); ok { +// nsgId := v.(string) +// properties.NetworkSecurityGroup = &network.SecurityGroup{ +// ID: &nsgId, +// } +// } +// +// if v, ok := d.GetOk("route_table_id"); ok { +// rtId := v.(string) +// properties.RouteTable = &network.RouteTable{ +// ID: &rtId, +// } +// } +// +// subnet := network.Subnet{ +// Name: &name, +// Properties: &properties, +// } +// +// resp, err := subnetClient.CreateOrUpdate(resGroup, vnetName, name, subnet) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Subnet (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: subnetRuleStateRefreshFunc(client, resGroup, vnetName, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Subnet (%s) to become available: %s", name, err) +// } +// +// return resourceArmSubnetRead(d, meta) +//} +// +//func resourceArmSubnetRead(d *schema.ResourceData, meta interface{}) error { +// subnetClient := meta.(*ArmClient).subnetClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// vnetName := id.Path["virtualNetworks"] +// name := id.Path["subnets"] +// +// resp, err := subnetClient.Get(resGroup, vnetName, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Subnet %s: %s", name, err) +// } +// +// if resp.Properties.IPConfigurations != nil && len(*resp.Properties.IPConfigurations) > 0 { +// ips := make([]string, 0, len(*resp.Properties.IPConfigurations)) +// for _, ip := range *resp.Properties.IPConfigurations { +// ips = append(ips, *ip.ID) +// } +// +// if err := d.Set("ip_configurations", ips); err != nil { +// return err +// } +// } +// +// return nil +//} +// +//func resourceArmSubnetDelete(d *schema.ResourceData, meta interface{}) error { +// subnetClient := meta.(*ArmClient).subnetClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["subnets"] +// vnetName := id.Path["virtualNetworks"] +// +// armMutexKV.Lock(vnetName) +// defer armMutexKV.Unlock(vnetName) +// +// _, err = subnetClient.Delete(resGroup, vnetName, name) +// +// return err +//} +// +//func subnetRuleStateRefreshFunc(client *ArmClient, resourceGroupName string, virtualNetworkName string, subnetName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.subnetClient.Get(resourceGroupName, virtualNetworkName, subnetName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in subnetRuleStateRefreshFunc to Azure ARM for subnet '%s' (RG: '%s') (VNN: '%s'): %s", subnetName, resourceGroupName, virtualNetworkName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} diff --git a/builtin/providers/azurerm/resource_arm_subnet_test.go b/builtin/providers/azurerm/resource_arm_subnet_test.go index 844e04f992..5f6314d260 100644 --- a/builtin/providers/azurerm/resource_arm_subnet_test.go +++ b/builtin/providers/azurerm/resource_arm_subnet_test.go @@ -1,108 +1,108 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMSubnet_basic(t *testing.T) { - - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMSubnet_basic, ri, ri, ri) - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMSubnetDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMSubnetExists("azurerm_subnet.test"), - ), - }, - }, - }) -} - -func testCheckAzureRMSubnetExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - vnetName := rs.Primary.Attributes["virtual_network_name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for subnet: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).subnetClient - - resp, err := conn.Get(resourceGroup, vnetName, name, "") - if err != nil { - return fmt.Errorf("Bad: Get on subnetClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMSubnetDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).subnetClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_subnet" { - continue - } - - name := rs.Primary.Attributes["name"] - vnetName := rs.Primary.Attributes["virtual_network_name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, vnetName, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Subnet still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMSubnet_basic = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acctestvirtnet%d" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "acctestsubnet%d" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMSubnet_basic(t *testing.T) { +// +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMSubnet_basic, ri, ri, ri) +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMSubnetDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMSubnetExists("azurerm_subnet.test"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMSubnetExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// name := rs.Primary.Attributes["name"] +// vnetName := rs.Primary.Attributes["virtual_network_name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for subnet: %s", name) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).subnetClient +// +// resp, err := conn.Get(resourceGroup, vnetName, name, "") +// if err != nil { +// return fmt.Errorf("Bad: Get on subnetClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: Subnet %q (resource group: %q) does not exist", name, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMSubnetDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).subnetClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_subnet" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// vnetName := rs.Primary.Attributes["virtual_network_name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, vnetName, name, "") +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Subnet still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMSubnet_basic = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acctestvirtnet%d" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "acctestsubnet%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_template_deployment.go b/builtin/providers/azurerm/resource_arm_template_deployment.go index 33b8b0f8f3..d7dabf34ba 100644 --- a/builtin/providers/azurerm/resource_arm_template_deployment.go +++ b/builtin/providers/azurerm/resource_arm_template_deployment.go @@ -1,213 +1,213 @@ package azurerm -import ( - "encoding/json" - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/resources/resources" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmTemplateDeployment() *schema.Resource { - return &schema.Resource{ - Create: resourceArmTemplateDeploymentCreate, - Read: resourceArmTemplateDeploymentRead, - Update: resourceArmTemplateDeploymentCreate, - Delete: resourceArmTemplateDeploymentDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "template_body": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - StateFunc: normalizeJson, - }, - - "parameters": &schema.Schema{ - Type: schema.TypeMap, - Optional: true, - }, - - "outputs": &schema.Schema{ - Type: schema.TypeMap, - Computed: true, - }, - - "deployment_mode": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - }, - } -} - -func resourceArmTemplateDeploymentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - deployClient := client.deploymentsClient - - name := d.Get("name").(string) - resGroup := d.Get("resource_group_name").(string) - deploymentMode := d.Get("deployment_mode").(string) - - log.Printf("[INFO] preparing arguments for Azure ARM Template Deployment creation.") - properties := resources.DeploymentProperties{ - Mode: resources.DeploymentMode(deploymentMode), - } - - if v, ok := d.GetOk("parameters"); ok { - params := v.(map[string]interface{}) - - newParams := make(map[string]interface{}, len(params)) - for key, val := range params { - newParams[key] = struct { - Value interface{} - }{ - Value: val, - } - } - - properties.Parameters = &newParams - } - - if v, ok := d.GetOk("template_body"); ok { - template, err := expandTemplateBody(v.(string)) - if err != nil { - return err - } - - properties.Template = &template - } - - deployment := resources.Deployment{ - Properties: &properties, - } - resp, err := deployClient.CreateOrUpdate(resGroup, name, deployment) - if err != nil { - return nil - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Template Deployment (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"creating", "updating", "accepted", "running"}, - Target: []string{"succeeded"}, - Refresh: templateDeploymentStateRefreshFunc(client, resGroup, name), - Timeout: 40 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Template Deployment (%s) to become available: %s", name, err) - } - - return resourceArmTemplateDeploymentRead(d, meta) -} - -func resourceArmTemplateDeploymentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - deployClient := client.deploymentsClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["deployments"] - if name == "" { - name = id.Path["Deployments"] - } - - resp, err := deployClient.Get(resGroup, name) - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure RM Template Deployment %s: %s", name, err) - } - var outputs map[string]string - if resp.Properties.Outputs != nil && len(*resp.Properties.Outputs) > 0 { - outputs = make(map[string]string) - for key, output := range *resp.Properties.Outputs { - outputMap := output.(map[string]interface{}) - outputValue, ok := outputMap["value"] - if !ok { - // No value - continue - } - - outputs[key] = outputValue.(string) - } - } - - d.Set("outputs", outputs) - - return nil -} - -func resourceArmTemplateDeploymentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - deployClient := client.deploymentsClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["deployments"] - if name == "" { - name = id.Path["Deployments"] - } - - _, err = deployClient.Delete(resGroup, name) - return nil -} - -func expandTemplateBody(template string) (map[string]interface{}, error) { - var templateBody map[string]interface{} - err := json.Unmarshal([]byte(template), &templateBody) - if err != nil { - return nil, fmt.Errorf("Error Expanding the template_body for Azure RM Template Deployment") - } - return templateBody, nil -} - -func normalizeJson(jsonString interface{}) string { - if jsonString == nil || jsonString == "" { - return "" - } - var j interface{} - err := json.Unmarshal([]byte(jsonString.(string)), &j) - if err != nil { - return fmt.Sprintf("Error parsing JSON: %s", err) - } - b, _ := json.Marshal(j) - return string(b[:]) -} - -func templateDeploymentStateRefreshFunc(client *ArmClient, resourceGroupName string, name string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.deploymentsClient.Get(resourceGroupName, name) - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in templateDeploymentStateRefreshFunc to Azure ARM for Template Deployment '%s' (RG: '%s'): %s", name, resourceGroupName, err) - } - - return res, strings.ToLower(*res.Properties.ProvisioningState), nil - } -} +//import ( +// "encoding/json" +// "fmt" +// "log" +// "net/http" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/resources/resources" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmTemplateDeployment() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmTemplateDeploymentCreate, +// Read: resourceArmTemplateDeploymentRead, +// Update: resourceArmTemplateDeploymentCreate, +// Delete: resourceArmTemplateDeploymentDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "template_body": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// StateFunc: normalizeJson, +// }, +// +// "parameters": &schema.Schema{ +// Type: schema.TypeMap, +// Optional: true, +// }, +// +// "outputs": &schema.Schema{ +// Type: schema.TypeMap, +// Computed: true, +// }, +// +// "deployment_mode": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// }, +// } +//} +// +//func resourceArmTemplateDeploymentCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// deployClient := client.deploymentsClient +// +// name := d.Get("name").(string) +// resGroup := d.Get("resource_group_name").(string) +// deploymentMode := d.Get("deployment_mode").(string) +// +// log.Printf("[INFO] preparing arguments for Azure ARM Template Deployment creation.") +// properties := resources.DeploymentProperties{ +// Mode: resources.DeploymentMode(deploymentMode), +// } +// +// if v, ok := d.GetOk("parameters"); ok { +// params := v.(map[string]interface{}) +// +// newParams := make(map[string]interface{}, len(params)) +// for key, val := range params { +// newParams[key] = struct { +// Value interface{} +// }{ +// Value: val, +// } +// } +// +// properties.Parameters = &newParams +// } +// +// if v, ok := d.GetOk("template_body"); ok { +// template, err := expandTemplateBody(v.(string)) +// if err != nil { +// return err +// } +// +// properties.Template = &template +// } +// +// deployment := resources.Deployment{ +// Properties: &properties, +// } +// resp, err := deployClient.CreateOrUpdate(resGroup, name, deployment) +// if err != nil { +// return nil +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Template Deployment (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"creating", "updating", "accepted", "running"}, +// Target: []string{"succeeded"}, +// Refresh: templateDeploymentStateRefreshFunc(client, resGroup, name), +// Timeout: 40 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Template Deployment (%s) to become available: %s", name, err) +// } +// +// return resourceArmTemplateDeploymentRead(d, meta) +//} +// +//func resourceArmTemplateDeploymentRead(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// deployClient := client.deploymentsClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["deployments"] +// if name == "" { +// name = id.Path["Deployments"] +// } +// +// resp, err := deployClient.Get(resGroup, name) +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure RM Template Deployment %s: %s", name, err) +// } +// var outputs map[string]string +// if resp.Properties.Outputs != nil && len(*resp.Properties.Outputs) > 0 { +// outputs = make(map[string]string) +// for key, output := range *resp.Properties.Outputs { +// outputMap := output.(map[string]interface{}) +// outputValue, ok := outputMap["value"] +// if !ok { +// // No value +// continue +// } +// +// outputs[key] = outputValue.(string) +// } +// } +// +// d.Set("outputs", outputs) +// +// return nil +//} +// +//func resourceArmTemplateDeploymentDelete(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// deployClient := client.deploymentsClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["deployments"] +// if name == "" { +// name = id.Path["Deployments"] +// } +// +// _, err = deployClient.Delete(resGroup, name) +// return nil +//} +// +//func expandTemplateBody(template string) (map[string]interface{}, error) { +// var templateBody map[string]interface{} +// err := json.Unmarshal([]byte(template), &templateBody) +// if err != nil { +// return nil, fmt.Errorf("Error Expanding the template_body for Azure RM Template Deployment") +// } +// return templateBody, nil +//} +// +//func normalizeJson(jsonString interface{}) string { +// if jsonString == nil || jsonString == "" { +// return "" +// } +// var j interface{} +// err := json.Unmarshal([]byte(jsonString.(string)), &j) +// if err != nil { +// return fmt.Sprintf("Error parsing JSON: %s", err) +// } +// b, _ := json.Marshal(j) +// return string(b[:]) +//} +// +//func templateDeploymentStateRefreshFunc(client *ArmClient, resourceGroupName string, name string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.deploymentsClient.Get(resourceGroupName, name) +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in templateDeploymentStateRefreshFunc to Azure ARM for Template Deployment '%s' (RG: '%s'): %s", name, resourceGroupName, err) +// } +// +// return res, strings.ToLower(*res.Properties.ProvisioningState), nil +// } +//} diff --git a/builtin/providers/azurerm/resource_arm_template_deployment_test.go b/builtin/providers/azurerm/resource_arm_template_deployment_test.go index 188f33da92..0a3707d645 100644 --- a/builtin/providers/azurerm/resource_arm_template_deployment_test.go +++ b/builtin/providers/azurerm/resource_arm_template_deployment_test.go @@ -1,251 +1,251 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMTemplateDeployment_basic(t *testing.T) { - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMTemplateDeployment_basicExample, ri, ri) - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMTemplateDeployment_withParams(t *testing.T) { - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMTemplateDeployment_withParams, ri, ri, ri) - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"), - resource.TestCheckResourceAttr("azurerm_template_deployment.test", "outputs.testOutput", "Output Value"), - ), - }, - }, - }) -} - -func testCheckAzureRMTemplateDeploymentExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - name := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for template deployment: %s", name) - } - - conn := testAccProvider.Meta().(*ArmClient).deploymentsClient - - resp, err := conn.Get(resourceGroup, name) - if err != nil { - return fmt.Errorf("Bad: Get on deploymentsClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: TemplateDeployment %q (resource group: %q) does not exist", name, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMTemplateDeploymentDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).vmClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_template_deployment" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Template Deployment still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMTemplateDeployment_basicExample = ` - resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" - } - - resource "azurerm_template_deployment" "test" { - name = "acctesttemplate-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - template_body = < 1023 { - errors = append(errors, fmt.Errorf( - "The `disk_size_gb` can only be between 1 and 1023")) - } - return - }, - }, - - "lun": &schema.Schema{ - Type: schema.TypeInt, - Required: true, - }, - }, - }, - }, - - "os_profile": &schema.Schema{ - Type: schema.TypeSet, - Required: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "computer_name": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - - "admin_username": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "admin_password": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "custom_data": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Computed: true, - }, - }, - }, - Set: resourceArmVirtualMachineStorageOsProfileHash, - }, - - "os_profile_windows_config": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "provision_vm_agent": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - }, - "enable_automatic_upgrades": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - }, - "winrm": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "protocol": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "certificate_url": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - }, - }, - }, - }, - "additional_unattend_config": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "pass": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "component": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "setting_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "content": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - }, - }, - }, - }, - }, - Set: resourceArmVirtualMachineStorageOsProfileWindowsConfigHash, - }, - - "os_profile_linux_config": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "disable_password_authentication": &schema.Schema{ - Type: schema.TypeBool, - Required: true, - }, - "ssh_keys": &schema.Schema{ - Type: schema.TypeList, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "path": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "key_data": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - }, - }, - }, - }, - }, - }, - Set: resourceArmVirtualMachineStorageOsProfileLinuxConfigHash, - }, - - "os_profile_secrets": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "source_vault_id": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - - "vault_certificates": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "certificate_url": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "certificate_store": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - }, - }, - }, - }, - }, - }, - }, - - "network_interface_ids": &schema.Schema{ - Type: schema.TypeSet, - Required: true, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - }, - - "tags": tagsSchema(), - }, - } -} - -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) -} - -func resourceArmVirtualMachineRead(d *schema.ResourceData, meta interface{}) error { - vmClient := meta.(*ArmClient).vmClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["virtualMachines"] - - resp, err := vmClient.Get(resGroup, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure Virtual Machine %s: %s", name, err) - } - - if resp.Plan != nil { - if err := d.Set("plan", flattenAzureRmVirtualMachinePlan(resp.Plan)); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Plan error: %#v", err) - } - } - - if resp.Properties.AvailabilitySet != nil { - d.Set("availability_set_id", strings.ToLower(*resp.Properties.AvailabilitySet.ID)) - } - - d.Set("vm_size", resp.Properties.HardwareProfile.VMSize) - - if resp.Properties.StorageProfile.ImageReference != nil { - if err := d.Set("storage_image_reference", schema.NewSet(resourceArmVirtualMachineStorageImageReferenceHash, flattenAzureRmVirtualMachineImageReference(resp.Properties.StorageProfile.ImageReference))); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage Image Reference error: %#v", err) - } - } - - if err := d.Set("storage_os_disk", schema.NewSet(resourceArmVirtualMachineStorageOsDiskHash, flattenAzureRmVirtualMachineOsDisk(resp.Properties.StorageProfile.OsDisk))); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Disk error: %#v", err) - } - - if resp.Properties.StorageProfile.DataDisks != nil { - if err := d.Set("storage_data_disk", flattenAzureRmVirtualMachineDataDisk(resp.Properties.StorageProfile.DataDisks)); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage Data Disks error: %#v", err) - } - } - - if err := d.Set("os_profile", schema.NewSet(resourceArmVirtualMachineStorageOsProfileHash, flattenAzureRmVirtualMachineOsProfile(resp.Properties.OsProfile))); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile: %#v", err) - } - - if resp.Properties.OsProfile.WindowsConfiguration != nil { - if err := d.Set("os_profile_windows_config", schema.NewSet(resourceArmVirtualMachineStorageOsProfileWindowsConfigHash, flattenAzureRmVirtualMachineOsProfileWindowsConfiguration(resp.Properties.OsProfile.WindowsConfiguration))); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile Windows Configuration: %#v", err) - } - } - - if resp.Properties.OsProfile.LinuxConfiguration != nil { - if err := d.Set("os_profile_linux_config", flattenAzureRmVirtualMachineOsProfileLinuxConfiguration(resp.Properties.OsProfile.LinuxConfiguration)); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile Linux Configuration: %#v", err) - } - } - - if resp.Properties.OsProfile.Secrets != nil { - if err := d.Set("os_profile_secrets", flattenAzureRmVirtualMachineOsProfileSecrets(resp.Properties.OsProfile.Secrets)); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile Secrets: %#v", err) - } - } - - if resp.Properties.NetworkProfile != nil { - if err := d.Set("network_interface_ids", flattenAzureRmVirtualMachineNetworkInterfaces(resp.Properties.NetworkProfile)); err != nil { - return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage Network Interfaces: %#v", err) - } - } - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmVirtualMachineDelete(d *schema.ResourceData, meta interface{}) error { - vmClient := meta.(*ArmClient).vmClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["virtualMachines"] - - _, err = vmClient.Delete(resGroup, name) - - return err -} - -func virtualMachineStateRefreshFunc(client *ArmClient, resourceGroupName string, vmName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.vmClient.Get(resourceGroupName, vmName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in virtualMachineStateRefreshFunc to Azure ARM for Virtual Machine '%s' (RG: '%s'): %s", vmName, resourceGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} - -func resourceArmVirtualMachinePlanHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["publisher"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["product"].(string))) - - return hashcode.String(buf.String()) -} - -func resourceArmVirtualMachineStorageImageReferenceHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["publisher"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["offer"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["sku"].(string))) - - return hashcode.String(buf.String()) -} - -func resourceArmVirtualMachineStorageOsProfileHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["admin_username"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["computer_name"].(string))) - return hashcode.String(buf.String()) -} - -func resourceArmVirtualMachineStorageDataDiskHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["vhd_uri"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["create_option"].(string))) - buf.WriteString(fmt.Sprintf("%d-", m["disk_size_gb"].(int))) - buf.WriteString(fmt.Sprintf("%d-", m["lun"].(int))) - - return hashcode.String(buf.String()) -} - -func resourceArmVirtualMachineStorageOsDiskHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["vhd_uri"].(string))) - - return hashcode.String(buf.String()) -} - -func resourceArmVirtualMachineStorageOsProfileLinuxConfigHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%t-", m["disable_password_authentication"].(bool))) - - return hashcode.String(buf.String()) -} - -func resourceArmVirtualMachineStorageOsProfileWindowsConfigHash(v interface{}) int { - var buf bytes.Buffer - m := v.(map[string]interface{}) - if m["provision_vm_agent"] != nil { - buf.WriteString(fmt.Sprintf("%t-", m["provision_vm_agent"].(bool))) - } - if m["enable_automatic_upgrades"] != nil { - buf.WriteString(fmt.Sprintf("%t-", m["enable_automatic_upgrades"].(bool))) - } - return hashcode.String(buf.String()) -} - -func flattenAzureRmVirtualMachinePlan(plan *compute.Plan) map[string]interface{} { - result := make(map[string]interface{}) - result["name"] = *plan.Name - result["publisher"] = *plan.Publisher - result["product"] = *plan.Product - - return result -} - -func flattenAzureRmVirtualMachineImageReference(image *compute.ImageReference) []interface{} { - result := make(map[string]interface{}) - result["offer"] = *image.Offer - result["publisher"] = *image.Publisher - result["sku"] = *image.Sku - - if image.Version != nil { - result["version"] = *image.Version - } - - return []interface{}{result} -} - -func flattenAzureRmVirtualMachineNetworkInterfaces(profile *compute.NetworkProfile) []string { - result := make([]string, 0, len(*profile.NetworkInterfaces)) - for _, nic := range *profile.NetworkInterfaces { - result = append(result, *nic.ID) - } - return result -} - -func flattenAzureRmVirtualMachineOsProfileSecrets(secrets *[]compute.VaultSecretGroup) []map[string]interface{} { - result := make([]map[string]interface{}, 0, len(*secrets)) - for _, secret := range *secrets { - s := map[string]interface{}{ - "source_vault_id": *secret.SourceVault.ID, - } - - if secret.VaultCertificates != nil { - certs := make([]map[string]interface{}, 0, len(*secret.VaultCertificates)) - for _, cert := range *secret.VaultCertificates { - vaultCert := make(map[string]interface{}) - vaultCert["certificate_url"] = *cert.CertificateURL - - if cert.CertificateStore != nil { - vaultCert["certificate_store"] = *cert.CertificateStore - } - - certs = append(certs, vaultCert) - } - - s["vault_certificates"] = certs - } - - result = append(result, s) - } - return result -} - -func flattenAzureRmVirtualMachineDataDisk(disks *[]compute.DataDisk) interface{} { - result := make([]interface{}, len(*disks)) - for i, disk := range *disks { - l := make(map[string]interface{}) - l["name"] = *disk.Name - l["vhd_uri"] = *disk.Vhd.URI - l["create_option"] = disk.CreateOption - l["disk_size_gb"] = *disk.DiskSizeGB - l["lun"] = *disk.Lun - - result[i] = l - } - return result -} - -func flattenAzureRmVirtualMachineOsProfile(osProfile *compute.OSProfile) []interface{} { - result := make(map[string]interface{}) - result["computer_name"] = *osProfile.ComputerName - result["admin_username"] = *osProfile.AdminUsername - if osProfile.CustomData != nil { - result["custom_data"] = *osProfile.CustomData - } - - return []interface{}{result} -} - -func flattenAzureRmVirtualMachineOsProfileWindowsConfiguration(config *compute.WindowsConfiguration) []interface{} { - result := make(map[string]interface{}) - - if config.ProvisionVMAgent != nil { - result["provision_vm_agent"] = *config.ProvisionVMAgent - } - - if config.EnableAutomaticUpdates != nil { - result["enable_automatic_upgrades"] = *config.EnableAutomaticUpdates - } - - if config.WinRM != nil { - listeners := make([]map[string]interface{}, 0, len(*config.WinRM.Listeners)) - for _, i := range *config.WinRM.Listeners { - listener := make(map[string]interface{}) - listener["protocol"] = i.Protocol - - if i.CertificateURL != nil { - listener["certificate_url"] = *i.CertificateURL - } - - listeners = append(listeners, listener) - } - - result["winrm"] = listeners - } - - if config.AdditionalUnattendContent != nil { - content := make([]map[string]interface{}, 0, len(*config.AdditionalUnattendContent)) - for _, i := range *config.AdditionalUnattendContent { - c := make(map[string]interface{}) - c["pass"] = i.PassName - c["component"] = i.ComponentName - c["setting_name"] = i.SettingName - c["content"] = *i.Content - - content = append(content, c) - } - - result["additional_unattend_config"] = content - } - - return []interface{}{result} -} - -func flattenAzureRmVirtualMachineOsProfileLinuxConfiguration(config *compute.LinuxConfiguration) []interface{} { - - result := make(map[string]interface{}) - result["disable_password_authentication"] = *config.DisablePasswordAuthentication - - if config.SSH != nil && len(*config.SSH.PublicKeys) > 0 { - ssh_keys := make([]map[string]interface{}, len(*config.SSH.PublicKeys)) - for _, i := range *config.SSH.PublicKeys { - key := make(map[string]interface{}) - key["path"] = *i.Path - - if i.KeyData != nil { - key["key_data"] = *i.KeyData - } - - ssh_keys = append(ssh_keys, key) - } - - result["ssh_keys"] = ssh_keys - } - - return []interface{}{result} -} - -func flattenAzureRmVirtualMachineOsDisk(disk *compute.OSDisk) []interface{} { - result := make(map[string]interface{}) - result["name"] = *disk.Name - result["vhd_uri"] = *disk.Vhd.URI - result["create_option"] = disk.CreateOption - result["caching"] = disk.Caching - - return []interface{}{result} -} - -func expandAzureRmVirtualMachinePlan(d *schema.ResourceData) (*compute.Plan, error) { - planConfigs := d.Get("plan").(*schema.Set).List() - - if len(planConfigs) != 1 { - return nil, fmt.Errorf("Cannot specify more than one plan.") - } - - planConfig := planConfigs[0].(map[string]interface{}) - - publisher := planConfig["publisher"].(string) - name := planConfig["name"].(string) - product := planConfig["product"].(string) - - return &compute.Plan{ - Publisher: &publisher, - Name: &name, - Product: &product, - }, nil -} - -func expandAzureRmVirtualMachineOsProfile(d *schema.ResourceData) (*compute.OSProfile, error) { - osProfiles := d.Get("os_profile").(*schema.Set).List() - - if len(osProfiles) != 1 { - return nil, fmt.Errorf("[ERROR] Only 1 OS Profile Can be specified for an Azure RM Virtual Machine") - } - - osProfile := osProfiles[0].(map[string]interface{}) - - adminUsername := osProfile["admin_username"].(string) - adminPassword := osProfile["admin_password"].(string) - - profile := &compute.OSProfile{ - AdminUsername: &adminUsername, - } - - if adminPassword != "" { - profile.AdminPassword = &adminPassword - } - - if _, ok := d.GetOk("os_profile_windows_config"); ok { - winConfig, err := expandAzureRmVirtualMachineOsProfileWindowsConfig(d) - if err != nil { - return nil, err - } - if winConfig != nil { - profile.WindowsConfiguration = winConfig - } - } - - if _, ok := d.GetOk("os_profile_linux_config"); ok { - linuxConfig, err := expandAzureRmVirtualMachineOsProfileLinuxConfig(d) - if err != nil { - return nil, err - } - if linuxConfig != nil { - profile.LinuxConfiguration = linuxConfig - } - } - - if _, ok := d.GetOk("os_profile_secrets"); ok { - secrets := expandAzureRmVirtualMachineOsProfileSecrets(d) - if secrets != nil { - profile.Secrets = secrets - } - } - - if v := osProfile["computer_name"].(string); v != "" { - profile.ComputerName = &v - } - if v := osProfile["custom_data"].(string); v != "" { - profile.CustomData = &v - } - - return profile, nil -} - -func expandAzureRmVirtualMachineOsProfileSecrets(d *schema.ResourceData) *[]compute.VaultSecretGroup { - secretsConfig := d.Get("os_profile_secrets").(*schema.Set).List() - secrets := make([]compute.VaultSecretGroup, 0, len(secretsConfig)) - - for _, secretConfig := range secretsConfig { - config := secretConfig.(map[string]interface{}) - sourceVaultId := config["source_vault_id"].(string) - - vaultSecretGroup := compute.VaultSecretGroup{ - SourceVault: &compute.SubResource{ - ID: &sourceVaultId, - }, - } - - if v := config["vault_certificates"]; v != nil { - certsConfig := v.(*schema.Set).List() - certs := make([]compute.VaultCertificate, 0, len(certsConfig)) - for _, certConfig := range certsConfig { - config := certConfig.(map[string]interface{}) - - certUrl := config["certificate_url"].(string) - cert := compute.VaultCertificate{ - CertificateURL: &certUrl, - } - if v := config["certificate_store"].(string); v != "" { - cert.CertificateStore = &v - } - - certs = append(certs, cert) - } - vaultSecretGroup.VaultCertificates = &certs - } - - secrets = append(secrets, vaultSecretGroup) - } - - return &secrets -} - -func expandAzureRmVirtualMachineOsProfileLinuxConfig(d *schema.ResourceData) (*compute.LinuxConfiguration, error) { - osProfilesLinuxConfig := d.Get("os_profile_linux_config").(*schema.Set).List() - - if len(osProfilesLinuxConfig) != 1 { - return nil, fmt.Errorf("[ERROR] Only 1 OS Profile Linux Config Can be specified for an Azure RM Virtual Machine") - } - - linuxConfig := osProfilesLinuxConfig[0].(map[string]interface{}) - disablePasswordAuth := linuxConfig["disable_password_authentication"].(bool) - - config := &compute.LinuxConfiguration{ - DisablePasswordAuthentication: &disablePasswordAuth, - } - - linuxKeys := linuxConfig["ssh_keys"].([]interface{}) - sshPublicKeys := []compute.SSHPublicKey{} - for _, key := range linuxKeys { - - sshKey, ok := key.(map[string]interface{}) - if !ok { - continue - } - path := sshKey["path"].(string) - keyData := sshKey["key_data"].(string) - - sshPublicKey := compute.SSHPublicKey{ - Path: &path, - KeyData: &keyData, - } - - sshPublicKeys = append(sshPublicKeys, sshPublicKey) - } - - config.SSH = &compute.SSHConfiguration{ - PublicKeys: &sshPublicKeys, - } - - return config, nil -} - -func expandAzureRmVirtualMachineOsProfileWindowsConfig(d *schema.ResourceData) (*compute.WindowsConfiguration, error) { - osProfilesWindowsConfig := d.Get("os_profile_windows_config").(*schema.Set).List() - - if len(osProfilesWindowsConfig) != 1 { - return nil, fmt.Errorf("[ERROR] Only 1 OS Profile Windows Config Can be specified for an Azure RM Virtual Machine") - } - - osProfileConfig := osProfilesWindowsConfig[0].(map[string]interface{}) - config := &compute.WindowsConfiguration{} - - if v := osProfileConfig["provision_vm_agent"]; v != nil { - provision := v.(bool) - config.ProvisionVMAgent = &provision - } - - if v := osProfileConfig["enable_automatic_upgrades"]; v != nil { - update := v.(bool) - config.EnableAutomaticUpdates = &update - } - - if v := osProfileConfig["winrm"]; v != nil { - winRm := v.(*schema.Set).List() - if len(winRm) > 0 { - winRmListners := make([]compute.WinRMListener, 0, len(winRm)) - for _, winRmConfig := range winRm { - config := winRmConfig.(map[string]interface{}) - - protocol := config["protocol"].(string) - winRmListner := compute.WinRMListener{ - Protocol: compute.ProtocolTypes(protocol), - } - if v := config["certificate_url"].(string); v != "" { - winRmListner.CertificateURL = &v - } - - winRmListners = append(winRmListners, winRmListner) - } - config.WinRM = &compute.WinRMConfiguration{ - Listeners: &winRmListners, - } - } - } - if v := osProfileConfig["additional_unattend_config"]; v != nil { - additionalConfig := v.(*schema.Set).List() - if len(additionalConfig) > 0 { - additionalConfigContent := make([]compute.AdditionalUnattendContent, 0, len(additionalConfig)) - for _, addConfig := range additionalConfig { - config := addConfig.(map[string]interface{}) - pass := config["pass"].(string) - component := config["component"].(string) - settingName := config["setting_name"].(string) - content := config["content"].(string) - - addContent := compute.AdditionalUnattendContent{ - PassName: compute.PassNames(pass), - ComponentName: compute.ComponentNames(component), - SettingName: compute.SettingNames(settingName), - Content: &content, - } - - additionalConfigContent = append(additionalConfigContent, addContent) - } - config.AdditionalUnattendContent = &additionalConfigContent - } - } - return config, nil -} - -func expandAzureRmVirtualMachineDataDisk(d *schema.ResourceData) ([]compute.DataDisk, error) { - disks := d.Get("storage_data_disk").([]interface{}) - data_disks := make([]compute.DataDisk, 0, len(disks)) - for _, disk_config := range disks { - config := disk_config.(map[string]interface{}) - - name := config["name"].(string) - vhd := config["vhd_uri"].(string) - createOption := config["create_option"].(string) - lun := config["lun"].(int) - disk_size := config["disk_size_gb"].(int) - - data_disk := compute.DataDisk{ - Name: &name, - Vhd: &compute.VirtualHardDisk{ - URI: &vhd, - }, - Lun: &lun, - DiskSizeGB: &disk_size, - CreateOption: compute.DiskCreateOptionTypes(createOption), - } - - data_disks = append(data_disks, data_disk) - } - - return data_disks, nil -} - -func expandAzureRmVirtualMachineImageReference(d *schema.ResourceData) (*compute.ImageReference, error) { - storageImageRefs := d.Get("storage_image_reference").(*schema.Set).List() - - if len(storageImageRefs) != 1 { - return nil, fmt.Errorf("Cannot specify more than one storage_image_reference.") - } - - storageImageRef := storageImageRefs[0].(map[string]interface{}) - - publisher := storageImageRef["publisher"].(string) - offer := storageImageRef["offer"].(string) - sku := storageImageRef["sku"].(string) - version := storageImageRef["version"].(string) - - return &compute.ImageReference{ - Publisher: &publisher, - Offer: &offer, - Sku: &sku, - Version: &version, - }, nil -} - -func expandAzureRmVirtualMachineNetworkProfile(d *schema.ResourceData) compute.NetworkProfile { - nicIds := d.Get("network_interface_ids").(*schema.Set).List() - network_interfaces := make([]compute.NetworkInterfaceReference, 0, len(nicIds)) - - network_profile := compute.NetworkProfile{} - - for _, nic := range nicIds { - id := nic.(string) - network_interface := compute.NetworkInterfaceReference{ - ID: &id, - } - network_interfaces = append(network_interfaces, network_interface) - } - - network_profile.NetworkInterfaces = &network_interfaces - - return network_profile -} - -func expandAzureRmVirtualMachineOsDisk(d *schema.ResourceData) (*compute.OSDisk, error) { - disks := d.Get("storage_os_disk").(*schema.Set).List() - - if len(disks) != 1 { - return nil, fmt.Errorf("[ERROR] Only 1 OS Disk Can be specified for an Azure RM Virtual Machine") - } - - disk := disks[0].(map[string]interface{}) - - name := disk["name"].(string) - vhdURI := disk["vhd_uri"].(string) - imageURI := disk["image_uri"].(string) - createOption := disk["create_option"].(string) - - osDisk := &compute.OSDisk{ - Name: &name, - Vhd: &compute.VirtualHardDisk{ - URI: &vhdURI, - }, - CreateOption: compute.DiskCreateOptionTypes(createOption), - } - - if v := disk["image_uri"].(string); v != "" { - osDisk.Image = &compute.VirtualHardDisk{ - URI: &imageURI, - } - } - - if v := disk["os_type"].(string); v != "" { - if v == "linux" { - osDisk.OsType = compute.Linux - } else if v == "windows" { - osDisk.OsType = compute.Windows - } else { - return nil, fmt.Errorf("[ERROR] os_type must be 'linux' or 'windows'") - } - } - - if v := disk["caching"].(string); v != "" { - osDisk.Caching = compute.CachingTypes(v) - } - - return osDisk, nil -} +//import ( +// "bytes" +// "fmt" +// "log" +// "net/http" +// "strings" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/compute" +// "github.com/hashicorp/terraform/helper/hashcode" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmVirtualMachine() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmVirtualMachineCreate, +// Read: resourceArmVirtualMachineRead, +// Update: resourceArmVirtualMachineCreate, +// Delete: resourceArmVirtualMachineDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "plan": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "publisher": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "product": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// }, +// }, +// Set: resourceArmVirtualMachinePlanHash, +// }, +// +// "availability_set_id": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// StateFunc: func(id interface{}) string { +// return strings.ToLower(id.(string)) +// }, +// }, +// +// "license_type": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "vm_size": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "storage_image_reference": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "publisher": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "offer": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "sku": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "version": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// }, +// }, +// Set: resourceArmVirtualMachineStorageImageReferenceHash, +// }, +// +// "storage_os_disk": &schema.Schema{ +// Type: schema.TypeSet, +// Required: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "os_type": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "vhd_uri": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "image_uri": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// +// "caching": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "create_option": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// }, +// }, +// Set: resourceArmVirtualMachineStorageOsDiskHash, +// }, +// +// "storage_data_disk": &schema.Schema{ +// Type: schema.TypeList, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "vhd_uri": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "create_option": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "disk_size_gb": &schema.Schema{ +// Type: schema.TypeInt, +// Required: true, +// ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { +// value := v.(int) +// if value < 1 || value > 1023 { +// errors = append(errors, fmt.Errorf( +// "The `disk_size_gb` can only be between 1 and 1023")) +// } +// return +// }, +// }, +// +// "lun": &schema.Schema{ +// Type: schema.TypeInt, +// Required: true, +// }, +// }, +// }, +// }, +// +// "os_profile": &schema.Schema{ +// Type: schema.TypeSet, +// Required: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "computer_name": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// +// "admin_username": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "admin_password": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "custom_data": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// Computed: true, +// }, +// }, +// }, +// Set: resourceArmVirtualMachineStorageOsProfileHash, +// }, +// +// "os_profile_windows_config": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "provision_vm_agent": &schema.Schema{ +// Type: schema.TypeBool, +// Optional: true, +// }, +// "enable_automatic_upgrades": &schema.Schema{ +// Type: schema.TypeBool, +// Optional: true, +// }, +// "winrm": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "protocol": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "certificate_url": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// }, +// }, +// }, +// "additional_unattend_config": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "pass": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "component": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "setting_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "content": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// }, +// }, +// }, +// }, +// }, +// Set: resourceArmVirtualMachineStorageOsProfileWindowsConfigHash, +// }, +// +// "os_profile_linux_config": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "disable_password_authentication": &schema.Schema{ +// Type: schema.TypeBool, +// Required: true, +// }, +// "ssh_keys": &schema.Schema{ +// Type: schema.TypeList, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "path": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "key_data": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// }, +// }, +// }, +// }, +// }, +// Set: resourceArmVirtualMachineStorageOsProfileLinuxConfigHash, +// }, +// +// "os_profile_secrets": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "source_vault_id": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// +// "vault_certificates": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "certificate_url": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "certificate_store": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// +// "network_interface_ids": &schema.Schema{ +// Type: schema.TypeSet, +// Required: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// Set: schema.HashString, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//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) +//} +// +//func resourceArmVirtualMachineRead(d *schema.ResourceData, meta interface{}) error { +// vmClient := meta.(*ArmClient).vmClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["virtualMachines"] +// +// resp, err := vmClient.Get(resGroup, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure Virtual Machine %s: %s", name, err) +// } +// +// if resp.Plan != nil { +// if err := d.Set("plan", flattenAzureRmVirtualMachinePlan(resp.Plan)); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Plan error: %#v", err) +// } +// } +// +// if resp.Properties.AvailabilitySet != nil { +// d.Set("availability_set_id", strings.ToLower(*resp.Properties.AvailabilitySet.ID)) +// } +// +// d.Set("vm_size", resp.Properties.HardwareProfile.VMSize) +// +// if resp.Properties.StorageProfile.ImageReference != nil { +// if err := d.Set("storage_image_reference", schema.NewSet(resourceArmVirtualMachineStorageImageReferenceHash, flattenAzureRmVirtualMachineImageReference(resp.Properties.StorageProfile.ImageReference))); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage Image Reference error: %#v", err) +// } +// } +// +// if err := d.Set("storage_os_disk", schema.NewSet(resourceArmVirtualMachineStorageOsDiskHash, flattenAzureRmVirtualMachineOsDisk(resp.Properties.StorageProfile.OsDisk))); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Disk error: %#v", err) +// } +// +// if resp.Properties.StorageProfile.DataDisks != nil { +// if err := d.Set("storage_data_disk", flattenAzureRmVirtualMachineDataDisk(resp.Properties.StorageProfile.DataDisks)); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage Data Disks error: %#v", err) +// } +// } +// +// if err := d.Set("os_profile", schema.NewSet(resourceArmVirtualMachineStorageOsProfileHash, flattenAzureRmVirtualMachineOsProfile(resp.Properties.OsProfile))); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile: %#v", err) +// } +// +// if resp.Properties.OsProfile.WindowsConfiguration != nil { +// if err := d.Set("os_profile_windows_config", schema.NewSet(resourceArmVirtualMachineStorageOsProfileWindowsConfigHash, flattenAzureRmVirtualMachineOsProfileWindowsConfiguration(resp.Properties.OsProfile.WindowsConfiguration))); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile Windows Configuration: %#v", err) +// } +// } +// +// if resp.Properties.OsProfile.LinuxConfiguration != nil { +// if err := d.Set("os_profile_linux_config", flattenAzureRmVirtualMachineOsProfileLinuxConfiguration(resp.Properties.OsProfile.LinuxConfiguration)); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile Linux Configuration: %#v", err) +// } +// } +// +// if resp.Properties.OsProfile.Secrets != nil { +// if err := d.Set("os_profile_secrets", flattenAzureRmVirtualMachineOsProfileSecrets(resp.Properties.OsProfile.Secrets)); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage OS Profile Secrets: %#v", err) +// } +// } +// +// if resp.Properties.NetworkProfile != nil { +// if err := d.Set("network_interface_ids", flattenAzureRmVirtualMachineNetworkInterfaces(resp.Properties.NetworkProfile)); err != nil { +// return fmt.Errorf("[DEBUG] Error setting Virtual Machine Storage Network Interfaces: %#v", err) +// } +// } +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmVirtualMachineDelete(d *schema.ResourceData, meta interface{}) error { +// vmClient := meta.(*ArmClient).vmClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["virtualMachines"] +// +// _, err = vmClient.Delete(resGroup, name) +// +// return err +//} +// +//func virtualMachineStateRefreshFunc(client *ArmClient, resourceGroupName string, vmName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.vmClient.Get(resourceGroupName, vmName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in virtualMachineStateRefreshFunc to Azure ARM for Virtual Machine '%s' (RG: '%s'): %s", vmName, resourceGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//} +// +//func resourceArmVirtualMachinePlanHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["publisher"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["product"].(string))) +// +// return hashcode.String(buf.String()) +//} +// +//func resourceArmVirtualMachineStorageImageReferenceHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["publisher"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["offer"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["sku"].(string))) +// +// return hashcode.String(buf.String()) +//} +// +//func resourceArmVirtualMachineStorageOsProfileHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["admin_username"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["computer_name"].(string))) +// return hashcode.String(buf.String()) +//} +// +//func resourceArmVirtualMachineStorageDataDiskHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["vhd_uri"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["create_option"].(string))) +// buf.WriteString(fmt.Sprintf("%d-", m["disk_size_gb"].(int))) +// buf.WriteString(fmt.Sprintf("%d-", m["lun"].(int))) +// +// return hashcode.String(buf.String()) +//} +// +//func resourceArmVirtualMachineStorageOsDiskHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) +// buf.WriteString(fmt.Sprintf("%s-", m["vhd_uri"].(string))) +// +// return hashcode.String(buf.String()) +//} +// +//func resourceArmVirtualMachineStorageOsProfileLinuxConfigHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// buf.WriteString(fmt.Sprintf("%t-", m["disable_password_authentication"].(bool))) +// +// return hashcode.String(buf.String()) +//} +// +//func resourceArmVirtualMachineStorageOsProfileWindowsConfigHash(v interface{}) int { +// var buf bytes.Buffer +// m := v.(map[string]interface{}) +// if m["provision_vm_agent"] != nil { +// buf.WriteString(fmt.Sprintf("%t-", m["provision_vm_agent"].(bool))) +// } +// if m["enable_automatic_upgrades"] != nil { +// buf.WriteString(fmt.Sprintf("%t-", m["enable_automatic_upgrades"].(bool))) +// } +// return hashcode.String(buf.String()) +//} +// +//func flattenAzureRmVirtualMachinePlan(plan *compute.Plan) map[string]interface{} { +// result := make(map[string]interface{}) +// result["name"] = *plan.Name +// result["publisher"] = *plan.Publisher +// result["product"] = *plan.Product +// +// return result +//} +// +//func flattenAzureRmVirtualMachineImageReference(image *compute.ImageReference) []interface{} { +// result := make(map[string]interface{}) +// result["offer"] = *image.Offer +// result["publisher"] = *image.Publisher +// result["sku"] = *image.Sku +// +// if image.Version != nil { +// result["version"] = *image.Version +// } +// +// return []interface{}{result} +//} +// +//func flattenAzureRmVirtualMachineNetworkInterfaces(profile *compute.NetworkProfile) []string { +// result := make([]string, 0, len(*profile.NetworkInterfaces)) +// for _, nic := range *profile.NetworkInterfaces { +// result = append(result, *nic.ID) +// } +// return result +//} +// +//func flattenAzureRmVirtualMachineOsProfileSecrets(secrets *[]compute.VaultSecretGroup) []map[string]interface{} { +// result := make([]map[string]interface{}, 0, len(*secrets)) +// for _, secret := range *secrets { +// s := map[string]interface{}{ +// "source_vault_id": *secret.SourceVault.ID, +// } +// +// if secret.VaultCertificates != nil { +// certs := make([]map[string]interface{}, 0, len(*secret.VaultCertificates)) +// for _, cert := range *secret.VaultCertificates { +// vaultCert := make(map[string]interface{}) +// vaultCert["certificate_url"] = *cert.CertificateURL +// +// if cert.CertificateStore != nil { +// vaultCert["certificate_store"] = *cert.CertificateStore +// } +// +// certs = append(certs, vaultCert) +// } +// +// s["vault_certificates"] = certs +// } +// +// result = append(result, s) +// } +// return result +//} +// +//func flattenAzureRmVirtualMachineDataDisk(disks *[]compute.DataDisk) interface{} { +// result := make([]interface{}, len(*disks)) +// for i, disk := range *disks { +// l := make(map[string]interface{}) +// l["name"] = *disk.Name +// l["vhd_uri"] = *disk.Vhd.URI +// l["create_option"] = disk.CreateOption +// l["disk_size_gb"] = *disk.DiskSizeGB +// l["lun"] = *disk.Lun +// +// result[i] = l +// } +// return result +//} +// +//func flattenAzureRmVirtualMachineOsProfile(osProfile *compute.OSProfile) []interface{} { +// result := make(map[string]interface{}) +// result["computer_name"] = *osProfile.ComputerName +// result["admin_username"] = *osProfile.AdminUsername +// if osProfile.CustomData != nil { +// result["custom_data"] = *osProfile.CustomData +// } +// +// return []interface{}{result} +//} +// +//func flattenAzureRmVirtualMachineOsProfileWindowsConfiguration(config *compute.WindowsConfiguration) []interface{} { +// result := make(map[string]interface{}) +// +// if config.ProvisionVMAgent != nil { +// result["provision_vm_agent"] = *config.ProvisionVMAgent +// } +// +// if config.EnableAutomaticUpdates != nil { +// result["enable_automatic_upgrades"] = *config.EnableAutomaticUpdates +// } +// +// if config.WinRM != nil { +// listeners := make([]map[string]interface{}, 0, len(*config.WinRM.Listeners)) +// for _, i := range *config.WinRM.Listeners { +// listener := make(map[string]interface{}) +// listener["protocol"] = i.Protocol +// +// if i.CertificateURL != nil { +// listener["certificate_url"] = *i.CertificateURL +// } +// +// listeners = append(listeners, listener) +// } +// +// result["winrm"] = listeners +// } +// +// if config.AdditionalUnattendContent != nil { +// content := make([]map[string]interface{}, 0, len(*config.AdditionalUnattendContent)) +// for _, i := range *config.AdditionalUnattendContent { +// c := make(map[string]interface{}) +// c["pass"] = i.PassName +// c["component"] = i.ComponentName +// c["setting_name"] = i.SettingName +// c["content"] = *i.Content +// +// content = append(content, c) +// } +// +// result["additional_unattend_config"] = content +// } +// +// return []interface{}{result} +//} +// +//func flattenAzureRmVirtualMachineOsProfileLinuxConfiguration(config *compute.LinuxConfiguration) []interface{} { +// +// result := make(map[string]interface{}) +// result["disable_password_authentication"] = *config.DisablePasswordAuthentication +// +// if config.SSH != nil && len(*config.SSH.PublicKeys) > 0 { +// ssh_keys := make([]map[string]interface{}, len(*config.SSH.PublicKeys)) +// for _, i := range *config.SSH.PublicKeys { +// key := make(map[string]interface{}) +// key["path"] = *i.Path +// +// if i.KeyData != nil { +// key["key_data"] = *i.KeyData +// } +// +// ssh_keys = append(ssh_keys, key) +// } +// +// result["ssh_keys"] = ssh_keys +// } +// +// return []interface{}{result} +//} +// +//func flattenAzureRmVirtualMachineOsDisk(disk *compute.OSDisk) []interface{} { +// result := make(map[string]interface{}) +// result["name"] = *disk.Name +// result["vhd_uri"] = *disk.Vhd.URI +// result["create_option"] = disk.CreateOption +// result["caching"] = disk.Caching +// +// return []interface{}{result} +//} +// +//func expandAzureRmVirtualMachinePlan(d *schema.ResourceData) (*compute.Plan, error) { +// planConfigs := d.Get("plan").(*schema.Set).List() +// +// if len(planConfigs) != 1 { +// return nil, fmt.Errorf("Cannot specify more than one plan.") +// } +// +// planConfig := planConfigs[0].(map[string]interface{}) +// +// publisher := planConfig["publisher"].(string) +// name := planConfig["name"].(string) +// product := planConfig["product"].(string) +// +// return &compute.Plan{ +// Publisher: &publisher, +// Name: &name, +// Product: &product, +// }, nil +//} +// +//func expandAzureRmVirtualMachineOsProfile(d *schema.ResourceData) (*compute.OSProfile, error) { +// osProfiles := d.Get("os_profile").(*schema.Set).List() +// +// if len(osProfiles) != 1 { +// return nil, fmt.Errorf("[ERROR] Only 1 OS Profile Can be specified for an Azure RM Virtual Machine") +// } +// +// osProfile := osProfiles[0].(map[string]interface{}) +// +// adminUsername := osProfile["admin_username"].(string) +// adminPassword := osProfile["admin_password"].(string) +// +// profile := &compute.OSProfile{ +// AdminUsername: &adminUsername, +// } +// +// if adminPassword != "" { +// profile.AdminPassword = &adminPassword +// } +// +// if _, ok := d.GetOk("os_profile_windows_config"); ok { +// winConfig, err := expandAzureRmVirtualMachineOsProfileWindowsConfig(d) +// if err != nil { +// return nil, err +// } +// if winConfig != nil { +// profile.WindowsConfiguration = winConfig +// } +// } +// +// if _, ok := d.GetOk("os_profile_linux_config"); ok { +// linuxConfig, err := expandAzureRmVirtualMachineOsProfileLinuxConfig(d) +// if err != nil { +// return nil, err +// } +// if linuxConfig != nil { +// profile.LinuxConfiguration = linuxConfig +// } +// } +// +// if _, ok := d.GetOk("os_profile_secrets"); ok { +// secrets := expandAzureRmVirtualMachineOsProfileSecrets(d) +// if secrets != nil { +// profile.Secrets = secrets +// } +// } +// +// if v := osProfile["computer_name"].(string); v != "" { +// profile.ComputerName = &v +// } +// if v := osProfile["custom_data"].(string); v != "" { +// profile.CustomData = &v +// } +// +// return profile, nil +//} +// +//func expandAzureRmVirtualMachineOsProfileSecrets(d *schema.ResourceData) *[]compute.VaultSecretGroup { +// secretsConfig := d.Get("os_profile_secrets").(*schema.Set).List() +// secrets := make([]compute.VaultSecretGroup, 0, len(secretsConfig)) +// +// for _, secretConfig := range secretsConfig { +// config := secretConfig.(map[string]interface{}) +// sourceVaultId := config["source_vault_id"].(string) +// +// vaultSecretGroup := compute.VaultSecretGroup{ +// SourceVault: &compute.SubResource{ +// ID: &sourceVaultId, +// }, +// } +// +// if v := config["vault_certificates"]; v != nil { +// certsConfig := v.(*schema.Set).List() +// certs := make([]compute.VaultCertificate, 0, len(certsConfig)) +// for _, certConfig := range certsConfig { +// config := certConfig.(map[string]interface{}) +// +// certUrl := config["certificate_url"].(string) +// cert := compute.VaultCertificate{ +// CertificateURL: &certUrl, +// } +// if v := config["certificate_store"].(string); v != "" { +// cert.CertificateStore = &v +// } +// +// certs = append(certs, cert) +// } +// vaultSecretGroup.VaultCertificates = &certs +// } +// +// secrets = append(secrets, vaultSecretGroup) +// } +// +// return &secrets +//} +// +//func expandAzureRmVirtualMachineOsProfileLinuxConfig(d *schema.ResourceData) (*compute.LinuxConfiguration, error) { +// osProfilesLinuxConfig := d.Get("os_profile_linux_config").(*schema.Set).List() +// +// if len(osProfilesLinuxConfig) != 1 { +// return nil, fmt.Errorf("[ERROR] Only 1 OS Profile Linux Config Can be specified for an Azure RM Virtual Machine") +// } +// +// linuxConfig := osProfilesLinuxConfig[0].(map[string]interface{}) +// disablePasswordAuth := linuxConfig["disable_password_authentication"].(bool) +// +// config := &compute.LinuxConfiguration{ +// DisablePasswordAuthentication: &disablePasswordAuth, +// } +// +// linuxKeys := linuxConfig["ssh_keys"].([]interface{}) +// sshPublicKeys := []compute.SSHPublicKey{} +// for _, key := range linuxKeys { +// +// sshKey, ok := key.(map[string]interface{}) +// if !ok { +// continue +// } +// path := sshKey["path"].(string) +// keyData := sshKey["key_data"].(string) +// +// sshPublicKey := compute.SSHPublicKey{ +// Path: &path, +// KeyData: &keyData, +// } +// +// sshPublicKeys = append(sshPublicKeys, sshPublicKey) +// } +// +// config.SSH = &compute.SSHConfiguration{ +// PublicKeys: &sshPublicKeys, +// } +// +// return config, nil +//} +// +//func expandAzureRmVirtualMachineOsProfileWindowsConfig(d *schema.ResourceData) (*compute.WindowsConfiguration, error) { +// osProfilesWindowsConfig := d.Get("os_profile_windows_config").(*schema.Set).List() +// +// if len(osProfilesWindowsConfig) != 1 { +// return nil, fmt.Errorf("[ERROR] Only 1 OS Profile Windows Config Can be specified for an Azure RM Virtual Machine") +// } +// +// osProfileConfig := osProfilesWindowsConfig[0].(map[string]interface{}) +// config := &compute.WindowsConfiguration{} +// +// if v := osProfileConfig["provision_vm_agent"]; v != nil { +// provision := v.(bool) +// config.ProvisionVMAgent = &provision +// } +// +// if v := osProfileConfig["enable_automatic_upgrades"]; v != nil { +// update := v.(bool) +// config.EnableAutomaticUpdates = &update +// } +// +// if v := osProfileConfig["winrm"]; v != nil { +// winRm := v.(*schema.Set).List() +// if len(winRm) > 0 { +// winRmListners := make([]compute.WinRMListener, 0, len(winRm)) +// for _, winRmConfig := range winRm { +// config := winRmConfig.(map[string]interface{}) +// +// protocol := config["protocol"].(string) +// winRmListner := compute.WinRMListener{ +// Protocol: compute.ProtocolTypes(protocol), +// } +// if v := config["certificate_url"].(string); v != "" { +// winRmListner.CertificateURL = &v +// } +// +// winRmListners = append(winRmListners, winRmListner) +// } +// config.WinRM = &compute.WinRMConfiguration{ +// Listeners: &winRmListners, +// } +// } +// } +// if v := osProfileConfig["additional_unattend_config"]; v != nil { +// additionalConfig := v.(*schema.Set).List() +// if len(additionalConfig) > 0 { +// additionalConfigContent := make([]compute.AdditionalUnattendContent, 0, len(additionalConfig)) +// for _, addConfig := range additionalConfig { +// config := addConfig.(map[string]interface{}) +// pass := config["pass"].(string) +// component := config["component"].(string) +// settingName := config["setting_name"].(string) +// content := config["content"].(string) +// +// addContent := compute.AdditionalUnattendContent{ +// PassName: compute.PassNames(pass), +// ComponentName: compute.ComponentNames(component), +// SettingName: compute.SettingNames(settingName), +// Content: &content, +// } +// +// additionalConfigContent = append(additionalConfigContent, addContent) +// } +// config.AdditionalUnattendContent = &additionalConfigContent +// } +// } +// return config, nil +//} +// +//func expandAzureRmVirtualMachineDataDisk(d *schema.ResourceData) ([]compute.DataDisk, error) { +// disks := d.Get("storage_data_disk").([]interface{}) +// data_disks := make([]compute.DataDisk, 0, len(disks)) +// for _, disk_config := range disks { +// config := disk_config.(map[string]interface{}) +// +// name := config["name"].(string) +// vhd := config["vhd_uri"].(string) +// createOption := config["create_option"].(string) +// lun := config["lun"].(int) +// disk_size := config["disk_size_gb"].(int) +// +// data_disk := compute.DataDisk{ +// Name: &name, +// Vhd: &compute.VirtualHardDisk{ +// URI: &vhd, +// }, +// Lun: &lun, +// DiskSizeGB: &disk_size, +// CreateOption: compute.DiskCreateOptionTypes(createOption), +// } +// +// data_disks = append(data_disks, data_disk) +// } +// +// return data_disks, nil +//} +// +//func expandAzureRmVirtualMachineImageReference(d *schema.ResourceData) (*compute.ImageReference, error) { +// storageImageRefs := d.Get("storage_image_reference").(*schema.Set).List() +// +// if len(storageImageRefs) != 1 { +// return nil, fmt.Errorf("Cannot specify more than one storage_image_reference.") +// } +// +// storageImageRef := storageImageRefs[0].(map[string]interface{}) +// +// publisher := storageImageRef["publisher"].(string) +// offer := storageImageRef["offer"].(string) +// sku := storageImageRef["sku"].(string) +// version := storageImageRef["version"].(string) +// +// return &compute.ImageReference{ +// Publisher: &publisher, +// Offer: &offer, +// Sku: &sku, +// Version: &version, +// }, nil +//} +// +//func expandAzureRmVirtualMachineNetworkProfile(d *schema.ResourceData) compute.NetworkProfile { +// nicIds := d.Get("network_interface_ids").(*schema.Set).List() +// network_interfaces := make([]compute.NetworkInterfaceReference, 0, len(nicIds)) +// +// network_profile := compute.NetworkProfile{} +// +// for _, nic := range nicIds { +// id := nic.(string) +// network_interface := compute.NetworkInterfaceReference{ +// ID: &id, +// } +// network_interfaces = append(network_interfaces, network_interface) +// } +// +// network_profile.NetworkInterfaces = &network_interfaces +// +// return network_profile +//} +// +//func expandAzureRmVirtualMachineOsDisk(d *schema.ResourceData) (*compute.OSDisk, error) { +// disks := d.Get("storage_os_disk").(*schema.Set).List() +// +// if len(disks) != 1 { +// return nil, fmt.Errorf("[ERROR] Only 1 OS Disk Can be specified for an Azure RM Virtual Machine") +// } +// +// disk := disks[0].(map[string]interface{}) +// +// name := disk["name"].(string) +// vhdURI := disk["vhd_uri"].(string) +// imageURI := disk["image_uri"].(string) +// createOption := disk["create_option"].(string) +// +// osDisk := &compute.OSDisk{ +// Name: &name, +// Vhd: &compute.VirtualHardDisk{ +// URI: &vhdURI, +// }, +// CreateOption: compute.DiskCreateOptionTypes(createOption), +// } +// +// if v := disk["image_uri"].(string); v != "" { +// osDisk.Image = &compute.VirtualHardDisk{ +// URI: &imageURI, +// } +// } +// +// if v := disk["os_type"].(string); v != "" { +// if v == "linux" { +// osDisk.OsType = compute.Linux +// } else if v == "windows" { +// osDisk.OsType = compute.Windows +// } else { +// return nil, fmt.Errorf("[ERROR] os_type must be 'linux' or 'windows'") +// } +// } +// +// if v := disk["caching"].(string); v != "" { +// osDisk.Caching = compute.CachingTypes(v) +// } +// +// return osDisk, nil +//} diff --git a/builtin/providers/azurerm/resource_arm_virtual_machine_test.go b/builtin/providers/azurerm/resource_arm_virtual_machine_test.go index 8e11e9fa20..099de061df 100644 --- a/builtin/providers/azurerm/resource_arm_virtual_machine_test.go +++ b/builtin/providers/azurerm/resource_arm_virtual_machine_test.go @@ -1,510 +1,510 @@ package azurerm -import ( - "fmt" - "net/http" - "testing" - - "github.com/hashicorp/terraform/helper/acctest" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestAccAzureRMVirtualMachine_basicLinuxMachine(t *testing.T) { - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri) - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMVirtualMachineDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), - ), - }, - }, - }) -} - -func TestAccAzureRMVirtualMachine_tags(t *testing.T) { - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachineUpdated, ri, ri, ri, ri, ri, ri, ri) - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMVirtualMachineDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "tags.#", "2"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "tags.environment", "Production"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "tags.cost-center", "Ops"), - ), - }, - - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "tags.#", "1"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "tags.environment", "Production"), - ), - }, - }, - }) -} - -//This is a regression test around https://github.com/hashicorp/terraform/issues/6517 -//Because we use CreateOrUpdate, we were sending an empty password on update requests -func TestAccAzureRMVirtualMachine_updateMachineSize(t *testing.T) { - ri := acctest.RandInt() - preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri) - postConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_updatedLinuxMachine, ri, ri, ri, ri, ri, ri, ri) - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMVirtualMachineDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: preConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "vm_size", "Standard_A0"), - ), - }, - resource.TestStep{ - Config: postConfig, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), - resource.TestCheckResourceAttr( - "azurerm_virtual_machine.test", "vm_size", "Standard_A1"), - ), - }, - }, - }) -} - -func TestAccAzureRMVirtualMachine_basicWindowsMachine(t *testing.T) { - ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMVirtualMachine_basicWindowsMachine, ri, ri, ri, ri, ri, ri) - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testCheckAzureRMVirtualMachineDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: config, - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), - ), - }, - }, - }) -} - -func testCheckAzureRMVirtualMachineExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - // Ensure we have enough information in state to look up in API - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("Not found: %s", name) - } - - vmName := rs.Primary.Attributes["name"] - resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] - if !hasResourceGroup { - return fmt.Errorf("Bad: no resource group found in state for virtual machine: %s", vmName) - } - - conn := testAccProvider.Meta().(*ArmClient).vmClient - - resp, err := conn.Get(resourceGroup, vmName, "") - if err != nil { - return fmt.Errorf("Bad: Get on vmClient: %s", err) - } - - if resp.StatusCode == http.StatusNotFound { - return fmt.Errorf("Bad: VirtualMachine %q (resource group: %q) does not exist", vmName, resourceGroup) - } - - return nil - } -} - -func testCheckAzureRMVirtualMachineDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*ArmClient).vmClient - - for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_virtual_machine" { - continue - } - - name := rs.Primary.Attributes["name"] - resourceGroup := rs.Primary.Attributes["resource_group_name"] - - resp, err := conn.Get(resourceGroup, name, "") - - if err != nil { - return nil - } - - if resp.StatusCode != http.StatusNotFound { - return fmt.Errorf("Virtual Machine still exists:\n%#v", resp.Properties) - } - } - - return nil -} - -var testAccAzureRMVirtualMachine_basicLinuxMachine = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acctvn-%d" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "acctsub-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acctni-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } -} - -resource "azurerm_storage_account" "test" { - name = "accsa%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "westus" - account_type = "Standard_LRS" - - tags { - environment = "staging" - } -} - -resource "azurerm_storage_container" "test" { - name = "vhds" - resource_group_name = "${azurerm_resource_group.test.name}" - storage_account_name = "${azurerm_storage_account.test.name}" - container_access_type = "private" -} - -resource "azurerm_virtual_machine" "test" { - name = "acctvm-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - network_interface_ids = ["${azurerm_network_interface.test.id}"] - vm_size = "Standard_A0" - - storage_image_reference { - publisher = "Canonical" - offer = "UbuntuServer" - sku = "14.04.2-LTS" - version = "latest" - } - - storage_os_disk { - name = "myosdisk1" - vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "hostname%d" - admin_username = "testadmin" - admin_password = "Password1234!" - } - - os_profile_linux_config { - disable_password_authentication = false - } - - tags { - environment = "Production" - cost-center = "Ops" - } -} -` - -var testAccAzureRMVirtualMachine_basicLinuxMachineUpdated = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acctvn-%d" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "acctsub-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acctni-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } -} - -resource "azurerm_storage_account" "test" { - name = "accsa%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "westus" - account_type = "Standard_LRS" - - tags { - environment = "staging" - } -} - -resource "azurerm_storage_container" "test" { - name = "vhds" - resource_group_name = "${azurerm_resource_group.test.name}" - storage_account_name = "${azurerm_storage_account.test.name}" - container_access_type = "private" -} - -resource "azurerm_virtual_machine" "test" { - name = "acctvm-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - network_interface_ids = ["${azurerm_network_interface.test.id}"] - vm_size = "Standard_A0" - - storage_image_reference { - publisher = "Canonical" - offer = "UbuntuServer" - sku = "14.04.2-LTS" - version = "latest" - } - - storage_os_disk { - name = "myosdisk1" - vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "hostname%d" - admin_username = "testadmin" - admin_password = "Password1234!" - } - - os_profile_linux_config { - disable_password_authentication = false - } - - tags { - environment = "Production" - } -} -` - -var testAccAzureRMVirtualMachine_updatedLinuxMachine = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acctvn-%d" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "acctsub-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acctni-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } -} - -resource "azurerm_storage_account" "test" { - name = "accsa%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "westus" - account_type = "Standard_LRS" - - tags { - environment = "staging" - } -} - -resource "azurerm_storage_container" "test" { - name = "vhds" - resource_group_name = "${azurerm_resource_group.test.name}" - storage_account_name = "${azurerm_storage_account.test.name}" - container_access_type = "private" -} - -resource "azurerm_virtual_machine" "test" { - name = "acctvm-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - network_interface_ids = ["${azurerm_network_interface.test.id}"] - vm_size = "Standard_A1" - - storage_image_reference { - publisher = "Canonical" - offer = "UbuntuServer" - sku = "14.04.2-LTS" - version = "latest" - } - - storage_os_disk { - name = "myosdisk1" - vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "hostname%d" - admin_username = "testadmin" - admin_password = "Password1234!" - } - - os_profile_linux_config { - disable_password_authentication = false - } -} -` - -var testAccAzureRMVirtualMachine_basicWindowsMachine = ` -resource "azurerm_resource_group" "test" { - name = "acctestrg-%d" - location = "West US" -} - -resource "azurerm_virtual_network" "test" { - name = "acctvn-%d" - address_space = ["10.0.0.0/16"] - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" -} - -resource "azurerm_subnet" "test" { - name = "acctsub-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" - address_prefix = "10.0.2.0/24" -} - -resource "azurerm_network_interface" "test" { - name = "acctni-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - - ip_configuration { - name = "testconfiguration1" - subnet_id = "${azurerm_subnet.test.id}" - private_ip_address_allocation = "dynamic" - } -} - -resource "azurerm_storage_account" "test" { - name = "accsa%d" - resource_group_name = "${azurerm_resource_group.test.name}" - location = "westus" - account_type = "Standard_LRS" - - tags { - environment = "staging" - } -} - -resource "azurerm_storage_container" "test" { - name = "vhds" - resource_group_name = "${azurerm_resource_group.test.name}" - storage_account_name = "${azurerm_storage_account.test.name}" - container_access_type = "private" -} - -resource "azurerm_virtual_machine" "test" { - name = "acctvm-%d" - location = "West US" - resource_group_name = "${azurerm_resource_group.test.name}" - network_interface_ids = ["${azurerm_network_interface.test.id}"] - vm_size = "Standard_A0" - - storage_image_reference { - publisher = "MicrosoftWindowsServer" - offer = "WindowsServer" - sku = "2012-Datacenter" - version = "latest" - } - - storage_os_disk { - name = "myosdisk1" - vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "winhost01" - admin_username = "testadmin" - admin_password = "Password1234!" - } - - os_profile_windows_config { - enable_automatic_upgrades = false - provision_vm_agent = true - } -} -` +//import ( +// "fmt" +// "net/http" +// "testing" +// +// "github.com/hashicorp/terraform/helper/acctest" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/terraform" +//) +// +//func TestAccAzureRMVirtualMachine_basicLinuxMachine(t *testing.T) { +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri) +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMVirtualMachineDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMVirtualMachine_tags(t *testing.T) { +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachineUpdated, ri, ri, ri, ri, ri, ri, ri) +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMVirtualMachineDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "tags.#", "2"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "tags.environment", "Production"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "tags.cost-center", "Ops"), +// ), +// }, +// +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "tags.#", "1"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "tags.environment", "Production"), +// ), +// }, +// }, +// }) +//} +// +////This is a regression test around https://github.com/hashicorp/terraform/issues/6517 +////Because we use CreateOrUpdate, we were sending an empty password on update requests +//func TestAccAzureRMVirtualMachine_updateMachineSize(t *testing.T) { +// ri := acctest.RandInt() +// preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri) +// postConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_updatedLinuxMachine, ri, ri, ri, ri, ri, ri, ri) +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMVirtualMachineDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: preConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "vm_size", "Standard_A0"), +// ), +// }, +// resource.TestStep{ +// Config: postConfig, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), +// resource.TestCheckResourceAttr( +// "azurerm_virtual_machine.test", "vm_size", "Standard_A1"), +// ), +// }, +// }, +// }) +//} +// +//func TestAccAzureRMVirtualMachine_basicWindowsMachine(t *testing.T) { +// ri := acctest.RandInt() +// config := fmt.Sprintf(testAccAzureRMVirtualMachine_basicWindowsMachine, ri, ri, ri, ri, ri, ri) +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testCheckAzureRMVirtualMachineDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: config, +// Check: resource.ComposeTestCheckFunc( +// testCheckAzureRMVirtualMachineExists("azurerm_virtual_machine.test"), +// ), +// }, +// }, +// }) +//} +// +//func testCheckAzureRMVirtualMachineExists(name string) resource.TestCheckFunc { +// return func(s *terraform.State) error { +// // Ensure we have enough information in state to look up in API +// rs, ok := s.RootModule().Resources[name] +// if !ok { +// return fmt.Errorf("Not found: %s", name) +// } +// +// vmName := rs.Primary.Attributes["name"] +// resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] +// if !hasResourceGroup { +// return fmt.Errorf("Bad: no resource group found in state for virtual machine: %s", vmName) +// } +// +// conn := testAccProvider.Meta().(*ArmClient).vmClient +// +// resp, err := conn.Get(resourceGroup, vmName, "") +// if err != nil { +// return fmt.Errorf("Bad: Get on vmClient: %s", err) +// } +// +// if resp.StatusCode == http.StatusNotFound { +// return fmt.Errorf("Bad: VirtualMachine %q (resource group: %q) does not exist", vmName, resourceGroup) +// } +// +// return nil +// } +//} +// +//func testCheckAzureRMVirtualMachineDestroy(s *terraform.State) error { +// conn := testAccProvider.Meta().(*ArmClient).vmClient +// +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "azurerm_virtual_machine" { +// continue +// } +// +// name := rs.Primary.Attributes["name"] +// resourceGroup := rs.Primary.Attributes["resource_group_name"] +// +// resp, err := conn.Get(resourceGroup, name, "") +// +// if err != nil { +// return nil +// } +// +// if resp.StatusCode != http.StatusNotFound { +// return fmt.Errorf("Virtual Machine still exists:\n%#v", resp.Properties) +// } +// } +// +// return nil +//} +// +//var testAccAzureRMVirtualMachine_basicLinuxMachine = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acctvn-%d" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "acctsub-%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" +//} +// +//resource "azurerm_network_interface" "test" { +// name = "acctni-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +//} +// +//resource "azurerm_storage_account" "test" { +// name = "accsa%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// location = "westus" +// account_type = "Standard_LRS" +// +// tags { +// environment = "staging" +// } +//} +// +//resource "azurerm_storage_container" "test" { +// name = "vhds" +// resource_group_name = "${azurerm_resource_group.test.name}" +// storage_account_name = "${azurerm_storage_account.test.name}" +// container_access_type = "private" +//} +// +//resource "azurerm_virtual_machine" "test" { +// name = "acctvm-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// network_interface_ids = ["${azurerm_network_interface.test.id}"] +// vm_size = "Standard_A0" +// +// storage_image_reference { +// publisher = "Canonical" +// offer = "UbuntuServer" +// sku = "14.04.2-LTS" +// version = "latest" +// } +// +// storage_os_disk { +// name = "myosdisk1" +// vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" +// caching = "ReadWrite" +// create_option = "FromImage" +// } +// +// os_profile { +// computer_name = "hostname%d" +// admin_username = "testadmin" +// admin_password = "Password1234!" +// } +// +// os_profile_linux_config { +// disable_password_authentication = false +// } +// +// tags { +// environment = "Production" +// cost-center = "Ops" +// } +//} +//` +// +//var testAccAzureRMVirtualMachine_basicLinuxMachineUpdated = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acctvn-%d" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "acctsub-%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" +//} +// +//resource "azurerm_network_interface" "test" { +// name = "acctni-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +//} +// +//resource "azurerm_storage_account" "test" { +// name = "accsa%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// location = "westus" +// account_type = "Standard_LRS" +// +// tags { +// environment = "staging" +// } +//} +// +//resource "azurerm_storage_container" "test" { +// name = "vhds" +// resource_group_name = "${azurerm_resource_group.test.name}" +// storage_account_name = "${azurerm_storage_account.test.name}" +// container_access_type = "private" +//} +// +//resource "azurerm_virtual_machine" "test" { +// name = "acctvm-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// network_interface_ids = ["${azurerm_network_interface.test.id}"] +// vm_size = "Standard_A0" +// +// storage_image_reference { +// publisher = "Canonical" +// offer = "UbuntuServer" +// sku = "14.04.2-LTS" +// version = "latest" +// } +// +// storage_os_disk { +// name = "myosdisk1" +// vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" +// caching = "ReadWrite" +// create_option = "FromImage" +// } +// +// os_profile { +// computer_name = "hostname%d" +// admin_username = "testadmin" +// admin_password = "Password1234!" +// } +// +// os_profile_linux_config { +// disable_password_authentication = false +// } +// +// tags { +// environment = "Production" +// } +//} +//` +// +//var testAccAzureRMVirtualMachine_updatedLinuxMachine = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acctvn-%d" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "acctsub-%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" +//} +// +//resource "azurerm_network_interface" "test" { +// name = "acctni-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +//} +// +//resource "azurerm_storage_account" "test" { +// name = "accsa%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// location = "westus" +// account_type = "Standard_LRS" +// +// tags { +// environment = "staging" +// } +//} +// +//resource "azurerm_storage_container" "test" { +// name = "vhds" +// resource_group_name = "${azurerm_resource_group.test.name}" +// storage_account_name = "${azurerm_storage_account.test.name}" +// container_access_type = "private" +//} +// +//resource "azurerm_virtual_machine" "test" { +// name = "acctvm-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// network_interface_ids = ["${azurerm_network_interface.test.id}"] +// vm_size = "Standard_A1" +// +// storage_image_reference { +// publisher = "Canonical" +// offer = "UbuntuServer" +// sku = "14.04.2-LTS" +// version = "latest" +// } +// +// storage_os_disk { +// name = "myosdisk1" +// vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" +// caching = "ReadWrite" +// create_option = "FromImage" +// } +// +// os_profile { +// computer_name = "hostname%d" +// admin_username = "testadmin" +// admin_password = "Password1234!" +// } +// +// os_profile_linux_config { +// disable_password_authentication = false +// } +//} +//` +// +//var testAccAzureRMVirtualMachine_basicWindowsMachine = ` +//resource "azurerm_resource_group" "test" { +// name = "acctestrg-%d" +// location = "West US" +//} +// +//resource "azurerm_virtual_network" "test" { +// name = "acctvn-%d" +// address_space = ["10.0.0.0/16"] +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +//} +// +//resource "azurerm_subnet" "test" { +// name = "acctsub-%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// virtual_network_name = "${azurerm_virtual_network.test.name}" +// address_prefix = "10.0.2.0/24" +//} +// +//resource "azurerm_network_interface" "test" { +// name = "acctni-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// +// ip_configuration { +// name = "testconfiguration1" +// subnet_id = "${azurerm_subnet.test.id}" +// private_ip_address_allocation = "dynamic" +// } +//} +// +//resource "azurerm_storage_account" "test" { +// name = "accsa%d" +// resource_group_name = "${azurerm_resource_group.test.name}" +// location = "westus" +// account_type = "Standard_LRS" +// +// tags { +// environment = "staging" +// } +//} +// +//resource "azurerm_storage_container" "test" { +// name = "vhds" +// resource_group_name = "${azurerm_resource_group.test.name}" +// storage_account_name = "${azurerm_storage_account.test.name}" +// container_access_type = "private" +//} +// +//resource "azurerm_virtual_machine" "test" { +// name = "acctvm-%d" +// location = "West US" +// resource_group_name = "${azurerm_resource_group.test.name}" +// network_interface_ids = ["${azurerm_network_interface.test.id}"] +// vm_size = "Standard_A0" +// +// storage_image_reference { +// publisher = "MicrosoftWindowsServer" +// offer = "WindowsServer" +// sku = "2012-Datacenter" +// version = "latest" +// } +// +// storage_os_disk { +// name = "myosdisk1" +// vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" +// caching = "ReadWrite" +// create_option = "FromImage" +// } +// +// os_profile { +// computer_name = "winhost01" +// admin_username = "testadmin" +// admin_password = "Password1234!" +// } +// +// os_profile_windows_config { +// enable_automatic_upgrades = false +// provision_vm_agent = true +// } +//} +//` diff --git a/builtin/providers/azurerm/resource_arm_virtual_network.go b/builtin/providers/azurerm/resource_arm_virtual_network.go index c6b4699071..fb1248db89 100644 --- a/builtin/providers/azurerm/resource_arm_virtual_network.go +++ b/builtin/providers/azurerm/resource_arm_virtual_network.go @@ -1,257 +1,257 @@ package azurerm -import ( - "fmt" - "log" - "net/http" - "time" - - "github.com/Azure/azure-sdk-for-go/arm/network" - "github.com/hashicorp/terraform/helper/hashcode" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" -) - -func resourceArmVirtualNetwork() *schema.Resource { - return &schema.Resource{ - Create: resourceArmVirtualNetworkCreate, - Read: resourceArmVirtualNetworkRead, - Update: resourceArmVirtualNetworkCreate, - Delete: resourceArmVirtualNetworkDelete, - - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "address_space": &schema.Schema{ - Type: schema.TypeList, - Required: true, - Elem: &schema.Schema{Type: schema.TypeString}, - }, - - "dns_servers": &schema.Schema{ - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - - "subnet": &schema.Schema{ - Type: schema.TypeSet, - Optional: true, - Computed: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "address_prefix": &schema.Schema{ - Type: schema.TypeString, - Required: true, - }, - "security_group": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - }, - }, - }, - Set: resourceAzureSubnetHash, - }, - - "location": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - StateFunc: azureRMNormalizeLocation, - }, - - "resource_group_name": &schema.Schema{ - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "tags": tagsSchema(), - }, - } -} - -func resourceArmVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*ArmClient) - vnetClient := client.vnetClient - - log.Printf("[INFO] preparing arguments for Azure ARM virtual network 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{}) - - vnet := network.VirtualNetwork{ - Name: &name, - Location: &location, - Properties: getVirtualNetworkProperties(d), - Tags: expandTags(tags), - } - - resp, err := vnetClient.CreateOrUpdate(resGroup, name, vnet) - if err != nil { - return err - } - - d.SetId(*resp.ID) - - log.Printf("[DEBUG] Waiting for Virtual Network (%s) to become available", name) - stateConf := &resource.StateChangeConf{ - Pending: []string{"Accepted", "Updating"}, - Target: []string{"Succeeded"}, - Refresh: virtualNetworkStateRefreshFunc(client, resGroup, name), - Timeout: 10 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf("Error waiting for Virtual Network (%s) to become available: %s", name, err) - } - - return resourceArmVirtualNetworkRead(d, meta) -} - -func resourceArmVirtualNetworkRead(d *schema.ResourceData, meta interface{}) error { - vnetClient := meta.(*ArmClient).vnetClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["virtualNetworks"] - - resp, err := vnetClient.Get(resGroup, name, "") - if resp.StatusCode == http.StatusNotFound { - d.SetId("") - return nil - } - if err != nil { - return fmt.Errorf("Error making Read request on Azure virtual network %s: %s", name, err) - } - vnet := *resp.Properties - - // update appropriate values - d.Set("address_space", vnet.AddressSpace.AddressPrefixes) - - subnets := &schema.Set{ - F: resourceAzureSubnetHash, - } - - for _, subnet := range *vnet.Subnets { - s := map[string]interface{}{} - - s["name"] = *subnet.Name - s["address_prefix"] = *subnet.Properties.AddressPrefix - if subnet.Properties.NetworkSecurityGroup != nil { - s["security_group"] = *subnet.Properties.NetworkSecurityGroup.ID - } - - subnets.Add(s) - } - d.Set("subnet", subnets) - - dnses := []string{} - for _, dns := range *vnet.DhcpOptions.DNSServers { - dnses = append(dnses, dns) - } - d.Set("dns_servers", dnses) - - flattenAndSetTags(d, resp.Tags) - - return nil -} - -func resourceArmVirtualNetworkDelete(d *schema.ResourceData, meta interface{}) error { - vnetClient := meta.(*ArmClient).vnetClient - - id, err := parseAzureResourceID(d.Id()) - if err != nil { - return err - } - resGroup := id.ResourceGroup - name := id.Path["virtualNetworks"] - - _, err = vnetClient.Delete(resGroup, name) - - return err -} - -func getVirtualNetworkProperties(d *schema.ResourceData) *network.VirtualNetworkPropertiesFormat { - // first; get address space prefixes: - prefixes := []string{} - for _, prefix := range d.Get("address_space").([]interface{}) { - prefixes = append(prefixes, prefix.(string)) - } - - // then; the dns servers: - dnses := []string{} - for _, dns := range d.Get("dns_servers").([]interface{}) { - dnses = append(dnses, dns.(string)) - } - - // then; the subnets: - subnets := []network.Subnet{} - if subs := d.Get("subnet").(*schema.Set); subs.Len() > 0 { - for _, subnet := range subs.List() { - subnet := subnet.(map[string]interface{}) - - name := subnet["name"].(string) - prefix := subnet["address_prefix"].(string) - secGroup := subnet["security_group"].(string) - - var subnetObj network.Subnet - subnetObj.Name = &name - subnetObj.Properties = &network.SubnetPropertiesFormat{} - subnetObj.Properties.AddressPrefix = &prefix - - if secGroup != "" { - subnetObj.Properties.NetworkSecurityGroup = &network.SecurityGroup{ - ID: &secGroup, - } - } - - subnets = append(subnets, subnetObj) - } - } - - // finally; return the struct: - return &network.VirtualNetworkPropertiesFormat{ - AddressSpace: &network.AddressSpace{ - AddressPrefixes: &prefixes, - }, - DhcpOptions: &network.DhcpOptions{ - DNSServers: &dnses, - }, - Subnets: &subnets, - } -} - -func resourceAzureSubnetHash(v interface{}) int { - m := v.(map[string]interface{}) - subnet := m["name"].(string) + m["address_prefix"].(string) - if securityGroup, present := m["security_group"]; present { - subnet = subnet + securityGroup.(string) - } - return hashcode.String(subnet) -} - -func virtualNetworkStateRefreshFunc(client *ArmClient, resourceGroupName string, networkName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - res, err := client.vnetClient.Get(resourceGroupName, networkName, "") - if err != nil { - return nil, "", fmt.Errorf("Error issuing read request in virtualNetworkStateRefreshFunc to Azure ARM for virtual network '%s' (RG: '%s'): %s", networkName, resourceGroupName, err) - } - - return res, *res.Properties.ProvisioningState, nil - } -} +//import ( +// "fmt" +// "log" +// "net/http" +// "time" +// +// "github.com/Azure/azure-sdk-for-go/arm/network" +// "github.com/hashicorp/terraform/helper/hashcode" +// "github.com/hashicorp/terraform/helper/resource" +// "github.com/hashicorp/terraform/helper/schema" +//) +// +//func resourceArmVirtualNetwork() *schema.Resource { +// return &schema.Resource{ +// Create: resourceArmVirtualNetworkCreate, +// Read: resourceArmVirtualNetworkRead, +// Update: resourceArmVirtualNetworkCreate, +// Delete: resourceArmVirtualNetworkDelete, +// +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "address_space": &schema.Schema{ +// Type: schema.TypeList, +// Required: true, +// Elem: &schema.Schema{Type: schema.TypeString}, +// }, +// +// "dns_servers": &schema.Schema{ +// Type: schema.TypeList, +// Optional: true, +// Elem: &schema.Schema{ +// Type: schema.TypeString, +// }, +// }, +// +// "subnet": &schema.Schema{ +// Type: schema.TypeSet, +// Optional: true, +// Computed: true, +// Elem: &schema.Resource{ +// Schema: map[string]*schema.Schema{ +// "name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "address_prefix": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// }, +// "security_group": &schema.Schema{ +// Type: schema.TypeString, +// Optional: true, +// }, +// }, +// }, +// Set: resourceAzureSubnetHash, +// }, +// +// "location": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// StateFunc: azureRMNormalizeLocation, +// }, +// +// "resource_group_name": &schema.Schema{ +// Type: schema.TypeString, +// Required: true, +// ForceNew: true, +// }, +// +// "tags": tagsSchema(), +// }, +// } +//} +// +//func resourceArmVirtualNetworkCreate(d *schema.ResourceData, meta interface{}) error { +// client := meta.(*ArmClient) +// vnetClient := client.vnetClient +// +// log.Printf("[INFO] preparing arguments for Azure ARM virtual network 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{}) +// +// vnet := network.VirtualNetwork{ +// Name: &name, +// Location: &location, +// Properties: getVirtualNetworkProperties(d), +// Tags: expandTags(tags), +// } +// +// resp, err := vnetClient.CreateOrUpdate(resGroup, name, vnet) +// if err != nil { +// return err +// } +// +// d.SetId(*resp.ID) +// +// log.Printf("[DEBUG] Waiting for Virtual Network (%s) to become available", name) +// stateConf := &resource.StateChangeConf{ +// Pending: []string{"Accepted", "Updating"}, +// Target: []string{"Succeeded"}, +// Refresh: virtualNetworkStateRefreshFunc(client, resGroup, name), +// Timeout: 10 * time.Minute, +// } +// if _, err := stateConf.WaitForState(); err != nil { +// return fmt.Errorf("Error waiting for Virtual Network (%s) to become available: %s", name, err) +// } +// +// return resourceArmVirtualNetworkRead(d, meta) +//} +// +//func resourceArmVirtualNetworkRead(d *schema.ResourceData, meta interface{}) error { +// vnetClient := meta.(*ArmClient).vnetClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["virtualNetworks"] +// +// resp, err := vnetClient.Get(resGroup, name, "") +// if resp.StatusCode == http.StatusNotFound { +// d.SetId("") +// return nil +// } +// if err != nil { +// return fmt.Errorf("Error making Read request on Azure virtual network %s: %s", name, err) +// } +// vnet := *resp.Properties +// +// // update appropriate values +// d.Set("address_space", vnet.AddressSpace.AddressPrefixes) +// +// subnets := &schema.Set{ +// F: resourceAzureSubnetHash, +// } +// +// for _, subnet := range *vnet.Subnets { +// s := map[string]interface{}{} +// +// s["name"] = *subnet.Name +// s["address_prefix"] = *subnet.Properties.AddressPrefix +// if subnet.Properties.NetworkSecurityGroup != nil { +// s["security_group"] = *subnet.Properties.NetworkSecurityGroup.ID +// } +// +// subnets.Add(s) +// } +// d.Set("subnet", subnets) +// +// dnses := []string{} +// for _, dns := range *vnet.DhcpOptions.DNSServers { +// dnses = append(dnses, dns) +// } +// d.Set("dns_servers", dnses) +// +// flattenAndSetTags(d, resp.Tags) +// +// return nil +//} +// +//func resourceArmVirtualNetworkDelete(d *schema.ResourceData, meta interface{}) error { +// vnetClient := meta.(*ArmClient).vnetClient +// +// id, err := parseAzureResourceID(d.Id()) +// if err != nil { +// return err +// } +// resGroup := id.ResourceGroup +// name := id.Path["virtualNetworks"] +// +// _, err = vnetClient.Delete(resGroup, name) +// +// return err +//} +// +//func getVirtualNetworkProperties(d *schema.ResourceData) *network.VirtualNetworkPropertiesFormat { +// // first; get address space prefixes: +// prefixes := []string{} +// for _, prefix := range d.Get("address_space").([]interface{}) { +// prefixes = append(prefixes, prefix.(string)) +// } +// +// // then; the dns servers: +// dnses := []string{} +// for _, dns := range d.Get("dns_servers").([]interface{}) { +// dnses = append(dnses, dns.(string)) +// } +// +// // then; the subnets: +// subnets := []network.Subnet{} +// if subs := d.Get("subnet").(*schema.Set); subs.Len() > 0 { +// for _, subnet := range subs.List() { +// subnet := subnet.(map[string]interface{}) +// +// name := subnet["name"].(string) +// prefix := subnet["address_prefix"].(string) +// secGroup := subnet["security_group"].(string) +// +// var subnetObj network.Subnet +// subnetObj.Name = &name +// subnetObj.Properties = &network.SubnetPropertiesFormat{} +// subnetObj.Properties.AddressPrefix = &prefix +// +// if secGroup != "" { +// subnetObj.Properties.NetworkSecurityGroup = &network.SecurityGroup{ +// ID: &secGroup, +// } +// } +// +// subnets = append(subnets, subnetObj) +// } +// } +// +// // finally; return the struct: +// return &network.VirtualNetworkPropertiesFormat{ +// AddressSpace: &network.AddressSpace{ +// AddressPrefixes: &prefixes, +// }, +// DhcpOptions: &network.DhcpOptions{ +// DNSServers: &dnses, +// }, +// Subnets: &subnets, +// } +//} +// +//func resourceAzureSubnetHash(v interface{}) int { +// m := v.(map[string]interface{}) +// subnet := m["name"].(string) + m["address_prefix"].(string) +// if securityGroup, present := m["security_group"]; present { +// subnet = subnet + securityGroup.(string) +// } +// return hashcode.String(subnet) +//} +// +//func virtualNetworkStateRefreshFunc(client *ArmClient, resourceGroupName string, networkName string) resource.StateRefreshFunc { +// return func() (interface{}, string, error) { +// res, err := client.vnetClient.Get(resourceGroupName, networkName, "") +// if err != nil { +// return nil, "", fmt.Errorf("Error issuing read request in virtualNetworkStateRefreshFunc to Azure ARM for virtual network '%s' (RG: '%s'): %s", networkName, resourceGroupName, err) +// } +// +// return res, *res.Properties.ProvisioningState, nil +// } +//}