// 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 resourceAwsEbsVolumeDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn return resource.Retry(5*time.Minute, func() *resource.RetryError { request := &ec2.DeleteVolumeInput{ VolumeId: aws.String(d.Id()), } _, err := conn.DeleteVolume(request) if err == nil { return nil } ebsErr, ok := err.(awserr.Error) if ebsErr.Code() == "VolumeInUse" { return resource.RetryableError(fmt.Errorf("EBS VolumeInUse - trying again while it detaches")) } if !ok { return resource.NonRetryableError(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 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 resourceAwsNetworkAclDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn log.Printf("[INFO] Deleting Network Acl: %s", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteNetworkAcl(&ec2.DeleteNetworkAclInput{ NetworkAclId: aws.String(d.Id()), }) if err != nil { ec2err := err.(awserr.Error) switch ec2err.Code() { case "InvalidNetworkAclID.NotFound": return nil case "DependencyViolation": // In case of dependency violation, we remove the association between subnet and network acl. // This means the subnet is attached to default acl of vpc. var associations []*ec2.NetworkAclAssociation if v, ok := d.GetOk("subnet_id"); ok { a, err := findNetworkAclAssociation(v.(string), conn) if err != nil { return resource.NonRetryableError(err) } associations = append(associations, a) } else if v, ok := d.GetOk("subnet_ids"); ok { ids := v.(*schema.Set).List() for _, i := range ids { a, err := findNetworkAclAssociation(i.(string), conn) if err != nil { return resource.NonRetryableError(err) } associations = append(associations, a) } } defaultAcl, err := getDefaultNetworkAcl(d.Get("vpc_id").(string), conn) if err != nil { return resource.NonRetryableError(err) } for _, a := range associations { _, err = conn.ReplaceNetworkAclAssociation(&ec2.ReplaceNetworkAclAssociationInput{ AssociationId: a.NetworkAclAssociationId, NetworkAclId: defaultAcl.NetworkAclId, }) } return resource.NonRetryableError(err) default: // Any other error, we want to quit the retry loop immediately return resource.NonRetryableError(err) } } log.Printf("[Info] Deleted network ACL %s successfully", d.Id()) return nil }) }
func resourceAwsCodeDeployDeploymentGroupCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).codedeployconn application := d.Get("app_name").(string) deploymentGroup := d.Get("deployment_group_name").(string) input := codedeploy.CreateDeploymentGroupInput{ ApplicationName: aws.String(application), DeploymentGroupName: aws.String(deploymentGroup), ServiceRoleArn: aws.String(d.Get("service_role_arn").(string)), } if attr, ok := d.GetOk("deployment_config_name"); ok { input.DeploymentConfigName = aws.String(attr.(string)) } if attr, ok := d.GetOk("autoscaling_groups"); ok { input.AutoScalingGroups = expandStringList(attr.(*schema.Set).List()) } if attr, ok := d.GetOk("on_premises_instance_tag_filters"); ok { onPremFilters := buildOnPremTagFilters(attr.(*schema.Set).List()) input.OnPremisesInstanceTagFilters = onPremFilters } if attr, ok := d.GetOk("ec2_tag_filter"); ok { ec2TagFilters := buildEC2TagFilters(attr.(*schema.Set).List()) input.Ec2TagFilters = ec2TagFilters } // Retry to handle IAM role eventual consistency. var resp *codedeploy.CreateDeploymentGroupOutput var err error err = resource.Retry(2*time.Minute, func() *resource.RetryError { resp, err = conn.CreateDeploymentGroup(&input) if err != nil { codedeployErr, ok := err.(awserr.Error) if !ok { return resource.NonRetryableError(err) } if codedeployErr.Code() == "InvalidRoleException" { log.Printf("[DEBUG] Trying to create deployment group again: %q", codedeployErr.Message()) return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) if err != nil { return err } d.SetId(*resp.DeploymentGroupId) return resourceAwsCodeDeployDeploymentGroupRead(d, meta) }
// 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 resourceAwsSsmDocumentDelete(d *schema.ResourceData, meta interface{}) error { ssmconn := meta.(*AWSClient).ssmconn if err := deleteDocumentPermissions(d, meta); err != nil { return err } log.Printf("[INFO] Deleting SSM Document: %s", d.Id()) params := &ssm.DeleteDocumentInput{ Name: aws.String(d.Get("name").(string)), } _, err := ssmconn.DeleteDocument(params) if err != nil { return err } log.Printf("[DEBUG] Waiting for SSM Document %q to be deleted", d.Get("name").(string)) err = resource.Retry(10*time.Minute, func() *resource.RetryError { _, err := ssmconn.DescribeDocument(&ssm.DescribeDocumentInput{ Name: aws.String(d.Get("name").(string)), }) if err != nil { awsErr, ok := err.(awserr.Error) if !ok { return resource.NonRetryableError(err) } if awsErr.Code() == "InvalidDocument" { return nil } return resource.NonRetryableError(err) } return resource.RetryableError( fmt.Errorf("%q: Timeout while waiting for the document to be deleted", d.Id())) }) if err != nil { return err } d.SetId("") return nil }
func resourceAwsDynamoDbTableDelete(d *schema.ResourceData, meta interface{}) error { dynamodbconn := meta.(*AWSClient).dynamodbconn if err := waitForTableToBeActive(d.Id(), meta); err != nil { return errwrap.Wrapf("Error waiting for Dynamo DB Table update: {{err}}", err) } log.Printf("[DEBUG] DynamoDB delete table: %s", d.Id()) _, err := dynamodbconn.DeleteTable(&dynamodb.DeleteTableInput{ TableName: aws.String(d.Id()), }) if err != nil { return err } params := &dynamodb.DescribeTableInput{ TableName: aws.String(d.Id()), } err = resource.Retry(10*time.Minute, func() *resource.RetryError { t, err := dynamodbconn.DescribeTable(params) if err != nil { if awserr, ok := err.(awserr.Error); ok && awserr.Code() == "ResourceNotFoundException" { return nil } // Didn't recognize the error, so shouldn't retry. return resource.NonRetryableError(err) } if t != nil { if t.Table.TableStatus != nil && strings.ToLower(*t.Table.TableStatus) == "deleting" { log.Printf("[DEBUG] AWS Dynamo DB table (%s) is still deleting", d.Id()) return resource.RetryableError(fmt.Errorf("still deleting")) } } // we should be not found or deleting, so error here return resource.NonRetryableError(err) }) // check error from retry if err != nil { return 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 resourceAwsElasticacheSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).elasticacheconn log.Printf("[DEBUG] Cache security group delete: %s", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCacheSecurityGroup(&elasticache.DeleteCacheSecurityGroupInput{ CacheSecurityGroupName: aws.String(d.Id()), }) if err != nil { apierr, ok := err.(awserr.Error) if !ok { return resource.RetryableError(err) } log.Printf("[DEBUG] APIError.Code: %v", apierr.Code()) switch apierr.Code() { case "InvalidCacheSecurityGroupState": return resource.RetryableError(err) case "DependencyViolation": // If it is a dependency violation, we want to retry return resource.RetryableError(err) default: return resource.NonRetryableError(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 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 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 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(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 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 }
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 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 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 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 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 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 }) }
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 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 resourceAwsSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn log.Printf("[DEBUG] Security Group destroy: %v", d.Id()) if err := deleteLingeringLambdaENIs(conn, d); err != nil { return fmt.Errorf("Failed to delete Lambda ENIs: %s", err) } 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 default: // Any other error, we want to quit the retry loop immediately return resource.NonRetryableError(err) } } 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 resourceAwsOpsworksRdsDbInstanceDeregister(d *schema.ResourceData, meta interface{}) error { client := meta.(*AWSClient).opsworksconn req := &opsworks.DeregisterRdsDbInstanceInput{ RdsDbInstanceArn: aws.String(d.Get("rds_db_instance_arn").(string)), } log.Printf("[DEBUG] Unregistering rds db instance '%s' from stack: %s", d.Get("rds_db_instance_arn"), d.Get("stack_id")) err := resource.Retry(2*time.Minute, func() *resource.RetryError { var cerr error _, cerr = client.DeregisterRdsDbInstance(req) if cerr != nil { log.Printf("[INFO] client error") if opserr, ok := cerr.(awserr.Error); ok { if opserr.Code() == "ResourceNotFoundException" { log.Printf("[INFO] The db instance could not be found. Remove it from state.") d.SetId("") return nil } log.Printf("[ERROR] OpsWorks error: %s message: %s", opserr.Code(), opserr.Message()) } return resource.NonRetryableError(cerr) } return nil }) if err != nil { return err } return nil }