Skip to content

Commit 2a6c25b

Browse files
committed
Tracking service port with the TG
1 parent d0e0e61 commit 2a6c25b

File tree

8 files changed

+102
-61
lines changed

8 files changed

+102
-61
lines changed

pkg/alb/lb/loadbalancer.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ func (l *LoadBalancer) Reconcile(rOpts *ReconcileOptions) []error {
326326
IgnoreDeletes: true,
327327
}
328328

329+
// Creates target groups
329330
tgs, err := l.targetgroups.Reconcile(tgsOpts)
330331
if err != nil {
331332
errors = append(errors, err)
@@ -344,13 +345,13 @@ func (l *LoadBalancer) Reconcile(rOpts *ReconcileOptions) []error {
344345
l.listeners = ltnrs
345346
}
346347

347-
// Decide: Is this still needed?
348+
// Does not consider TG used for listener default action
348349
for _, listener := range l.listeners {
349-
// Does not consider TG used for listener default action
350350
unusedTGs := listener.GetRules().FindUnusedTGs(l.targetgroups)
351351
unusedTGs.StripDesiredState()
352352
}
353353

354+
// removes target groups
354355
tgsOpts.IgnoreDeletes = false
355356
tgs, err = l.targetgroups.Reconcile(tgsOpts)
356357
if err != nil {

pkg/alb/rs/rule.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type NewDesiredRuleOptions struct {
2121
IgnoreHostHeader bool
2222
Path string
2323
SvcName string
24+
SvcPort int32
2425
Logger *log.Logger
2526
}
2627

@@ -60,24 +61,25 @@ func NewDesiredRule(o *NewDesiredRuleOptions) *Rule {
6061
}
6162

6263
return &Rule{
63-
svcname: svcname{desired: o.SvcName},
64-
rs: rs{desired: r},
65-
logger: o.Logger,
64+
svc: svc{desired: service{name: o.SvcName, port: o.SvcPort}},
65+
rs: rs{desired: r},
66+
logger: o.Logger,
6667
}
6768
}
6869

6970
type NewCurrentRuleOptions struct {
7071
SvcName string
72+
SvcPort int32
7173
Rule *elbv2.Rule
7274
Logger *log.Logger
7375
}
7476

7577
// NewCurrentRule creates a Rule from an elbv2.Rule
7678
func NewCurrentRule(o *NewCurrentRuleOptions) *Rule {
7779
return &Rule{
78-
svcname: svcname{current: o.SvcName},
79-
rs: rs{current: o.Rule},
80-
logger: o.Logger,
80+
svc: svc{current: service{name: o.SvcName, port: o.SvcPort}},
81+
rs: rs{current: o.Rule},
82+
logger: o.Logger,
8183
}
8284
}
8385

@@ -134,14 +136,14 @@ func (r *Rule) Reconcile(rOpts *ReconcileOptions) error {
134136
}
135137

136138
func (r *Rule) TargetGroupArn(tgs tg.TargetGroups) *string {
137-
i := tgs.LookupBySvc(r.svcname.desired)
139+
i := tgs.LookupBySvc(r.svc.desired.name, r.svc.desired.port)
138140
if i < 0 {
139-
r.logger.Errorf("Failed to locate TargetGroup related to this service: %s", r.svcname.desired)
141+
r.logger.Errorf("Failed to locate TargetGroup related to this service: %s:%d", r.svc.desired.name, r.svc.desired.port)
140142
return nil
141143
}
142144
arn := tgs[i].CurrentARN()
143145
if arn == nil {
144-
r.logger.Errorf("Located TargetGroup but no known (current) state found: %s", r.svcname.desired)
146+
r.logger.Errorf("Located TargetGroup but no known (current) state found: %s:%d", r.svc.desired.name, r.svc.desired.port)
145147
}
146148
return arn
147149
}
@@ -160,7 +162,7 @@ func (r *Rule) create(rOpts *ReconcileOptions) error {
160162
return fmt.Errorf("Failed Rule creation. Rule: %s | Error: %s", log.Prettify(r.rs.desired), err.Error())
161163
}
162164
r.rs.current = o.Rules[0]
163-
r.svcname.current = r.svcname.desired
165+
r.svc.current = r.svc.desired
164166

165167
return nil
166168
}
@@ -181,7 +183,7 @@ func (r *Rule) modify(rOpts *ReconcileOptions) error {
181183
if len(o.Rules) > 0 {
182184
r.rs.current = o.Rules[0]
183185
}
184-
r.svcname.current = r.svcname.desired
186+
r.svc.current = r.svc.desired
185187

186188
return nil
187189
}
@@ -221,8 +223,11 @@ func (r *Rule) needsModification() bool {
221223
case !conditionsEqual(crs.Conditions, drs.Conditions):
222224
r.logger.Debugf("Conditions needs to be changed (%v != %v)", log.Prettify(crs.Conditions), log.Prettify(drs.Conditions))
223225
return true
224-
case r.svcname.current != r.svcname.desired:
225-
r.logger.Debugf("SvcName needs to be changed (%v != %v)", r.svcname.current, r.svcname.desired)
226+
case r.svc.current.name != r.svc.desired.name:
227+
r.logger.Debugf("SvcName needs to be changed (%v != %v)", r.svc.current.name, r.svc.desired.name)
228+
return true
229+
case r.svc.current.port != r.svc.desired.port && r.svc.current.port != 0: // Check against 0 because that is the default for legacy tags
230+
r.logger.Debugf("SvcPort needs to be changed (%v != %v)", r.svc.current.port, r.svc.desired.port)
226231
return true
227232
}
228233

