From 84d63cbe609d648d46f8a00d47ab0151d758c99e Mon Sep 17 00:00:00 2001 From: Mike Splain Date: Fri, 6 Jul 2018 15:18:42 -0400 Subject: [PATCH] Fix suspend proccesst to also resume Also fixed internal consistency error by switching from []*string to *[]string. --- pkg/model/awsmodel/autoscalinggroup.go | 8 +- .../fi/cloudup/awstasks/autoscalinggroup.go | 87 +++++++++++++++---- 2 files changed, 74 insertions(+), 21 deletions(-) diff --git a/pkg/model/awsmodel/autoscalinggroup.go b/pkg/model/awsmodel/autoscalinggroup.go index d7a364a2dc..4e07bbaf6e 100644 --- a/pkg/model/awsmodel/autoscalinggroup.go +++ b/pkg/model/awsmodel/autoscalinggroup.go @@ -230,11 +230,11 @@ func (b *AutoscalingGroupModelBuilder) Build(c *fi.ModelBuilderContext) error { } t.Tags = tags - if ig.Spec.SuspendProcesses != nil { - for _, p := range ig.Spec.SuspendProcesses { - t.SuspendProcesses = append(t.SuspendProcesses, p) - } + processes := []string{} + for _, p := range ig.Spec.SuspendProcesses { + processes = append(processes, p) } + t.SuspendProcesses = &processes c.AddTask(t) } diff --git a/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go b/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go index dbb418e2fe..accb7ac52c 100644 --- a/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go +++ b/upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go @@ -49,7 +49,7 @@ type AutoscalingGroup struct { LaunchConfiguration *LaunchConfiguration - SuspendProcesses []string + SuspendProcesses *[]string } var _ fi.CompareWithID = &AutoscalingGroup{} @@ -146,6 +146,13 @@ func (e *AutoscalingGroup) Find(c *fi.Context) (*AutoscalingGroup, error) { actual.Subnets = e.Subnets } + processes := []string{} + for _, p := range g.SuspendedProcesses { + processes = append(processes, *p.ProcessName) + } + + actual.SuspendProcesses = &processes + // Avoid spurious changes actual.Lifecycle = e.Lifecycle @@ -227,6 +234,21 @@ func (_ *AutoscalingGroup) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Autos return fmt.Errorf("error enabling metrics collection for AutoscalingGroup: %v", err) } + if len(*e.SuspendProcesses) > 0 { + toSuspend := []*string{} + for _, p := range *e.SuspendProcesses { + toSuspend = append(toSuspend, &p) + } + + processQuery := &autoscaling.ScalingProcessQuery{} + processQuery.AutoScalingGroupName = e.Name + processQuery.ScalingProcesses = toSuspend + + _, err := t.Cloud.Autoscaling().SuspendProcesses(processQuery) + if err != nil { + return fmt.Errorf("error suspending processes: %v", err) + } + } } else { request := &autoscaling.UpdateAutoScalingGroupInput{ AutoScalingGroupName: e.Name, @@ -282,6 +304,33 @@ func (_ *AutoscalingGroup) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Autos } } + if changes.SuspendProcesses != nil { + toSuspend := processCompare(e.SuspendProcesses, a.SuspendProcesses) + toResume := processCompare(a.SuspendProcesses, e.SuspendProcesses) + + if len(toSuspend) > 0 { + suspendProcessQuery := &autoscaling.ScalingProcessQuery{} + suspendProcessQuery.AutoScalingGroupName = e.Name + suspendProcessQuery.ScalingProcesses = toSuspend + + _, err := t.Cloud.Autoscaling().SuspendProcesses(suspendProcessQuery) + if err != nil { + return fmt.Errorf("error suspending processes: %v", err) + } + } + if len(toResume) > 0 { + resumeProcessQuery := &autoscaling.ScalingProcessQuery{} + resumeProcessQuery.AutoScalingGroupName = e.Name + resumeProcessQuery.ScalingProcesses = toResume + + _, err := t.Cloud.Autoscaling().ResumeProcesses(resumeProcessQuery) + if err != nil { + return fmt.Errorf("error resuming processes: %v", err) + } + } + changes.SuspendProcesses = nil + } + empty := &AutoscalingGroup{} if !reflect.DeepEqual(empty, changes) { glog.Warningf("cannot apply changes to AutoScalingGroup: %v", changes) @@ -306,26 +355,30 @@ func (_ *AutoscalingGroup) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Autos } } - if e.SuspendProcesses != nil { - processQuery := &autoscaling.ScalingProcessQuery{} - processQuery.AutoScalingGroupName = e.Name - processQuery.ScalingProcesses = []*string{} - - for _, p := range e.SuspendProcesses { - processQuery.ScalingProcesses = append(processQuery.ScalingProcesses, &p) - } - - _, err := t.Cloud.Autoscaling().SuspendProcesses(processQuery) - if err != nil { - return fmt.Errorf("error suspending processes: %v", err) - } - } - // TODO: Use PropagateAtLaunch = false for tagging? return nil // We have } +// processCompare returns processes that exist in a but not in b +func processCompare(a *[]string, b *[]string) []*string { + notInB := []*string{} + for _, ap := range *a { + found := false + for _, bp := range *b { + if ap == bp { + found = true + break + } + } + if !found { + notFound := ap + notInB = append(notInB, ¬Found) + } + } + return notInB +} + // getASGTagsToDelete loops through the currently set tags and builds a list of // tags to be deleted from the Autoscaling Group func (e *AutoscalingGroup) getASGTagsToDelete(currentTags map[string]string) []*autoscaling.Tag { @@ -429,7 +482,7 @@ func (_ *AutoscalingGroup) RenderTerraform(t *terraform.TerraformTarget, a, e, c var processes []*string if e.SuspendProcesses != nil { - for _, p := range e.SuspendProcesses { + for _, p := range *e.SuspendProcesses { processes = append(processes, fi.String(p)) } }