summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/autoscaling/autoscaling.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goamz/goamz/autoscaling/autoscaling.go')
-rw-r--r--vendor/github.com/goamz/goamz/autoscaling/autoscaling.go1768
1 files changed, 1768 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/autoscaling/autoscaling.go b/vendor/github.com/goamz/goamz/autoscaling/autoscaling.go
new file mode 100644
index 000000000..8e9f8ab02
--- /dev/null
+++ b/vendor/github.com/goamz/goamz/autoscaling/autoscaling.go
@@ -0,0 +1,1768 @@
+//
+// autoscaling: This package provides types and functions to interact with the AWS Auto Scale API
+//
+// Depends on https://wiki.ubuntu.com/goamz
+//
+
+package autoscaling
+
+import (
+ "encoding/base64"
+ "encoding/xml"
+ "fmt"
+ "log"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/goamz/goamz/aws"
+)
+
+const debug = false
+
+var timeNow = time.Now
+
+// AutoScaling contains the details of the AWS region to perform operations against.
+type AutoScaling struct {
+ aws.Auth
+ aws.Region
+}
+
+// New creates a new AutoScaling Client.
+func New(auth aws.Auth, region aws.Region) *AutoScaling {
+ return &AutoScaling{auth, region}
+}
+
+// ----------------------------------------------------------------------------
+// Request dispatching logic.
+
+// Error encapsulates an error returned by the AWS Auto Scaling API.
+//
+// See http://goo.gl/VZGuC for more details.
+type Error struct {
+ // HTTP status code (200, 403, ...)
+ StatusCode int
+ // AutoScaling error code ("UnsupportedOperation", ...)
+ Code string
+ // The error type
+ Type string
+ // The human-oriented error message
+ Message string
+ RequestId string `xml:"RequestID"`
+}
+
+func (err *Error) Error() string {
+ if err.Code == "" {
+ return err.Message
+ }
+
+ return fmt.Sprintf("%s (%s)", err.Message, err.Code)
+}
+
+type xmlErrors struct {
+ RequestId string `xml:"RequestId"`
+ Errors []Error `xml:"Error"`
+}
+
+func (as *AutoScaling) query(params map[string]string, resp interface{}) error {
+ params["Version"] = "2011-01-01"
+ data := strings.NewReader(multimap(params).Encode())
+
+ hreq, err := http.NewRequest("POST", as.Region.AutoScalingEndpoint+"/", data)
+ if err != nil {
+ return err
+ }
+
+ hreq.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
+
+ token := as.Auth.Token()
+ if token != "" {
+ hreq.Header.Set("X-Amz-Security-Token", token)
+ }
+
+ signer := aws.NewV4Signer(as.Auth, "autoscaling", as.Region)
+ signer.Sign(hreq)
+
+ if debug {
+ log.Printf("%v -> {\n", hreq)
+ }
+ r, err := http.DefaultClient.Do(hreq)
+
+ if err != nil {
+ log.Printf("Error calling Amazon %v", err)
+ return err
+ }
+
+ defer r.Body.Close()
+
+ if debug {
+ dump, _ := httputil.DumpResponse(r, true)
+ log.Printf("response:\n")
+ log.Printf("%v\n}\n", string(dump))
+ }
+ if r.StatusCode != 200 {
+ return buildError(r)
+ }
+ err = xml.NewDecoder(r.Body).Decode(resp)
+ return err
+}
+
+func buildError(r *http.Response) error {
+ var (
+ err Error
+ errors xmlErrors
+ )
+ xml.NewDecoder(r.Body).Decode(&errors)
+ if len(errors.Errors) > 0 {
+ err = errors.Errors[0]
+ }
+
+ err.RequestId = errors.RequestId
+ err.StatusCode = r.StatusCode
+ if err.Message == "" {
+ err.Message = r.Status
+ }
+ return &err
+}
+
+func multimap(p map[string]string) url.Values {
+ q := make(url.Values, len(p))
+ for k, v := range p {
+ q[k] = []string{v}
+ }
+ return q
+}
+
+func makeParams(action string) map[string]string {
+ params := make(map[string]string)
+ params["Action"] = action
+ return params
+}
+
+func addParamsList(params map[string]string, label string, ids []string) {
+ for i, id := range ids {
+ params[label+"."+strconv.Itoa(i+1)] = id
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Filtering helper.
+
+// Filter builds filtering parameters to be used in an autoscaling query which supports
+// filtering. For example:
+//
+// filter := NewFilter()
+// filter.Add("architecture", "i386")
+// filter.Add("launch-index", "0")
+// resp, err := as.DescribeTags(filter,nil,nil)
+//
+type Filter struct {
+ m map[string][]string
+}
+
+// NewFilter creates a new Filter.
+func NewFilter() *Filter {
+ return &Filter{make(map[string][]string)}
+}
+
+// Add appends a filtering parameter with the given name and value(s).
+func (f *Filter) Add(name string, value ...string) {
+ f.m[name] = append(f.m[name], value...)
+}
+
+func (f *Filter) addParams(params map[string]string) {
+ if f != nil {
+ a := make([]string, len(f.m))
+ i := 0
+ for k := range f.m {
+ a[i] = k
+ i++
+ }
+ sort.StringSlice(a).Sort()
+ for i, k := range a {
+ prefix := "Filters.member." + strconv.Itoa(i+1)
+ params[prefix+".Name"] = k
+ for j, v := range f.m[k] {
+ params[prefix+".Values.member."+strconv.Itoa(j+1)] = v
+ }
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Auto Scaling base types and related functions.
+
+// SimpleResp is the basic response from most actions.
+type SimpleResp struct {
+ XMLName xml.Name
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// EnabledMetric encapsulates a metric associated with an Auto Scaling Group
+//
+// See http://goo.gl/hXiH17 for more details
+type EnabledMetric struct {
+ Granularity string `xml:"Granularity"` // The granularity of the enabled metric.
+ Metric string `xml:"Metric"` // The name of the enabled metric.
+}
+
+// Instance encapsulates an instance type as returned by the Auto Scaling API
+//
+// See http://goo.gl/NwBxGh and http://goo.gl/OuoqhS for more details.
+type Instance struct {
+ // General instance information
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ AvailabilityZone string `xml:"AvailabilityZone"`
+ HealthStatus string `xml:"HealthStatus"`
+ InstanceId string `xml:"InstanceId"`
+ LaunchConfigurationName string `xml:"LaunchConfigurationName"`
+ LifecycleState string `xml:"LifecycleState"`
+}
+
+// SuspenedProcess encapsulates an Auto Scaling process that has been suspended
+//
+// See http://goo.gl/iObPgF for more details
+type SuspendedProcess struct {
+ ProcessName string `xml:"ProcessName"`
+ SuspensionReason string `xml:"SuspensionReason"`
+}
+
+// Tag encapsulates tag applied to an Auto Scaling group.
+//
+// See http://goo.gl/MG1hqs for more details
+type Tag struct {
+ Key string `xml:"Key"`
+ PropagateAtLaunch bool `xml:"PropagateAtLaunch"` // Specifies whether the new tag will be applied to instances launched after the tag is created
+ ResourceId string `xml:"ResourceId"` // the name of the Auto Scaling group - not required if creating ASG
+ ResourceType string `xml:"ResourceType"` // currently only auto-scaling-group is supported - not required if creating ASG
+ Value string `xml:"Value"`
+}
+
+// AutoScalingGroup encapsulates an Auto Scaling Group object
+//
+// See http://goo.gl/fJdYhg for more details.
+type AutoScalingGroup struct {
+ AutoScalingGroupARN string `xml:"AutoScalingGroupARN"`
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ AvailabilityZones []string `xml:"AvailabilityZones>member"`
+ CreatedTime time.Time `xml:"CreatedTime"`
+ DefaultCooldown int `xml:"DefaultCooldown"`
+ DesiredCapacity int `xml:"DesiredCapacity"`
+ EnabledMetrics []EnabledMetric `xml:"EnabledMetric>member"`
+ HealthCheckGracePeriod int `xml:"HealthCheckGracePeriod"`
+ HealthCheckType string `xml:"HealthCheckType"`
+ Instances []Instance `xml:"Instances>member"`
+ LaunchConfigurationName string `xml:"LaunchConfigurationName"`
+ LoadBalancerNames []string `xml:"LoadBalancerNames>member"`
+ MaxSize int `xml:"MaxSize"`
+ MinSize int `xml:"MinSize"`
+ PlacementGroup string `xml:"PlacementGroup"`
+ Status string `xml:"Status"`
+ SuspendedProcesses []SuspendedProcess `xml:"SuspendedProcesses>member"`
+ Tags []Tag `xml:"Tags>member"`
+ TerminationPolicies []string `xml:"TerminationPolicies>member"`
+ VPCZoneIdentifier string `xml:"VPCZoneIdentifier"`
+}
+
+// CreateAutoScalingGroupParams type encapsulates options for the respective request.
+//
+// See http://goo.gl/3S13Bv for more details.
+type CreateAutoScalingGroupParams struct {
+ AutoScalingGroupName string
+ AvailabilityZones []string
+ DefaultCooldown int
+ DesiredCapacity int
+ HealthCheckGracePeriod int
+ HealthCheckType string
+ InstanceId string
+ LaunchConfigurationName string
+ LoadBalancerNames []string
+ MaxSize int
+ MinSize int
+ PlacementGroup string
+ Tags []Tag
+ TerminationPolicies []string
+ VPCZoneIdentifier string
+}
+
+// AttachInstances Attach running instances to an autoscaling group
+//
+// See http://goo.gl/zDZbuQ for more details.
+func (as *AutoScaling) AttachInstances(name string, instanceIds []string) (resp *SimpleResp, err error) {
+ params := makeParams("AttachInstances")
+ params["AutoScalingGroupName"] = name
+
+ for i, id := range instanceIds {
+ key := fmt.Sprintf("InstanceIds.member.%d", i+1)
+ params[key] = id
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// CreateAutoScalingGroup creates an Auto Scaling Group on AWS
+//
+// Required params: AutoScalingGroupName, MinSize, MaxSize
+//
+// See http://goo.gl/3S13Bv for more details.
+func (as *AutoScaling) CreateAutoScalingGroup(options *CreateAutoScalingGroupParams) (
+ resp *SimpleResp, err error) {
+ params := makeParams("CreateAutoScalingGroup")
+
+ params["AutoScalingGroupName"] = options.AutoScalingGroupName
+ params["MaxSize"] = strconv.Itoa(options.MaxSize)
+ params["MinSize"] = strconv.Itoa(options.MinSize)
+ params["DesiredCapacity"] = strconv.Itoa(options.DesiredCapacity)
+
+ if options.DefaultCooldown > 0 {
+ params["DefaultCooldown"] = strconv.Itoa(options.DefaultCooldown)
+ }
+ if options.HealthCheckGracePeriod > 0 {
+ params["HealthCheckGracePeriod"] = strconv.Itoa(options.HealthCheckGracePeriod)
+ }
+ if options.HealthCheckType != "" {
+ params["HealthCheckType"] = options.HealthCheckType
+ }
+ if options.InstanceId != "" {
+ params["InstanceId"] = options.InstanceId
+ }
+ if options.LaunchConfigurationName != "" {
+ params["LaunchConfigurationName"] = options.LaunchConfigurationName
+ }
+ if options.PlacementGroup != "" {
+ params["PlacementGroup"] = options.PlacementGroup
+ }
+ if options.VPCZoneIdentifier != "" {
+ params["VPCZoneIdentifier"] = options.VPCZoneIdentifier
+ }
+ if len(options.LoadBalancerNames) > 0 {
+ addParamsList(params, "LoadBalancerNames.member", options.LoadBalancerNames)
+ }
+ if len(options.AvailabilityZones) > 0 {
+ addParamsList(params, "AvailabilityZones.member", options.AvailabilityZones)
+ }
+ if len(options.TerminationPolicies) > 0 {
+ addParamsList(params, "TerminationPolicies.member", options.TerminationPolicies)
+ }
+ for i, t := range options.Tags {
+ key := "Tags.member.%d.%s"
+ index := i + 1
+ params[fmt.Sprintf(key, index, "Key")] = t.Key
+ params[fmt.Sprintf(key, index, "Value")] = t.Value
+ params[fmt.Sprintf(key, index, "PropagateAtLaunch")] = strconv.FormatBool(t.PropagateAtLaunch)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// EBS represents the AWS EBS volume data type
+//
+// See http://goo.gl/nDUL2h for more details
+type EBS struct {
+ DeleteOnTermination bool `xml:"DeleteOnTermination"`
+ Iops int `xml:"Iops"`
+ SnapshotId string `xml:"SnapshotId"`
+ VolumeSize int `xml:"VolumeSize"`
+ VolumeType string `xml:"VolumeType"`
+}
+
+// BlockDeviceMapping represents the association of a block device with ebs volume.
+//
+// See http://goo.gl/wEGwkU for more details.
+type BlockDeviceMapping struct {
+ DeviceName string `xml:"DeviceName"`
+ Ebs EBS `xml:"Ebs"`
+ NoDevice bool `xml:"NoDevice"`
+ VirtualName string `xml:"VirtualName"`
+}
+
+// InstanceMonitoring data type
+//
+// See http://goo.gl/TfaPwz for more details
+type InstanceMonitoring struct {
+ Enabled bool `xml:"Enabled"`
+}
+
+// LaunchConfiguration encapsulates the LaunchConfiguration Data Type
+//
+// See http://goo.gl/TOJunp
+type LaunchConfiguration struct {
+ AssociatePublicIpAddress bool `xml:"AssociatePublicIpAddress"`
+ BlockDeviceMappings []BlockDeviceMapping `xml:"BlockDeviceMappings>member"`
+ CreatedTime time.Time `xml:"CreatedTime"`
+ EbsOptimized bool `xml:"EbsOptimized"`
+ IamInstanceProfile string `xml:"IamInstanceProfile"`
+ ImageId string `xml:"ImageId"`
+ InstanceId string `xml:"InstanceId"`
+ InstanceMonitoring InstanceMonitoring `xml:"InstanceMonitoring"`
+ InstanceType string `xml:"InstanceType"`
+ KernelId string `xml:"KernelId"`
+ KeyName string `xml:"KeyName"`
+ LaunchConfigurationARN string `xml:"LaunchConfigurationARN"`
+ LaunchConfigurationName string `xml:"LaunchConfigurationName"`
+ RamdiskId string `xml:"RamdiskId"`
+ SecurityGroups []string `xml:"SecurityGroups>member"`
+ SpotPrice string `xml:"SpotPrice"`
+ UserData string `xml:"UserData"`
+}
+
+// CreateLaunchConfiguration creates a launch configuration
+//
+// Required params: AutoScalingGroupName, MinSize, MaxSize
+//
+// See http://goo.gl/8e0BSF for more details.
+func (as *AutoScaling) CreateLaunchConfiguration(lc *LaunchConfiguration) (
+ resp *SimpleResp, err error) {
+
+ var b64 = base64.StdEncoding
+
+ params := makeParams("CreateLaunchConfiguration")
+ params["LaunchConfigurationName"] = lc.LaunchConfigurationName
+
+ if lc.AssociatePublicIpAddress {
+ params["AssociatePublicIpAddress"] = strconv.FormatBool(lc.AssociatePublicIpAddress)
+ }
+ if lc.EbsOptimized {
+ params["EbsOptimized"] = strconv.FormatBool(lc.EbsOptimized)
+ }
+ if lc.IamInstanceProfile != "" {
+ params["IamInstanceProfile"] = lc.IamInstanceProfile
+ }
+ if lc.ImageId != "" {
+ params["ImageId"] = lc.ImageId
+ }
+ if lc.InstanceId != "" {
+ params["InstanceId"] = lc.InstanceId
+ }
+ if lc.InstanceMonitoring != (InstanceMonitoring{}) {
+ params["InstanceMonitoring.Enabled"] = strconv.FormatBool(lc.InstanceMonitoring.Enabled)
+ }
+ if lc.InstanceType != "" {
+ params["InstanceType"] = lc.InstanceType
+ }
+ if lc.KernelId != "" {
+ params["KernelId"] = lc.KernelId
+ }
+ if lc.KeyName != "" {
+ params["KeyName"] = lc.KeyName
+ }
+ if lc.RamdiskId != "" {
+ params["RamdiskId"] = lc.RamdiskId
+ }
+ if lc.SpotPrice != "" {
+ params["SpotPrice"] = lc.SpotPrice
+ }
+ if lc.UserData != "" {
+ params["UserData"] = b64.EncodeToString([]byte(lc.UserData))
+ }
+
+ // Add our block device mappings
+ for i, bdm := range lc.BlockDeviceMappings {
+ key := "BlockDeviceMappings.member.%d.%s"
+ index := i + 1
+ params[fmt.Sprintf(key, index, "DeviceName")] = bdm.DeviceName
+ params[fmt.Sprintf(key, index, "VirtualName")] = bdm.VirtualName
+
+ if bdm.NoDevice {
+ params[fmt.Sprintf(key, index, "NoDevice")] = "true"
+ }
+
+ if bdm.Ebs != (EBS{}) {
+ key := "BlockDeviceMappings.member.%d.Ebs.%s"
+
+ // Defaults to true
+ params[fmt.Sprintf(key, index, "DeleteOnTermination")] = strconv.FormatBool(bdm.Ebs.DeleteOnTermination)
+
+ if bdm.Ebs.Iops > 0 {
+ params[fmt.Sprintf(key, index, "Iops")] = strconv.Itoa(bdm.Ebs.Iops)
+ }
+ if bdm.Ebs.SnapshotId != "" {
+ params[fmt.Sprintf(key, index, "SnapshotId")] = bdm.Ebs.SnapshotId
+ }
+ if bdm.Ebs.VolumeSize > 0 {
+ params[fmt.Sprintf(key, index, "VolumeSize")] = strconv.Itoa(bdm.Ebs.VolumeSize)
+ }
+ if bdm.Ebs.VolumeType != "" {
+ params[fmt.Sprintf(key, index, "VolumeType")] = bdm.Ebs.VolumeType
+ }
+ }
+ }
+
+ if len(lc.SecurityGroups) > 0 {
+ addParamsList(params, "SecurityGroups.member", lc.SecurityGroups)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// CreateOrUpdateTags creates or updates Auto Scaling Group Tags
+//
+// See http://goo.gl/e1UIXb for more details.
+func (as *AutoScaling) CreateOrUpdateTags(tags []Tag) (resp *SimpleResp, err error) {
+ params := makeParams("CreateOrUpdateTags")
+
+ for i, t := range tags {
+ key := "Tags.member.%d.%s"
+ index := i + 1
+ params[fmt.Sprintf(key, index, "Key")] = t.Key
+ params[fmt.Sprintf(key, index, "Value")] = t.Value
+ params[fmt.Sprintf(key, index, "PropagateAtLaunch")] = strconv.FormatBool(t.PropagateAtLaunch)
+ params[fmt.Sprintf(key, index, "ResourceId")] = t.ResourceId
+ if t.ResourceType != "" {
+ params[fmt.Sprintf(key, index, "ResourceType")] = t.ResourceType
+ } else {
+ params[fmt.Sprintf(key, index, "ResourceType")] = "auto-scaling-group"
+ }
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+type CompleteLifecycleActionParams struct {
+ AutoScalingGroupName string
+ LifecycleActionResult string
+ LifecycleActionToken string
+ LifecycleHookName string
+}
+
+// CompleteLifecycleAction completes the lifecycle action for the associated token initiated under the given lifecycle hook with the specified result.
+//
+// Part of the basic sequence for adding a lifecycle hook to an Auto Scaling group:
+// 1) Create a notification target (SQS queue || SNS Topic)
+// 2) Create an IAM role to allow the ASG topublish lifecycle notifications to the designated SQS queue or SNS topic
+// 3) Create the lifecycle hook. You can create a hook that acts when instances launch or when instances terminate
+// 4) If necessary, record the lifecycle action heartbeat to keep the instance in a pending state
+// 5) ***Complete the lifecycle action***
+//
+// See http://goo.gl/k4fl0p for more details
+func (as *AutoScaling) CompleteLifecycleAction(options *CompleteLifecycleActionParams) (
+ resp *SimpleResp, err error) {
+ params := makeParams("CompleteLifecycleAction")
+
+ params["AutoScalingGroupName"] = options.AutoScalingGroupName
+ params["LifecycleActionResult"] = options.LifecycleActionResult
+ params["LifecycleActionToken"] = options.LifecycleActionToken
+ params["LifecycleHookName"] = options.LifecycleHookName
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeleteAutoScalingGroup deletes an Auto Scaling Group
+//
+// See http://goo.gl/us7VSffor for more details.
+func (as *AutoScaling) DeleteAutoScalingGroup(asgName string, forceDelete bool) (
+ resp *SimpleResp, err error) {
+ params := makeParams("DeleteAutoScalingGroup")
+ params["AutoScalingGroupName"] = asgName
+
+ if forceDelete {
+ params["ForceDelete"] = "true"
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeleteLaunchConfiguration deletes a Launch Configuration
+//
+// See http://goo.gl/xksfyR for more details.
+func (as *AutoScaling) DeleteLaunchConfiguration(name string) (resp *SimpleResp, err error) {
+ params := makeParams("DeleteLaunchConfiguration")
+ params["LaunchConfigurationName"] = name
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeleteLifecycleHook eletes the specified lifecycle hook.
+// If there are any outstanding lifecycle actions, they are completed first
+//
+// See http://goo.gl/MwX1vG for more details.
+func (as *AutoScaling) DeleteLifecycleHook(asgName, lifecycleHookName string) (resp *SimpleResp, err error) {
+ params := makeParams("DeleteLifecycleHook")
+ params["AutoScalingGroupName"] = asgName
+ params["LifecycleHookName"] = lifecycleHookName
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeleteNotificationConfiguration deletes notifications created by PutNotificationConfiguration.
+//
+// See http://goo.gl/jTqoYz for more details
+func (as *AutoScaling) DeleteNotificationConfiguration(asgName string, topicARN string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("DeleteNotificationConfiguration")
+ params["AutoScalingGroupName"] = asgName
+ params["TopicARN"] = topicARN
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeletePolicy deletes a policy created by PutScalingPolicy.
+//
+// policyName might be the policy name or ARN
+//
+// See http://goo.gl/aOQPH2 for more details
+func (as *AutoScaling) DeletePolicy(asgName string, policyName string) (resp *SimpleResp, err error) {
+ params := makeParams("DeletePolicy")
+ params["AutoScalingGroupName"] = asgName
+ params["PolicyName"] = policyName
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeleteScheduledAction deletes a scheduled action previously created using the PutScheduledUpdateGroupAction.
+//
+// See http://goo.gl/Zss9CH for more details
+func (as *AutoScaling) DeleteScheduledAction(asgName string, scheduledActionName string) (resp *SimpleResp, err error) {
+ params := makeParams("DeleteScheduledAction")
+ params["AutoScalingGroupName"] = asgName
+ params["ScheduledActionName"] = scheduledActionName
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DeleteTags deletes autoscaling group tags
+//
+// See http://goo.gl/o8HzAk for more details.
+func (as *AutoScaling) DeleteTags(tags []Tag) (resp *SimpleResp, err error) {
+ params := makeParams("DeleteTags")
+
+ for i, t := range tags {
+ key := "Tags.member.%d.%s"
+ index := i + 1
+ params[fmt.Sprintf(key, index, "Key")] = t.Key
+ params[fmt.Sprintf(key, index, "Value")] = t.Value
+ params[fmt.Sprintf(key, index, "PropagateAtLaunch")] = strconv.FormatBool(t.PropagateAtLaunch)
+ params[fmt.Sprintf(key, index, "ResourceId")] = t.ResourceId
+ params[fmt.Sprintf(key, index, "ResourceType")] = "auto-scaling-group"
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+//DescribeAccountLimits response wrapper
+//
+// See http://goo.gl/tKsMN0 for more details.
+type DescribeAccountLimitsResp struct {
+ MaxNumberOfAutoScalingGroups int `xml:"DescribeAccountLimitsResult>MaxNumberOfAutoScalingGroups"`
+ MaxNumberOfLaunchConfigurations int `xml:"DescribeAccountLimitsResult>MaxNumberOfLaunchConfigurations"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeAccountLimits - Returns the limits for the Auto Scaling resources currently allowed for your AWS account.
+//
+// See http://goo.gl/tKsMN0 for more details.
+func (as *AutoScaling) DescribeAccountLimits() (resp *DescribeAccountLimitsResp, err error) {
+ params := makeParams("DescribeAccountLimits")
+
+ resp = new(DescribeAccountLimitsResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// AdjustmentType specifies whether the PutScalingPolicy ScalingAdjustment parameter is an absolute number or a percentage of the current capacity.
+//
+// See http://goo.gl/tCFqeL for more details
+type AdjustmentType struct {
+ AdjustmentType string //Valid values are ChangeInCapacity, ExactCapacity, and PercentChangeInCapacity.
+}
+
+//DescribeAdjustmentTypes response wrapper
+//
+// See http://goo.gl/hGx3Pc for more details.
+type DescribeAdjustmentTypesResp struct {
+ AdjustmentTypes []AdjustmentType `xml:"DescribeAdjustmentTypesResult>AdjustmentTypes>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeAdjustmentTypes returns policy adjustment types for use in the PutScalingPolicy action.
+//
+// See http://goo.gl/hGx3Pc for more details.
+func (as *AutoScaling) DescribeAdjustmentTypes() (resp *DescribeAdjustmentTypesResp, err error) {
+ params := makeParams("DescribeAdjustmentTypes")
+
+ resp = new(DescribeAdjustmentTypesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeAutoScalingGroups response wrapper
+//
+// See http://goo.gl/nW74Ut for more details.
+type DescribeAutoScalingGroupsResp struct {
+ AutoScalingGroups []AutoScalingGroup `xml:"DescribeAutoScalingGroupsResult>AutoScalingGroups>member"`
+ NextToken string `xml:"DescribeAutoScalingGroupsResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeAutoScalingGroups returns a full description of each Auto Scaling group in the given list
+// If no autoscaling groups are provided, returns the details of all autoscaling groups
+// Supports pagination by using the returned "NextToken" parameter for subsequent calls
+//
+// See http://goo.gl/nW74Ut for more details.
+func (as *AutoScaling) DescribeAutoScalingGroups(names []string, maxRecords int, nextToken string) (
+ resp *DescribeAutoScalingGroupsResp, err error) {
+ params := makeParams("DescribeAutoScalingGroups")
+
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+ if len(names) > 0 {
+ addParamsList(params, "AutoScalingGroupNames.member", names)
+ }
+
+ resp = new(DescribeAutoScalingGroupsResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeAutoScalingInstances response wrapper
+//
+// See http://goo.gl/ckzORt for more details.
+type DescribeAutoScalingInstancesResp struct {
+ AutoScalingInstances []Instance `xml:"DescribeAutoScalingInstancesResult>AutoScalingInstances>member"`
+ NextToken string `xml:"DescribeAutoScalingInstancesResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeAutoScalingInstances returns a description of each Auto Scaling instance in the InstanceIds list.
+// If a list is not provided, the service returns the full details of all instances up to a maximum of 50
+// By default, the service returns a list of 20 items.
+// Supports pagination by using the returned "NextToken" parameter for subsequent calls
+//
+// See http://goo.gl/ckzORt for more details.
+func (as *AutoScaling) DescribeAutoScalingInstances(ids []string, maxRecords int, nextToken string) (
+ resp *DescribeAutoScalingInstancesResp, err error) {
+ params := makeParams("DescribeAutoScalingInstances")
+
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+ if len(ids) > 0 {
+ addParamsList(params, "InstanceIds.member", ids)
+ }
+
+ resp = new(DescribeAutoScalingInstancesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeAutoScalingNotificationTypes response wrapper
+//
+// See http://goo.gl/pmLIoE for more details.
+type DescribeAutoScalingNotificationTypesResp struct {
+ AutoScalingNotificationTypes []string `xml:"DescribeAutoScalingNotificationTypesResult>AutoScalingNotificationTypes>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeAutoScalingNotificationTypes returns a list of all notification types that are supported by Auto Scaling
+//
+// See http://goo.gl/pmLIoE for more details.
+func (as *AutoScaling) DescribeAutoScalingNotificationTypes() (resp *DescribeAutoScalingNotificationTypesResp, err error) {
+ params := makeParams("DescribeAutoScalingNotificationTypes")
+
+ resp = new(DescribeAutoScalingNotificationTypesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeLaunchConfigurationResp defines the basic response structure for launch configuration
+// requests
+//
+// See http://goo.gl/y31YYE for more details.
+type DescribeLaunchConfigurationsResp struct {
+ LaunchConfigurations []LaunchConfiguration `xml:"DescribeLaunchConfigurationsResult>LaunchConfigurations>member"`
+ NextToken string `xml:"DescribeLaunchConfigurationsResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeLaunchConfigurations returns details about the launch configurations supplied in
+// the list. If the list is nil, information is returned about all launch configurations in the
+// region.
+//
+// See http://goo.gl/y31YYE for more details.
+func (as *AutoScaling) DescribeLaunchConfigurations(names []string, maxRecords int, nextToken string) (
+ resp *DescribeLaunchConfigurationsResp, err error) {
+ params := makeParams("DescribeLaunchConfigurations")
+
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+ if len(names) > 0 {
+ addParamsList(params, "LaunchConfigurationNames.member", names)
+ }
+
+ resp = new(DescribeLaunchConfigurationsResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+
+ return resp, nil
+}
+
+// DescribeLifecycleHookTypesResult wraps a DescribeLifecycleHookTypes response
+//
+// See http://goo.gl/qiAH31 for more details.
+type DescribeLifecycleHookTypesResult struct {
+ LifecycleHookTypes []string `xml:"DescribeLifecycleHookTypesResult>LifecycleHookTypes>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeLifecycleHookTypes describes the available types of lifecycle hooks
+//
+// See http://goo.gl/E9IBtY for more information
+func (as *AutoScaling) DescribeLifecycleHookTypes() (
+ resp *DescribeLifecycleHookTypesResult, err error) {
+ params := makeParams("DescribeLifecycleHookTypes")
+
+ resp = new(DescribeLifecycleHookTypesResult)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// LifecycleHook represents a lifecyclehook object
+//
+// See http://goo.gl/j62Iqu for more information
+type LifecycleHook struct {
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ DefaultResult string `xml:"DefaultResult"`
+ GlobalTimeout int `xml:"GlobalTimeout"`
+ HeartbeatTimeout int `xml:"HeartbeatTimeout"`
+ LifecycleHookName string `xml:"LifecycleHookName"`
+ LifecycleTransition string `xml:"LifecycleTransition"`
+ NotificationMetadata string `xml:"NotificationMetadata"`
+ NotificationTargetARN string `xml:"NotificationTargetARN"`
+ RoleARN string `xml:"RoleARN"`
+}
+
+// DescribeLifecycleHooks wraps a DescribeLifecycleHooks response
+//
+// See http://goo.gl/wQkWiz for more details.
+type DescribeLifecycleHooksResult struct {
+ LifecycleHooks []string `xml:"DescribeLifecycleHooksResult>LifecycleHooks>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeLifecycleHooks describes the lifecycle hooks that currently belong to the specified Auto Scaling group
+//
+// See http://goo.gl/wQkWiz for more information
+func (as *AutoScaling) DescribeLifecycleHooks(asgName string, hookNames []string) (
+ resp *DescribeLifecycleHooksResult, err error) {
+ params := makeParams("DescribeLifecycleHooks")
+ params["AutoScalingGroupName"] = asgName
+
+ if len(hookNames) > 0 {
+ addParamsList(params, "LifecycleHookNames.member", hookNames)
+ }
+
+ resp = new(DescribeLifecycleHooksResult)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// MetricGranularity encapsulates the MetricGranularityType
+//
+// See http://goo.gl/WJ82AA for more details
+type MetricGranularity struct {
+ Granularity string `xml:"Granularity"`
+}
+
+//MetricCollection encapsulates the MetricCollectionType
+//
+// See http://goo.gl/YrEG6h for more details
+type MetricCollection struct {
+ Metric string `xml:"Metric"`
+}
+
+// DescribeMetricCollectionTypesResp response wrapper
+//
+// See http://goo.gl/UyYc3i for more details.
+type DescribeMetricCollectionTypesResp struct {
+ Granularities []MetricGranularity `xml:"DescribeMetricCollectionTypesResult>Granularities>member"`
+ Metrics []MetricCollection `xml:"DescribeMetricCollectionTypesResult>Metrics>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeMetricCollectionTypes returns a list of metrics and a corresponding list of granularities for each metric
+//
+// See http://goo.gl/UyYc3i for more details.
+func (as *AutoScaling) DescribeMetricCollectionTypes() (resp *DescribeMetricCollectionTypesResp, err error) {
+ params := makeParams("DescribeMetricCollectionTypes")
+
+ resp = new(DescribeMetricCollectionTypesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// NotificationConfiguration encapsulates the NotificationConfigurationType
+//
+// See http://goo.gl/M8xYOQ for more details
+type NotificationConfiguration struct {
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ NotificationType string `xml:"NotificationType"`
+ TopicARN string `xml:"TopicARN"`
+}
+
+// DescribeNotificationConfigurations response wrapper
+//
+// See http://goo.gl/qiAH31 for more details.
+type DescribeNotificationConfigurationsResp struct {
+ NotificationConfigurations []NotificationConfiguration `xml:"DescribeNotificationConfigurationsResult>NotificationConfigurations>member"`
+ NextToken string `xml:"DescribeNotificationConfigurationsResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeNotificationConfigurations returns a list of notification actions associated with Auto Scaling groups for specified events.
+// Supports pagination by using the returned "NextToken" parameter for subsequent calls
+//
+// http://goo.gl/qiAH31 for more details.
+func (as *AutoScaling) DescribeNotificationConfigurations(asgNames []string, maxRecords int, nextToken string) (
+ resp *DescribeNotificationConfigurationsResp, err error) {
+ params := makeParams("DescribeNotificationConfigurations")
+
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+ if len(asgNames) > 0 {
+ addParamsList(params, "AutoScalingGroupNames.member", asgNames)
+ }
+
+ resp = new(DescribeNotificationConfigurationsResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// Alarm encapsulates the Alarm data type.
+//
+// See http://goo.gl/Q0uPAB for more details
+type Alarm struct {
+ AlarmARN string `xml:"AlarmARN"`
+ AlarmName string `xml:"AlarmName"`
+}
+
+// ScalingPolicy encapsulates the ScalingPolicyType
+//
+// See http://goo.gl/BYAT18 for more details
+type ScalingPolicy struct {
+ AdjustmentType string `xml:"AdjustmentType"` // ChangeInCapacity, ExactCapacity, and PercentChangeInCapacity
+ Alarms []Alarm `xml:"Alarms>member"` // A list of CloudWatch Alarms related to the policy
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ Cooldown int `xml:"Cooldown"`
+ MinAdjustmentStep int `xml:"MinAdjustmentStep"` // Changes the DesiredCapacity of ASG by at least the specified number of instances.
+ PolicyARN string `xml:"PolicyARN"`
+ PolicyName string `xml:"PolicyName"`
+ ScalingAdjustment int `xml:"ScalingAdjustment"`
+}
+
+// DescribePolicies response wrapper
+//
+// http://goo.gl/bN7A9T for more details.
+type DescribePoliciesResp struct {
+ ScalingPolicies []ScalingPolicy `xml:"DescribePoliciesResult>ScalingPolicies>member"`
+ NextToken string `xml:"DescribePoliciesResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribePolicies returns descriptions of what each policy does.
+// Supports pagination by using the returned "NextToken" parameter for subsequent calls
+//
+// http://goo.gl/bN7A9Tfor more details.
+func (as *AutoScaling) DescribePolicies(asgName string, policyNames []string, maxRecords int, nextToken string) (
+ resp *DescribePoliciesResp, err error) {
+ params := makeParams("DescribePolicies")
+
+ if asgName != "" {
+ params["AutoScalingGroupName"] = asgName
+ }
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+ if len(policyNames) > 0 {
+ addParamsList(params, "PolicyNames.member", policyNames)
+ }
+
+ resp = new(DescribePoliciesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// Activity encapsulates the Activity data type
+//
+// See http://goo.gl/fRaVi1 for more details
+type Activity struct {
+ ActivityId string `xml:"ActivityId"`
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ Cause string `xml:"Cause"`
+ Description string `xml:"Description"`
+ Details string `xml:"Details"`
+ EndTime time.Time `xml:"EndTime"`
+ Progress int `xml:"Progress"`
+ StartTime time.Time `xml:"StartTime"`
+ StatusCode string `xml:"StatusCode"`
+ StatusMessage string `xml:"StatusMessage"`
+}
+
+// DescribeScalingActivities response wrapper
+//
+// http://goo.gl/noOXIC for more details.
+type DescribeScalingActivitiesResp struct {
+ Activities []Activity `xml:"DescribeScalingActivitiesResult>Activities>member"`
+ NextToken string `xml:"DescribeScalingActivitiesResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeScalingActivities returns the scaling activities for the specified Auto Scaling group.
+// Supports pagination by using the returned "NextToken" parameter for subsequent calls
+//
+// http://goo.gl/noOXIC more details.
+func (as *AutoScaling) DescribeScalingActivities(asgName string, activityIds []string, maxRecords int, nextToken string) (
+ resp *DescribeScalingActivitiesResp, err error) {
+ params := makeParams("DescribeScalingActivities")
+
+ if asgName != "" {
+ params["AutoScalingGroupName"] = asgName
+ }
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+ if len(activityIds) > 0 {
+ addParamsList(params, "ActivityIds.member", activityIds)
+ }
+
+ resp = new(DescribeScalingActivitiesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ProcessType encapsulates the Auto Scaling process data type
+//
+// See http://goo.gl/9BvNik for more details.
+type ProcessType struct {
+ ProcessName string `xml:"ProcessName"`
+}
+
+// DescribeScalingProcessTypes response wrapper
+//
+// See http://goo.gl/rkp2tw for more details.
+type DescribeScalingProcessTypesResp struct {
+ Processes []ProcessType `xml:"DescribeScalingProcessTypesResult>Processes>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeScalingProcessTypes returns scaling process types for use in the ResumeProcesses and SuspendProcesses actions.
+//
+// See http://goo.gl/rkp2tw for more details.
+func (as *AutoScaling) DescribeScalingProcessTypes() (resp *DescribeScalingProcessTypesResp, err error) {
+ params := makeParams("DescribeScalingProcessTypes")
+
+ resp = new(DescribeScalingProcessTypesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ScheduledUpdateGroupAction contains the information to be used in a scheduled update to an
+// AutoScalingGroup
+//
+// See http://goo.gl/z2Kfxe for more details
+type ScheduledUpdateGroupAction struct {
+ AutoScalingGroupName string `xml:"AutoScalingGroupName"`
+ DesiredCapacity int `xml:"DesiredCapacity"`
+ EndTime time.Time `xml:"EndTime"`
+ MaxSize int `xml:"MaxSize"`
+ MinSize int `xml:"MinSize"`
+ Recurrence string `xml:"Recurrence"`
+ ScheduledActionARN string `xml:"ScheduledActionARN"`
+ ScheduledActionName string `xml:"ScheduledActionName"`
+ StartTime time.Time `xml:"StartTime"`
+ Time time.Time `xml:"Time"`
+}
+
+// DescribeScheduledActionsResult contains the response from a DescribeScheduledActions.
+//
+// See http://goo.gl/zqrJLx for more details.
+type DescribeScheduledActionsResult struct {
+ ScheduledUpdateGroupActions []ScheduledUpdateGroupAction `xml:"DescribeScheduledActionsResult>ScheduledUpdateGroupActions>member"`
+ NextToken string `xml:"DescribeScheduledActionsResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// ScheduledActionsRequestParams contains the items that can be specified when making
+// a ScheduledActions request
+type DescribeScheduledActionsParams struct {
+ AutoScalingGroupName string
+ EndTime time.Time
+ MaxRecords int
+ ScheduledActionNames []string
+ StartTime time.Time
+ NextToken string
+}
+
+// DescribeScheduledActions returns a list of the current scheduled actions. If the
+// AutoScalingGroup name is provided it will list all the scheduled actions for that group.
+//
+// See http://goo.gl/zqrJLx for more details.
+func (as *AutoScaling) DescribeScheduledActions(options *DescribeScheduledActionsParams) (
+ resp *DescribeScheduledActionsResult, err error) {
+ params := makeParams("DescribeScheduledActions")
+
+ if options.AutoScalingGroupName != "" {
+ params["AutoScalingGroupName"] = options.AutoScalingGroupName
+ }
+ if !options.StartTime.IsZero() {
+ params["StartTime"] = options.StartTime.Format(time.RFC3339)
+ }
+ if !options.EndTime.IsZero() {
+ params["EndTime"] = options.EndTime.Format(time.RFC3339)
+ }
+ if options.MaxRecords > 0 {
+ params["MaxRecords"] = strconv.Itoa(options.MaxRecords)
+ }
+ if options.NextToken != "" {
+ params["NextToken"] = options.NextToken
+ }
+ if len(options.ScheduledActionNames) > 0 {
+ addParamsList(params, "ScheduledActionNames.member", options.ScheduledActionNames)
+ }
+
+ resp = new(DescribeScheduledActionsResult)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeTags response wrapper
+//
+// See http://goo.gl/ZTEU3G for more details.
+type DescribeTagsResp struct {
+ Tags []Tag `xml:"DescribeTagsResult>Tags>member"`
+ NextToken string `xml:"DescribeTagsResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeTags lists the Auto Scaling group tags.
+// Supports pagination by using the returned "NextToken" parameter for subsequent calls
+//
+// See http://goo.gl/ZTEU3G for more details.
+func (as *AutoScaling) DescribeTags(filter *Filter, maxRecords int, nextToken string) (
+ resp *DescribeTagsResp, err error) {
+ params := makeParams("DescribeTags")
+
+ if maxRecords != 0 {
+ params["MaxRecords"] = strconv.Itoa(maxRecords)
+ }
+ if nextToken != "" {
+ params["NextToken"] = nextToken
+ }
+
+ filter.addParams(params)
+
+ resp = new(DescribeTagsResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeTerminationPolicyTypes response wrapper
+//
+// See http://goo.gl/ZTEU3G for more details.
+type DescribeTerminationPolicyTypesResp struct {
+ TerminationPolicyTypes []string `xml:"DescribeTerminationPolicyTypesResult>TerminationPolicyTypes>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeTerminationPolicyTypes returns a list of all termination policies supported by Auto Scaling
+//
+// See http://goo.gl/ZTEU3G for more details.
+func (as *AutoScaling) DescribeTerminationPolicyTypes() (resp *DescribeTerminationPolicyTypesResp, err error) {
+ params := makeParams("DescribeTerminationPolicyTypes")
+
+ resp = new(DescribeTerminationPolicyTypesResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DetachInstancesResult wraps a DetachInstances response
+type DetachInstancesResult struct {
+ Activities []Activity `xml:"DetachInstancesResult>Activities>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DetachInstances removes an instance from an Auto Scaling group
+//
+// See http://goo.gl/cNwrqF for more details
+func (as *AutoScaling) DetachInstances(asgName string, instanceIds []string, decrementCapacity bool) (
+ resp *DetachInstancesResult, err error) {
+ params := makeParams("DetachInstances")
+ params["AutoScalingGroupName"] = asgName
+ params["ShouldDecrementDesiredCapacity"] = strconv.FormatBool(decrementCapacity)
+
+ if len(instanceIds) > 0 {
+ addParamsList(params, "InstanceIds.member", instanceIds)
+ }
+
+ resp = new(DetachInstancesResult)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DisableMetricsCollection disables monitoring of group metrics for the Auto Scaling group specified in asgName.
+// You can specify the list of affected metrics with the metrics parameter. If no metrics are specified, all metrics are disabled
+//
+// See http://goo.gl/kAvzQw for more details.
+func (as *AutoScaling) DisableMetricsCollection(asgName string, metrics []string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("DisableMetricsCollection")
+ params["AutoScalingGroupName"] = asgName
+
+ if len(metrics) > 0 {
+ addParamsList(params, "Metrics.member", metrics)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// EnableMetricsCollection enables monitoring of group metrics for the Auto Scaling group specified in asNmae.
+// You can specify the list of affected metrics with the metrics parameter.
+// Auto Scaling metrics collection can be turned on only if the InstanceMonitoring flag is set to true.
+// Currently, the only legal granularity is "1Minute".
+//
+// See http://goo.gl/UcVDWn for more details.
+func (as *AutoScaling) EnableMetricsCollection(asgName string, metrics []string, granularity string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("EnableMetricsCollection")
+ params["AutoScalingGroupName"] = asgName
+ params["Granularity"] = granularity
+
+ if len(metrics) > 0 {
+ addParamsList(params, "Metrics.member", metrics)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// EnterStandbyResult wraps an EnterStandby response
+type EnterStandbyResult struct {
+ Activities []Activity `xml:"EnterStandbyResult>Activities>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// EnterStandby moves instances in an Auto Scaling group into a Standby mode.
+//
+// See http://goo.gl/BJ3lXs for more information
+func (as *AutoScaling) EnterStandby(asgName string, instanceIds []string, decrementCapacity bool) (
+ resp *EnterStandbyResult, err error) {
+ params := makeParams("EnterStandby")
+ params["AutoScalingGroupName"] = asgName
+ params["ShouldDecrementDesiredCapacity"] = strconv.FormatBool(decrementCapacity)
+
+ if len(instanceIds) > 0 {
+ addParamsList(params, "InstanceIds.member", instanceIds)
+ }
+
+ resp = new(EnterStandbyResult)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ExecutePolicy executes the specified policy.
+//
+// See http://goo.gl/BxHpFc for more details.
+func (as *AutoScaling) ExecutePolicy(policyName string, asgName string, honorCooldown bool) (
+ resp *SimpleResp, err error) {
+ params := makeParams("ExecutePolicy")
+ params["PolicyName"] = policyName
+
+ if asgName != "" {
+ params["AutoScalingGroupName"] = asgName
+ }
+ if honorCooldown {
+ params["HonorCooldown"] = strconv.FormatBool(honorCooldown)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ExitStandbyResult wraps an ExitStandby response
+type ExitStandbyResult struct {
+ Activities []Activity `xml:"ExitStandbyResult>Activities>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// ExitStandby moves an instance out of Standby mode.
+//
+// See http://goo.gl/9zQV4G for more information
+func (as *AutoScaling) ExitStandby(asgName string, instanceIds []string) (
+ resp *ExitStandbyResult, err error) {
+ params := makeParams("ExitStandby")
+ params["AutoScalingGroupName"] = asgName
+
+ if len(instanceIds) > 0 {
+ addParamsList(params, "InstanceIds.member", instanceIds)
+ }
+
+ resp = new(ExitStandbyResult)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// PutLifecycleHookParams wraps a PutLifecycleHook request
+//
+// See http://goo.gl/zsNqp5 for more details
+type PutLifecycleHookParams struct {
+ AutoScalingGroupName string
+ DefaultResult string
+ HeartbeatTimeout int
+ LifecycleHookName string
+ LifecycleTransition string
+ NotificationMetadata string
+ NotificationTargetARN string
+ RoleARN string
+}
+
+// PutLifecycleHook Creates or updates a lifecycle hook for an Auto Scaling Group.
+//
+// Part of the basic sequence for adding a lifecycle hook to an Auto Scaling group:
+// 1) Create a notification target (SQS queue || SNS Topic)
+// 2) Create an IAM role to allow the ASG topublish lifecycle notifications to the designated SQS queue or SNS topic
+// 3) *** Create the lifecycle hook. You can create a hook that acts when instances launch or when instances terminate***
+// 4) If necessary, record the lifecycle action heartbeat to keep the instance in a pending state
+// 5) Complete the lifecycle action
+//
+// See http://goo.gl/9XrROq for more details.
+func (as *AutoScaling) PutLifecycleHook(options *PutLifecycleHookParams) (
+ resp *SimpleResp, err error) {
+ params := makeParams("PutLifecycleHook")
+ params["AutoScalingGroupName"] = options.AutoScalingGroupName
+ params["LifecycleHookName"] = options.LifecycleHookName
+
+ if options.DefaultResult != "" {
+ params["DefaultResult"] = options.DefaultResult
+ }
+ if options.HeartbeatTimeout != 0 {
+ params["HeartbeatTimeout"] = strconv.Itoa(options.HeartbeatTimeout)
+ }
+ if options.LifecycleTransition != "" {
+ params["LifecycleTransition"] = options.LifecycleTransition
+ }
+ if options.NotificationMetadata != "" {
+ params["NotificationMetadata"] = options.NotificationMetadata
+ }
+ if options.NotificationTargetARN != "" {
+ params["NotificationTargetARN"] = options.NotificationTargetARN
+ }
+ if options.RoleARN != "" {
+ params["RoleARN"] = options.RoleARN
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// PutNotificationConfiguration configures an Auto Scaling group to send notifications when specified events take place.
+//
+// See http://goo.gl/9XrROq for more details.
+func (as *AutoScaling) PutNotificationConfiguration(asgName string, notificationTypes []string, topicARN string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("PutNotificationConfiguration")
+ params["AutoScalingGroupName"] = asgName
+ params["TopicARN"] = topicARN
+
+ if len(notificationTypes) > 0 {
+ addParamsList(params, "NotificationTypes.member", notificationTypes)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// PutScalingPolicyParams wraps a PutScalingPolicyParams request
+//
+// See http://goo.gl/o0E8hl for more details.
+type PutScalingPolicyParams struct {
+ AutoScalingGroupName string
+ PolicyName string
+ ScalingAdjustment int
+ AdjustmentType string
+ Cooldown int
+ MinAdjustmentStep int
+}
+
+// PutScalingPolicy response wrapper
+//
+// See http://goo.gl/o0E8hl for more details.
+type PutScalingPolicyResp struct {
+ PolicyARN string `xml:"PutScalingPolicyResult>PolicyARN"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// PutScalingPolicy creates or updates a policy for an Auto Scaling group
+//
+// See http://goo.gl/o0E8hl for more details.
+func (as *AutoScaling) PutScalingPolicy(options *PutScalingPolicyParams) (
+ resp *PutScalingPolicyResp, err error) {
+ params := makeParams("PutScalingPolicy")
+ params["AutoScalingGroupName"] = options.AutoScalingGroupName
+ params["PolicyName"] = options.PolicyName
+ params["ScalingAdjustment"] = strconv.Itoa(options.ScalingAdjustment)
+ params["AdjustmentType"] = options.AdjustmentType
+
+ if options.Cooldown != 0 {
+ params["Cooldown"] = strconv.Itoa(options.Cooldown)
+ }
+ if options.MinAdjustmentStep != 0 {
+ params["MinAdjustmentStep"] = strconv.Itoa(options.MinAdjustmentStep)
+ }
+
+ resp = new(PutScalingPolicyResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// PutScheduledUpdateGroupActionParams contains the details of the ScheduledAction to be added.
+//
+// See http://goo.gl/sLPi0d for more details
+type PutScheduledUpdateGroupActionParams struct {
+ AutoScalingGroupName string
+ DesiredCapacity int
+ EndTime time.Time
+ MaxSize int
+ MinSize int
+ Recurrence string
+ ScheduledActionName string
+ StartTime time.Time
+}
+
+// PutScheduledUpdateGroupAction creates or updates a scheduled scaling action for an
+// AutoScaling group. Scheduled actions can be made up to thirty days in advance. When updating
+// a scheduled scaling action, if you leave a parameter unspecified, the corresponding value
+// remains unchanged in the affected AutoScaling group.
+//
+// Auto Scaling supports the date and time expressed in "YYYY-MM-DDThh:mm:ssZ" format in UTC/GMT
+// only.
+//
+// See http://goo.gl/sLPi0d for more details.
+func (as *AutoScaling) PutScheduledUpdateGroupAction(options *PutScheduledUpdateGroupActionParams) (
+ resp *SimpleResp, err error) {
+ params := makeParams("PutScheduledUpdateGroupAction")
+ params["AutoScalingGroupName"] = options.AutoScalingGroupName
+ params["ScheduledActionName"] = options.ScheduledActionName
+ params["MinSize"] = strconv.Itoa(options.MinSize)
+ params["MaxSize"] = strconv.Itoa(options.MaxSize)
+ params["DesiredCapacity"] = strconv.Itoa(options.DesiredCapacity)
+
+ if !options.StartTime.IsZero() {
+ params["StartTime"] = options.StartTime.Format(time.RFC3339)
+ }
+ if !options.EndTime.IsZero() {
+ params["EndTime"] = options.EndTime.Format(time.RFC3339)
+ }
+ if options.Recurrence != "" {
+ params["Recurrence"] = options.Recurrence
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// RecordLifecycleActionHeartbeat ecords a heartbeat for the lifecycle action associated with a specific token.
+// This extends the timeout by the length of time defined by the HeartbeatTimeout parameter of the
+// PutLifecycleHook operation.
+//
+// Part of the basic sequence for adding a lifecycle hook to an Auto Scaling group:
+// 1) Create a notification target (SQS queue || SNS Topic)
+// 2) Create an IAM role to allow the ASG topublish lifecycle notifications to the designated SQS queue or SNS topic
+// 3) Create the lifecycle hook. You can create a hook that acts when instances launch or when instances terminate
+// 4) ***If necessary, record the lifecycle action heartbeat to keep the instance in a pending state***
+// 5) Complete the lifecycle action
+//
+// See http://goo.gl/jc70xp for more details.
+func (as *AutoScaling) RecordLifecycleActionHeartbeat(asgName, lifecycleActionToken, hookName string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("RecordLifecycleActionHeartbeat")
+ params["AutoScalingGroupName"] = asgName
+ params["LifecycleActionToken"] = lifecycleActionToken
+ params["LifecycleHookName"] = hookName
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ResumeProcesses resumes the scaling processes for the scaling group. If no processes are
+// provided, all processes are resumed.
+//
+// See http://goo.gl/XWIIg1 for more details.
+func (as *AutoScaling) ResumeProcesses(asgName string, processes []string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("ResumeProcesses")
+ params["AutoScalingGroupName"] = asgName
+
+ if len(processes) > 0 {
+ addParamsList(params, "ScalingProcesses.member", processes)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// SetDesiredCapacity changes the DesiredCapacity of an AutoScaling group.
+//
+// See http://goo.gl/3WGZbI for more details.
+func (as *AutoScaling) SetDesiredCapacity(asgName string, desiredCapacity int, honorCooldown bool) (
+ resp *SimpleResp, err error) {
+ params := makeParams("SetDesiredCapacity")
+ params["AutoScalingGroupName"] = asgName
+ params["DesiredCapacity"] = strconv.Itoa(desiredCapacity)
+ params["HonorCooldown"] = strconv.FormatBool(honorCooldown)
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// SetInstanceHealth sets the health status of a specified instance that belongs to any of your Auto Scaling groups.
+//
+// See http://goo.gl/j4ZRxh for more details.
+func (as *AutoScaling) SetInstanceHealth(id string, healthStatus string, respectGracePeriod bool) (
+ resp *SimpleResp, err error) {
+ params := makeParams("SetInstanceHealth")
+ params["HealthStatus"] = healthStatus
+ params["InstanceId"] = id
+ // Default is true
+ params["ShouldRespectGracePeriod"] = strconv.FormatBool(respectGracePeriod)
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// SuspendProcesses suspends the processes for the autoscaling group. If no processes are
+// provided, all processes are suspended.
+//
+// If you suspend either of the two primary processes (Launch or Terminate), this can prevent other
+// process types from functioning properly.
+//
+// See http://goo.gl/DUJpQy for more details.
+func (as *AutoScaling) SuspendProcesses(asgName string, processes []string) (
+ resp *SimpleResp, err error) {
+ params := makeParams("SuspendProcesses")
+ params["AutoScalingGroupName"] = asgName
+
+ if len(processes) > 0 {
+ addParamsList(params, "ScalingProcesses.member", processes)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// TerminateInstanceInAutoScalingGroupResp response wrapper
+//
+// See http://goo.gl/ki5hMh for more details.
+type TerminateInstanceInAutoScalingGroupResp struct {
+ Activity Activity `xml:"TerminateInstanceInAutoScalingGroupResult>Activity"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// TerminateInstanceInAutoScalingGroup terminates the specified instance.
+// Optionally, the desired group size can be adjusted by setting decrCap to true
+//
+// See http://goo.gl/ki5hMh for more details.
+func (as *AutoScaling) TerminateInstanceInAutoScalingGroup(id string, decrCap bool) (
+ resp *TerminateInstanceInAutoScalingGroupResp, err error) {
+ params := makeParams("TerminateInstanceInAutoScalingGroup")
+ params["InstanceId"] = id
+ params["ShouldDecrementDesiredCapacity"] = strconv.FormatBool(decrCap)
+
+ resp = new(TerminateInstanceInAutoScalingGroupResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// UpdateAutoScalingGroup updates the scaling group.
+//
+// To update an auto scaling group with a launch configuration that has the InstanceMonitoring
+// flag set to False, you must first ensure that collection of group metrics is disabled.
+// Otherwise calls to UpdateAutoScalingGroup will fail.
+//
+// See http://goo.gl/rqrmxy for more details.
+func (as *AutoScaling) UpdateAutoScalingGroup(asg *AutoScalingGroup) (resp *SimpleResp, err error) {
+ params := makeParams("UpdateAutoScalingGroup")
+
+ params["AutoScalingGroupName"] = asg.AutoScalingGroupName
+ params["MaxSize"] = strconv.Itoa(asg.MaxSize)
+ params["MinSize"] = strconv.Itoa(asg.MinSize)
+ params["DesiredCapacity"] = strconv.Itoa(asg.DesiredCapacity)
+
+ if asg.DefaultCooldown > 0 {
+ params["DefaultCooldown"] = strconv.Itoa(asg.DefaultCooldown)
+ }
+ if asg.HealthCheckGracePeriod > 0 {
+ params["HealthCheckGracePeriod"] = strconv.Itoa(asg.HealthCheckGracePeriod)
+ }
+ if asg.HealthCheckType != "" {
+ params["HealthCheckType"] = asg.HealthCheckType
+ }
+ if asg.LaunchConfigurationName != "" {
+ params["LaunchConfigurationName"] = asg.LaunchConfigurationName
+ }
+ if asg.PlacementGroup != "" {
+ params["PlacementGroup"] = asg.PlacementGroup
+ }
+ if asg.VPCZoneIdentifier != "" {
+ params["VPCZoneIdentifier"] = asg.VPCZoneIdentifier
+ }
+
+ if len(asg.AvailabilityZones) > 0 {
+ addParamsList(params, "AvailabilityZones.member", asg.AvailabilityZones)
+ }
+ if len(asg.TerminationPolicies) > 0 {
+ addParamsList(params, "TerminationPolicies.member", asg.TerminationPolicies)
+ }
+
+ resp = new(SimpleResp)
+ if err := as.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}