Skip to content

Commit 2105e9e

Browse files
jaishalsakshaysngupta
authored andcommitted
listener: support wildcard hostnames and multiple hostname for a ingress rule (#670)
1 parent bc90103 commit 2105e9e

32 files changed

+1248
-262
lines changed

functional_tests/duplicate_ports.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@
8686
],
8787
"httpListeners": [
8888
{
89-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-443",
90-
"name": "fl-foo.baz-443",
89+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-505c4171fc2857213ff0d86c602276fb",
90+
"name": "fl-505c4171fc2857213ff0d86c602276fb",
9191
"properties": {
9292
"frontendIPConfiguration": {
9393
"id": "--front-end-ip-id-1--"
@@ -103,8 +103,8 @@
103103
}
104104
},
105105
{
106-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-80",
107-
"name": "fl-foo.baz-80",
106+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-d8f5c23dcab3db80f8466dbc57706908",
107+
"name": "fl-d8f5c23dcab3db80f8466dbc57706908",
108108
"properties": {
109109
"frontendIPConfiguration": {
110110
"id": "--front-end-ip-id-1--"
@@ -157,22 +157,22 @@
157157
],
158158
"redirectConfigurations": [
159159
{
160-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-foo.baz-443",
161-
"name": "sslr-fl-foo.baz-443",
160+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-505c4171fc2857213ff0d86c602276fb",
161+
"name": "sslr-fl-505c4171fc2857213ff0d86c602276fb",
162162
"properties": {
163163
"includePath": true,
164164
"includeQueryString": true,
165165
"redirectType": "Permanent",
166166
"targetListener": {
167-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-443"
167+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-505c4171fc2857213ff0d86c602276fb"
168168
}
169169
}
170170
}
171171
],
172172
"requestRoutingRules": [
173173
{
174-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-foo.baz-443",
175-
"name": "rr-foo.baz-443",
174+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-505c4171fc2857213ff0d86c602276fb",
175+
"name": "rr-505c4171fc2857213ff0d86c602276fb",
176176
"properties": {
177177
"backendAddressPool": {
178178
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/backendAddressPools/pool---namespace---hello-world-80-bp-80"
@@ -181,20 +181,20 @@
181181
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/backendHttpSettingsCollection/bp---namespace---hello-world-80-80---name--"
182182
},
183183
"httpListener": {
184-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-443"
184+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-505c4171fc2857213ff0d86c602276fb"
185185
},
186186
"ruleType": "Basic"
187187
}
188188
},
189189
{
190-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-foo.baz-80",
191-
"name": "rr-foo.baz-80",
190+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-d8f5c23dcab3db80f8466dbc57706908",
191+
"name": "rr-d8f5c23dcab3db80f8466dbc57706908",
192192
"properties": {
193193
"httpListener": {
194-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-80"
194+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-d8f5c23dcab3db80f8466dbc57706908"
195195
},
196196
"redirectConfiguration": {
197-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-foo.baz-443"
197+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-505c4171fc2857213ff0d86c602276fb"
198198
},
199199
"ruleType": "Basic"
200200
}

functional_tests/functional_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,39 @@ var _ = ginkgo.Describe("Tests `appgw.ConfigBuilder`", func() {
164164
},
165165
}
166166

167+
ingressFooBazNoTLSHostNameFromAnnotation := &v1beta1.Ingress{
168+
Spec: v1beta1.IngressSpec{
169+
Rules: []v1beta1.IngressRule{
170+
{
171+
IngressRuleValue: v1beta1.IngressRuleValue{
172+
HTTP: &v1beta1.HTTPIngressRuleValue{
173+
Paths: []v1beta1.HTTPIngressPath{
174+
{
175+
Path: "/.well-known/acme-challenge/blahBlahBBLLAAHH",
176+
Backend: v1beta1.IngressBackend{
177+
ServiceName: serviceNameB,
178+
ServicePort: intstr.IntOrString{
179+
Type: intstr.Int,
180+
IntVal: 80,
181+
},
182+
},
183+
},
184+
},
185+
},
186+
},
187+
},
188+
},
189+
},
190+
ObjectMeta: metav1.ObjectMeta{
191+
Annotations: map[string]string{
192+
annotations.IngressClassKey: annotations.ApplicationGatewayIngressClass,
193+
annotations.HostNameExtensionKey: "foo.baz",
194+
},
195+
Namespace: tests.Namespace,
196+
Name: tests.Name,
197+
},
198+
}
199+
167200
ingressOtherNamespace := &v1beta1.Ingress{
168201
Spec: v1beta1.IngressSpec{
169202
Rules: []v1beta1.IngressRule{
@@ -475,6 +508,40 @@ var _ = ginkgo.Describe("Tests `appgw.ConfigBuilder`", func() {
475508
},
476509
}
477510

511+
ingressAWithExtendedHostName := &v1beta1.Ingress{
512+
Spec: v1beta1.IngressSpec{
513+
Rules: []v1beta1.IngressRule{
514+
{
515+
// This one has no host
516+
IngressRuleValue: v1beta1.IngressRuleValue{
517+
HTTP: &v1beta1.HTTPIngressRuleValue{
518+
Paths: []v1beta1.HTTPIngressPath{
519+
{
520+
Path: "/A/",
521+
Backend: v1beta1.IngressBackend{
522+
ServiceName: serviceNameA,
523+
ServicePort: intstr.IntOrString{
524+
Type: intstr.Int,
525+
IntVal: 80,
526+
},
527+
},
528+
},
529+
},
530+
},
531+
},
532+
},
533+
},
534+
},
535+
ObjectMeta: metav1.ObjectMeta{
536+
Annotations: map[string]string{
537+
annotations.IngressClassKey: annotations.ApplicationGatewayIngressClass,
538+
annotations.HostNameExtensionKey: "test.com, t*.com",
539+
},
540+
Namespace: tests.Namespace,
541+
Name: tests.Name,
542+
},
543+
}
544+
478545
ingressB := &v1beta1.Ingress{
479546
Spec: v1beta1.IngressSpec{
480547
Rules: []v1beta1.IngressRule{
@@ -611,6 +678,34 @@ var _ = ginkgo.Describe("Tests `appgw.ConfigBuilder`", func() {
611678
check(cbCtx, "two_ingresses_same_domain_tls_notls.json", stopChannel, ctxt, configBuilder)
612679
})
613680

681+
ginkgo.It("TWO Ingress Resources same path and hostname but one has host in ingress rule and other has annotation", func() {
682+
cbCtx := &ConfigBuilderContext{
683+
IngressList: []*v1beta1.Ingress{
684+
ingressFooBazNoTLS,
685+
ingressFooBazNoTLSHostNameFromAnnotation,
686+
},
687+
ServiceList: serviceList,
688+
EnvVariables: environment.GetFakeEnv(),
689+
DefaultAddressPoolID: to.StringPtr("xx"),
690+
DefaultHTTPSettingsID: to.StringPtr("yy"),
691+
}
692+
check(cbCtx, "two_ingresses_same_hostname_value_different_locations.json", stopChannel, ctxt, configBuilder)
693+
})
694+
695+
ginkgo.It("TWO Ingress Resources with same path but one with extended hostname and one without", func() {
696+
cbCtx := &ConfigBuilderContext{
697+
IngressList: []*v1beta1.Ingress{
698+
ingressAWithExtendedHostName,
699+
ingressA,
700+
},
701+
ServiceList: serviceList,
702+
EnvVariables: environment.GetFakeEnv(),
703+
DefaultAddressPoolID: to.StringPtr("xx"),
704+
DefaultHTTPSettingsID: to.StringPtr("yy"),
705+
}
706+
check(cbCtx, "two_ingresses_with_and_without_extendedhostname.json", stopChannel, ctxt, configBuilder)
707+
})
708+
614709
ginkgo.It("Preexisting port w/ same port number", func() {
615710

616711
cbCtx := &ConfigBuilderContext{

functional_tests/health_probes_same_labels_different_namespaces.json

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@
114114
],
115115
"httpListeners": [
116116
{
117-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-443",
118-
"name": "fl-foo.baz-443",
117+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-505c4171fc2857213ff0d86c602276fb",
118+
"name": "fl-505c4171fc2857213ff0d86c602276fb",
119119
"properties": {
120120
"frontendIPConfiguration": {
121121
"id": "--front-end-ip-id-1--"
@@ -131,8 +131,8 @@
131131
}
132132
},
133133
{
134-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-80",
135-
"name": "fl-foo.baz-80",
134+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-d8f5c23dcab3db80f8466dbc57706908",
135+
"name": "fl-d8f5c23dcab3db80f8466dbc57706908",
136136
"properties": {
137137
"frontendIPConfiguration": {
138138
"id": "--front-end-ip-id-1--"
@@ -197,22 +197,22 @@
197197
],
198198
"redirectConfigurations": [
199199
{
200-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-foo.baz-443",
201-
"name": "sslr-fl-foo.baz-443",
200+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-505c4171fc2857213ff0d86c602276fb",
201+
"name": "sslr-fl-505c4171fc2857213ff0d86c602276fb",
202202
"properties": {
203203
"includePath": true,
204204
"includeQueryString": true,
205205
"redirectType": "Permanent",
206206
"targetListener": {
207-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-443"
207+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-505c4171fc2857213ff0d86c602276fb"
208208
}
209209
}
210210
}
211211
],
212212
"requestRoutingRules": [
213213
{
214-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-foo.baz-443",
215-
"name": "rr-foo.baz-443",
214+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-505c4171fc2857213ff0d86c602276fb",
215+
"name": "rr-505c4171fc2857213ff0d86c602276fb",
216216
"properties": {
217217
"backendAddressPool": {
218218
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/backendAddressPools/pool---namespace---hello-world-80-bp-80"
@@ -221,21 +221,21 @@
221221
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/backendHttpSettingsCollection/bp---namespace---hello-world-80-80---name--"
222222
},
223223
"httpListener": {
224-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-443"
224+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-505c4171fc2857213ff0d86c602276fb"
225225
},
226226
"ruleType": "Basic"
227227
}
228228
},
229229
{
230-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-foo.baz-80",
231-
"name": "rr-foo.baz-80",
230+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-d8f5c23dcab3db80f8466dbc57706908",
231+
"name": "rr-d8f5c23dcab3db80f8466dbc57706908",
232232
"properties": {
233233
"httpListener": {
234-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-foo.baz-80"
234+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-d8f5c23dcab3db80f8466dbc57706908"
235235
},
236236
"ruleType": "PathBasedRouting",
237237
"urlPathMap": {
238-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/urlPathMaps/url-foo.baz-80"
238+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/urlPathMaps/url-d8f5c23dcab3db80f8466dbc57706908"
239239
}
240240
}
241241
}
@@ -257,11 +257,11 @@
257257
],
258258
"urlPathMaps": [
259259
{
260-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/urlPathMaps/url-foo.baz-80",
261-
"name": "url-foo.baz-80",
260+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/urlPathMaps/url-d8f5c23dcab3db80f8466dbc57706908",
261+
"name": "url-d8f5c23dcab3db80f8466dbc57706908",
262262
"properties": {
263263
"defaultRedirectConfiguration": {
264-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-foo.baz-443"
264+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/redirectConfigurations/sslr-fl-505c4171fc2857213ff0d86c602276fb"
265265
},
266266
"pathRules": [
267267
{

functional_tests/helpers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,4 @@ func check(cbCtx *appgw.ConfigBuilderContext, expectedFilename string, stopChan
6666
gomega.Expect(curatedLineAct).To(gomega.Equal(curatedLineExp), msg)
6767
}
6868

69-
}
69+
}

functional_tests/one_ingress_slash_nothing.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,15 @@
7979
],
8080
"httpListeners": [
8181
{
82-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-80",
83-
"name": "fl-80",
82+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-6d1d6d2bd4405b8228172c2ef8a065fb",
83+
"name": "fl-6d1d6d2bd4405b8228172c2ef8a065fb",
8484
"properties": {
8585
"frontendIPConfiguration": {
8686
"id": "--front-end-ip-id-1--"
8787
},
8888
"frontendPort": {
8989
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/frontendPorts/fp-80"
9090
},
91-
"hostName": "",
9291
"protocol": "Http"
9392
}
9493
}
@@ -134,8 +133,8 @@
134133
"redirectConfigurations": null,
135134
"requestRoutingRules": [
136135
{
137-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-80",
138-
"name": "rr-80",
136+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/requestRoutingRules/rr-6d1d6d2bd4405b8228172c2ef8a065fb",
137+
"name": "rr-6d1d6d2bd4405b8228172c2ef8a065fb",
139138
"properties": {
140139
"backendAddressPool": {
141140
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/backendAddressPools/pool---namespace---hello-world-b-80-bp-80"
@@ -144,7 +143,7 @@
144143
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/backendHttpSettingsCollection/bp---namespace---hello-world-b-80-80---name--"
145144
},
146145
"httpListener": {
147-
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-80"
146+
"id": "/subscriptions/--subscription--/resourceGroups/--resource-group--/providers/Microsoft.Network/applicationGateways/--app-gw-name--/httpListeners/fl-6d1d6d2bd4405b8228172c2ef8a065fb"
148147
},
149148
"ruleType": "Basic"
150149
}

0 commit comments

Comments
 (0)