8000 Add python tests · nginx/kubernetes-ingress@4b8eb16 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4b8eb16

Browse files
committed
Add python tests
1 parent f6dfde7 commit 4b8eb16

10 files changed

+200
-24
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: k8s.nginx.org/v1alpha1
2+
kind: GlobalConfiguration
3+
metadata:
4+
name: nginx-configuration
5+
spec:
6+
listeners:
7+
- name: tcp-server
8+
port: 3333
9+
protocol: TCP
10+
- name: udp-server
11+
port: 3333
12+
protocol: UDP
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: k8s.nginx.org/v1alpha1
2+
kind: TransportServer
3+
metadata:
4+
name: passthrough
5+
spec:
6+
listener:
7+
name: tls-passthrough
8+
protocol: TLS_PASSTHROUGH
9+
host: app.example.com
10+
upstreams:
11+
- name: secure-app
12+
service: secure-app
13+
port: 8443
14+
action:
15+
pass: secure-app
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: k8s.nginx.org/v1alpha1
2+
kind: TransportServer
3+
metadata:
4+
name: tcp
5+
spec:
6+
listener:
7+
name: tcp-server
8+
protocol: TCP
9+
upstreams:
10+
- name: tcp-app
11+
service: tcp-service
12+
port: 3333
13+
action:
14+
pass: tcp-app
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: k8s.nginx.org/v1alpha1
2+
kind: TransportServer
3+
metadata:
4+
name: udp
5+
spec:
6+
listener:
7+
name: udp-server
8+
protocol: UDP
9+
upstreams:
10+
- name: udp-app
11+
service: udp-service
12+
port: 3333
13+
action:
14+
pass: udp-app

