Add multitenancy hybrid tests for snat

Change-Id: I5702fbe81740d7950e7ed8a0aca9943a586ea5e1
Related-Prod: https://mirantis.jira.com/browse/PRODX-51693
diff --git a/ironic_tempest_plugin/tests/scenario/baremetal_manager.py b/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
index 9b611a6..5418ef9 100644
--- a/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
+++ b/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
@@ -20,6 +20,7 @@
 from tempest.common import waiters
 from tempest import config
 from tempest.lib.common import api_version_utils
+from tempest.lib.common import ssh
 from tempest.lib.common.utils.linux import remote_client
 from tempest.lib.common.utils import test_utils
 from tempest.lib import exceptions as lib_exc
@@ -196,9 +197,23 @@
         dest.validate_authentication()
 
     def verify_l3_connectivity(self, source_ip, private_key,
-                               destination_ip, conn_expected=True, timeout=15):
-        remote = self.get_remote_client(source_ip, private_key=private_key)
-        remote.validate_authentication()
+                               destination_ip, conn_expected=True, timeout=15,
+                               jump_host_ip=None, jump_host_key=None):
+        if jump_host_ip:
+            jump_host_key = jump_host_key or private_key
+            jump_client = self.get_remote_client(jump_host_ip,
+                                                 private_key=jump_host_key)
+            # TODO(mkarpin): add ability to pass proxy client to
+            # get_remote_client
+            remote = ssh.Client(source_ip, "cirros",
+                                ssh_key_type="ecdsa",
+                                pkey=private_key,
+                                proxy_client=jump_client.ssh_client)
+            remote.test_connection_auth()
+        else:
+            remote = self.get_remote_client(source_ip,
+                                            private_key=private_key)
+            remote.validate_authentication()
 
         output = remote.exec_command('ip route')
         LOG.debug("Routing table on %s is %s", source_ip, output)
diff --git a/ironic_tempest_plugin/tests/scenario/test_baremetal_multitenancy_hybrid.py b/ironic_tempest_plugin/tests/scenario/test_baremetal_multitenancy_hybrid.py
index 5e07f7c..db95ff0 100644
--- a/ironic_tempest_plugin/tests/scenario/test_baremetal_multitenancy_hybrid.py
+++ b/ironic_tempest_plugin/tests/scenario/test_baremetal_multitenancy_hybrid.py
@@ -200,6 +200,8 @@
             cls.r1['id'], subnet_id=cls.subnetB['id'])
 
         cls.keypair = cls.create_keypair()
+        cls.snat_check_ip = (cls.r1["external_gateway_info"]
+                                   ["external_fixed_ips"][0]["ip_address"])
 
         cls.bmA1, cls.bmA1_ip, cls.bmA1_fip = cls.create_server(
             key_name=cls.keypair['name'],
@@ -312,6 +314,18 @@
             self.vmB1_fip, self.keypair['private_key'],
             self.vmB2_ip, conn_expected=True, timeout=self.ping_timeout)
 
+    def _test_connectivity_vma2_snat(self):
+        self.verify_l3_connectivity(
+            self.vmA2_ip, self.keypair['private_key'],
+            self.snat_check_ip, conn_expected=True, timeout=self.ping_timeout,
+            jump_host_ip=self.vmA1_fip)
+
+    def _test_connectivity_vmb2_snat(self):
+        self.verify_l3_connectivity(
+            self.vmB2_ip, self.keypair['private_key'],
+            self.snat_check_ip, conn_expected=True, timeout=self.ping_timeout,
+            jump_host_ip=self.vmB1_fip)
+
 
 class BaremetalMultitenancyHybridGeneveGeneve(
         BaremetalMultitenancyHybridBase):
@@ -375,6 +389,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('b1e2df03-cc7a-4c2d-a8f7-ab18b4b441c9')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('f9c68b0c-09d2-4e9a-8a7d-0b26adad6426')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridVxlanVxlan(
         BaremetalMultitenancyHybridBase):
