-
Notifications
You must be signed in to change notification settings - Fork 84
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
target groups: preserve last used arns in case of ROLLBACK_IN_PROGRESS
state
#673
base: master
Are you sure you want to change the base?
Changes from all commits
e343d92
4341dc2
7e570e4
b0a4301
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,6 +61,7 @@ type Adapter struct { | |
obsoleteInstances []string | ||
stackTerminationProtection bool | ||
stackTags map[string]string | ||
stackLastTargerGroupARNs map[string][]string | ||
controllerID string | ||
sslPolicy string | ||
ipAddressType string | ||
|
@@ -248,6 +249,7 @@ func NewAdapter(clusterID, newControllerID, vpcID string, debug, disableInstrume | |
nlbCrossZone: DefaultNLBCrossZone, | ||
nlbHTTPEnabled: DefaultNLBHTTPEnabled, | ||
customFilter: DefaultCustomFilter, | ||
stackLastTargerGroupARNs: make(map[string][]string), | ||
TargetCNI: &TargetCNIconfig{ | ||
Enabled: false, | ||
TargetGroupCh: make(chan []string, 10), | ||
|
@@ -626,13 +628,29 @@ func (a *Adapter) SecurityGroupID() string { | |
// FindManagedStacks returns all CloudFormation stacks containing the controller management tags | ||
// that match the current cluster and are ready to be used. The stack status is used to filter. | ||
func (a *Adapter) FindManagedStacks() ([]*Stack, error) { | ||
stacks, err := findManagedStacks(a.cloudformation, a.ClusterID(), a.controllerID) | ||
stacks, err := findManagedStacks(a.cloudformation, a.ClusterID(), a.controllerID, a.stackLastTargerGroupARNs) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return stacks, nil | ||
} | ||
|
||
func (a *Adapter) UpdateStackLastTargetGroupARNs(stack *Stack) { | ||
if _, ok := a.stackLastTargerGroupARNs[stack.Name]; !ok { | ||
if len(stack.TargetGroupARNs) > 0 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why do you check this here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The check can be moved outside the function yes, I just thought it made sense here. |
||
a.stackLastTargerGroupARNs[stack.Name] = stack.TargetGroupARNs | ||
} | ||
} | ||
} | ||
|
||
func (a *Adapter) GetStackLastTargetGroupARNs(stackName string) []string { | ||
return a.stackLastTargerGroupARNs[stackName] | ||
} | ||
|
||
func (a *Adapter) CleanLastTargetGroupARNs() { | ||
a.stackLastTargerGroupARNs = make(map[string][]string) | ||
} | ||
|
||
// UpdateTargetGroupsAndAutoScalingGroups updates Auto Scaling Groups | ||
// config to have relevant Target Groups and registers/deregisters single | ||
// instances (that do not belong to ASG) in relevant Target Groups. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,6 +8,7 @@ import ( | |
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/service/cloudformation" | ||
"github.com/aws/aws-sdk-go/service/cloudformation/cloudformationiface" | ||
log "github.com/sirupsen/logrus" | ||
) | ||
|
||
const ( | ||
|
@@ -500,13 +501,22 @@ func mapToManagedStack(stack *cloudformation.Stack) *Stack { | |
} | ||
} | ||
|
||
func findManagedStacks(svc cloudformationiface.CloudFormationAPI, clusterID, controllerID string) ([]*Stack, error) { | ||
func findManagedStacks(svc cloudformationiface.CloudFormationAPI, clusterID, controllerID string, stacksLastTargetGroupARNs map[string][]string) ([]*Stack, error) { | ||
stacks := make([]*Stack, 0) | ||
err := svc.DescribeStacksPages(&cloudformation.DescribeStacksInput{}, | ||
func(page *cloudformation.DescribeStacksOutput, lastPage bool) bool { | ||
for _, s := range page.Stacks { | ||
if isManagedStack(s.Tags, clusterID, controllerID) { | ||
stacks = append(stacks, mapToManagedStack(s)) | ||
stack := mapToManagedStack(s) | ||
if len(stack.TargetGroupARNs) == 0 && stack.status == cloudformation.StackStatusRollbackInProgress { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why check len(stack.TargetGroupARNs) == 0? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm still thinking should it be for all states without output or only for rollback |
||
if _, ok := stacksLastTargetGroupARNs[stack.Name]; ok { | ||
log.Warnf("stack %s is in rolling back state, falling back to last saved output", stack.Name) | ||
stack.TargetGroupARNs = stacksLastTargetGroupARNs[stack.Name] | ||
} else { | ||
log.Warnf("stack %s has no saved target groups, skipping", stack.Name) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. how do you skip here? I don't see that you skip anything :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, thanks. Forgot the |
||
} | ||
} | ||
stacks = append(stacks, stack) | ||
} | ||
} | ||
return true | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
stackLastTargerGroupARNs -> stackLastTargetGroupARNs