tests/suite/custom_resources_utils.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ def delete_resource(custom_objects: CustomObjectsApi, resource, namespace, plura
226226
print(f"Resource '{kind}' was removed with name '{name}'")
227227

228228

229-
def patch_ts(
229+
def patch_ts_from_yaml(
230230
custom_objects: CustomObjectsApi, name, yaml_manifest, namespace
231231
) -> None:
232232
"""
@@ -251,6 +251,22 @@ def patch_custom_resource_v1alpha1(custom_objects: CustomObjectsApi, name, yaml_
251251
logging.exception(f"Failed with exception while patching custom resource: {name}")
252252
raise
253253

254+
def patch_ts(custom_objects: CustomObjectsApi, namespace, body) -> None:
255+
"""
256+
Patch a TransportServer
257+
"""
258+
name = body['metadata']['name']
259+
260+
print(f"Update a Resource: {name}")
261+
262+
try:
263+
custom_objects.patch_namespaced_custom_object(
264+
"k8s.nginx.org", "v1alpha1", namespace, "transportservers", name, body
265+
)
266+
except ApiException:
267+
logging.exception(f"Failed with exception while patching custom resource: {name}")
268+
raise
269+
254270

255271
def generate_item_with_upstream_options(yaml_manifest, options) -> dict:
256272
"""

tests/suite/test_prometheus_metrics.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33

44
from kubernetes.client import V1ContainerPort
55

6+
from suite.custom_resources_utils import (
7+
create_ts_from_yaml,
8+
patch_ts_from_yaml,
9+
patch_ts, delete_ts,
10+
create_gc_from_yaml,
11+
delete_gc,
12+
)
613
from suite.resources_utils import (
714
ensure_connection_to_public_endpoint,
815
create_items_from_yaml,
@@ -82,6 +89,7 @@ def fin():
8289
return IngressSetup(req_url, ingress_host)
8390

8491

92+
8593
@pytest.mark.ingresses
8694
@pytest.mark.smoke
8795
class TestPrometheusExporter:
@@ -200,3 +208,100 @@ def test_https_metrics(
200208
resp_content = resp.content.decode("utf-8")
201209
for item in expected_metrics:
202210
assert item in resp_content
211+
212+
213+
@pytest.fixture(scope="class")
214+
def ts_setup(request, kube_apis, crd_ingress_controller):
215+
global_config_file = f"{TEST_DATA}/prometheus/transport-server/global-configuration.yaml"
216+
217+
gc_resource = create_gc_from_yaml(kube_apis.custom_objects, global_config_file, "nginx-ingress")
218+
219+
def fin():
220+
delete_gc(kube_apis.custom_objects, gc_resource, "nginx-ingress")
221+
222+
request.addfinalizer(fin)
223+
224+
225+
def assert_ts_total_metric(ingress_controller_endpoint, ts_type, value):
226+
req_url = f"http://{ingress_controller_endpoint.public_ip}:{ingress_controller_endpoint.metrics_port}/metrics"
227+
resp = requests.get(req_url)
228+
resp_content = resp.content.decode("utf-8")
229+
230+
assert resp.status_code == 200, f"Expected 200 code for /metrics but got {resp.status_code}"
231+
assert f'nginx_ingress_controller_transportserver_resources_total{{class="nginx",type="{ts_type}"}} {value}' in resp_content
232+
233+
234+
@pytest.mark.ts
235+
@pytest.mark.parametrize(
236+
"crd_ingress_controller",
237+
[
238+
pytest.param(
239+
{
240+
"type": "complete",
241+
"extra_args":
242+
[
243+
"-global-configuration=nginx-ingress/nginx-configuration",
244+
"-enable-tls-passthrough",
245+
"-enable-prometheus-metrics"
246+
]
247+
},
248+
)
249+
],
250+
indirect=True,
251+
)
252+
class TestTransportServerMetrics:
253+
@pytest.mark.parametrize("ts", [
254+
(f"{TEST_DATA}/prometheus/transport-server/passthrough.yaml", "passthrough"),
255+
(f"{TEST_DATA}/prometheus/transport-server/tcp.yaml", "tcp"),
256+
(f"{TEST_DATA}/prometheus/transport-server/udp.yaml", "udp")
257+
])
258+
def test_total_metrics(
259+
self,
260+
crd_ingress_controller,
261+
ts_setup,
262+
ingress_controller_endpoint,
263+
kube_apis,
264+
test_namespace,
265+
ts
266+
):
267+
"""
268+
Tests nginx_ingress_controller_transportserver_resources_total metric for a given TransportServer type.
269+
"""
270+
ts_file = ts[0]
271+
ts_type = ts[1]
272+
273+
# initially, the number of TransportServers is 0
274+
275+
assert_ts_total_metric(ingress_controller_endpoint, ts_type, 0)
276+
277+
# create a TS and check the metric is 1
278+
279+
ts_resource = create_ts_from_yaml(kube_apis.custom_objects, ts_file, test_namespace)
280+
wait_before_test()
281+
282+
assert_ts_total_metric(ingress_controller_endpoint, ts_type, 1)
283+
284+
# make the TS invalid and check the metric is 0
285+
286+
ts_resource["spec"]["listener"]["protocol"] = "invalid"
287+
288+
patch_ts(kube_apis.custom_objects, test_namespace, ts_resource)
289+
wait_before_test()
290+
291+
assert_ts_total_metric(ingress_controller_endpoint, ts_type, 0)
292+
293+
# restore the TS and check the metric is 1
294+
295+
patch_ts_from_yaml(
296+
kube_apis.custom_objects, ts_resource["metadata"]["name"], ts_file, test_namespace
297+
)
298+
wait_before_test()
299+
300+
assert_ts_total_metric(ingress_controller_endpoint, ts_type, 1)
301+
302+
# delete the TS and check the metric is 0
303+
304+
delete_ts(kube_apis.custom_objects, ts_resource, test_namespace)
305+
wait_before_test()
306+
307+
assert_ts_total_metric(ingress_controller_endpoint, ts_type, 0)

tests/suite/test_transport_server.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
get_ts_nginx_template_conf,
66
)
77
from suite.custom_resources_utils import (
8-
patch_ts,
8+
patch_ts_from_yaml,
99
)
1010
from settings import TEST_DATA
1111

@@ -36,7 +36,7 @@ def test_snippets(
3636
Test snippets are present in conf when enabled
3737
"""
3838
patch_src = f"{TEST_DATA}/transport-server/transport-server-snippets.yaml"
39-
patch_ts(
39+
patch_ts_from_yaml(
4040
kube_apis.custom_objects,
4141
transport_server_setup.name,
4242
patch_src,
@@ -54,7 +54,7 @@ def test_snippets(
5454
print(conf)
5555

5656
std_src = f"{TEST_DATA}/transport-server-status/standard/transport-server.yaml"
57-
patch_ts(
57+
patch_ts_from_yaml(
5858
kube_apis.custom_objects,
5959
transport_server_setup.name,
6060
std_src,
@@ -73,7 +73,7 @@ def test_configurble_timeout_directives(
7373
Test session and upstream configurable timeouts are present in conf
7474
"""
7575
patch_src = f"{TEST_DATA}/transport-server/transport-server-configurable-timeouts.yaml"
76-
patch_ts(
76+
patch_ts_from_yaml(
7777
kube_apis.custom_objects,
7878
transport_server_setup.name,
7979
patch_src,
@@ -91,7 +91,7 @@ def test_configurble_timeout_directives(
9191
print(conf)
9292

9393
std_src = f"{TEST_DATA}/transport-server-status/standard/transport-server.yaml"
94-
patch_ts(
94+
patch_ts_from_yaml(
9595
kube_apis.custom_objects,
9696
transport_server_setup.name,
9797
std_src,

tests/suite/test_transport_server_status.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from suite.resources_utils import wait_before_test
44
from suite.custom_resources_utils import (
55
read_ts,
6-
patch_ts,
6+
patch_ts_from_yaml,
77
)
88
from settings import TEST_DATA
99

@@ -33,7 +33,7 @@ def restore_ts(self, kube_apis, transport_server_setup) -> None:
3333
Function to revert a TransportServer resource to a valid state.
3434
"""
3535
patch_src = f"{TEST_DATA}/transport-server-status/standard/transport-server.yaml"
36-
patch_ts(
36+
patch_ts_from_yaml(
3737
kube_apis.custom_objects,
3838
transport_server_setup.name,
3939
patch_src,
@@ -65,7 +65,7 @@ def test_status_warning(
6565
Test TransportServer status with a missing listener.
6666
"""
6767
patch_src = f"{TEST_DATA}/transport-server-status/rejected-warning.yaml"
68-
patch_ts(
68+
patch_ts_from_yaml(
6969
kube_apis.custom_objects,
7070
transport_server_setup.name,
7171
patch_src,
@@ -91,7 +91,7 @@ def test_status_invalid(
9191
Test TransportServer status with an invalid protocol.
9292
"""
9393
patch_src = f"{TEST_DATA}/transport-server-status/rejected-invalid.yaml"
94-
patch_ts(
94+
patch_ts_from_yaml(
9595
kube_apis.custom_objects,
9696
transport_server_setup.name,
9797
patch_src,

tests/suite/test_transport_server_tcp_load_balance.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
wait_for_event_increment,
1414
)
1515
from suite.custom_resources_utils import (
16-
patch_ts,
16+
patch_ts_from_yaml,
1717
read_ts,
1818
delete_ts,
1919
create_ts_from_yaml,
@@ -46,7 +46,7 @@ def restore_ts(self, kube_apis, transport_server_setup) -> None:
4646
Function to revert a TransportServer resource to a valid state.
4747
"""
4848
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/standard/transport-server.yaml"
49-
patch_ts(
49+
patch_ts_from_yaml(
5050
kube_apis.custom_objects,
5151
transport_server_setup.name,
5252
patch_src,
@@ -236,7 +236,7 @@ def test_tcp_request_load_balanced_wrong_port(
236236
"""
237237

238238
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/wrong-port-transport-server.yaml"
239-
patch_ts(
239+
patch_ts_from_yaml(
240240
kube_apis.custom_objects,
241241
transport_server_setup.name,
242242
patch_src,
@@ -267,7 +267,7 @@ def test_tcp_request_load_balanced_missing_service(
267267
"""
268268

269269
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/missing-service-transport-server.yaml"
270-
patch_ts(
270+
patch_ts_from_yaml(
271271
kube_apis.custom_objects,
272272
transport_server_setup.name,
273273
patch_src,
@@ -310,7 +310,7 @@ def test_tcp_request_max_connections(
310310

311311
# step 1 - set max connections to 2 with 1 replica
312312
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/max-connections-transport-server.yaml"
313-
patch_ts(
313+
patch_ts_from_yaml(
314314
kube_apis.custom_objects,
315315
transport_server_setup.name,
316316
patch_src,
@@ -358,7 +358,7 @@ def test_tcp_request_max_connections(
358358

359359
# step 4 - revert to config with no max connections
360360
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/standard/transport-server.yaml"
361-
patch_ts(
361+
patch_ts_from_yaml(
362362
kube_apis.custom_objects,
363363
transport_server_setup.name,
364364
patch_src,
@@ -386,7 +386,7 @@ def test_tcp_request_load_balanced_method(
386386
# Step 1 - set the load balancing method.
387387

388388
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/method-transport-server.yaml"
389-
patch_ts(
389+
patch_ts_from_yaml(
390390
kube_apis.custom_objects,
391391
transport_server_setup.name,
392392
patch_src,
@@ -474,7 +474,7 @@ def test_tcp_passing_healthcheck_with_match(
474474
# Step 1 - configure a passing health check
475475

476476
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/passing-hc-transport-server.yaml"
477-
patch_ts(
477+
patch_ts_from_yaml(
478478
kube_apis.custom_objects,
479479
transport_server_setup.name,
480480
patch_src,
@@ -539,7 +539,7 @@ def test_tcp_failing_healthcheck_with_match(
539539
# Step 1 - configure a failing health check
540540

541541
patch_src = f"{TEST_DATA}/transport-server-tcp-load-balance/failing-hc-transport-server.yaml"
542-
patch_ts(
542+
patch_ts_from_yaml(
543543
kube_apis.custom_objects,
544544
transport_server_setup.name,
545545
patch_src,

0 commit comments

Comments
 (0)
0