pkg/alb/rs/rule_test.go

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,17 @@ func TestNewDesiredRule(t *testing.T) {
2020
Hostname string
2121
Path string
2222
SvcName string
23+
SvcPort int32
2324
ExpectedRule Rule
2425
}{
2526
{
2627
Priority: 0,
2728
Hostname: "hostname",
2829
Path: "/path",
2930
SvcName: "namespace-service",
31+
SvcPort: 8080,
3032
ExpectedRule: Rule{
31-
svcname: svcname{desired: "namespace-service"},
33+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
3234
rs: rs{
3335
desired: &elbv2.Rule{
3436
Priority: aws.String("default"),
@@ -43,8 +45,9 @@ func TestNewDesiredRule(t *testing.T) {
4345
Hostname: "hostname",
4446
Path: "/path",
4547
SvcName: "namespace-service",
48+
SvcPort: 8080,
4649
ExpectedRule: Rule{
47-
svcname: svcname{desired: "namespace-service"},
50+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
4851
rs: rs{
4952
desired: &elbv2.Rule{
5053
Priority: aws.String("1"),
@@ -72,6 +75,7 @@ func TestNewDesiredRule(t *testing.T) {
7275
Hostname: c.Hostname,
7376
Path: c.Path,
7477
SvcName: c.SvcName,
78+
SvcPort: c.SvcPort,
7579
Logger: log.New("test"),
7680
})
7781
if log.Prettify(rule) != log.Prettify(c.ExpectedRule) {
@@ -110,15 +114,15 @@ func TestRuleReconcile(t *testing.T) {
110114
}{
111115
{ // test empty rule, no current/desired rules
112116
Rule: Rule{
113-
svcname: svcname{desired: "namespace-service"},
114-
logger: log.New("test"),
117+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
118+
logger: log.New("test"),
115119
},
116120
Pass: true,
117121
},
118122
{ // test Current is default, doesnt delete
119123
Rule: Rule{
120-
svcname: svcname{desired: "namespace-service"},
121-
logger: log.New("test"),
124+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
125+
logger: log.New("test"),
122126
rs: rs{
123127
current: &elbv2.Rule{
124128
Priority: aws.String("default"),
@@ -131,8 +135,8 @@ func TestRuleReconcile(t *testing.T) {
131135
},
132136
{ // test delete
133137
Rule: Rule{
134-
svcname: svcname{desired: "namespace-service"},
135-
logger: log.New("test"),
138+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
139+
logger: log.New("test"),
136140
rs: rs{
137141
current: &elbv2.Rule{
138142
Priority: aws.String("1"),
@@ -145,8 +149,8 @@ func TestRuleReconcile(t *testing.T) {
145149
},
146150
{ // test delete, fail
147151
Rule: Rule{
148-
svcname: svcname{desired: "namespace-service"},
149-
logger: log.New("test"),
152+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
153+
logger: log.New("test"),
150154
rs: rs{
151155
current: &elbv2.Rule{
152156
Priority: aws.String("1"),
@@ -160,8 +164,8 @@ func TestRuleReconcile(t *testing.T) {
160164
},
161165
{ // test desired rule is default, we do nothing
162166
Rule: Rule{
163-
svcname: svcname{desired: "namespace-service"},
164-
logger: log.New("test"),
167+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
168+
logger: log.New("test"),
165169
rs: rs{
166170
desired: &elbv2.Rule{
167171
Priority: aws.String("default"),
@@ -181,8 +185,8 @@ func TestRuleReconcile(t *testing.T) {
181185
},
182186
{ // test current rule is nil, desired rule exists, runs create
183187
Rule: Rule{
184-
svcname: svcname{desired: "namespace-service"},
185-
logger: log.New("test"),
188+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
189+
logger: log.New("test"),
186190
rs: rs{
187191
desired: &elbv2.Rule{
188192
Priority: aws.String("1"),
@@ -202,8 +206,8 @@ func TestRuleReconcile(t *testing.T) {
202206
},
203207
{ // test current rule is nil, desired rule exists, runs create, fails
204208
Rule: Rule{
205-
svcname: svcname{desired: "namespace-service"},
206-
logger: log.New("test"),
209+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
210+
logger: log.New("test"),
207211
rs: rs{
208212
desired: &elbv2.Rule{
209213
Priority: aws.String("1"),
@@ -224,8 +228,8 @@ func TestRuleReconcile(t *testing.T) {
224228
},
225229
{ // test current rule and desired rule are different, modify current rule
226230
Rule: Rule{
227-
svcname: svcname{desired: "namespace-service"},
228-
logger: log.New("test"),
231+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
232+
logger: log.New("test"),
229233
rs: rs{
230234
current: &elbv2.Rule{
231235
Priority: aws.String("1"),
@@ -262,8 +266,8 @@ func TestRuleReconcile(t *testing.T) {
262266
},
263267
{ // test current rule and desired rule are different, modify current rule, fail
264268
Rule: Rule{
265-
svcname: svcname{desired: "namespace-service"},
266-
logger: log.New("test"),
269+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
270+
logger: log.New("test"),
267271
rs: rs{
268272
current: &elbv2.Rule{
269273
Priority: aws.String("1"),
@@ -302,8 +306,8 @@ func TestRuleReconcile(t *testing.T) {
302306
},
303307
{ // test current rule and desired rule are the same, default case
304308
Rule: Rule{
305-
svcname: svcname{desired: "namespace-service"},
306-
logger: log.New("test"),
309+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
310+
logger: log.New("test"),
307311
rs: rs{
308312
current: &elbv2.Rule{
309313
Priority: aws.String("1"),
@@ -393,8 +397,8 @@ func TestTargetGroupArn(t *testing.T) {
393397
genTG("arn", "namespace-service"),
394398
},
395399
Rule: Rule{
396-
svcname: svcname{desired: "namespace-service"},
397-
logger: log.New("test"),
400+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
401+
logger: log.New("test"),
398402
},
399403
},
400404
{ // svcname isn't found in targetgroups list, returns a nil
@@ -403,8 +407,8 @@ func TestTargetGroupArn(t *testing.T) {
403407
genTG("arn", "missing svc name"),
404408
},
405409
Rule: Rule{
406-
svcname: svcname{desired: "namespace-service"},
407-
logger: log.New("test"),
410+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
411+
logger: log.New("test"),
408412
},
409413
},
410414
}
@@ -672,6 +676,7 @@ func TestIgnoreHostHeader(t *testing.T) {
672676
IgnoreHostHeader bool
673677
Path string
674678
SvcName string
679+
SvcPort int32
675680
ExpectedRule Rule
676681
}{
677682
{
@@ -680,8 +685,9 @@ func TestIgnoreHostHeader(t *testing.T) {
680685
IgnoreHostHeader: false,
681686
Path: "/path",
682687
SvcName: "namespace-service",
688+
SvcPort: 8080,
683689
ExpectedRule: Rule{
684-
svcname: svcname{desired: "namespace-service"},
690+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
685691
rs: rs{
686692
desired: &elbv2.Rule{
687693
Priority: aws.String("1"),
@@ -707,8 +713,9 @@ func TestIgnoreHostHeader(t *testing.T) {
707713
IgnoreHostHeader: true,
708714
Path: "/path",
709715
SvcName: "namespace-service",
716+
SvcPort: 8080,
710717
ExpectedRule: Rule{
711-
svcname: svcname{desired: "namespace-service"},
718+
svc: svc{desired: service{name: "namespace-service", port: 8080}},
712719
rs: rs{
713720
desired: &elbv2.Rule{
714721
Priority: aws.String("1"),
@@ -733,6 +740,7 @@ func TestIgnoreHostHeader(t *testing.T) {
733740
IgnoreHostHeader: c.IgnoreHostHeader,
734741
Path: c.Path,
735742
SvcName: c.SvcName,
743+
SvcPort: c.SvcPort,
736744
Logger: log.New("test"),
737745
})
738746
if log.Prettify(rule) != log.Prettify(c.ExpectedRule) {

pkg/alb/rs/rules.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func NewCurrentRules(o *NewCurrentRulesOptions) (Rules, error) {
3838

3939
newRule := NewCurrentRule(&NewCurrentRuleOptions{
4040
SvcName: tg.SvcName,
41+
SvcPort: tg.SvcPort,
4142
Rule: r,
4243
Logger: o.Logger,
4344
})
@@ -79,6 +80,7 @@ func NewDesiredRules(o *NewDesiredRulesOptions) (Rules, int, error) {
7980
IgnoreHostHeader: o.IgnoreHostHeader,
8081
Path: path.Path,
8182
SvcName: path.Backend.ServiceName,
83+
SvcPort: path.Backend.ServicePort.IntVal,
8284
Logger: o.Logger,
8385
})
8486
if !rs.merge(r) {
@@ -93,7 +95,7 @@ func NewDesiredRules(o *NewDesiredRulesOptions) (Rules, int, error) {
9395
func (r Rules) merge(mergeRule *Rule) bool {
9496
if i, existingRule := r.FindByPriority(mergeRule.rs.desired.Priority); i >= 0 {
9597
existingRule.rs.desired = mergeRule.rs.desired
96-
existingRule.svcname.desired = mergeRule.svcname.desired
98+
existingRule.svc.desired = mergeRule.svc.desired
9799
return true
98100
}
99101
return false

pkg/alb/rs/types.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type Rules []*Rule
1212
// Rule contains a current/desired Rule
1313
type Rule struct {
1414
rs rs
15-
svcname svcname
15+
svc svc
1616
deleted bool
1717
logger *log.Logger
1818
}
@@ -22,9 +22,14 @@ type rs struct {
2222
desired *elbv2.Rule
2323
}
2424

25-
type svcname struct {
26-
current string
27-
desired string
25+
type svc struct {
26+
current service
27+
desired service
28+
}
29+
30+
type service struct {
31+
name string
32+
port int32
2833
}
2934

3035
type ReconcileOptions struct {

0 commit comments

Comments
 (0)