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