Skip to content

Commit 2b2c58f

Browse files
jtdoepkeTimothy-Dougherty
authored andcommitted
Allow negative and duplicate group.orders (kubernetes-sigs#2634)
This commit relaxes the restrictions around the `group.order` annotation, allowing both negative and duplicate orders. Duplicate orders are sorted lexicographically.
1 parent e223569 commit 2b2c58f

File tree

4 files changed

+88
-29
lines changed

4 files changed

+88
-29
lines changed

docs/guide/ingress/annotations.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,9 @@ By default, Ingresses don't belong to any IngressGroup, and we treat it as a "im
8888
- <a name="group.order">`alb.ingress.kubernetes.io/group.order`</a> specifies the order across all Ingresses within IngressGroup.
8989

9090
!!!note ""
91-
- You can explicitly denote the order using a number between 1-1000
91+
- You can explicitly denote the order using a number between -1000 and 1000
9292
- The smaller the order, the rule will be evaluated first. All Ingresses without an explicit order setting get order value as 0
93-
- By default the rule order between Ingresses within IngressGroup is determined by the lexical order of Ingress’s namespace/name.
94-
95-
!!!warning ""
96-
You may not have duplicate group order explicitly defined for Ingresses within IngressGroup.
93+
- Rules with the same order are sorted lexicographically by the Ingress’s namespace/name.
9794

9895
!!!example
9996
```

pkg/ingress/group_loader.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@ package ingress
33
import (
44
"context"
55
"fmt"
6+
"regexp"
7+
"sort"
8+
"strings"
9+
610
"github.com/pkg/errors"
711
networking "k8s.io/api/networking/v1"
8-
"k8s.io/apimachinery/pkg/util/sets"
912
"k8s.io/client-go/tools/record"
10-
"regexp"
1113
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
1214
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
1315
"sigs.k8s.io/controller-runtime/pkg/client"
14-
"sort"
15-
"strings"
1616
)
1717

1818
const (
1919
defaultGroupOrder int64 = 0
20-
minGroupOrder int64 = 1
20+
minGroupOrder int64 = -1000
2121
maxGroupOder int64 = 1000
2222
maxGroupNameLength int = 63
2323
)
@@ -251,7 +251,7 @@ type groupMemberWithOrder struct {
251251

252252
// sortGroupMembers will sort Ingresses within Ingress group in ascending order.
253253
// the order for an ingress can be set as below:
254-
// * explicit denote the order via "group.order" annotation.(It's an error if two Ingress have same explicit order)
254+
// * explicit denote the order via "group.order" annotation.
255255
// * implicit denote the order of ${defaultGroupOrder}.
256256
// If two Ingress are of same order, they are sorted by lexical order of their full-qualified name.
257257
func (m *defaultGroupLoader) sortGroupMembers(members []ClassifiedIngress) ([]ClassifiedIngress, error) {
@@ -260,7 +260,6 @@ func (m *defaultGroupLoader) sortGroupMembers(members []ClassifiedIngress) ([]Cl
260260
}
261261

262262
groupMemberWithOrderList := make([]groupMemberWithOrder, 0, len(members))
263-
explicitOrders := sets.NewInt64()
264263
for _, member := range members {
265264
var order = defaultGroupOrder
266265
exists, err := m.annotationParser.ParseInt64Annotation(annotations.IngressSuffixGroupOrder, &order, member.Ing.Annotations)
@@ -272,10 +271,6 @@ func (m *defaultGroupLoader) sortGroupMembers(members []ClassifiedIngress) ([]Cl
272271
return nil, errors.Errorf("explicit Ingress group order must be within [%v:%v], Ingress: %v, order: %v",
273272
minGroupOrder, maxGroupOder, k8s.NamespacedName(member.Ing), order)
274273
}
275-
if explicitOrders.Has(order) {
276-
return nil, errors.Errorf("conflict Ingress group order: %v", order)
277-
}
278-
explicitOrders.Insert(order)
279274
}
280275

281276
groupMemberWithOrderList = append(groupMemberWithOrderList, groupMemberWithOrder{member: member, order: order})

pkg/ingress/group_loader_test.go

Lines changed: 79 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package ingress
22

33
import (
44
"context"
5+
"testing"
6+
"time"
7+
58
awssdk "github.com/aws/aws-sdk-go/aws"
69
"github.com/golang/mock/gomock"
710
"github.com/google/go-cmp/cmp"
@@ -16,8 +19,6 @@ import (
1619
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
1720
"sigs.k8s.io/aws-load-balancer-controller/pkg/equality"
1821
testclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
19-
"testing"
20-
"time"
2122
)
2223

2324
func Test_defaultGroupLoader_Load(t *testing.T) {
@@ -2617,27 +2618,80 @@ func Test_defaultGroupLoader_sortGroupMembers(t *testing.T) {
26172618
wantErr: errors.New("failed to load Ingress group order for ingress: namespace/ingress: failed to parse int64 annotation, alb.ingress.kubernetes.io/group.order: x: strconv.ParseInt: parsing \"x\": invalid syntax"),
26182619
},
26192620
{
2620-
name: "invalid group order range",
2621+
name: "two ingress with the same order should be sorted lexically",
26212622
members: []ClassifiedIngress{
26222623
{
26232624
Ing: &networking.Ingress{
26242625
ObjectMeta: metav1.ObjectMeta{
26252626
Namespace: "namespace",
2626-
Name: "ingress",
2627+
Name: "ingress-b",
2628+
Annotations: map[string]string{
2629+
"kubernetes.io/ingress.class": "alb",
2630+
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2631+
"alb.ingress.kubernetes.io/group.order": "42",
2632+
},
2633+
},
2634+
},
2635+
},
2636+
{
2637+
Ing: &networking.Ingress{
2638+
ObjectMeta: metav1.ObjectMeta{
2639+
Namespace: "namespace",
2640+
Name: "ingress-a",
26272641
Annotations: map[string]string{
26282642
"kubernetes.io/ingress.class": "alb",
2629-
"alb.ingress.kubernetes.io/group.order": "1001",
2643+
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2644+
"alb.ingress.kubernetes.io/group.order": "42",
2645+
},
2646+
},
2647+
},
2648+
},
2649+
},
2650+
want: []ClassifiedIngress{
2651+
{
2652+
Ing: &networking.Ingress{
2653+
ObjectMeta: metav1.ObjectMeta{
2654+
Namespace: "namespace",
2655+
Name: "ingress-a",
2656+
Annotations: map[string]string{
2657+
"kubernetes.io/ingress.class": "alb",
2658+
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2659+
"alb.ingress.kubernetes.io/group.order": "42",
2660+
},
2661+
},
2662+
},
2663+
},
2664+
{
2665+
Ing: &networking.Ingress{
2666+
ObjectMeta: metav1.ObjectMeta{
2667+
Namespace: "namespace",
2668+
Name: "ingress-b",
2669+
Annotations: map[string]string{
2670+
"kubernetes.io/ingress.class": "alb",
2671+
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2672+
"alb.ingress.kubernetes.io/group.order": "42",
26302673
},
26312674
},
26322675
},
26332676
},
26342677
},
2635-
want: nil,
2636-
wantErr: errors.New("explicit Ingress group order must be within [1:1000], Ingress: namespace/ingress, order: 1001"),
26372678
},
26382679
{
2639-
name: "two ingress shouldn't have same explicit order",
2680+
name: "negative orders are allow",
26402681
members: []ClassifiedIngress{
2682+
{
2683+
Ing: &networking.Ingress{
2684+
ObjectMeta: metav1.ObjectMeta{
2685+
Namespace: "namespace",
2686+
Name: "ingress-b",
2687+
Annotations: map[string]string{
2688+
"kubernetes.io/ingress.class": "alb",
2689+
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2690+
"alb.ingress.kubernetes.io/group.order": "0",
2691+
},
2692+
},
2693+
},
2694+
},
26412695
{
26422696
Ing: &networking.Ingress{
26432697
ObjectMeta: metav1.ObjectMeta{
@@ -2646,7 +2700,22 @@ func Test_defaultGroupLoader_sortGroupMembers(t *testing.T) {
26462700
Annotations: map[string]string{
26472701
"kubernetes.io/ingress.class": "alb",
26482702
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2649-
"alb.ingress.kubernetes.io/group.order": "42",
2703+
"alb.ingress.kubernetes.io/group.order": "-1",
2704+
},
2705+
},
2706+
},
2707+
},
2708+
},
2709+
want: []ClassifiedIngress{
2710+
{
2711+
Ing: &networking.Ingress{
2712+
ObjectMeta: metav1.ObjectMeta{
2713+
Namespace: "namespace",
2714+
Name: "ingress-a",
2715+
Annotations: map[string]string{
2716+
"kubernetes.io/ingress.class": "alb",
2717+
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2718+
"alb.ingress.kubernetes.io/group.order": "-1",
26502719
},
26512720
},
26522721
},
@@ -2659,14 +2728,12 @@ func Test_defaultGroupLoader_sortGroupMembers(t *testing.T) {
26592728
Annotations: map[string]string{
26602729
"kubernetes.io/ingress.class": "alb",
26612730
"alb.ingress.kubernetes.io/group.name": "awesome-group",
2662-
"alb.ingress.kubernetes.io/group.order": "42",
2731+
"alb.ingress.kubernetes.io/group.order": "0",
26632732
},
26642733
},
26652734
},
26662735
},
26672736
},
2668-
want: nil,
2669-
wantErr: errors.New("conflict Ingress group order: 42"),
26702737
},
26712738
}
26722739
for _, tt := range tests {

test/e2e/ingress/multi_path_backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type BackendConfig struct {
3232

3333
type MultiPathIngressConfig struct {
3434
GroupName string
35-
GroupOrder int32
35+
GroupOrder int64
3636
PathCFGs []PathConfig
3737
}
3838

0 commit comments

Comments
 (0)