@@ -438,6 +460,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('3a99c17b-8007-494a-b834-17f9a498abf8')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('ae196bec-7560-4c61-b895-89741ea39ce3')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridVlanVlan(
         BaremetalMultitenancyHybridBase):
@@ -501,6 +531,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('44a110ce-266e-4f15-8aea-9468d0007cbb')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('94ed2725-7d75-4066-b985-a489414bc318')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridVlanGeneve(
         BaremetalMultitenancyHybridBase):
@@ -564,6 +602,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('2c4fa154-b407-4cfa-b007-7668bd8436ac')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('dd09381b-452a-4979-9e77-4017155bf080')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridGeneveVlan(
         BaremetalMultitenancyHybridBase):
@@ -627,6 +673,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('5e6a0cbe-180d-4df9-b7b2-af20742c41ad')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('a64b1f48-c009-47c5-a907-8923d9d7952f')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridGeneveVxlan(
         BaremetalMultitenancyHybridBase):
@@ -690,6 +744,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('444794a7-dd67-4693-ab7e-7b3b6e95fa32')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('4e8828ba-d0e9-4b24-a170-90824581c12a')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridVxlanGeneve(
         BaremetalMultitenancyHybridBase):
@@ -753,6 +815,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('b13665b2-1fe4-417a-8e0c-1af523e62aea')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('0e0d4592-dc77-4026-8b46-46f4040bf7ee')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridVxlanVlan(
         BaremetalMultitenancyHybridBase):
@@ -816,6 +886,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('eba44471-36b4-408e-af61-6e365674b868')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('e759ed80-5137-44c5-86e8-e49191afbe62')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridVlanVxlan(
         BaremetalMultitenancyHybridBase):
@@ -879,6 +957,14 @@
     def test_connectivity_vmb1_vmb2(self):
         self._test_connectivity_vmb1_vmb2()
 
+    @decorators.idempotent_id('4fa0b40f-5048-4720-9019-c269a127f918')
+    def test_connectivity_vma2_snat(self):
+        self._test_connectivity_vma2_snat()
+
+    @decorators.idempotent_id('8e865d32-a831-4c3d-87b0-2fc2a9c445ed')
+    def test_connectivity_vmb2_snat(self):
+        self._test_connectivity_vmb2_snat()
+
 
 class BaremetalMultitenancyHybridBaseBM(
         BaremetalMultitenancyHybridBase):
@@ -889,9 +975,9 @@
                      ( r1 ) ------- netB --------
                        |              |       |
     --------- netA ------------    (bmB1)   (bmB2)
-            |        |              fipB1
+            |        |              fipbmB1
           (bmA1)   (bmA2)
-         fipbmA
+         fipbmA1
 
     * Test can ping fips fipbmA, fipA1, fipB1
     * Test each VM can reach other VMs via FIPs
@@ -942,6 +1028,8 @@
             cls.r1['id'], subnet_id=cls.subnetB['id'])
 
         cls.keypair = cls.create_keypair()
+        cls.snat_check_ip = (cls.r1["external_gateway_info"]
+                                   ["external_fixed_ips"][0]["ip_address"])
 
         cls.bmA1, cls.bmA1_ip, cls.bmA1_fip = cls.create_server(
             key_name=cls.keypair['name'],
@@ -1008,6 +1096,18 @@
             self.bmA1_fip, self.keypair['private_key'],
             self.bmB2_ip, conn_expected=True, timeout=self.ping_timeout)
 
+    def _test_connectivity_bma2_snat(self):
+        self.verify_l3_connectivity(
+            self.bmA2_ip, self.keypair['private_key'],
+            self.snat_check_ip, conn_expected=True, timeout=self.ping_timeout,
+            jump_host_ip=self.bmA1_fip)
+
+    def _test_connectivity_bmb2_snat(self):
+        self.verify_l3_connectivity(
+            self.bmB2_ip, self.keypair['private_key'],
+            self.snat_check_ip, conn_expected=True, timeout=self.ping_timeout,
+            jump_host_ip=self.bmB1_fip)
+
 
 class BaremetalMultitenancyHybridBaseBMGeneveGeneve(
         BaremetalMultitenancyHybridBaseBM):
