func testAccCheckInstanceDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_instance" { continue } // Try to find the resource resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{ InstanceIds: []*string{aws.String(rs.Primary.ID)}, }) if err == nil { for _, r := range resp.Reservations { for _, i := range r.Instances { if i.State != nil && *i.State.Name != "terminated" { return fmt.Errorf("Found unterminated instance: %s", i) } } } } // Verify the error is what we want if ae, ok := err.(awserr.Error); ok && ae.Code() == "InvalidInstanceID.NotFound" { continue } return err } return nil }
func providerConfigure(p *schema.Provider) schema.ConfigureFunc { return func(d *schema.ResourceData) (interface{}, error) { config := &Config{ SubscriptionID: d.Get("subscription_id").(string), ClientID: d.Get("client_id").(string), ClientSecret: d.Get("client_secret").(string), TenantID: d.Get("tenant_id").(string), } if err := config.validate(); err != nil { return nil, err } client, err := config.getArmClient() if err != nil { return nil, err } client.StopContext = p.StopContext() err = registerAzureResourceProvidersWithSubscription(client.rivieraClient) if err != nil { return nil, err } return client, nil } }
func testAccCheckInstanceDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_instance" { continue } // Try to find the resource var err error resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{ InstanceIds: []*string{aws.String(rs.Primary.ID)}, }) if err == nil { if len(resp.Reservations) > 0 { return fmt.Errorf("still exist.") } return nil } // Verify the error is what we want ec2err, ok := err.(awserr.Error) if !ok { return err } if ec2err.Code() != "InvalidInstanceID.NotFound" { return err } } return nil }
func testAccCheckRoute53ZoneAssociationExistsWithProvider(s *terraform.State, n string, zone *route53.HostedZone, provider *schema.Provider) error { rs, ok := s.RootModule().Resources[n] if !ok { return fmt.Errorf("Not found: %s", n) } if rs.Primary.ID == "" { return fmt.Errorf("No zone association ID is set") } zone_id, vpc_id := resourceAwsRoute53ZoneAssociationParseId(rs.Primary.ID) conn := provider.Meta().(*AWSClient).r53conn resp, err := conn.GetHostedZone(&route53.GetHostedZoneInput{Id: aws.String(zone_id)}) if err != nil { return fmt.Errorf("Hosted zone err: %v", err) } exists := false for _, vpc := range resp.VPCs { if vpc_id == *vpc.VPCId { exists = true } } if !exists { return fmt.Errorf("Hosted zone association not found") } *zone = *resp.HostedZone return nil }
func testAccCheckRoute53ZoneDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).r53conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_route53_zone" { continue } _, err := conn.GetHostedZone(&route53.GetHostedZoneInput{ID: aws.String(rs.Primary.ID)}) if err == nil { return fmt.Errorf("Hosted zone still exists") } } return nil }
func testAccCheckRoute53DelegationSetDestroy(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).r53conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_route53_delegation_set" { continue } _, err := conn.GetReusableDelegationSet(&route53.GetReusableDelegationSetInput{Id: aws.String(rs.Primary.ID)}) if err == nil { return fmt.Errorf("Delegation set still exists") } } return nil }
func testAccCheckAWSS3BucketDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).s3conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_s3_bucket" { continue } _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ Bucket: aws.String(rs.Primary.ID), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" { return nil } return err } } return nil }
func providerConfigure(p *schema.Provider) schema.ConfigureFunc { return func(d *schema.ResourceData) (interface{}, error) { config := &Config{ SubscriptionID: d.Get("subscription_id").(string), ClientID: d.Get("client_id").(string), ClientSecret: d.Get("client_secret").(string), TenantID: d.Get("tenant_id").(string), Environment: d.Get("environment").(string), SkipProviderRegistration: d.Get("skip_provider_registration").(bool), } if err := config.validate(); err != nil { return nil, err } client, err := config.getArmClient() if err != nil { return nil, err } client.StopContext = p.StopContext() // List all the available providers and their registration state to avoid unnecessary // requests. This also lets us check if the provider credentials are correct. providerList, err := client.providers.List(nil, "") if err != nil { return nil, fmt.Errorf("Unable to list provider registration status, it is possible that this is due to invalid "+ "credentials or the service principal does not have permission to use the Resource Manager API, Azure "+ "error: %s", err) } if !config.SkipProviderRegistration { err = registerAzureResourceProvidersWithSubscription(*providerList.Value, client.providers) if err != nil { return nil, err } } return client, nil } }
func testAccCheckRoute53ZoneExistsWithProvider(s *terraform.State, n string, zone *route53.GetHostedZoneOutput, provider *schema.Provider) error { rs, ok := s.RootModule().Resources[n] if !ok { return fmt.Errorf("Not found: %s", n) } if rs.Primary.ID == "" { return fmt.Errorf("No hosted zone ID is set") } conn := provider.Meta().(*AWSClient).r53conn resp, err := conn.GetHostedZone(&route53.GetHostedZoneInput{ID: aws.String(rs.Primary.ID)}) if err != nil { return fmt.Errorf("Hosted zone err: %v", err) } aws_comment := *resp.HostedZone.Config.Comment rs_comment := rs.Primary.Attributes["comment"] if rs_comment != "" && rs_comment != aws_comment { return fmt.Errorf("Hosted zone with comment '%s' found but does not match '%s'", aws_comment, rs_comment) } if !*resp.HostedZone.Config.PrivateZone { sorted_ns := make([]string, len(resp.DelegationSet.NameServers)) for i, ns := range resp.DelegationSet.NameServers { sorted_ns[i] = *ns } sort.Strings(sorted_ns) for idx, ns := range sorted_ns { attribute := fmt.Sprintf("name_servers.%d", idx) dsns := rs.Primary.Attributes[attribute] if dsns != ns { return fmt.Errorf("Got: %v for %v, Expected: %v", dsns, attribute, ns) } } } *zone = *resp return nil }
func testAccCreateRandomRoute53RecordsInZoneId(provider *schema.Provider, zone *route53.GetHostedZoneOutput, recordsCount int) error { conn := provider.Meta().(*AWSClient).r53conn var changes []*route53.Change if recordsCount > 100 { return fmt.Errorf("Route53 API only allows 100 record sets in a single batch") } for i := 0; i < recordsCount; i++ { changes = append(changes, &route53.Change{ Action: aws.String("UPSERT"), ResourceRecordSet: &route53.ResourceRecordSet{ Name: aws.String(fmt.Sprintf("%d-tf-acc-random.%s", acctest.RandInt(), *zone.HostedZone.Name)), Type: aws.String("CNAME"), ResourceRecords: []*route53.ResourceRecord{ &route53.ResourceRecord{Value: aws.String(fmt.Sprintf("random.%s", *zone.HostedZone.Name))}, }, TTL: aws.Int64(int64(30)), }, }) } req := &route53.ChangeResourceRecordSetsInput{ HostedZoneId: zone.HostedZone.Id, ChangeBatch: &route53.ChangeBatch{ Comment: aws.String("Generated by Terraform"), Changes: changes, }, } log.Printf("[DEBUG] Change set: %s\n", *req) resp, err := changeRoute53RecordSet(conn, req) if err != nil { return err } changeInfo := resp.(*route53.ChangeResourceRecordSetsOutput).ChangeInfo err = waitForRoute53RecordSetToSync(conn, cleanChangeID(*changeInfo.Id)) return err }
func testAccCheckRoute53ZoneAssociationDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).r53conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_route53_zone_association" { continue } zone_id, vpc_id := resourceAwsRoute53ZoneAssociationParseId(rs.Primary.ID) resp, err := conn.GetHostedZone(&route53.GetHostedZoneInput{Id: aws.String(zone_id)}) if err != nil { exists := false for _, vpc := range resp.VPCs { if vpc_id == *vpc.VPCId { exists = true } } if exists { return fmt.Errorf("VPC: %v is still associated to HostedZone: %v", vpc_id, zone_id) } } } return nil }
// Provider returns a terraform.ResourceProvider. func Provider() terraform.ResourceProvider { var p *schema.Provider p = &schema.Provider{ Schema: map[string]*schema.Schema{ "subscription_id": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_SUBSCRIPTION_ID", ""), }, "client_id": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_CLIENT_ID", ""), }, "client_secret": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_CLIENT_SECRET", ""), }, "tenant_id": { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("ARM_TENANT_ID", ""), }, }, DataSourcesMap: map[string]*schema.Resource{ "azurerm_client_config": dataSourceArmClientConfig(), }, ResourcesMap: map[string]*schema.Resource{ // These resources use the Azure ARM SDK "azurerm_availability_set": resourceArmAvailabilitySet(), "azurerm_cdn_endpoint": resourceArmCdnEndpoint(), "azurerm_cdn_profile": resourceArmCdnProfile(), "azurerm_eventhub": resourceArmEventHub(), "azurerm_eventhub_namespace": resourceArmEventHubNamespace(), "azurerm_lb": resourceArmLoadBalancer(), "azurerm_lb_backend_address_pool": resourceArmLoadBalancerBackendAddressPool(), "azurerm_lb_nat_rule": resourceArmLoadBalancerNatRule(), "azurerm_lb_nat_pool": resourceArmLoadBalancerNatPool(), "azurerm_lb_probe": resourceArmLoadBalancerProbe(), "azurerm_lb_rule": resourceArmLoadBalancerRule(), "azurerm_key_vault": resourceArmKeyVault(), "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_servicebus_namespace": resourceArmServiceBusNamespace(), "azurerm_servicebus_subscription": resourceArmServiceBusSubscription(), "azurerm_servicebus_topic": resourceArmServiceBusTopic(), "azurerm_storage_account": resourceArmStorageAccount(), "azurerm_storage_blob": resourceArmStorageBlob(), "azurerm_storage_container": resourceArmStorageContainer(), "azurerm_storage_share": resourceArmStorageShare(), "azurerm_storage_queue": resourceArmStorageQueue(), "azurerm_storage_table": resourceArmStorageTable(), "azurerm_subnet": resourceArmSubnet(), "azurerm_template_deployment": resourceArmTemplateDeployment(), "azurerm_traffic_manager_endpoint": resourceArmTrafficManagerEndpoint(), "azurerm_traffic_manager_profile": resourceArmTrafficManagerProfile(), "azurerm_virtual_machine_extension": resourceArmVirtualMachineExtensions(), "azurerm_virtual_machine": resourceArmVirtualMachine(), "azurerm_virtual_machine_scale_set": resourceArmVirtualMachineScaleSet(), "azurerm_virtual_network": resourceArmVirtualNetwork(), "azurerm_virtual_network_peering": resourceArmVirtualNetworkPeering(), // 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(), }, } p.ConfigureFunc = providerConfigure(p) return p }