// Private function without the confirmation terminal prompts func updateAutoScaleGroups(asgList *AutoScaleGroups, version string, double, dryRun bool) (err error) { for _, asg := range *asgList { // Get the ASG class config cfg, err := config.LoadAutoscalingGroupClass(asg.Class) if err != nil { return err } terminal.Information("Found Autoscaling group class configuration for [" + asg.Class + "]") // Get the Launch Configuration class config launchConfigurationCfg, err := config.LoadLaunchConfigurationClass(cfg.LaunchConfigurationClass) if err != nil { return err } terminal.Information("Found Launch Configuration class configuration for [" + cfg.LaunchConfigurationClass + "]") // Get the AZs azs, errs := regions.GetAZs() if errs != nil { return errors.New("Error gathering region list") } for region, regionAZs := range azs.GetRegionMap(cfg.AvailabilityZones) { // TODO check if exists yet ? // Verify that the latest Launch Configuration is available in this region lcName := GetLaunchConfigurationName(region, cfg.LaunchConfigurationClass, launchConfigurationCfg.Version) if lcName == "" { return fmt.Errorf("Launch Configuration [%s] version [%d] is not available in [%s]!", cfg.LaunchConfigurationClass, launchConfigurationCfg.Version, region) } terminal.Information(fmt.Sprintf("Found latest Launch Configuration [%s] version [%d] in [%s]", cfg.LaunchConfigurationClass, launchConfigurationCfg.Version, asg.Region)) svc := autoscaling.New(session.New(&aws.Config{Region: aws.String(region)})) params := &autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(asg.Name), AvailabilityZones: []*string{ aws.String("XmlStringMaxLen255"), // Required // More values... }, DefaultCooldown: aws.Int64(int64(cfg.DefaultCooldown)), DesiredCapacity: aws.Int64(int64(cfg.DesiredCapacity)), HealthCheckGracePeriod: aws.Int64(int64(cfg.HealthCheckGracePeriod)), HealthCheckType: aws.String(cfg.HealthCheckType), LaunchConfigurationName: aws.String(lcName), MaxSize: aws.Int64(int64(asg.MaxSize)), MinSize: aws.Int64(int64(asg.MinSize)), //NewInstancesProtectedFromScaleIn: aws.Bool(true), // TODO? //PlacementGroup: aws.String("XmlStringMaxLen255"), // TODO } subList := new(Subnets) var vpcZones []string if cfg.SubnetClass != "" { err := GetRegionSubnets(region, subList, "") if err != nil { return err } } // Set the AZs for _, az := range regionAZs { if !azs.ValidAZ(az) { return cli.NewExitError("Availability Zone ["+az+"] is Invalid!", 1) } terminal.Information("Found Availability Zone [" + az + "]!") params.AvailabilityZones = append(params.AvailabilityZones, aws.String(az)) for _, sub := range *subList { if sub.Class == cfg.SubnetClass && sub.AvailabilityZone == az { vpcZones = append(vpcZones, sub.SubnetID) } } } // Set the VPCZoneIdentifier (SubnetIds seperated by comma) params.VPCZoneIdentifier = aws.String(strings.Join(vpcZones, ", ")) // Set the Termination Policies for _, terminationPolicy := range cfg.LoadBalancerNames { params.TerminationPolicies = append(params.TerminationPolicies, aws.String(terminationPolicy)) // ?? } // Update it! if !dryRun { _, err := svc.UpdateAutoScalingGroup(params) if err != nil { if awsErr, ok := err.(awserr.Error); ok { return errors.New(awsErr.Message()) } return err } terminal.Information("Updated AutoScaling Group [" + asg.Name + "] in [" + region + "]!") } else { fmt.Println(params) } } } return nil }
// CreateAutoScaleGroups creates a new AutoScale Group of the given class func CreateAutoScaleGroups(class string, dryRun bool) (err error) { // --dry-run flag if dryRun { terminal.Information("--dry-run flag is set, not making any actual changes!") } // Verify the asg config class input cfg, err := config.LoadAutoscalingGroupClass(class) if err != nil { return err } terminal.Information("Found Autoscaling group class configuration for [" + class + "]") // Verify the launchconfig class input launchConfigurationCfg, err := config.LoadLaunchConfigurationClass(cfg.LaunchConfigurationClass) if err != nil { return err } terminal.Information("Found Launch Configuration class configuration for [" + cfg.LaunchConfigurationClass + "]") // Get the AZs azs, errs := regions.GetAZs() if errs != nil { return errors.New("Error gathering region list") } for region, regionAZs := range azs.GetRegionMap(cfg.AvailabilityZones) { // Verify that the latest Launch Configuration is available in this region lcName := GetLaunchConfigurationName(region, cfg.LaunchConfigurationClass, launchConfigurationCfg.Version) if lcName == "" { return fmt.Errorf("Launch Configuration [%s] version [%d] is not available in [%s]!", cfg.LaunchConfigurationClass, launchConfigurationCfg.Version, region) } terminal.Information(fmt.Sprintf("Found latest Launch Configuration [%s] version [%d] in [%s]", cfg.LaunchConfigurationClass, launchConfigurationCfg.Version, region)) svc := autoscaling.New(session.New(&aws.Config{Region: aws.String(region)})) params := &autoscaling.CreateAutoScalingGroupInput{ AutoScalingGroupName: aws.String(class), MaxSize: aws.Int64(int64(cfg.MaxSize)), MinSize: aws.Int64(int64(cfg.MinSize)), DefaultCooldown: aws.Int64(int64(cfg.DefaultCooldown)), DesiredCapacity: aws.Int64(int64(cfg.DesiredCapacity)), HealthCheckGracePeriod: aws.Int64(int64(cfg.HealthCheckGracePeriod)), HealthCheckType: aws.String(cfg.HealthCheckType), LaunchConfigurationName: aws.String(lcName), // InstanceId: aws.String("XmlStringMaxLen19"), // TODO ? // NewInstancesProtectedFromScaleIn: aws.Bool(true), // TODO ? // PlacementGroup: aws.String("XmlStringMaxLen255"), // TODO ? Tags: []*autoscaling.Tag{ { // Name Key: aws.String("Name"), PropagateAtLaunch: aws.Bool(true), ResourceId: aws.String(class), ResourceType: aws.String("auto-scaling-group"), Value: aws.String(lcName), }, { // Class Key: aws.String("Class"), PropagateAtLaunch: aws.Bool(true), ResourceId: aws.String(class), ResourceType: aws.String("auto-scaling-group"), Value: aws.String(class), }, }, } subList := new(Subnets) var vpcZones []string if cfg.SubnetClass != "" { err := GetRegionSubnets(region, subList, "") if err != nil { return err } } // Set the AZs for _, az := range regionAZs { if !azs.ValidAZ(az) { return cli.NewExitError("Availability Zone ["+az+"] is Invalid!", 1) } terminal.Information("Found Availability Zone [" + az + "]!") params.AvailabilityZones = append(params.AvailabilityZones, aws.String(az)) for _, sub := range *subList { if sub.Class == cfg.SubnetClass && sub.AvailabilityZone == az { vpcZones = append(vpcZones, sub.SubnetID) } } } // Set the VPCZoneIdentifier (SubnetIds seperated by comma) params.VPCZoneIdentifier = aws.String(strings.Join(vpcZones, ", ")) // Set the Load Balancers for _, elb := range cfg.LoadBalancerNames { params.LoadBalancerNames = append(params.LoadBalancerNames, aws.String(elb)) } // Set the Termination Policies for _, terminationPolicy := range cfg.LoadBalancerNames { params.TerminationPolicies = append(params.TerminationPolicies, aws.String(terminationPolicy)) // ?? } // Create it! if !dryRun { _, err := svc.CreateAutoScalingGroup(params) if err != nil { if awsErr, ok := err.(awserr.Error); ok { return errors.New(awsErr.Message()) } return err } terminal.Information("Created AutoScaling Group [" + aws.StringValue(params.AutoScalingGroupName) + "] in [" + region + "]!") terminal.Information("Done!") } else { fmt.Println(params) } } return nil }