@@ -1039,6 +1139,14 @@
     def test_connectivity_bma1_bmb2(self):
         self._test_connectivity_bma1_bmb2()
 
+    @decorators.idempotent_id('3ad949e2-2fd2-42d9-bace-e0c1aab5d21d')
+    def test_connectivity_bma2_snat(self):
+        self._test_connectivity_bma2_snat()
+
+    @decorators.idempotent_id('cb2a0a0c-1b3b-4a72-8e11-051b3e6cd578')
+    def test_connectivity_bmb2_snat(self):
+        self._test_connectivity_bmb2_snat()
+
 
 class BaremetalMultitenancyHybridBaseBMVxlanVxlan(
         BaremetalMultitenancyHybridBaseBM):
@@ -1070,6 +1178,14 @@
     def test_connectivity_bma1_bmb2(self):
         self._test_connectivity_bma1_bmb2()
 
+    @decorators.idempotent_id('0b9ae8ad-e566-49c6-92a5-64b3a86189c7')
+    def test_connectivity_bma2_snat(self):
+        self._test_connectivity_bma2_snat()
+
+    @decorators.idempotent_id('58e9878a-57fd-40d5-aeee-7200d799b059')
+    def test_connectivity_bmb2_snat(self):
+        self._test_connectivity_bmb2_snat()
+
 
 class BaremetalMultitenancyHybridBaseBMVlanVlan(
         BaremetalMultitenancyHybridBaseBM):
@@ -1101,6 +1217,14 @@
     def test_connectivity_bma1_bmb2(self):
         self._test_connectivity_bma1_bmb2()
 
+    @decorators.idempotent_id('0061ced9-1099-401b-a418-6acd6d5b0e9a')
+    def test_connectivity_bma2_snat(self):
+        self._test_connectivity_bma2_snat()
+
+    @decorators.idempotent_id('7f689624-3e59-4bca-818c-affbb414d1b8')
+    def test_connectivity_bmb2_snat(self):
+        self._test_connectivity_bmb2_snat()
+
 
 class BaremetalMultitenancyHybridBaseBMGeneveVLAN(
         BaremetalMultitenancyHybridBaseBM):
@@ -1132,6 +1256,14 @@
     def test_connectivity_bma1_bmb2(self):
         self._test_connectivity_bma1_bmb2()
 
+    @decorators.idempotent_id('7f0b6589-b535-425b-9880-b0c15c6b3b64')
+    def test_connectivity_bma2_snat(self):
+        self._test_connectivity_bma2_snat()
+
+    @decorators.idempotent_id('cede7117-18a6-4dca-ad2f-d68aec450cc0')
+    def test_connectivity_bmb2_snat(self):
+        self._test_connectivity_bmb2_snat()
+
 
 class BaremetalMultitenancyHybridBaseBMGeneveVXLAN(
         BaremetalMultitenancyHybridBaseBM):
@@ -1162,3 +1294,11 @@
     @decorators.idempotent_id('388a695f-c289-4d09-878b-1dc7d2b822ac')
     def test_connectivity_bma1_bmb2(self):
         self._test_connectivity_bma1_bmb2()
+
+    @decorators.idempotent_id('10e5429d-7534-4a65-b0ec-a1e4e0111ab5')
+    def test_connectivity_bma2_snat(self):
+        self._test_connectivity_bma2_snat()
+
+    @decorators.idempotent_id('c2811a5b-cf2b-48c4-a33f-c844855d89be')
+    def test_connectivity_bmb2_snat(self):
+        self._test_connectivity_bmb2_snat()