// resourceAwsLambdaEventSourceMappingUpdate maps to: // UpdateEventSourceMapping in the API / SDK func resourceAwsLambdaEventSourceMappingUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).lambdaconn log.Printf("[DEBUG] Updating Lambda event source mapping: %s", d.Id()) params := &lambda.UpdateEventSourceMappingInput{ UUID: aws.String(d.Id()), BatchSize: aws.Int64(int64(d.Get("batch_size").(int))), FunctionName: aws.String(d.Get("function_name").(string)), Enabled: aws.Bool(d.Get("enabled").(bool)), } err := resource.Retry(1*time.Minute, func() *resource.RetryError { _, err := conn.UpdateEventSourceMapping(params) if err != nil { if awserr, ok := err.(awserr.Error); ok { if awserr.Code() == "InvalidParameterValueException" { return resource.RetryableError(awserr) } } return resource.NonRetryableError(err) } return nil }) if err != nil { return fmt.Errorf("Error updating Lambda event source mapping: %s", err) } return resourceAwsLambdaEventSourceMappingRead(d, meta) }
func resourceAwsAutoscalingGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn // Read the autoscaling group first. If it doesn't exist, we're done. // We need the group in order to check if there are instances attached. // If so, we need to remove those first. g, err := getAwsAutoscalingGroup(d.Id(), conn) if err != nil { return err } if g == nil { log.Printf("[INFO] Autoscaling Group %q not found", d.Id()) d.SetId("") return nil } if len(g.Instances) > 0 || *g.DesiredCapacity > 0 { if err := resourceAwsAutoscalingGroupDrain(d, meta); err != nil { return err } } log.Printf("[DEBUG] AutoScaling Group destroy: %v", d.Id()) deleteopts := autoscaling.DeleteAutoScalingGroupInput{ AutoScalingGroupName: aws.String(d.Id()), ForceDelete: aws.Bool(d.Get("force_delete").(bool)), } // We retry the delete operation to handle InUse/InProgress errors coming // from scaling operations. We should be able to sneak in a delete in between // scaling operations within 5m. err = resource.Retry(5*time.Minute, func() *resource.RetryError { if _, err := conn.DeleteAutoScalingGroup(&deleteopts); err != nil { if awserr, ok := err.(awserr.Error); ok { switch awserr.Code() { case "InvalidGroup.NotFound": // Already gone? Sure! return nil case "ResourceInUse", "ScalingActivityInProgress": // These are retryable return resource.RetryableError(awserr) } } // Didn't recognize the error, so shouldn't retry. return resource.NonRetryableError(err) } // Successful delete return nil }) if err != nil { return err } return resource.Retry(5*time.Minute, func() *resource.RetryError { if g, _ = getAwsAutoscalingGroup(d.Id(), conn); g != nil { return resource.RetryableError( fmt.Errorf("Auto Scaling Group still exists")) } return nil }) }
// setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" func setTags(conn *ec2.EC2, d *schema.ResourceData) error { if d.HasChange("tags") { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) n := nraw.(map[string]interface{}) create, remove := diffTags(tagsFromMap(o), tagsFromMap(n)) // Set tags if len(remove) > 0 { err := resource.Retry(2*time.Minute, func() *resource.RetryError { log.Printf("[DEBUG] Removing tags: %#v from %s", remove, d.Id()) _, err := conn.DeleteTags(&ec2.DeleteTagsInput{ Resources: []*string{aws.String(d.Id())}, Tags: remove, }) if err != nil { ec2err, ok := err.(awserr.Error) if ok && strings.Contains(ec2err.Code(), ".NotFound") { return resource.RetryableError(err) // retry } return resource.NonRetryableError(err) } return nil }) if err != nil { return err } } if len(create) > 0 { err := resource.Retry(2*time.Minute, func() *resource.RetryError { log.Printf("[DEBUG] Creating tags: %s for %s", create, d.Id()) _, err := conn.CreateTags(&ec2.CreateTagsInput{ Resources: []*string{aws.String(d.Id())}, Tags: create, }) if err != nil { ec2err, ok := err.(awserr.Error) if ok && strings.Contains(ec2err.Code(), ".NotFound") { return resource.RetryableError(err) // retry } return resource.NonRetryableError(err) } return nil }) if err != nil { return err } } } return nil }
func resourceAwsS3BucketPolicyPut(d *schema.ResourceData, meta interface{}) error { s3conn := meta.(*AWSClient).s3conn bucket := d.Get("bucket").(string) policy := d.Get("policy").(string) d.SetId(bucket) log.Printf("[DEBUG] S3 bucket: %s, put policy: %s", bucket, policy) params := &s3.PutBucketPolicyInput{ Bucket: aws.String(bucket), Policy: aws.String(policy), } err := resource.Retry(1*time.Minute, func() *resource.RetryError { if _, err := s3conn.PutBucketPolicy(params); err != nil { if awserr, ok := err.(awserr.Error); ok { if awserr.Code() == "MalformedPolicy" { return resource.RetryableError(awserr) } } return resource.NonRetryableError(err) } return nil }) if err != nil { return fmt.Errorf("Error putting S3 policy: %s", err) } return nil }
func resourceAwsAutoscalingGroupDrain(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn // First, set the capacity to zero so the group will drain log.Printf("[DEBUG] Reducing autoscaling group capacity to zero") opts := autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(d.Id()), DesiredCapacity: aws.Long(0), MinSize: aws.Long(0), MaxSize: aws.Long(0), } if _, err := conn.UpdateAutoScalingGroup(&opts); err != nil { return fmt.Errorf("Error setting capacity to zero to drain: %s", err) } // Next, wait for the autoscale group to drain log.Printf("[DEBUG] Waiting for group to have zero instances") return resource.Retry(10*time.Minute, func() error { g, err := getAwsAutoscalingGroup(d, meta) if err != nil { return resource.RetryError{Err: err} } if g == nil { return nil } if len(g.Instances) == 0 { return nil } return fmt.Errorf("group still has %d instances", len(g.Instances)) }) }
func resourceAwsElasticacheSubnetGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).elasticacheconn log.Printf("[DEBUG] Cache subnet group delete: %s", d.Id()) return resource.Retry(5*time.Minute, func() error { _, err := conn.DeleteCacheSubnetGroup(&elasticache.DeleteCacheSubnetGroupInput{ CacheSubnetGroupName: aws.String(d.Id()), }) if err != nil { apierr, ok := err.(awserr.Error) if !ok { return err } log.Printf("[DEBUG] APIError.Code: %v", apierr.Code) switch apierr.Code() { case "DependencyViolation": // If it is a dependency violation, we want to retry return err default: return resource.RetryError{Err: err} } } return nil }) }
func testAccCheckAWSLambdaPermissionDestroy(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).lambdaconn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_lambda_permission" { continue } // IAM is eventually consistent err := resource.Retry(5*time.Minute, func() error { err := isLambdaPermissionGone(rs, conn) if err != nil { if !strings.HasPrefix(err.Error(), "Error unmarshalling Lambda policy") { return err } return resource.RetryError{Err: err} } return nil }) if err != nil { return err } } return nil }
func resourceAwsAutoscalingLifecycleHookPut(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn params := getAwsAutoscalingPutLifecycleHookInput(d) log.Printf("[DEBUG] AutoScaling PutLifecyleHook: %s", params) err := resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.PutLifecycleHook(¶ms) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if strings.Contains(awsErr.Message(), "Unable to publish test message to notification target") { return resource.RetryableError(fmt.Errorf("[DEBUG] Retrying AWS AutoScaling Lifecycle Hook: %s", params)) } } return resource.NonRetryableError(fmt.Errorf("Error putting lifecycle hook: %s", err)) } return nil }) if err != nil { return err } d.SetId(d.Get("name").(string)) return resourceAwsAutoscalingLifecycleHookRead(d, meta) }
func resourceAwsApiGatewayBasePathMappingCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).apigateway err := resource.Retry(30*time.Second, func() *resource.RetryError { _, err := conn.CreateBasePathMapping(&apigateway.CreateBasePathMappingInput{ RestApiId: aws.String(d.Get("api_id").(string)), DomainName: aws.String(d.Get("domain_name").(string)), BasePath: aws.String(d.Get("base_path").(string)), Stage: aws.String(d.Get("stage_name").(string)), }) if err != nil { if err, ok := err.(awserr.Error); ok && err.Code() != "BadRequestException" { return resource.NonRetryableError(err) } return resource.RetryableError( fmt.Errorf("Error creating Gateway base path mapping: %s", err), ) } return nil }) if err != nil { return fmt.Errorf("Error creating Gateway base path mapping: %s", err) } id := fmt.Sprintf("%s/%s", d.Get("domain_name").(string), d.Get("base_path").(string)) d.SetId(id) return resourceAwsApiGatewayBasePathMappingRead(d, meta) }
func resourceLibratoAlertDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*librato.Client) id, err := strconv.ParseUint(d.Id(), 10, 0) if err != nil { return err } log.Printf("[INFO] Deleting Alert: %d", id) _, err = client.Alerts.Delete(uint(id)) if err != nil { return fmt.Errorf("Error deleting Alert: %s", err) } resource.Retry(1*time.Minute, func() *resource.RetryError { _, _, err := client.Alerts.Get(uint(id)) if err != nil { if errResp, ok := err.(*librato.ErrorResponse); ok && errResp.Response.StatusCode == 404 { return nil } return resource.NonRetryableError(err) } return resource.RetryableError(fmt.Errorf("alert still exists")) }) d.SetId("") return nil }
func resourceAwsVpnGatewayDelete(d *schema.ResourceData, meta interface{}) error { ec2conn := meta.(*AWSClient).ec2conn // Detach if it is attached if err := resourceAwsVpnGatewayDetach(d, meta); err != nil { return err } log.Printf("[INFO] Deleting VPN gateway: %s", d.Id()) return resource.Retry(5*time.Minute, func() error { err := ec2conn.DeleteVPNGateway(&ec2.DeleteVPNGatewayRequest{ VPNGatewayID: aws.String(d.Id()), }) if err == nil { return nil } ec2err, ok := err.(aws.APIError) if !ok { return err } switch ec2err.Code { case "InvalidVpnGatewayID.NotFound": return nil case "IncorrectState": return err // retry } return resource.RetryError{Err: err} }) }
func testAccCheckAWSLambdaEventSourceMappingDisappears(conf *lambda.EventSourceMappingConfiguration) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).lambdaconn params := &lambda.DeleteEventSourceMappingInput{ UUID: conf.UUID, } _, err := conn.DeleteEventSourceMapping(params) if err != nil { if err != nil { return err } } return resource.Retry(10*time.Minute, func() *resource.RetryError { params := &lambda.GetEventSourceMappingInput{ UUID: conf.UUID, } _, err := conn.GetEventSourceMapping(params) if err != nil { cgw, ok := err.(awserr.Error) if ok && cgw.Code() == "ResourceNotFoundException" { return nil } return resource.NonRetryableError( fmt.Errorf("Error retrieving Lambda Event Source Mapping: %s", err)) } return resource.RetryableError(fmt.Errorf( "Waiting for Lambda Event Source Mapping: %v", conf.UUID)) }) } }
func resourceAwsSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { ec2conn := meta.(*AWSClient).ec2conn log.Printf("[DEBUG] Security Group destroy: %v", d.Id()) return resource.Retry(5*time.Minute, func() error { _, err := ec2conn.DeleteSecurityGroup(ec2.SecurityGroup{Id: d.Id()}) if err != nil { ec2err, ok := err.(*ec2.Error) if !ok { return err } switch ec2err.Code { case "InvalidGroup.NotFound": return nil case "DependencyViolation": // If it is a dependency violation, we want to retry return err default: // Any other error, we want to quit the retry loop immediately return resource.RetryError{err} } } return nil }) }
func testAccAWSDBClusterParameterGroupDisappears(v *rds.DBClusterParameterGroup) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).rdsconn opts := &rds.DeleteDBClusterParameterGroupInput{ DBClusterParameterGroupName: v.DBClusterParameterGroupName, } if _, err := conn.DeleteDBClusterParameterGroup(opts); err != nil { return err } return resource.Retry(40*time.Minute, func() *resource.RetryError { opts := &rds.DescribeDBClusterParameterGroupsInput{ DBClusterParameterGroupName: v.DBClusterParameterGroupName, } _, err := conn.DescribeDBClusterParameterGroups(opts) if err != nil { dbparamgrouperr, ok := err.(awserr.Error) if ok && dbparamgrouperr.Code() == "DBParameterGroupNotFound" { return nil } return resource.NonRetryableError( fmt.Errorf("Error retrieving DB Cluster Parameter Groups: %s", err)) } return resource.RetryableError(fmt.Errorf( "Waiting for cluster parameter group to be deleted: %v", v.DBClusterParameterGroupName)) }) } }
func resourceAwsLaunchConfigurationCreate(d *schema.ResourceData, meta interface{}) error { autoscalingconn := meta.(*AWSClient).autoscalingconn var createLaunchConfigurationOpts autoscaling.CreateLaunchConfiguration createLaunchConfigurationOpts.Name = d.Get("name").(string) createLaunchConfigurationOpts.IamInstanceProfile = d.Get("iam_instance_profile").(string) createLaunchConfigurationOpts.ImageId = d.Get("image_id").(string) createLaunchConfigurationOpts.InstanceType = d.Get("instance_type").(string) createLaunchConfigurationOpts.KeyName = d.Get("key_name").(string) createLaunchConfigurationOpts.UserData = d.Get("user_data").(string) createLaunchConfigurationOpts.AssociatePublicIpAddress = d.Get("associate_public_ip_address").(bool) if v, ok := d.GetOk("security_groups"); ok { createLaunchConfigurationOpts.SecurityGroups = expandStringList( v.(*schema.Set).List()) } log.Printf("[DEBUG] autoscaling create launch configuration: %#v", createLaunchConfigurationOpts) _, err := autoscalingconn.CreateLaunchConfiguration(&createLaunchConfigurationOpts) if err != nil { return fmt.Errorf("Error creating launch configuration: %s", err) } d.SetId(d.Get("name").(string)) log.Printf("[INFO] launch configuration ID: %s", d.Id()) // We put a Retry here since sometimes eventual consistency bites // us and we need to retry a few times to get the LC to load properly return resource.Retry(30*time.Second, func() error { return resourceAwsLaunchConfigurationRead(d, meta) }) }
func resourceCLCLoadBalancerCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*clc.Client) dc := d.Get("data_center").(string) name := d.Get("name").(string) desc := d.Get("description").(string) status := d.Get("status").(string) r1 := lb.LoadBalancer{ Name: name, Description: desc, Status: status, } l, err := client.LB.Create(dc, r1) if err != nil { return fmt.Errorf("Failed creating load balancer under %v/%v: %v", dc, name, err) } d.SetId(l.ID) return resource.Retry(1*time.Minute, func() *resource.RetryError { _, err := client.LB.Get(dc, l.ID) if err != nil { return resource.RetryableError(err) } err = resourceCLCLoadBalancerRead(d, meta) if err != nil { return resource.NonRetryableError(err) } return nil }) }
func resourceAwsEcsClusterDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ecsconn log.Printf("[DEBUG] Deleting ECS cluster %s", d.Id()) return resource.Retry(10*time.Minute, func() error { out, err := conn.DeleteCluster(&ecs.DeleteClusterInput{ Cluster: aws.String(d.Id()), }) if err == nil { log.Printf("[DEBUG] ECS cluster %s deleted: %s", d.Id(), out) return nil } awsErr, ok := err.(awserr.Error) if !ok { return resource.RetryError{Err: err} } if awsErr.Code() == "ClusterContainsContainerInstancesException" { log.Printf("[TRACE] Retrying ECS cluster %q deletion after %q", d.Id(), awsErr.Code()) return err } if awsErr.Code() == "ClusterContainsServicesException" { log.Printf("[TRACE] Retrying ECS cluster %q deletion after %q", d.Id(), awsErr.Code()) return err } return resource.RetryError{Err: err} }) }
func resourceAwsSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn log.Printf("[DEBUG] Security Group destroy: %v", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteSecurityGroup(&ec2.DeleteSecurityGroupInput{ GroupId: aws.String(d.Id()), }) if err != nil { ec2err, ok := err.(awserr.Error) if !ok { return resource.RetryableError(err) } switch ec2err.Code() { case "InvalidGroup.NotFound": return nil case "DependencyViolation": // If it is a dependency violation, we want to retry return resource.RetryableError(err) default: // Any other error, we want to quit the retry loop immediately return resource.NonRetryableError(err) } } return nil }) }
func resourceAwsVpnGatewayDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn // Detach if it is attached if err := resourceAwsVpnGatewayDetach(d, meta); err != nil { return err } log.Printf("[INFO] Deleting VPN gateway: %s", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVpnGateway(&ec2.DeleteVpnGatewayInput{ VpnGatewayId: aws.String(d.Id()), }) if err == nil { return nil } ec2err, ok := err.(awserr.Error) if !ok { return resource.RetryableError(err) } switch ec2err.Code() { case "InvalidVpnGatewayID.NotFound": return nil case "IncorrectState": return resource.RetryableError(err) } return resource.NonRetryableError(err) }) }
func resourceAwsApiGatewayDeploymentDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).apigateway log.Printf("[DEBUG] Deleting API Gateway Deployment: %s", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { log.Printf("[DEBUG] schema is %#v", d) if _, err := conn.DeleteStage(&apigateway.DeleteStageInput{ StageName: aws.String(d.Get("stage_name").(string)), RestApiId: aws.String(d.Get("rest_api_id").(string)), }); err == nil { return nil } _, err := conn.DeleteDeployment(&apigateway.DeleteDeploymentInput{ DeploymentId: aws.String(d.Id()), RestApiId: aws.String(d.Get("rest_api_id").(string)), }) if err == nil { return nil } apigatewayErr, ok := err.(awserr.Error) if apigatewayErr.Code() == "NotFoundException" { return nil } if !ok { return resource.NonRetryableError(err) } return resource.NonRetryableError(err) }) }
func clearServerList(client *brightbox.Client, initial_server_group *brightbox.ServerGroup) error { serverID := initial_server_group.Id server_list := initial_server_group.Servers serverIds := serverIdList(server_list) log.Printf("[INFO] Removing servers %#v from server group %s", serverIds, serverID) _, err := client.RemoveServersFromServerGroup(serverID, serverIds) if err != nil { return fmt.Errorf("Error removing servers from server group %s", serverID) } // Wait for group to empty return resource.Retry( 1*time.Minute, func() *resource.RetryError { server_group, err := client.ServerGroup(serverID) if err != nil { return resource.NonRetryableError( fmt.Errorf("Error retrieving Server Group details: %s", err), ) } if len(server_group.Servers) > 0 { return resource.RetryableError( fmt.Errorf("Error: servers %#v still in server group %s", serverIdList(server_group.Servers), server_group.Id), ) } return nil }, ) }
func resourceAwsDbOptionGroupDelete(d *schema.ResourceData, meta interface{}) error { rdsconn := meta.(*AWSClient).rdsconn deleteOpts := &rds.DeleteOptionGroupInput{ OptionGroupName: aws.String(d.Id()), } log.Printf("[DEBUG] Delete DB Option Group: %#v", deleteOpts) ret := resource.Retry(1*time.Minute, func() *resource.RetryError { _, err := rdsconn.DeleteOptionGroup(deleteOpts) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "InvalidOptionGroupStateFault" { log.Printf("[DEBUG] AWS believes the RDS Option Group is still in use, retrying") return resource.RetryableError(awsErr) } } return resource.NonRetryableError(err) } return nil }) if ret != nil { return fmt.Errorf("Error Deleting DB Option Group: %s", ret) } return nil }
func resourceAwsIamRoleCreate(d *schema.ResourceData, meta interface{}) error { iamconn := meta.(*AWSClient).iamconn var name string if v, ok := d.GetOk("name"); ok { name = v.(string) } else if v, ok := d.GetOk("name_prefix"); ok { name = resource.PrefixedUniqueId(v.(string)) } else { name = resource.UniqueId() } request := &iam.CreateRoleInput{ Path: aws.String(d.Get("path").(string)), RoleName: aws.String(name), AssumeRolePolicyDocument: aws.String(d.Get("assume_role_policy").(string)), } var createResp *iam.CreateRoleOutput err := resource.Retry(30*time.Second, func() *resource.RetryError { var err error createResp, err = iamconn.CreateRole(request) // IAM users (referenced in Principal field of assume policy) // can take ~30 seconds to propagate in AWS if isAWSErr(err, "MalformedPolicyDocument", "Invalid principal in policy") { return resource.RetryableError(err) } return resource.NonRetryableError(err) }) if err != nil { return fmt.Errorf("Error creating IAM Role %s: %s", name, err) } return resourceAwsIamRoleReadResult(d, createResp.Role) }
func testAccAWSClusterInstanceDisappears(v *rds.DBInstance) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).rdsconn opts := &rds.DeleteDBInstanceInput{ DBInstanceIdentifier: v.DBInstanceIdentifier, } if _, err := conn.DeleteDBInstance(opts); err != nil { return err } return resource.Retry(40*time.Minute, func() *resource.RetryError { opts := &rds.DescribeDBInstancesInput{ DBInstanceIdentifier: v.DBInstanceIdentifier, } _, err := conn.DescribeDBInstances(opts) if err != nil { dbinstanceerr, ok := err.(awserr.Error) if ok && dbinstanceerr.Code() == "DBInstanceNotFound" { return nil } return resource.NonRetryableError( fmt.Errorf("Error retrieving DB Instances: %s", err)) } return resource.RetryableError(fmt.Errorf( "Waiting for instance to be deleted: %v", v.DBInstanceIdentifier)) }) } }
func resourceAwsInternetGatewayDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn // Detach if it is attached if err := resourceAwsInternetGatewayDetach(d, meta); err != nil { return err } log.Printf("[INFO] Deleting Internet Gateway: %s", d.Id()) return resource.Retry(5*time.Minute, func() error { _, err := conn.DeleteInternetGateway(&ec2.DeleteInternetGatewayInput{ InternetGatewayId: aws.String(d.Id()), }) if err == nil { return nil } ec2err, ok := err.(awserr.Error) if !ok { return err } switch ec2err.Code() { case "InvalidInternetGatewayID.NotFound": return nil case "DependencyViolation": return err // retry } return resource.RetryError{Err: err} }) }
func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn vpcID := d.Id() DeleteVpcOpts := &ec2.DeleteVpcInput{ VpcId: &vpcID, } log.Printf("[INFO] Deleting VPC: %s", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVpc(DeleteVpcOpts) if err == nil { return nil } ec2err, ok := err.(awserr.Error) if !ok { return resource.NonRetryableError(err) } switch ec2err.Code() { case "InvalidVpcID.NotFound": return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting VPC: %s", err)) }) }
func resourceAwsApiGatewayMethodDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).apigateway log.Printf("[DEBUG] Deleting API Gateway Method: %s", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteMethod(&apigateway.DeleteMethodInput{ HttpMethod: aws.String(d.Get("http_method").(string)), ResourceId: aws.String(d.Get("resource_id").(string)), RestApiId: aws.String(d.Get("rest_api_id").(string)), }) if err == nil { return nil } apigatewayErr, ok := err.(awserr.Error) if apigatewayErr.Code() == "NotFoundException" { return nil } if !ok { return resource.NonRetryableError(err) } return resource.NonRetryableError(err) }) }
func resourceAwsCloudWatchEventRuleCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).cloudwatcheventsconn input := buildPutRuleInputStruct(d) log.Printf("[DEBUG] Creating CloudWatch Event Rule: %s", input) // IAM Roles take some time to propagate var out *events.PutRuleOutput err := resource.Retry(30*time.Second, func() *resource.RetryError { var err error out, err = conn.PutRule(input) pattern := regexp.MustCompile("cannot be assumed by principal '[a-z]+\\.amazonaws\\.com'\\.$") if err != nil { if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "ValidationException" && pattern.MatchString(awsErr.Message()) { log.Printf("[DEBUG] Retrying creation of CloudWatch Event Rule %q", *input.Name) return resource.RetryableError(err) } } return resource.NonRetryableError(err) } return nil }) if err != nil { return fmt.Errorf("Creating CloudWatch Event Rule failed: %s", err) } d.Set("arn", out.RuleArn) d.SetId(d.Get("name").(string)) log.Printf("[INFO] CloudWatch Event Rule %q created", *out.RuleArn) return resourceAwsCloudWatchEventRuleUpdate(d, meta) }
func resourceAwsIamRoleCreate(d *schema.ResourceData, meta interface{}) error { iamconn := meta.(*AWSClient).iamconn var name string if v, ok := d.GetOk("name"); ok { name = v.(string) } else if v, ok := d.GetOk("name_prefix"); ok { name = resource.PrefixedUniqueId(v.(string)) } else { name = resource.UniqueId() } request := &iam.CreateRoleInput{ Path: aws.String(d.Get("path").(string)), RoleName: aws.String(name), AssumeRolePolicyDocument: aws.String(d.Get("assume_role_policy").(string)), } var createResp *iam.CreateRoleOutput err := resource.Retry(10*time.Second, func() *resource.RetryError { var err error createResp, err = iamconn.CreateRole(request) // IAM roles can take ~10 seconds to propagate in AWS: // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role-console if isAWSErr(err, "MalformedPolicyDocument", "Invalid principal in policy") { return resource.RetryableError(err) } return resource.NonRetryableError(err) }) if err != nil { return fmt.Errorf("Error creating IAM Role %s: %s", name, err) } return resourceAwsIamRoleReadResult(d, createResp.Role) }
func resourceAwsIAMServerCertificateDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).iamconn log.Printf("[INFO] Deleting IAM Server Certificate: %s", d.Id()) err := resource.Retry(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteServerCertificate(&iam.DeleteServerCertificateInput{ ServerCertificateName: aws.String(d.Get("name").(string)), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "DeleteConflict" && strings.Contains(awsErr.Message(), "currently in use by arn") { log.Printf("[WARN] Conflict deleting server certificate: %s, retrying", awsErr.Message()) return resource.RetryableError(err) } } return resource.NonRetryableError(err) } return nil }) if err != nil { return err } d.SetId("") return nil }