func resourceAwsIamUserUpdate(d *schema.ResourceData, meta interface{}) error { if d.HasChange("name") || d.HasChange("path") { iamconn := meta.(*AWSClient).iamconn on, nn := d.GetChange("name") _, np := d.GetChange("path") request := &iam.UpdateUserInput{ UserName: aws.String(on.(string)), NewUserName: aws.String(nn.(string)), NewPath: aws.String(np.(string)), } log.Println("[DEBUG] Update IAM User request:", request) _, err := iamconn.UpdateUser(request) if err != nil { if iamerr, ok := err.(awserr.Error); ok && iamerr.Code() == "NoSuchEntity" { log.Printf("[WARN] No IAM user by name (%s) found", d.Id()) d.SetId("") return nil } return fmt.Errorf("Error updating IAM User %s: %s", d.Id(), err) } return resourceAwsIamUserRead(d, meta) } return nil }
func instanceProfileSetRoles(d *schema.ResourceData, iamconn *iam.IAM) error { oldInterface, newInterface := d.GetChange("roles") oldRoles := oldInterface.(*schema.Set) newRoles := newInterface.(*schema.Set) currentRoles := schema.CopySet(oldRoles) d.Partial(true) for _, role := range oldRoles.Difference(newRoles).List() { err := instanceProfileRemoveRole(iamconn, d.Id(), role.(string)) if err != nil { return fmt.Errorf("Error removing role %s from IAM instance profile %s: %s", role, d.Id(), err) } currentRoles.Remove(role) d.Set("roles", currentRoles) d.SetPartial("roles") } for _, role := range newRoles.Difference(oldRoles).List() { err := instanceProfileAddRole(iamconn, d.Id(), role.(string)) if err != nil { return fmt.Errorf("Error adding role %s to IAM instance profile %s: %s", role, d.Id(), err) } currentRoles.Add(role) d.Set("roles", currentRoles) d.SetPartial("roles") } d.Partial(false) return nil }
func resourceAwsIamGroupMembershipUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).iamconn if d.HasChange("users") { group := d.Get("group").(string) o, n := d.GetChange("users") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := n.(*schema.Set) remove := expandStringList(os.Difference(ns).List()) add := expandStringList(ns.Difference(os).List()) if err := removeUsersFromGroup(conn, remove, group); err != nil { return err } if err := addUsersToGroup(conn, add, group); err != nil { return err } } return resourceAwsIamGroupMembershipRead(d, meta) }
func resourceAwsSqsQueueUpdate(d *schema.ResourceData, meta interface{}) error { sqsconn := meta.(*AWSClient).sqsconn attributes := make(map[string]*string) resource := *resourceAwsSqsQueue() for k, s := range resource.Schema { if attrKey, ok := AttributeMap[k]; ok { if d.HasChange(k) { log.Printf("[DEBUG] Updating %s", attrKey) _, n := d.GetChange(k) if s.Type == schema.TypeInt { attributes[attrKey] = aws.String(strconv.Itoa(n.(int))) } else { attributes[attrKey] = aws.String(n.(string)) } } } } if len(attributes) > 0 { req := &sqs.SetQueueAttributesInput{ QueueUrl: aws.String(d.Id()), Attributes: attributes, } sqsconn.SetQueueAttributes(req) } return resourceAwsSqsQueueRead(d, meta) }
// setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tag" func setAutoscalingTags(conn *autoscaling.AutoScaling, d *schema.ResourceData) error { if d.HasChange("tag") { oraw, nraw := d.GetChange("tag") o := setToMapByKey(oraw.(*schema.Set), "key") n := setToMapByKey(nraw.(*schema.Set), "key") resourceID := d.Get("name").(string) c, r := diffAutoscalingTags( autoscalingTagsFromMap(o, resourceID), autoscalingTagsFromMap(n, resourceID), resourceID) create := autoscaling.CreateOrUpdateTagsInput{ Tags: c, } remove := autoscaling.DeleteTagsInput{ Tags: r, } // Set tags if len(r) > 0 { log.Printf("[DEBUG] Removing autoscaling tags: %#v", r) if _, err := conn.DeleteTags(&remove); err != nil { return err } } if len(c) > 0 { log.Printf("[DEBUG] Creating autoscaling tags: %#v", c) if _, err := conn.CreateOrUpdateTags(&create); err != nil { return err } } } return nil }
func resourceAwsEcsServiceUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ecsconn log.Printf("[DEBUG] Updating ECS service %s", d.Id()) input := ecs.UpdateServiceInput{ Service: aws.String(d.Id()), Cluster: aws.String(d.Get("cluster").(string)), } if d.HasChange("desired_count") { _, n := d.GetChange("desired_count") input.DesiredCount = aws.Int64(int64(n.(int))) } if d.HasChange("task_definition") { _, n := d.GetChange("task_definition") input.TaskDefinition = aws.String(n.(string)) } out, err := conn.UpdateService(&input) if err != nil { return err } service := out.Service log.Printf("[DEBUG] Updated ECS service %s", service) return resourceAwsEcsServiceRead(d, meta) }
func resourceAwsVpnGatewayDetach(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn // Get the old VPC ID to detach from vpcID, _ := d.GetChange("vpc_id") if vpcID.(string) == "" { log.Printf( "[DEBUG] Not detaching VPN Gateway '%s' as no VPC ID is set", d.Id()) return nil } log.Printf( "[INFO] Detaching VPN Gateway '%s' from VPC '%s'", d.Id(), vpcID.(string)) wait := true _, err := conn.DetachVpnGateway(&ec2.DetachVpnGatewayInput{ VpnGatewayId: aws.String(d.Id()), VpcId: aws.String(vpcID.(string)), }) if err != nil { ec2err, ok := err.(awserr.Error) if ok { if ec2err.Code() == "InvalidVpnGatewayID.NotFound" { err = nil wait = false } else if ec2err.Code() == "InvalidVpnGatewayAttachment.NotFound" { err = nil wait = false } } if err != nil { return err } } if !wait { return nil } // Wait for it to be fully detached before continuing log.Printf("[DEBUG] Waiting for VPN gateway (%s) to detach", d.Id()) stateConf := &resource.StateChangeConf{ Pending: []string{"attached", "detaching", "available"}, Target: "detached", Refresh: vpnGatewayAttachStateRefreshFunc(conn, d.Id(), "detached"), Timeout: 1 * time.Minute, } if _, err := stateConf.WaitForState(); err != nil { return fmt.Errorf( "Error waiting for vpn gateway (%s) to detach: %s", d.Id(), err) } return nil }
// setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" func setTagsS3(conn *s3.S3, 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 := diffTagsS3(tagsFromMapS3(o), tagsFromMapS3(n)) // Set tags if len(remove) > 0 { log.Printf("[DEBUG] Removing tags: %#v", remove) _, err := conn.DeleteBucketTagging(&s3.DeleteBucketTaggingInput{ Bucket: aws.String(d.Get("bucket").(string)), }) if err != nil { return err } } if len(create) > 0 { log.Printf("[DEBUG] Creating tags: %#v", create) req := &s3.PutBucketTaggingInput{ Bucket: aws.String(d.Get("bucket").(string)), Tagging: &s3.Tagging{ TagSet: create, }, } _, err := conn.PutBucketTagging(req) if err != nil { return err } } } return nil }
// setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" func setTagsR53(conn *route53.Route53, d *schema.ResourceData, resourceType string) error { if d.HasChange("tags") { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) n := nraw.(map[string]interface{}) create, remove := diffTagsR53(tagsFromMapR53(o), tagsFromMapR53(n)) // Set tags r := make([]*string, len(remove)) for i, t := range remove { r[i] = t.Key } log.Printf("[DEBUG] Changing tags: \n\tadding: %#v\n\tremoving:%#v", create, remove) req := &route53.ChangeTagsForResourceInput{ ResourceId: aws.String(d.Id()), ResourceType: aws.String(resourceType), } if len(create) > 0 { req.AddTags = create } if len(r) > 0 { req.RemoveTagKeys = r } _, err := conn.ChangeTagsForResource(req) if err != nil { return err } } return nil }
func resourceAwsInternetGatewayDetach(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn // Get the old VPC ID to detach from vpcID, _ := d.GetChange("vpc_id") if vpcID.(string) == "" { log.Printf( "[DEBUG] Not detaching Internet Gateway '%s' as no VPC ID is set", d.Id()) return nil } log.Printf( "[INFO] Detaching Internet Gateway '%s' from VPC '%s'", d.Id(), vpcID.(string)) // Wait for it to be fully detached before continuing log.Printf("[DEBUG] Waiting for internet gateway (%s) to detach", d.Id()) stateConf := &resource.StateChangeConf{ Pending: []string{"detaching"}, Target: "detached", Refresh: detachIGStateRefreshFunc(conn, d.Id(), vpcID.(string)), Timeout: 5 * time.Minute, Delay: 10 * time.Second, } if _, err := stateConf.WaitForState(); err != nil { return fmt.Errorf( "Error waiting for internet gateway (%s) to detach: %s", d.Id(), err) } return nil }
func resourceAwsDbSubnetGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).rdsconn if d.HasChange("subnet_ids") { _, n := d.GetChange("subnet_ids") if n == nil { n = new(schema.Set) } ns := n.(*schema.Set) var sIds []*string for _, s := range ns.List() { sIds = append(sIds, aws.String(s.(string))) } _, err := conn.ModifyDBSubnetGroup(&rds.ModifyDBSubnetGroupInput{ DBSubnetGroupName: aws.String(d.Id()), SubnetIds: sIds, }) if err != nil { return err } } if arn, err := buildRDSsubgrpARN(d, meta); err == nil { if err := setTagsRDS(conn, d, arn); err != nil { return err } else { d.SetPartial("tags") } } return resourceAwsDbSubnetGroupRead(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 { 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 { return err } } if len(create) > 0 { 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 { return err } } } return nil }
func resourceAwsRedshiftSubnetGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).redshiftconn if d.HasChange("subnet_ids") { _, n := d.GetChange("subnet_ids") if n == nil { n = new(schema.Set) } ns := n.(*schema.Set) var sIds []*string for _, s := range ns.List() { sIds = append(sIds, aws.String(s.(string))) } _, err := conn.ModifyClusterSubnetGroup(&redshift.ModifyClusterSubnetGroupInput{ ClusterSubnetGroupName: aws.String(d.Id()), SubnetIds: sIds, }) if err != nil { return err } } return nil }
func resourceComputeSecGroupV2Update(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) computeClient, err := config.computeV2Client(d.Get("region").(string)) if err != nil { return fmt.Errorf("Error creating OpenStack compute client: %s", err) } updateOpts := secgroups.UpdateOpts{ Name: d.Get("name").(string), Description: d.Get("description").(string), } log.Printf("[DEBUG] Updating Security Group (%s) with options: %+v", d.Id(), updateOpts) _, err = secgroups.Update(computeClient, d.Id(), updateOpts).Extract() if err != nil { return fmt.Errorf("Error updating OpenStack security group (%s): %s", d.Id(), err) } if d.HasChange("rule") { oldSGRaw, newSGRaw := d.GetChange("rule") oldSGRSet, newSGRSet := oldSGRaw.(*schema.Set), newSGRaw.(*schema.Set) secgrouprulesToAdd := newSGRSet.Difference(oldSGRSet) secgrouprulesToRemove := oldSGRSet.Difference(newSGRSet) log.Printf("[DEBUG] Security group rules to add: %v", secgrouprulesToAdd) log.Printf("[DEBUG] Security groups rules to remove: %v", secgrouprulesToRemove) for _, rawRule := range secgrouprulesToAdd.List() { createRuleOpts := resourceSecGroupRuleCreateOptsV2(d, rawRule) rule, err := secgroups.CreateRule(computeClient, createRuleOpts).Extract() if err != nil { return fmt.Errorf("Error adding rule to OpenStack security group (%s): %s", d.Id(), err) } log.Printf("[DEBUG] Added rule (%s) to OpenStack security group (%s) ", rule.ID, d.Id()) } for _, r := range secgrouprulesToRemove.List() { rule := resourceSecGroupRuleV2(d, r) err := secgroups.DeleteRule(computeClient, rule.ID).ExtractErr() if err != nil { errCode, ok := err.(*gophercloud.UnexpectedResponseCodeError) if !ok { return fmt.Errorf("Error removing rule (%s) from OpenStack security group (%s): %s", rule.ID, d.Id(), err) } if errCode.Actual == 404 { continue } else { return fmt.Errorf("Error removing rule (%s) from OpenStack security group (%s)", rule.ID, d.Id()) } } else { log.Printf("[DEBUG] Removed rule (%s) from OpenStack security group (%s): %s", rule.ID, d.Id(), err) } } } return resourceComputeSecGroupV2Read(d, meta) }
func resourceAwsProxyProtocolPolicyUpdate(d *schema.ResourceData, meta interface{}) error { elbconn := meta.(*AWSClient).elbconn elbname := aws.String(d.Get("load_balancer").(string)) // Retrieve the current ELB policies for updating the state req := &elb.DescribeLoadBalancersInput{ LoadBalancerNames: []*string{elbname}, } resp, err := elbconn.DescribeLoadBalancers(req) if err != nil { if isLoadBalancerNotFound(err) { // The ELB is gone now, so just remove it from the state d.SetId("") return nil } return fmt.Errorf("Error retrieving ELB attributes: %s", err) } backends := flattenBackendPolicies(resp.LoadBalancerDescriptions[0].BackendServerDescriptions) _, policyName := resourceAwsProxyProtocolPolicyParseId(d.Id()) d.Partial(true) if d.HasChange("instance_ports") { o, n := d.GetChange("instance_ports") os := o.(*schema.Set) ns := n.(*schema.Set) remove := os.Difference(ns).List() add := ns.Difference(os).List() inputs := []*elb.SetLoadBalancerPoliciesForBackendServerInput{} i, err := resourceAwsProxyProtocolPolicyRemove(policyName, remove, backends) if err != nil { return err } inputs = append(inputs, i...) i, err = resourceAwsProxyProtocolPolicyAdd(policyName, add, backends) if err != nil { return err } inputs = append(inputs, i...) for _, input := range inputs { input.LoadBalancerName = elbname if _, err := elbconn.SetLoadBalancerPoliciesForBackendServer(input); err != nil { return fmt.Errorf("Error setting policy for backend: %s", err) } } d.SetPartial("instance_ports") } return resourceAwsProxyProtocolPolicyRead(d, meta) }
func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{}) error { rdsconn := meta.(*AWSClient).rdsconn d.Partial(true) if d.HasChange("parameter") { o, n := d.GetChange("parameter") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := n.(*schema.Set) // Expand the "parameter" set to aws-sdk-go compat []rds.Parameter parameters, err := expandParameters(ns.Difference(os).List()) if err != nil { return err } if len(parameters) > 0 { modifyOpts := rds.ModifyDBParameterGroupInput{ DBParameterGroupName: aws.String(d.Get("name").(string)), Parameters: parameters, } log.Printf("[DEBUG] Modify DB Parameter Group: %s", modifyOpts) _, err = rdsconn.ModifyDBParameterGroup(&modifyOpts) if err != nil { return fmt.Errorf("Error modifying DB Parameter Group: %s", err) } } d.SetPartial("parameter") } if arn, err := buildRDSPGARN(d, meta); err == nil { if err := setTagsRDS(rdsconn, d, arn); err != nil { return err } else { d.SetPartial("tags") } } d.Partial(false) return resourceAwsDbParameterGroupRead(d, meta) }
// setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" func setTagsKinesis(conn *kinesis.Kinesis, d *schema.ResourceData) error { sn := d.Get("name").(string) if d.HasChange("tags") { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) n := nraw.(map[string]interface{}) create, remove := diffTagsKinesis(tagsFromMapKinesis(o), tagsFromMapKinesis(n)) // Set tags if len(remove) > 0 { log.Printf("[DEBUG] Removing tags: %#v", remove) k := make([]*string, len(remove), len(remove)) for i, t := range remove { k[i] = t.Key } _, err := conn.RemoveTagsFromStream(&kinesis.RemoveTagsFromStreamInput{ StreamName: aws.String(sn), TagKeys: k, }) if err != nil { return err } } if len(create) > 0 { log.Printf("[DEBUG] Creating tags: %#v", create) t := make(map[string]*string) for _, tag := range create { t[*tag.Key] = tag.Value } _, err := conn.AddTagsToStream(&kinesis.AddTagsToStreamInput{ StreamName: aws.String(sn), Tags: t, }) if err != nil { return err } } } return nil }
func resourceCloudStackFirewallUpdate(d *schema.ResourceData, meta interface{}) error { // Make sure all required parameters are there if err := verifyFirewallParams(d); err != nil { return err } // Check if the rule set as a whole has changed if d.HasChange("rule") { o, n := d.GetChange("rule") ors := o.(*schema.Set).Difference(n.(*schema.Set)) nrs := n.(*schema.Set).Difference(o.(*schema.Set)) // We need to start with a rule set containing all the rules we // already have and want to keep. Any rules that are not deleted // correctly and any newly created rules, will be added to this // set to make sure we end up in a consistent state rules := o.(*schema.Set).Intersection(n.(*schema.Set)) // First loop through all the old rules and delete them if ors.Len() > 0 { err := deleteFirewallRules(d, meta, rules, ors) // We need to update this first to preserve the correct state d.Set("rule", rules) if err != nil { return err } } // Then loop through all the new rules and create them if nrs.Len() > 0 { err := createFirewallRules(d, meta, rules, nrs) // We need to update this first to preserve the correct state d.Set("rule", rules) if err != nil { return err } } } return resourceCloudStackFirewallRead(d, meta) }
func resourceAwsCodeDeployUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).codedeployconn o, n := d.GetChange("name") _, err := conn.UpdateApplication(&codedeploy.UpdateApplicationInput{ ApplicationName: aws.String(o.(string)), NewApplicationName: aws.String(n.(string)), }) if err != nil { return err } log.Printf("[DEBUG] CodeDeploy application %s updated", n) d.Set("name", n) return nil }
func resourceAwsSnsTopicSubscriptionUpdate(d *schema.ResourceData, meta interface{}) error { snsconn := meta.(*AWSClient).snsconn // If any changes happened, un-subscribe and re-subscribe if d.HasChange("protocol") || d.HasChange("endpoint") || d.HasChange("topic_arn") { log.Printf("[DEBUG] Updating subscription %s", d.Id()) // Unsubscribe _, err := snsconn.Unsubscribe(&sns.UnsubscribeInput{ SubscriptionArn: aws.String(d.Id()), }) if err != nil { return fmt.Errorf("Error unsubscribing from SNS topic: %s", err) } // Re-subscribe and set id output, err := subscribeToSNSTopic(d, snsconn) d.SetId(*output.SubscriptionArn) d.Set("arn", *output.SubscriptionArn) } if d.HasChange("raw_message_delivery") { _, n := d.GetChange("raw_message_delivery") attrValue := "false" if n.(bool) { attrValue = "true" } req := &sns.SetSubscriptionAttributesInput{ SubscriptionArn: aws.String(d.Id()), AttributeName: aws.String("RawMessageDelivery"), AttributeValue: aws.String(attrValue), } _, err := snsconn.SetSubscriptionAttributes(req) if err != nil { return fmt.Errorf("Unable to set raw message delivery attribute on subscription") } } return resourceAwsSnsTopicSubscriptionRead(d, meta) }
func resourceAwsIamGroupUpdate(d *schema.ResourceData, meta interface{}) error { if d.HasChange("name") || d.HasChange("path") { iamconn := meta.(*AWSClient).iamconn on, nn := d.GetChange("name") _, np := d.GetChange("path") request := &iam.UpdateGroupInput{ GroupName: aws.String(on.(string)), NewGroupName: aws.String(nn.(string)), NewPath: aws.String(np.(string)), } _, err := iamconn.UpdateGroup(request) if err != nil { return fmt.Errorf("Error updating IAM Group %s: %s", d.Id(), err) } return resourceAwsIamGroupRead(d, meta) } return nil }
func resourceComputeProjectMetadataUpdate(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) if d.HasChange("metadata") { o, n := d.GetChange("metadata") updateMD := func() error { // Load project service log.Printf("[DEBUG] Loading project service: %s", config.Project) project, err := config.clientCompute.Projects.Get(config.Project).Do() if err != nil { return fmt.Errorf("Error loading project '%s': %s", config.Project, err) } md := project.CommonInstanceMetadata MetadataUpdate(o.(map[string]interface{}), n.(map[string]interface{}), md) op, err := config.clientCompute.Projects.SetCommonInstanceMetadata(config.Project, md).Do() if err != nil { return fmt.Errorf("SetCommonInstanceMetadata failed: %s", err) } log.Printf("[DEBUG] SetCommonMetadata: %d (%s)", op.Id, op.SelfLink) // Optimistic locking requires the fingerprint received to match // the fingerprint we send the server, if there is a mismatch then we // are working on old data, and must retry return computeOperationWaitGlobal(config, op, "SetCommonMetadata") } err := MetadataRetryWrapper(updateMD) if err != nil { return err } return resourceComputeProjectMetadataRead(d, meta) } return nil }
func resourceAwsElasticacheParameterGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).elasticacheconn d.Partial(true) if d.HasChange("parameter") { o, n := d.GetChange("parameter") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := n.(*schema.Set) // Expand the "parameter" set to aws-sdk-go compat []elasticacheconn.Parameter parameters, err := expandElastiCacheParameters(ns.Difference(os).List()) if err != nil { return err } if len(parameters) > 0 { modifyOpts := elasticache.ModifyCacheParameterGroupInput{ CacheParameterGroupName: aws.String(d.Get("name").(string)), ParameterNameValues: parameters, } log.Printf("[DEBUG] Modify Cache Parameter Group: %#v", modifyOpts) _, err = conn.ModifyCacheParameterGroup(&modifyOpts) if err != nil { return fmt.Errorf("Error modifying Cache Parameter Group: %s", err) } } d.SetPartial("parameter") } d.Partial(false) return resourceAwsElasticacheParameterGroupRead(d, meta) }
func resourceAwsCodeDeployDeploymentGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).codedeployconn input := codedeploy.UpdateDeploymentGroupInput{ ApplicationName: aws.String(d.Get("app_name").(string)), CurrentDeploymentGroupName: aws.String(d.Get("deployment_group_name").(string)), } if d.HasChange("autoscaling_groups") { _, n := d.GetChange("autoscaling_groups") input.AutoScalingGroups = expandStringList(n.(*schema.Set).List()) } if d.HasChange("deployment_config_name") { _, n := d.GetChange("deployment_config_name") input.DeploymentConfigName = aws.String(n.(string)) } if d.HasChange("deployment_group_name") { _, n := d.GetChange("deployment_group_name") input.NewDeploymentGroupName = aws.String(n.(string)) } // TagFilters aren't like tags. They don't append. They simply replace. if d.HasChange("on_premises_instance_tag_filter") { _, n := d.GetChange("on_premises_instance_tag_filter") onPremFilters := buildOnPremTagFilters(n.(*schema.Set).List()) input.OnPremisesInstanceTagFilters = onPremFilters } if d.HasChange("ec2_tag_filter") { _, n := d.GetChange("ec2_tag_filter") ec2Filters := buildEC2TagFilters(n.(*schema.Set).List()) input.Ec2TagFilters = ec2Filters } log.Printf("[DEBUG] Updating CodeDeploy DeploymentGroup %s", d.Id()) _, err := conn.UpdateDeploymentGroup(&input) if err != nil { return err } return resourceAwsCodeDeployDeploymentGroupRead(d, meta) }
func resourceCloudStackPortForwardUpdate(d *schema.ResourceData, meta interface{}) error { // Check if the forward set as a whole has changed if d.HasChange("forward") { o, n := d.GetChange("forward") ors := o.(*schema.Set).Difference(n.(*schema.Set)) nrs := n.(*schema.Set).Difference(o.(*schema.Set)) // We need to start with a rule set containing all the rules we // already have and want to keep. Any rules that are not deleted // correctly and any newly created rules, will be added to this // set to make sure we end up in a consistent state forwards := o.(*schema.Set).Intersection(n.(*schema.Set)) // First loop through all the new forwards and create (before destroy) them if nrs.Len() > 0 { err := createPortForwards(d, meta, forwards, nrs) // We need to update this first to preserve the correct state d.Set("forward", forwards) if err != nil { return err } } // Then loop through all the old forwards and delete them if ors.Len() > 0 { err := deletePortForwards(d, meta, forwards, ors) // We need to update this first to preserve the correct state d.Set("forward", forwards) if err != nil { return err } } } return resourceCloudStackPortForwardRead(d, meta) }
func updateRoles(conn *iam.IAM, d *schema.ResourceData, meta interface{}) error { arn := d.Get("policy_arn").(string) o, n := d.GetChange("roles") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := n.(*schema.Set) remove := expandStringList(os.Difference(ns).List()) add := expandStringList(ns.Difference(os).List()) if rErr := detachPolicyFromRoles(conn, remove, arn); rErr != nil { return rErr } if aErr := attachPolicyToRoles(conn, add, arn); aErr != nil { return aErr } return nil }
func resourceAwsSnsTopicUpdate(d *schema.ResourceData, meta interface{}) error { r := *resourceAwsSnsTopic() for k, _ := range r.Schema { if attrKey, ok := SNSAttributeMap[k]; ok { if d.HasChange(k) { log.Printf("[DEBUG] Updating %s", attrKey) _, n := d.GetChange(k) // Ignore an empty policy if !(k == "policy" && n == "") { // Make API call to update attributes req := sns.SetTopicAttributesInput{ TopicArn: aws.String(d.Id()), AttributeName: aws.String(attrKey), AttributeValue: aws.String(n.(string)), } // Retry the update in the event of an eventually consistent style of // error, where say an IAM resource is successfully created but not // actually available. See https://github.com/hashicorp/terraform/issues/3660 log.Printf("[DEBUG] Updating SNS Topic (%s) attributes request: %s", d.Id(), req) stateConf := &resource.StateChangeConf{ Pending: []string{"retrying"}, Target: "success", Refresh: resourceAwsSNSUpdateRefreshFunc(meta, req), Timeout: 1 * time.Minute, MinTimeout: 3 * time.Second, } _, err := stateConf.WaitForState() if err != nil { return err } } } } } return resourceAwsSnsTopicRead(d, meta) }
func resourceAwsAutoscalingNotificationUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn // Notifications API call is a PUT, so we don't need to diff the list, just // push whatever it is and AWS sorts it out nl := convertSetToList(d.Get("notifications").(*schema.Set)) o, n := d.GetChange("group_names") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := n.(*schema.Set) remove := convertSetToList(os.Difference(ns)) add := convertSetToList(ns.Difference(os)) topic := d.Get("topic_arn").(string) if err := removeNotificationConfigToGroupsWithTopic(conn, remove, topic); err != nil { return err } var update []*string if d.HasChange("notifications") { update = convertSetToList(d.Get("group_names").(*schema.Set)) } else { update = add } if err := addNotificationConfigToGroupsWithTopic(conn, update, nl, topic); err != nil { return err } return resourceAwsAutoscalingNotificationRead(d, meta) }
func resourceHerokuAppUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*heroku.Service) // If name changed, update it if d.HasChange("name") { v := d.Get("name").(string) opts := heroku.AppUpdateOpts{ Name: &v, } renamedApp, err := client.AppUpdate(d.Id(), opts) if err != nil { return err } // Store the new ID d.SetId(renamedApp.Name) } // If the config vars changed, then recalculate those if d.HasChange("config_vars") { o, n := d.GetChange("config_vars") if o == nil { o = []interface{}{} } if n == nil { n = []interface{}{} } err := updateConfigVars( d.Id(), client, o.([]interface{}), n.([]interface{})) if err != nil { return err } } return resourceHerokuAppRead(d, meta) }
// setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" func setTagsRDS(conn *rds.RDS, d *schema.ResourceData, arn string) error { if d.HasChange("tags") { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) n := nraw.(map[string]interface{}) create, remove := diffTagsRDS(tagsFromMapRDS(o), tagsFromMapRDS(n)) // Set tags if len(remove) > 0 { log.Printf("[DEBUG] Removing tags: %s", remove) k := make([]*string, len(remove), len(remove)) for i, t := range remove { k[i] = t.Key } _, err := conn.RemoveTagsFromResource(&rds.RemoveTagsFromResourceInput{ ResourceName: aws.String(arn), TagKeys: k, }) if err != nil { return err } } if len(create) > 0 { log.Printf("[DEBUG] Creating tags: %s", create) _, err := conn.AddTagsToResource(&rds.AddTagsToResourceInput{ ResourceName: aws.String(arn), Tags: create, }) if err != nil { return err } } } return nil }