Skip to content

Commit ce6d45a

Browse files
committed
chore(gateway): add parent ref filter
1 parent 6ae8bfb commit ce6d45a

2 files changed

Lines changed: 84 additions & 2 deletions

File tree

rootfs/api/models/gateway.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,14 +404,16 @@ def _get_all_parent_refs(self):
404404
for gateway in self.app.gateway_set.filter(
405405
name__in=[item["name"] for item in self.parent_refs]):
406406
gateways[gateway.name] = gateway
407-
parent_refs, http_parent_refs = [], []
407+
hostnames, parent_refs, http_parent_refs = self.hostnames, [], []
408408
for item in self.parent_refs:
409409
gateway_name, port = item["name"], item["port"]
410410
if gateway_name not in gateways:
411411
continue
412412
gateway = gateways[gateway_name]
413413
for listener in gateway.listeners:
414-
if listener["port"] == port and listener["protocol"] in self.protocols:
414+
hostname = listener.get('hostname', None)
415+
if listener["port"] == port and listener["protocol"] in self.protocols and (
416+
hostname is None or hostname in hostnames):
415417
parent_ref = {
416418
"group": "gateway.networking.k8s.io",
417419
"kind": "Gateway",

rootfs/api/tests/test_gateway.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,3 +703,83 @@ def test_change_tls(self):
703703
}]
704704
self.assertEqual(len(response.data["results"]), 1, response.data)
705705
self.assertEqual(response.data["results"][0]["parent_refs"], expect, response.data)
706+
707+
def test_route_parent_refs(self):
708+
app_id = self.create_app_with_domain_and_deploy()
709+
response = self.client.get('/v2/apps/{}/routes/'.format(app_id))
710+
self.assertEqual(len(response.data["results"]), 1, response.data)
711+
expect = [{
712+
'name': f'{app_id}',
713+
'port': 80
714+
}]
715+
# enable tls
716+
self.change_certs_auto(app_id, True)
717+
self.assertEqual(response.data["results"][0]["parent_refs"], expect, response.data)
718+
response = self.client.get('/v2/apps/{}/routes/'.format(app_id))
719+
self.assertEqual(len(response.data["results"]), 1, response.data)
720+
expect = [{
721+
'name': f'{app_id}',
722+
'port': 80
723+
}, {
724+
'name': f'{app_id}',
725+
'port': 443
726+
}]
727+
self.assertEqual(len(response.data["results"]), 1, response.data)
728+
self.assertEqual(response.data["results"][0]["parent_refs"], expect, response.data)
729+
# add new domain
730+
ptype, kind, route_name, domain = (
731+
'gateway', "HTTPRoute", "myroute-1", 'test-domain-gateway.example.com')
732+
response = self.client.post(
733+
'/v2/apps/{}/domains'.format(app_id),
734+
{'domain': domain, 'ptype': ptype}
735+
)
736+
self.assertEqual(response.status_code, 201, response.data)
737+
# add new services
738+
response = self.client.post(
739+
'/v2/apps/{}/services'.format(app_id),
740+
{
741+
'port': 9999,
742+
'protocol': 'TCP',
743+
'target_port': 9999,
744+
'ptype': 'gateway'
745+
}
746+
)
747+
self.assertEqual(response.status_code, 201, response.data)
748+
# add new router
749+
response = self.client.post(
750+
'/v2/apps/{}/routes/'.format(app_id),
751+
{
752+
"kind": kind,
753+
"name": route_name,
754+
"rules": [{
755+
"backendRefs": [{
756+
"kind": "Service",
757+
"name": f"{app_id}-{ptype}",
758+
"port": 9999,
759+
"weight": 100,
760+
}],
761+
}],
762+
}
763+
)
764+
self.assertEqual(response.status_code, 201, response.data)
765+
self.client.patch(
766+
'/v2/apps/{}/routes/{}/attach/'.format(app_id, route_name),
767+
{
768+
"gateway": app_id,
769+
"port": 443
770+
}
771+
)
772+
self.assertEqual(response.status_code, 201, response.data)
773+
route = Route.objects.get(name=route_name)
774+
response = route.scheduler().httproutes.get(app_id, route_name)
775+
self.assertEqual(response.status_code, 200, response.json())
776+
self.assertEqual(len(response.json()['spec']['parentRefs']), 1)
777+
# get gateway
778+
response = route.scheduler().gateways.get(app_id, app_id)
779+
listeners = [
780+
listener for listener in response.json()['spec']['listeners']
781+
if listener['port'] == 443
782+
]
783+
self.assertEqual(len(listeners) > 1, True)
784+
hostnames = [listener['hostname'] for listener in listeners]
785+
self.assertEqual(domain in hostnames, True)

0 commit comments

Comments
 (0)