func resourceAwsAutoscalingGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn opts := autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(d.Id()), } if d.HasChange("desired_capacity") { opts.DesiredCapacity = aws.Long(int64(d.Get("desired_capacity").(int))) } if d.HasChange("launch_configuration") { opts.LaunchConfigurationName = aws.String(d.Get("launch_configuration").(string)) } if d.HasChange("min_size") { opts.MinSize = aws.Long(int64(d.Get("min_size").(int))) } if d.HasChange("max_size") { opts.MaxSize = aws.Long(int64(d.Get("max_size").(int))) } if d.HasChange("health_check_grace_period") { opts.HealthCheckGracePeriod = aws.Long(int64(d.Get("health_check_grace_period").(int))) } if d.HasChange("health_check_type") { opts.HealthCheckGracePeriod = aws.Long(int64(d.Get("health_check_grace_period").(int))) opts.HealthCheckType = aws.String(d.Get("health_check_type").(string)) } if err := setAutoscalingTags(conn, d); err != nil { return err } else { d.SetPartial("tag") } log.Printf("[DEBUG] AutoScaling Group update configuration: %#v", opts) _, err := conn.UpdateAutoScalingGroup(&opts) if err != nil { d.Partial(true) return fmt.Errorf("Error updating Autoscaling group: %s", err) } return resourceAwsAutoscalingGroupRead(d, meta) }
func resourceAwsAutoscalingGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn opts := autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(d.Id()), } if d.HasChange("default_cooldown") { opts.DefaultCooldown = aws.Long(int64(d.Get("default_cooldown").(int))) } if d.HasChange("desired_capacity") { opts.DesiredCapacity = aws.Long(int64(d.Get("desired_capacity").(int))) } if d.HasChange("launch_configuration") { opts.LaunchConfigurationName = aws.String(d.Get("launch_configuration").(string)) } if d.HasChange("min_size") { opts.MinSize = aws.Long(int64(d.Get("min_size").(int))) } if d.HasChange("max_size") { opts.MaxSize = aws.Long(int64(d.Get("max_size").(int))) } if d.HasChange("health_check_grace_period") { opts.HealthCheckGracePeriod = aws.Long(int64(d.Get("health_check_grace_period").(int))) } if d.HasChange("health_check_type") { opts.HealthCheckGracePeriod = aws.Long(int64(d.Get("health_check_grace_period").(int))) opts.HealthCheckType = aws.String(d.Get("health_check_type").(string)) } if err := setAutoscalingTags(conn, d); err != nil { return err } else { d.SetPartial("tag") } log.Printf("[DEBUG] AutoScaling Group update configuration: %#v", opts) _, err := conn.UpdateAutoScalingGroup(&opts) if err != nil { d.Partial(true) return fmt.Errorf("Error updating Autoscaling group: %s", err) } if d.HasChange("load_balancers") { o, n := d.GetChange("load_balancers") 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 len(remove) > 0 { _, err := conn.DetachLoadBalancers(&autoscaling.DetachLoadBalancersInput{ AutoScalingGroupName: aws.String(d.Id()), LoadBalancerNames: remove, }) if err != nil { return fmt.Errorf("[WARN] Error updating Load Balancers for AutoScaling Group (%s), error: %s", d.Id(), err) } } if len(add) > 0 { _, err := conn.AttachLoadBalancers(&autoscaling.AttachLoadBalancersInput{ AutoScalingGroupName: aws.String(d.Id()), LoadBalancerNames: add, }) if err != nil { return fmt.Errorf("[WARN] Error updating Load Balancers for AutoScaling Group (%s), error: %s", d.Id(), err) } } } return resourceAwsAutoscalingGroupRead(d, meta) }
func resourceAwsAutoscalingGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn shouldWaitForCapacity := false opts := autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(d.Id()), } if d.HasChange("default_cooldown") { opts.DefaultCooldown = aws.Int64(int64(d.Get("default_cooldown").(int))) } if d.HasChange("desired_capacity") { opts.DesiredCapacity = aws.Int64(int64(d.Get("desired_capacity").(int))) shouldWaitForCapacity = true } if d.HasChange("launch_configuration") { opts.LaunchConfigurationName = aws.String(d.Get("launch_configuration").(string)) } if d.HasChange("min_size") { opts.MinSize = aws.Int64(int64(d.Get("min_size").(int))) shouldWaitForCapacity = true } if d.HasChange("max_size") { opts.MaxSize = aws.Int64(int64(d.Get("max_size").(int))) } if d.HasChange("health_check_grace_period") { opts.HealthCheckGracePeriod = aws.Int64(int64(d.Get("health_check_grace_period").(int))) } if d.HasChange("health_check_type") { opts.HealthCheckGracePeriod = aws.Int64(int64(d.Get("health_check_grace_period").(int))) opts.HealthCheckType = aws.String(d.Get("health_check_type").(string)) } if d.HasChange("vpc_zone_identifier") { opts.VPCZoneIdentifier = expandVpcZoneIdentifiers(d.Get("vpc_zone_identifier").(*schema.Set).List()) } if d.HasChange("availability_zones") { if v, ok := d.GetOk("availability_zones"); ok && v.(*schema.Set).Len() > 0 { opts.AvailabilityZones = expandStringList(v.(*schema.Set).List()) } } if d.HasChange("placement_group") { opts.PlacementGroup = aws.String(d.Get("placement_group").(string)) } if d.HasChange("termination_policies") { // If the termination policy is set to null, we need to explicitly set // it back to "Default", or the API won't reset it for us. if v, ok := d.GetOk("termination_policies"); ok && len(v.([]interface{})) > 0 { opts.TerminationPolicies = expandStringList(v.([]interface{})) } else { log.Printf("[DEBUG] Explictly setting null termination policy to 'Default'") opts.TerminationPolicies = aws.StringSlice([]string{"Default"}) } } if err := setAutoscalingTags(conn, d); err != nil { return err } else { d.SetPartial("tag") } log.Printf("[DEBUG] AutoScaling Group update configuration: %#v", opts) _, err := conn.UpdateAutoScalingGroup(&opts) if err != nil { d.Partial(true) return fmt.Errorf("Error updating Autoscaling group: %s", err) } if d.HasChange("load_balancers") { o, n := d.GetChange("load_balancers") 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 len(remove) > 0 { _, err := conn.DetachLoadBalancers(&autoscaling.DetachLoadBalancersInput{ AutoScalingGroupName: aws.String(d.Id()), LoadBalancerNames: remove, }) if err != nil { return fmt.Errorf("[WARN] Error updating Load Balancers for AutoScaling Group (%s), error: %s", d.Id(), err) } } if len(add) > 0 { _, err := conn.AttachLoadBalancers(&autoscaling.AttachLoadBalancersInput{ AutoScalingGroupName: aws.String(d.Id()), LoadBalancerNames: add, }) if err != nil { return fmt.Errorf("[WARN] Error updating Load Balancers for AutoScaling Group (%s), error: %s", d.Id(), err) } } } if shouldWaitForCapacity { waitForASGCapacity(d, meta, capacitySatifiedUpdate) } if d.HasChange("enabled_metrics") { updateASGMetricsCollection(d, conn) } return resourceAwsAutoscalingGroupRead(d, meta) }
func resourceAwsAutoscalingGroupCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn var asgName string if v, ok := d.GetOk("name"); ok { asgName = v.(string) } else { asgName = resource.PrefixedUniqueId("tf-asg-") d.Set("name", asgName) } createOpts := autoscaling.CreateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(asgName), LaunchConfigurationName: aws.String(d.Get("launch_configuration").(string)), NewInstancesProtectedFromScaleIn: aws.Bool(d.Get("protect_from_scale_in").(bool)), } updateOpts := autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(asgName), } initialLifecycleHooks := d.Get("initial_lifecycle_hook").(*schema.Set).List() twoPhases := len(initialLifecycleHooks) > 0 minSize := aws.Int64(int64(d.Get("min_size").(int))) maxSize := aws.Int64(int64(d.Get("max_size").(int))) if twoPhases { createOpts.MinSize = aws.Int64(int64(0)) createOpts.MaxSize = aws.Int64(int64(0)) updateOpts.MinSize = minSize updateOpts.MaxSize = maxSize if v, ok := d.GetOk("desired_capacity"); ok { updateOpts.DesiredCapacity = aws.Int64(int64(v.(int))) } } else { createOpts.MinSize = minSize createOpts.MaxSize = maxSize if v, ok := d.GetOk("desired_capacity"); ok { createOpts.DesiredCapacity = aws.Int64(int64(v.(int))) } } // Availability Zones are optional if VPC Zone Identifer(s) are specified if v, ok := d.GetOk("availability_zones"); ok && v.(*schema.Set).Len() > 0 { createOpts.AvailabilityZones = expandStringList(v.(*schema.Set).List()) } if v, ok := d.GetOk("tag"); ok { createOpts.Tags = autoscalingTagsFromMap( setToMapByKey(v.(*schema.Set), "key"), d.Get("name").(string)) } if v, ok := d.GetOk("default_cooldown"); ok { createOpts.DefaultCooldown = aws.Int64(int64(v.(int))) } if v, ok := d.GetOk("health_check_type"); ok && v.(string) != "" { createOpts.HealthCheckType = aws.String(v.(string)) } if v, ok := d.GetOk("health_check_grace_period"); ok { createOpts.HealthCheckGracePeriod = aws.Int64(int64(v.(int))) } if v, ok := d.GetOk("placement_group"); ok { createOpts.PlacementGroup = aws.String(v.(string)) } if v, ok := d.GetOk("load_balancers"); ok && v.(*schema.Set).Len() > 0 { createOpts.LoadBalancerNames = expandStringList( v.(*schema.Set).List()) } if v, ok := d.GetOk("vpc_zone_identifier"); ok && v.(*schema.Set).Len() > 0 { createOpts.VPCZoneIdentifier = expandVpcZoneIdentifiers(v.(*schema.Set).List()) } if v, ok := d.GetOk("termination_policies"); ok && len(v.([]interface{})) > 0 { createOpts.TerminationPolicies = expandStringList(v.([]interface{})) } if v, ok := d.GetOk("target_group_arns"); ok && len(v.(*schema.Set).List()) > 0 { createOpts.TargetGroupARNs = expandStringList(v.(*schema.Set).List()) } log.Printf("[DEBUG] AutoScaling Group create configuration: %#v", createOpts) _, err := conn.CreateAutoScalingGroup(&createOpts) if err != nil { return fmt.Errorf("Error creating AutoScaling Group: %s", err) } d.SetId(d.Get("name").(string)) log.Printf("[INFO] AutoScaling Group ID: %s", d.Id()) if twoPhases { for _, hook := range generatePutLifecycleHookInputs(asgName, initialLifecycleHooks) { if err = resourceAwsAutoscalingLifecycleHookPutOp(conn, &hook); err != nil { return fmt.Errorf("Error creating initial lifecycle hooks: %s", err) } } _, err = conn.UpdateAutoScalingGroup(&updateOpts) if err != nil { return fmt.Errorf("Error setting AutoScaling Group initial capacity: %s", err) } } if err := waitForASGCapacity(d, meta, capacitySatisfiedCreate); err != nil { return err } if _, ok := d.GetOk("enabled_metrics"); ok { metricsErr := enableASGMetricsCollection(d, conn) if metricsErr != nil { return metricsErr } } return resourceAwsAutoscalingGroupRead(d, meta) }
func resourceAwsAutoscalingGroupUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn opts := autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(d.Id()), } if d.HasChange("default_cooldown") { opts.DefaultCooldown = aws.Int64(int64(d.Get("default_cooldown").(int))) } if d.HasChange("desired_capacity") { opts.DesiredCapacity = aws.Int64(int64(d.Get("desired_capacity").(int))) } if d.HasChange("launch_configuration") { opts.LaunchConfigurationName = aws.String(d.Get("launch_configuration").(string)) } if d.HasChange("min_size") { opts.MinSize = aws.Int64(int64(d.Get("min_size").(int))) } if d.HasChange("max_size") { opts.MaxSize = aws.Int64(int64(d.Get("max_size").(int))) } if d.HasChange("health_check_grace_period") { opts.HealthCheckGracePeriod = aws.Int64(int64(d.Get("health_check_grace_period").(int))) } if d.HasChange("health_check_type") { opts.HealthCheckGracePeriod = aws.Int64(int64(d.Get("health_check_grace_period").(int))) opts.HealthCheckType = aws.String(d.Get("health_check_type").(string)) } if d.HasChange("vpc_zone_identifier") { opts.VPCZoneIdentifier = expandVpcZoneIdentifiers(d.Get("vpc_zone_identifier").(*schema.Set).List()) } if d.HasChange("availability_zones") { if v, ok := d.GetOk("availability_zones"); ok && v.(*schema.Set).Len() > 0 { opts.AvailabilityZones = expandStringList(d.Get("availability_zones").(*schema.Set).List()) } } if d.HasChange("placement_group") { opts.PlacementGroup = aws.String(d.Get("placement_group").(string)) } if d.HasChange("termination_policies") { // If the termination policy is set to null, we need to explicitly set // it back to "Default", or the API won't reset it for us. // This means GetOk() will fail us on the zero check. v := d.Get("termination_policies") if len(v.([]interface{})) > 0 { opts.TerminationPolicies = expandStringList(v.([]interface{})) } else { // Policies is a slice of string pointers, so build one. // Maybe there's a better idiom for this? log.Printf("[DEBUG] Explictly setting null termination policy to 'Default'") pol := "Default" s := make([]*string, 1, 1) s[0] = &pol opts.TerminationPolicies = s } } if err := setAutoscalingTags(conn, d); err != nil { return err } else { d.SetPartial("tag") } log.Printf("[DEBUG] AutoScaling Group update configuration: %#v", opts) _, err := conn.UpdateAutoScalingGroup(&opts) if err != nil { d.Partial(true) return fmt.Errorf("Error updating Autoscaling group: %s", err) } if d.HasChange("load_balancers") { o, n := d.GetChange("load_balancers") 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 len(remove) > 0 { _, err := conn.DetachLoadBalancers(&autoscaling.DetachLoadBalancersInput{ AutoScalingGroupName: aws.String(d.Id()), LoadBalancerNames: remove, }) if err != nil { return fmt.Errorf("[WARN] Error updating Load Balancers for AutoScaling Group (%s), error: %s", d.Id(), err) } } if len(add) > 0 { _, err := conn.AttachLoadBalancers(&autoscaling.AttachLoadBalancersInput{ AutoScalingGroupName: aws.String(d.Id()), LoadBalancerNames: add, }) if err != nil { return fmt.Errorf("[WARN] Error updating Load Balancers for AutoScaling Group (%s), error: %s", d.Id(), err) } } } return resourceAwsAutoscalingGroupRead(d, meta) }