@@ -3,8 +3,11 @@ package ingress
3
3
import (
4
4
"context"
5
5
"github.com/pkg/errors"
6
+ corev1 "k8s.io/api/core/v1"
6
7
networking "k8s.io/api/networking/v1beta1"
8
+ "k8s.io/apimachinery/pkg/types"
7
9
"k8s.io/apimachinery/pkg/util/sets"
10
+ "k8s.io/client-go/tools/record"
8
11
"regexp"
9
12
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
10
13
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
@@ -13,11 +16,13 @@ import (
13
16
)
14
17
15
18
const (
16
- defaultGroupOrder int64 = 0
17
- minGroupOrder int64 = 1
18
- maxGroupOder int64 = 1000
19
- maxGroupNameLength int = 63
20
- defaultIngressClass = "alb"
19
+ defaultGroupOrder int64 = 0
20
+ minGroupOrder int64 = 1
21
+ maxGroupOder int64 = 1000
22
+ maxGroupNameLength int = 63
23
+ ingressClassALB = "alb"
24
+ // the controller name used in IngressClass for ALB.
25
+ ingressClassControllerALB = "ingress.k8s.aws/alb"
21
26
)
22
27
23
28
var (
@@ -36,9 +41,10 @@ type GroupLoader interface {
36
41
}
37
42
38
43
// NewDefaultGroupLoader constructs new GroupLoader instance.
39
- func NewDefaultGroupLoader (client client.Client , annotationParser annotations.Parser , ingressClass string ) * defaultGroupLoader {
44
+ func NewDefaultGroupLoader (client client.Client , eventRecorder record. EventRecorder , annotationParser annotations.Parser , ingressClass string ) * defaultGroupLoader {
40
45
return & defaultGroupLoader {
41
46
client : client ,
47
+ eventRecorder : eventRecorder ,
42
48
annotationParser : annotationParser ,
43
49
ingressClass : ingressClass ,
44
50
}
@@ -49,13 +55,18 @@ var _ GroupLoader = (*defaultGroupLoader)(nil)
49
55
// default implementation for GroupLoader
50
56
type defaultGroupLoader struct {
51
57
client client.Client
58
+ eventRecorder record.EventRecorder
52
59
annotationParser annotations.Parser
53
60
54
61
ingressClass string
55
62
}
56
63
57
64
func (m * defaultGroupLoader ) FindGroupID (ctx context.Context , ing * networking.Ingress ) (* GroupID , error ) {
58
- if ! m .matchesIngressClass (ing ) {
65
+ matchesIngressClass , err := m .matchesIngressClass (ctx , ing )
66
+ if err != nil {
67
+ return nil , err
68
+ }
69
+ if ! matchesIngressClass {
59
70
return nil , nil
60
71
}
61
72
@@ -85,7 +96,7 @@ func (m *defaultGroupLoader) Load(ctx context.Context, groupID GroupID) (Group,
85
96
ing := & ingList .Items [index ]
86
97
isGroupMember , err := m .isGroupMember (ctx , groupID , ing )
87
98
if err != nil {
88
- return Group {}, err
99
+ return Group {}, errors . Wrapf ( err , "ingress: %v" , k8s . NamespacedName ( ing ))
89
100
}
90
101
if isGroupMember {
91
102
members = append (members , ing )
@@ -104,13 +115,52 @@ func (m *defaultGroupLoader) Load(ctx context.Context, groupID GroupID) (Group,
104
115
}, nil
105
116
}
106
117
107
- // matchesIngressClass tests whether Ingress matches ingress class of this group manager.
108
- func (m * defaultGroupLoader ) matchesIngressClass (ing * networking.Ingress ) bool {
109
- ingClass := ing .Annotations [annotations .IngressClass ]
110
- if m .ingressClass == "" {
111
- return ingClass == "" || ingClass == defaultIngressClass
118
+ // matchesIngressClass tests whether provided Ingress are matched by this group loader.
119
+ func (m * defaultGroupLoader ) matchesIngressClass (ctx context.Context , ing * networking.Ingress ) (bool , error ) {
120
+ var matchesIngressClassResults []bool
121
+ if ingClassAnnotation , exists := ing .Annotations [annotations .IngressClass ]; exists {
122
+ matchesIngressClass := m .matchesIngressClassAnnotation (ctx , ingClassAnnotation )
123
+ matchesIngressClassResults = append (matchesIngressClassResults , matchesIngressClass )
124
+ }
125
+
126
+ if ing .Spec .IngressClassName != nil {
127
+ matchesIngressClass , err := m .matchesIngressClassName (ctx , * ing .Spec .IngressClassName )
128
+ if err != nil {
129
+ return false , err
130
+ }
131
+ matchesIngressClassResults = append (matchesIngressClassResults , matchesIngressClass )
132
+ }
133
+
134
+ if len (matchesIngressClassResults ) == 2 {
135
+ if matchesIngressClassResults [0 ] != matchesIngressClassResults [1 ] {
136
+ m .eventRecorder .Event (ing , corev1 .EventTypeWarning , k8s .IngressEventReasonConflictIngressClass , "conflict IngressClass by `spec.IngressClass` and `kubernetes.io/ingress.class` annotation" )
137
+ }
138
+ return matchesIngressClassResults [0 ], nil
139
+ }
140
+ if len (matchesIngressClassResults ) == 1 {
141
+ return matchesIngressClassResults [0 ], nil
142
+ }
143
+
144
+ return m .ingressClass == "" , nil
145
+ }
146
+
147
+ // matchesIngressClassAnnotation tests whether provided ingClassAnnotation are matched by this group loader.
148
+ func (m * defaultGroupLoader ) matchesIngressClassAnnotation (_ context.Context , ingClassAnnotation string ) bool {
149
+ if m .ingressClass == "" && ingClassAnnotation == ingressClassALB {
150
+ return true
151
+ }
152
+ return ingClassAnnotation == m .ingressClass
153
+ }
154
+
155
+ // matchesIngressClassName tests whether provided ingClassName are matched by this group loader.
156
+ func (m * defaultGroupLoader ) matchesIngressClassName (ctx context.Context , ingClassName string ) (bool , error ) {
157
+ ingClassKey := types.NamespacedName {Name : ingClassName }
158
+ ingClass := & networking.IngressClass {}
159
+ if err := m .client .Get (ctx , ingClassKey , ingClass ); err != nil {
160
+ return false , err
112
161
}
113
- return ingClass == m .ingressClass
162
+ matchesIngressClass := ingClass .Spec .Controller == ingressClassControllerALB
163
+ return matchesIngressClass , nil
114
164
}
115
165
116
166
// isGroupMember checks whether an ingress is member of a Ingress group
0 commit comments