Skip to content

Commit

Permalink
Merge pull request #10666 from hakman/same-lb-multiple-igs
Browse files Browse the repository at this point in the history
Allow attaching same external load balancer to multiple instance groups
  • Loading branch information
k8s-ci-robot authored Jan 27, 2021
2 parents 6b4816b + 5fcd4e4 commit ecf795f
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 10 deletions.
7 changes: 6 additions & 1 deletion pkg/model/awsmodel/autoscalinggroup.go
Original file line number Diff line number Diff line change
Expand Up @@ -450,8 +450,12 @@ func (b *AutoscalingGroupModelBuilder) buildAutoScalingGroupTask(c *fi.ModelBuil

for _, extLB := range ig.Spec.ExternalLoadBalancers {
if extLB.LoadBalancerName != nil {
loadBalancerName := fi.StringValue(extLB.LoadBalancerName)
if loadBalancerName != awsup.GetResourceName32(b.Cluster.Name, "api") && loadBalancerName != awsup.GetResourceName32(b.Cluster.Name, "bastion") {
loadBalancerName = name + "-" + loadBalancerName
}
lb := &awstasks.ClassicLoadBalancer{
Name: extLB.LoadBalancerName,
Name: fi.String(loadBalancerName),
LoadBalancerName: extLB.LoadBalancerName,
Shared: fi.Bool(true),
}
Expand All @@ -473,6 +477,7 @@ func (b *AutoscalingGroupModelBuilder) buildAutoScalingGroupTask(c *fi.ModelBuil
c.AddTask(tg)
}
}
sort.Stable(awstasks.OrderLoadBalancersByName(t.LoadBalancers))
sort.Stable(awstasks.OrderTargetGroupsByName(t.TargetGroups))

// @step: are we using a mixed instance policy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
}
],
"LoadBalancerNames": [
"my-external-elb-1",
"my-external-elb-2",
"my-external-elb-3"
],
Expand Down
3 changes: 2 additions & 1 deletion tests/integration/update_cluster/externallb/in-v1alpha2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,9 @@ spec:
subnets:
- us-test-1a
externalLoadBalancers:
- targetGroupArn: arn:aws:elasticloadbalancing:us-test-1:000000000000:targetgroup/my-external-tg-1/1
- targetGroupArn: arn:aws:elasticloadbalancing:us-test-1:000000000000:targetgroup/my-external-tg-2/2
- targetGroupArn: arn:aws:elasticloadbalancing:us-test-1:000000000000:targetgroup/my-external-tg-1/1
- targetGroupArn: arn:aws:elasticloadbalancing:us-test-1:000000000000:targetgroup/my-external-tg-3/3
- loadBalancerName: my-external-elb-2
- loadBalancerName: my-external-elb-1
- loadBalancerName: my-external-elb-3
2 changes: 1 addition & 1 deletion tests/integration/update_cluster/externallb/kubernetes.tf
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ resource "aws_autoscaling_group" "master-us-test-1a-masters-externallb-example-c
id = aws_launch_template.master-us-test-1a-masters-externallb-example-com.id
version = aws_launch_template.master-us-test-1a-masters-externallb-example-com.latest_version
}
load_balancers = ["my-external-elb-2", "my-external-elb-3"]
load_balancers = ["my-external-elb-1", "my-external-elb-2", "my-external-elb-3"]
max_size = 1
metrics_granularity = "1Minute"
min_size = 1
Expand Down
7 changes: 6 additions & 1 deletion upup/pkg/fi/cloudup/awstasks/autoscalinggroup.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,12 @@ func (e *AutoscalingGroup) Find(c *fi.Context) (*AutoscalingGroup, error) {

actual.LoadBalancers = []*ClassicLoadBalancer{}
for _, lb := range g.LoadBalancerNames {
loadBalancerName := fi.StringValue(lb)
if loadBalancerName != awsup.GetResourceName32(c.Cluster.Name, "api") && loadBalancerName != awsup.GetResourceName32(c.Cluster.Name, "bastion") {
loadBalancerName = fi.StringValue(g.AutoScalingGroupName) + "-" + loadBalancerName
}
actual.LoadBalancers = append(actual.LoadBalancers, &ClassicLoadBalancer{
Name: aws.String(*lb),
Name: aws.String(loadBalancerName),
LoadBalancerName: aws.String(*lb),
})
}
Expand Down Expand Up @@ -158,6 +162,7 @@ func (e *AutoscalingGroup) Find(c *fi.Context) (*AutoscalingGroup, error) {
}
}
}
sort.Stable(OrderLoadBalancersByName(actual.LoadBalancers))

actual.TargetGroups = []*TargetGroup{}
if len(g.TargetGroupARNs) > 0 {
Expand Down
21 changes: 15 additions & 6 deletions upup/pkg/fi/cloudup/awstasks/classic_load_balancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,15 @@ func (_ *ClassicLoadBalancer) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Cl
return nil
}

// OrderLoadBalancersByName implements sort.Interface for []OrderLoadBalancersByName, based on name
type OrderLoadBalancersByName []*ClassicLoadBalancer

func (a OrderLoadBalancersByName) Len() int { return len(a) }
func (a OrderLoadBalancersByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a OrderLoadBalancersByName) Less(i, j int) bool {
return fi.StringValue(a[i].Name) < fi.StringValue(a[j].Name)
}

type terraformLoadBalancer struct {
LoadBalancerName *string `json:"name" cty:"name"`
Listener []*terraformLoadBalancerListener `json:"listener" cty:"listener"`
Expand Down Expand Up @@ -821,12 +830,12 @@ func (_ *ClassicLoadBalancer) RenderTerraform(t *terraform.TerraformTarget, a, e
func (e *ClassicLoadBalancer) TerraformLink(params ...string) *terraform.Literal {
shared := fi.BoolValue(e.Shared)
if shared {
if e.Name == nil {
if e.LoadBalancerName == nil {
klog.Fatalf("Name must be set, if LB is shared: %s", e)
}

klog.V(4).Infof("reusing existing LB with name %q", *e.Name)
return terraform.LiteralFromStringValue(*e.Name)
klog.V(4).Infof("reusing existing LB with name %q", *e.LoadBalancerName)
return terraform.LiteralFromStringValue(*e.LoadBalancerName)
}

prop := "id"
Expand Down Expand Up @@ -966,12 +975,12 @@ func (_ *ClassicLoadBalancer) RenderCloudformation(t *cloudformation.Cloudformat
func (e *ClassicLoadBalancer) CloudformationLink() *cloudformation.Literal {
shared := fi.BoolValue(e.Shared)
if shared {
if e.Name == nil {
if e.LoadBalancerName == nil {
klog.Fatalf("Name must be set, if LB is shared: %s", e)
}

klog.V(4).Infof("reusing existing LB with name %q", *e.Name)
return cloudformation.LiteralString(*e.Name)
klog.V(4).Infof("reusing existing LB with name %q", *e.LoadBalancerName)
return cloudformation.LiteralString(*e.LoadBalancerName)
}

return cloudformation.Ref("AWS::ElasticLoadBalancing::LoadBalancer", *e.Name)
Expand Down

0 comments on commit ecf795f

Please sign in to comment.