Merge "Add test_k8s_ingress_nginx test"
diff --git a/tcp_tests/managers/k8s/ingresses.py b/tcp_tests/managers/k8s/ingresses.py
index 906dc31..5dd353c 100644
--- a/tcp_tests/managers/k8s/ingresses.py
+++ b/tcp_tests/managers/k8s/ingresses.py
@@ -14,6 +14,8 @@
from kubernetes import client
+from devops.helpers import helpers
+
from tcp_tests.managers.k8s.base import K8sBaseResource
from tcp_tests.managers.k8s.base import K8sBaseManager
@@ -41,6 +43,12 @@
self._manager.api.delete_namespaced_ingress(
self.name, self.namespace, client.V1DeleteOptions(), **kwargs)
+ def wait_ready(self, timeout=120, interval=2):
+ helpers.wait(
+ lambda: self.read().status.load_balancer.ingress is not None,
+ timeout=timeout, interval=interval)
+ return self
+
class K8sIngressManager(K8sBaseManager):
resource_class = K8sIngress
diff --git a/tcp_tests/settings_oslo.py b/tcp_tests/settings_oslo.py
index 842ffd8..d76396a 100644
--- a/tcp_tests/settings_oslo.py
+++ b/tcp_tests/settings_oslo.py
@@ -354,6 +354,8 @@
help="", default=False),
ct.Cfg('kubernetes_metallb_enabled', ct.Boolean(),
help="", default=False),
+ ct.Cfg('kubernetes_ingressnginx_enabled', ct.Boolean(),
+ help="", default=False),
ct.Cfg('kubelet_fail_on_swap', ct.Boolean(),
help="", default=False)
]
diff --git a/tcp_tests/tests/system/test_k8s_actions.py b/tcp_tests/tests/system/test_k8s_actions.py
index 7f01cf5..deee430 100644
--- a/tcp_tests/tests/system/test_k8s_actions.py
+++ b/tcp_tests/tests/system/test_k8s_actions.py
@@ -16,6 +16,7 @@
import netaddr
import os
import json
+import requests
from tcp_tests import logger
from tcp_tests import settings
@@ -385,3 +386,74 @@
[ns.name for ns in k8s_deployed.api.namespaces.list()]
for namespace in dashboard_namespaces:
assert namespace['objectMeta']['name'] in namespaces_names_list
+
+ @pytest.mark.grap_versions
+ @pytest.mark.fail_snapshot
+ def test_k8s_ingress_nginx(self, show_step, config,
+ salt_deployed, k8s_deployed):
+ """Test ingress-nginx configured and working with metallb
+
+ Scenario:
+ 1. Setup Kubernetes cluster with metallb
+ 2. Create 2 example deployments and expose them
+ 3. Create ingress controller with 2 backends to each deployment
+ service respectively
+ 4. Wait ingress for deploy
+ 5. Try to reach default endpoint
+ 6. Try to reach test1 and test2 deployment services endpoints
+ """
+ show_step(1)
+ if not config.k8s_deploy.kubernetes_metallb_enabled:
+ pytest.skip("Test requires metallb addon enabled")
+ if not config.k8s_deploy.kubernetes_ingressnginx_enabled:
+ pytest.skip("Test requires ingress-nginx addon enabled")
+
+ show_step(2)
+ image = 'nginxdemos/hello:plain-text'
+ port = 80
+ dep1 = k8s_deployed.run_sample_deployment(
+ 'dep-ingress-1', image=image, port=port)
+ dep2 = k8s_deployed.run_sample_deployment(
+ 'dep-ingress-2', image=image, port=port)
+ svc1 = dep1.wait_ready().expose()
+ svc2 = dep2.wait_ready().expose()
+
+ show_step(3)
+ body = {
+ 'apiVersion': 'extensions/v1beta1',
+ 'kind': 'Ingress',
+ 'metadata': {'name': 'ingress-test'},
+ 'spec': {
+ 'rules': [{'http': {
+ 'paths': [{
+ 'backend': {
+ 'serviceName': svc1.name,
+ 'servicePort': port},
+ 'path': '/test1'}, {
+ 'backend': {
+ 'serviceName': svc2.name,
+ 'servicePort': port},
+ 'path': '/test2'
+ }]
+ }}]
+ }
+ }
+ ingress = k8s_deployed.api.ingresses.create(body=body)
+
+ show_step(4)
+ ingress.wait_ready()
+
+ show_step(5)
+ ingress_address = "https://{}".format(
+ ingress.read().status.load_balancer.ingress[0].ip)
+
+ assert requests.get(ingress_address, verify=False).status_code == 404
+
+ show_step(6)
+ req1 = requests.get(ingress_address + "/test1", verify=False)
+ assert req1.status_code == 200
+ assert 'dep-ingress-1' in req1.text
+
+ req2 = requests.get(ingress_address + "/test2", verify=False)
+ assert req2.status_code == 200
+ assert 'dep-ingress-2' in req2.text