Add LB connectivity tests in mt hybrid scenario

Related-Prod: PRODX-51689
Change-Id: I43d4aee780a3c3d387a5a4ed24e4b7b58c34c22d
(cherry picked from commit b895d24f27f38e5495625b9109a38358e0dc73e1)
diff --git a/ironic_tempest_plugin/common/waiters.py b/ironic_tempest_plugin/common/waiters.py
index 673e646..d80ba18 100644
--- a/ironic_tempest_plugin/common/waiters.py
+++ b/ironic_tempest_plugin/common/waiters.py
@@ -12,6 +12,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import time
+
 from oslo_log import log
 from tempest import config
 from tempest.lib.common.utils import test_utils
@@ -194,3 +196,64 @@
                % {'node_id': node_id, 'timeout': timeout,
                   'field': field, 'value': value})
         raise lib_exc.TimeoutException(msg)
+
+
+def wait_for_deleted_status_or_not_found(
+        show_client, id, status_key, check_interval, check_timeout,
+        root_tag=None, **kwargs):
+    """Waits for an object to reach a DELETED status or be not found (404).
+
+    :param show_client: The tempest service client show method.
+                        Ex. cls.os_primary.servers_client.show_server
+    :param id: The id of the object to query.
+    :param status_key: The key of the status field in the response.
+                       Ex. provisioning_status
+    :param check_interval: How often to check the status, in seconds.
+    :param check_timeout: The maximum time, in seconds, to check the status.
+    :param root_tag: The root tag on the response to remove, if any.
+    :raises CommandFailed: Raised if the object goes into ERROR and ERROR was
+                           not the desired status.
+    :raises TimeoutException: The object did not achieve the status or ERROR in
+                              the check_timeout period.
+    :returns: None
+    """
+    start = int(time.time())
+    LOG.info(
+        "Waiting for %s status to update to DELETED or be not found (404)",
+        show_client.__name__,
+    )
+    while True:
+        try:
+            response = show_client(id, **kwargs)
+        except lib_exc.NotFound:
+            LOG.info("Object with ID %s is not found.", id)
+            return
+
+        if root_tag:
+            object_details = response[root_tag]
+        else:
+            object_details = response
+
+        if object_details[status_key] == 'DELETED':
+            LOG.info(
+                "%s's status updated to DELETED.",
+                show_client.__name__,
+            )
+            return
+        if int(time.time()) - start >= check_timeout:
+            message = (
+                '{name} {field} failed to update to DELETED or become not '
+                'found (404) within the required time {timeout}. Current '
+                'status of {name}: {status}'.format(
+                    name=show_client.__name__,
+                    timeout=check_timeout,
+                    status=object_details[status_key],
+                    field=status_key
+                ))
+            caller = test_utils.find_test_caller()
+            if caller:
+                message = '({caller}) {message}'.format(caller=caller,
+                                                        message=message)
+            raise lib_exc.TimeoutException(message)
+
+        time.sleep(check_interval)
diff --git a/ironic_tempest_plugin/tests/scenario/baremetal_manager.py b/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
index e8fc064..54ad41d 100644
--- a/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
+++ b/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
@@ -14,6 +14,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import socket
 import time
 
 from oslo_log import log as logging
@@ -246,6 +247,45 @@
         res = test_utils.call_until_true(ping_remote, timeout, 1)
         self.assertTrue(res)
 
+    def verify_l4_connectivity(self, destination_ip=None, port=None,
+                               conn_expected=True, timeout=15):
+        """Verify L4 connectivity to the pool member through the load balancer.
+
+        Connect to destination_ip:port (LB VIP) and read the
+        first bytes from the connection. The pool member listens on port 22
+        (SSH), so the member sends an SSH banner (e.g. "SSH-2.0-...")
+        """
+        SSH_BANNER_PREFIX = b'SSH-2.0'
+
+        def probe_through_lb():
+            sock = None
+            try:
+                LOG.debug(
+                    "Connecting to %s:%s to verify path through LB to member",
+                    destination_ip, port
+                )
+                sock = socket.create_connection(
+                    (destination_ip, port), timeout=5)
+                sock.settimeout(5)
+                data = sock.recv(256)
+                return SSH_BANNER_PREFIX in data
+            except (socket.timeout, ConnectionRefusedError, OSError) as e:
+                LOG.debug(
+                    "Error connecting to LB or reading from member: %s", e
+                )
+                return False
+            finally:
+                if sock is not None:
+                    sock.close()
+
+        res = test_utils.call_until_true(probe_through_lb, timeout, 1)
+        self.assertEqual(
+            conn_expected,
+            res,
+            f"Connect to {destination_ip}: {port} and receive SSH banner "
+            f"from member through LB expected {conn_expected}",
+        )
+
     def boot_instance(self, clients=None, keypair=None,
                       net_id=None, fixed_ip=None, **create_kwargs):
         if clients is None:
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 3bdcc97..70043f4 100644
--- a/ironic_tempest_plugin/tests/scenario/test_baremetal_multitenancy_hybrid.py
+++ b/ironic_tempest_plugin/tests/scenario/test_baremetal_multitenancy_hybrid.py
@@ -13,6 +13,8 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+import time
+
 import netaddr
 from oslo_log import log as logging
 from tempest.api.network import base
@@ -22,12 +24,17 @@
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
 
+from ironic_tempest_plugin.common import waiters as ironic_waiters
 from ironic_tempest_plugin.tests.scenario import baremetal_manager
 
 LOG = logging.getLogger(__name__)
 CONF = config.CONF
 
+LB_WAIT_INTERVAL = 5
+LB_WAIT_TIMEOUT = 120
+
 
 class BaremetalMultitenancyHybridBase(
         baremetal_manager.BaremetalScenarioTest,
@@ -36,16 +43,17 @@
 
     ---- fip network -----
                        |
-                     ( r1 ) ------- netB --------
-                       |              |       |
-    --------- netA ------------    (vmB1)   (vmB2)
-            |        |      |       fipB1
-          (bmA)    (vmA1) (vmA2)
-         fipbmA    fipA1
+                     ( r1 ) ------- netB ----------------
+                       |              |       |       |
+    --------- netA ------------    (vmB1)   (vmB2)  (lbB)
+     |       |        |      |       fipB1
+   (lbA)   (bmA1)   (vmA1) (vmA2)
+          fipbmA1   fipA1
 
     * Test can ping fips fipbmA, fipA1, fipB1
     * Test each VM can reach other VMs via FIPs
     * Test each VM can reach other VMs via private IPs
+    * Test connectivity through lbA/lbB to different backends
     """
 
     credentials = ['primary', 'admin', 'system_admin']
@@ -93,6 +101,15 @@
         cls.keypairs_client = cls.os_admin.keypairs_client
         cls.servers_client = cls.os_admin.servers_client
         cls.floating_ips_client = cls.os_admin.compute_floating_ips_client
+        cls.security_groups_client = cls.os_admin.security_groups_client
+        cls.security_group_rules_client = (
+            cls.os_admin.security_group_rules_client)
+        cls.loadbalancers_client = (
+            cls.os_admin.load_balancer_v2.LoadbalancerClient()
+        )
+        cls.listeners_client = cls.os_admin.load_balancer_v2.ListenerClient()
+        cls.pools_client = cls.os_admin.load_balancer_v2.PoolClient()
+        cls.members_client = cls.os_admin.load_balancer_v2.MemberClient()
 
     @classmethod
     def _delete_keypair(cls, keypair_name, **params):
@@ -137,7 +154,8 @@
             key_name=key_name,
             flavor=flavor,
             wait_until=wait_until,
-            name=name)
+            name=name,
+            security_groups=[{'name': cls.security_group['name']}])
 
         cls.addClassCleanup(test_utils.call_and_ignore_notfound_exc,
                             waiters.wait_for_server_termination,
@@ -166,13 +184,120 @@
         return floating_ip
 
     @classmethod
+    def wait_for_loadbalancer_status(
+        cls,
+        lb_id,
+        expected_status="ACTIVE",
+        interval=LB_WAIT_INTERVAL,
+        timeout=LB_WAIT_TIMEOUT
+    ):
+        start = int(time.time())
+        LOG.info(
+            "Waiting for load balancer %s to reach %s status",
+            lb_id,
+            expected_status,
+        )
+
+        while True:
+            try:
+                lb = cls.loadbalancers_client.show_loadbalancer(lb_id)
+            except lib_exc.NotFound:
+                if expected_status.upper() == "DELETED":
+                    LOG.info("Load balancer %s successfully deleted.", lb_id)
+                    return
+                time.sleep(interval)
+                continue
+
+            lb_status = lb['provisioning_status'].upper()
+
+            if lb_status == expected_status.upper():
+                LOG.info(
+                    "Load balancer %s reached desired status: %s",
+                    lb_id,
+                    expected_status,
+                )
+                return lb
+
+            if lb_status == "ERROR":
+                caller = test_utils.find_test_caller()
+                msg = (
+                    f"Load balancer {lb_id} entered ERROR provisioning status"
+                )
+                if caller:
+                    msg = f"({caller}) {msg}"
+                raise lib_exc.UnexpectedResponseCode(msg)
+
+            if int(time.time()) - start >= timeout:
+                caller = test_utils.find_test_caller()
+                msg = (
+                    f"Load balancer {lb_id} failed to reach "
+                    f"{expected_status} status within {timeout}s. "
+                    f"Current status: {lb_status}"
+                )
+                if caller:
+                    msg = f"({caller}) {msg}"
+                raise lib_exc.TimeoutException(msg)
+
+            time.sleep(interval)
+
+    @classmethod
+    def _cleanup_loadbalancer(cls, lb_id):
+        cls.loadbalancers_client.delete_loadbalancer(lb_id, cascade=True)
+        ironic_waiters.wait_for_deleted_status_or_not_found(
+            cls.loadbalancers_client.show_loadbalancer,
+            lb_id,
+            'provisioning_status',
+            LB_WAIT_INTERVAL,
+            LB_WAIT_TIMEOUT
+        )
+
+    def cleanup_lb_obj(self, lb_id, delete_func, delete_args, show_func,
+                       obj_id, show_kwargs=None):
+        self.wait_for_loadbalancer_status(lb_id, "ACTIVE")
+        test_utils.call_and_ignore_notfound_exc(delete_func, *delete_args)
+        show_kwargs = show_kwargs or {}
+        ironic_waiters.wait_for_deleted_status_or_not_found(
+            show_func,
+            obj_id,
+            'provisioning_status',
+            LB_WAIT_INTERVAL,
+            LB_WAIT_TIMEOUT,
+            **show_kwargs
+        )
+        self.wait_for_loadbalancer_status(lb_id, "ACTIVE")
+
+    @classmethod
+    def create_loadbalancer(cls, subnet_id):
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__class__.__name__ + '-lb')
+        lb = cls.loadbalancers_client.create_loadbalancer(
+            name=name, vip_subnet_id=subnet_id)
+        cls.addClassCleanup(test_utils.call_and_ignore_notfound_exc,
+                            cls._cleanup_loadbalancer, lb['id'])
+        cls.wait_for_loadbalancer_status(lb["id"], "ACTIVE")
+        return lb
+
+    @classmethod
+    def attach_fip_to_lb(cls, lb):
+        vip_port_id = lb['vip_port_id']
+        floating_ip = cls.os_admin.floating_ips_client.create_floatingip(
+            floating_network_id=cls.ext_net_id,
+            port_id=vip_port_id,
+        )['floatingip']
+        cls.addClassCleanup(test_utils.call_and_ignore_notfound_exc,
+                            cls.os_admin.floating_ips_client.delete_floatingip,
+                            floating_ip['id'])
+        return floating_ip["floating_ip_address"]
+
+    @classmethod
     def resource_setup(cls):
         netA_cidr = netaddr.IPNetwork("192.168.10.0/24")
         netB_cidr = netaddr.IPNetwork("192.168.11.0/24")
         cls.ext_net_id = CONF.network.public_network_id
         vm_flavor = CONF.baremetal.vm_flavor_id
         cls.ping_timeout = 60
-        netA_kwargs = {"port_security_enabled": False}
+        netA_kwargs = {"port_security_enabled": True}
         if cls.netA_type:
             netA_kwargs["provider:network_type"] = cls.netA_type
 
@@ -187,7 +312,7 @@
             cls.routers_client.remove_router_interface,
             cls.r1['id'], subnet_id=cls.subnetA['id'])
 
-        netB_kwargs = {"port_security_enabled": False}
+        netB_kwargs = {"port_security_enabled": True}
         if cls.netB_type:
             netB_kwargs["provider:network_type"] = cls.netB_type
         cls.netB = cls.create_network(**netB_kwargs)
@@ -203,6 +328,32 @@
         cls.snat_check_ip = (cls.r1["external_gateway_info"]
                                    ["external_fixed_ips"][0]["ip_address"])
 
+        sg_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__class__.__name__ + '-sg')
+        cls.security_group = cls.security_groups_client.create_security_group(
+            name=sg_name
+        )['security_group']
+        cls.addClassCleanup(test_utils.call_and_ignore_notfound_exc,
+                            cls.security_groups_client.delete_security_group,
+                            cls.security_group['id'])
+
+        cls.security_group_rules_client.create_security_group_rule(
+            security_group_id=cls.security_group['id'],
+            direction='ingress',
+            remote_ip_prefix="0.0.0.0/0",
+            protocol='icmp',
+        )
+
+        cls.security_group_rules_client.create_security_group_rule(
+            security_group_id=cls.security_group['id'],
+            direction='ingress',
+            remote_ip_prefix="0.0.0.0/0",
+            protocol='tcp',
+            port_range_min=22,
+            port_range_max=22,
+        )
+
         cls.bmA1, cls.bmA1_ip, cls.bmA1_fip = cls.create_server(
             key_name=cls.keypair['name'],
             flavor=None,
@@ -242,6 +393,70 @@
             cls.vmB1_fip,
             private_key=cls.keypair['private_key'])
 
+        # Create load balancers
+        cls.lbA = cls.create_loadbalancer(cls.subnetA['id'])
+        cls.lbA_fip = cls.attach_fip_to_lb(cls.lbA)
+        cls.lbB = cls.create_loadbalancer(cls.subnetB['id'])
+        cls.lbB_fip = cls.attach_fip_to_lb(cls.lbB)
+
+    def _create_listener_and_pool(
+        self,
+        lb_id,
+        member_ip,
+        member_subnet_id,
+        listener_port,
+    ):
+        pool_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-pool')
+        pool = self.pools_client.create_pool(
+            name=pool_name,
+            lb_algorithm='ROUND_ROBIN',
+            protocol='TCP',
+            loadbalancer_id=lb_id)
+        self.addCleanup(
+            self.cleanup_lb_obj,
+            lb_id,
+            self.pools_client.delete_pool,
+            (pool['id'],),
+            self.pools_client.show_pool,
+            pool['id'])
+        self.wait_for_loadbalancer_status(lb_id, "ACTIVE")
+
+        member = self.members_client.create_member(
+            pool_id=pool['id'],
+            address=member_ip,
+            protocol_port=22,
+            subnet_id=member_subnet_id)
+        self.addCleanup(
+            self.cleanup_lb_obj,
+            lb_id,
+            self.members_client.delete_member,
+            (member['id'], pool['id']),
+            self.members_client.show_member,
+            member['id'],
+            {'pool_id': pool['id']})
+        self.wait_for_loadbalancer_status(lb_id, "ACTIVE")
+
+        listener_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-listener')
+        listener = self.listeners_client.create_listener(
+            name=listener_name,
+            loadbalancer_id=lb_id,
+            protocol='TCP',
+            protocol_port=listener_port,
+            default_pool_id=pool['id'])
+        self.addCleanup(
+            self.cleanup_lb_obj,
+            lb_id,
+            self.listeners_client.delete_listener,
+            (listener['id'],),
+            self.listeners_client.show_listener,
+            listener['id']
+        )
+        self.wait_for_loadbalancer_status(lb_id, "ACTIVE")
+
     def _test_connectivity_fip_vma1(self):
         self.assertTrue(
             self.ping_ip_address(
@@ -326,6 +541,246 @@
             self.snat_check_ip, conn_expected=True, timeout=self.ping_timeout,
             jump_host_ip=self.vmB1_fip)
 
+    def _test_connectivity_lbA_to_bmA1(self):
+        listener_port = 2201
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmA1_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_bmA1_fip(self):
+        listener_port = 2202
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmA1_fip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_vmA1(self):
+        listener_port = 2203
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.vmA1_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_vmA1_fip(self):
+        listener_port = 2204
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.vmA1_fip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_vmA2(self):
+        listener_port = 2205
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.vmA2_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_vmB1(self):
+        listener_port = 2206
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.vmB1_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_vmB1_fip(self):
+        listener_port = 2207
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.vmB1_fip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_vmB2(self):
+        listener_port = 2208
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.vmB2_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmA1(self):
+        listener_port = 2201
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmA1_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmA1_fip(self):
+        listener_port = 2202
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmA1_fip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_vmA1(self):
+        listener_port = 2203
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.vmA1_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_vmA1_fip(self):
+        listener_port = 2204
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.vmA1_fip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_vmA2(self):
+        listener_port = 2205
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.vmA2_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_vmB1(self):
+        listener_port = 2206
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.vmB1_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_vmB1_fip(self):
+        listener_port = 2207
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.vmB1_fip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_vmB2(self):
+        listener_port = 2208
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.vmB2_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
 
 class BaremetalMultitenancyHybridGeneveGeneve(
         BaremetalMultitenancyHybridBase):
@@ -397,6 +852,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('c6ddf5f8-60d2-4ec1-84a3-9471b7f26b3b')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('fa3c2bcb-03f1-4c71-9ef5-3a9f67f747ff')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('4ef0d4ff-b6d4-4b77-bcae-bf28cc546ba6')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('16572a41-f0d1-43f7-850a-0fdd2f4cce13')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('f245b178-471f-47c3-a721-0c8eeb445177')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('0a58a1b6-57a0-4d36-a46e-62d5ea6a2b3c')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('f7407c0a-9c2b-4cf2-8e53-57f40cbba9b6')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('2b84b6b7-b593-4450-851c-8d69db5e9f44')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('0c9e10f1-4e42-46e0-b8bb-5b9e928b0532')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('305c58a0-14bb-4e8f-b022-0978d3187c27')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('19e4c72a-5d4e-4e5a-a17d-9339c318f6a2')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('44a3875b-732c-4b35-8b2d-bd5b6f9324df')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('816b0894-5883-47fc-91a6-87fef78a88af')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('df22f6b6-6d31-45b6-9d01-d5bcb6472702')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('67d6e973-89f0-472d-a2b3-66fc8d64dca8')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('f39cfd83-cb87-4d36-a3c5-6d681f14efac')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridVxlanVxlan(
         BaremetalMultitenancyHybridBase):
@@ -468,6 +987,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('b2d1444d-1b92-4da3-91af-35c0b2149e9c')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('e2e1d2ed-13b8-45d5-bcbb-f09ff3f2ff4c')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('77db61a0-9a49-4653-9dcb-8a12bfa04649')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('fdd8d98f-b244-4a5a-808f-9b85a54e5db3')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('4bba2101-1de6-4b90-9c14-3990a197f254')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('05e23248-6a42-4a45-b329-1620bb3d3674')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('52a7d061-2e39-478a-b5d4-18fa6dff453d')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('4a4ce46b-3334-4e80-b63e-29b7b7a6f7c9')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('f6a06e1d-87ed-4f70-917a-49f9c7d8d5a5')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('f236f403-ec5c-4d59-8c62-0c216d52f409')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('a6c0f9cf-8b65-46b3-b7c1-7ea4a9ecda7f')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('5bcf7c1e-7c8d-4de0-bc92-1a426b067282')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('bc3647a5-3f7f-463b-9d5a-9dd83d7fc02e')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('02ddca1f-6ff6-49b5-92cd-44714a6190a1')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('2fb0989f-1d93-46b2-bdbe-1aefb6d3c0f1')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('9f6d3a9c-b2fc-4d2c-8c82-7f79aa5360b1')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridVlanVlan(
         BaremetalMultitenancyHybridBase):
@@ -539,6 +1122,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('98d035a8-027f-4dfe-8f2f-75a27c31324f')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('5125ea04-2352-407f-ac4a-dc6713e4ee74')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('3448ac17-d428-4086-980f-293bba35e79b')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('e36b17d5-acab-485a-8a41-d028062c7e73')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('f369fdda-bd91-4948-84c4-071cb0b2d821')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('8a157a46-7db2-4733-ae68-5ac1eeda3e6d')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('df2e1508-de1b-43a9-8853-4cff500de035')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('e91473bf-fc1a-4e04-acaf-b556591fdc46')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('25a738b8-fe92-46d7-9c26-085678685f7f')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('0c30b479-cdd3-4a6c-ab04-e17c6d272cb2')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('c07ea54d-50ec-4818-96de-b92697032d4f')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('b3777955-a25a-43e4-82dd-36ea82245c33')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('4dae2535-9918-4dee-86fe-3ba1353241b0')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('0018551c-99ad-4fce-8085-5367e2e7397b')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('0018551c-99ad-4fce-8085-5367e2e7397b')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('a5441070-9796-4816-83a2-7b8ea25bbd13')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridVlanGeneve(
         BaremetalMultitenancyHybridBase):
@@ -610,6 +1257,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('e7312dc7-26a4-4a03-b8d2-56b53f263b58')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('2a46c3be-f4fc-4900-8790-ea014365d107')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('0f27b6f7-e4d7-4aaf-8d67-dcccfef1f9a6')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('f3943a5e-1b69-4ff4-b40a-ec3e77d2559a')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('0a6fc1ef-49fc-499d-9eb5-1992d07a0aa1')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('dfdc70e0-b2b3-4864-b21d-55c109bc186d')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('27b5bb73-2ec3-4c5c-8965-c39a82c2c29a')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('46343127-9b53-471a-bb95-80d758d9babe')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('8c0be7b3-0a27-4c0c-bb32-4b6c0f6b0641')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('a2695bbf-0c93-4f0f-82a2-049a21a0ff1c')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('445ec6f8-5897-44e2-9d4f-5fa567362e1f')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('1a6b92d6-8b02-4da0-9ebd-e041f30433b4')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('8f20d302-9141-49d8-931a-54b26e200c83')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('d841fb39-6711-497c-85a7-4a0a7a42f6ad')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('6d41c139-145d-4cd4-a3c0-3790d13c739a')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('db01f1a8-7c16-4b45-bf8c-3cd62a7c8d0e')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridGeneveVlan(
         BaremetalMultitenancyHybridBase):
@@ -681,6 +1392,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('2c58913e-65b6-43dc-b760-6923ad228f5a')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('e5ff8265-35b5-4574-8f61-d5a114217b95')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('71c29953-3e36-4b4b-b1d4-5e96080f2855')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('d7a2847b-31de-4050-8985-0d7f7507c4fc')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('41a4f7c9-c9f1-41ab-b1cf-f9f8a41406a7')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('c2f35131-6e24-4d6c-ae3a-2d790aa1eb01')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('6e84cf2f-c364-4922-85e6-7e635428a6f2')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('04143ef0-d865-4c07-9c16-4d6941fc6286')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('1688de2c-1f67-496b-8be6-96dbdff203d3')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('a773b9ef-9c5c-49be-81c7-6df9eec3b9ed')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('38a5dc36-0d84-4a0d-94f3-f8ebdb8dfcb3')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('1e9dff34-1f89-45c2-9aef-11660b4b99f1')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('7eb2f235-34aa-4af4-b5dc-c9fa00ae3db0')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('ec7fbb63-4c26-4f65-b3bb-5e19db7f497d')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('b5b0f379-3393-4216-83c0-b2279da1f373')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('a3a25913-8bc0-4537-b6b5-0e205f93b052')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridGeneveVxlan(
         BaremetalMultitenancyHybridBase):
@@ -752,6 +1527,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('ce86700a-fbed-4cfb-b2d7-b45e984f26b5')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('6bf5e717-5208-4c4b-ac75-7eab5f092f34')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('e37de781-3fcb-4b64-8317-47502f71ba2e')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('070cf827-028e-4d93-8964-6bf1104d2d04')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('826cd2f6-6fed-4920-99a6-eab1c439b015')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('cd4e30bb-3024-418a-bf1d-d7ac459a20c6')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('51b4f544-81cd-49c3-9c20-6150ee3706a2')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('90b30f6d-8bb3-4b83-97cf-83f339c75545')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('fa6ab8e5-b52a-463d-807a-0dfc0fe6a80b')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('ea1d03d5-5393-41a1-94f0-5f79e33b38a4')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('6da7f19c-13f5-40a6-92a0-f849c3dd1f32')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('f9b7cb73-5287-4313-bccf-dbe054d01f3f')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('31e00e9c-f472-401b-9ac2-51b2f92b1a3f')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('2b2a8355-348c-41b1-a335-91bbdb9f12f6')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('49f60c3f-8b67-4de5-83b6-b3a4f4e1bbd6')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('0e9cb5fc-b17f-4a36-b4be-b0e0cc7f1128')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridVxlanGeneve(
         BaremetalMultitenancyHybridBase):
@@ -823,6 +1662,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('d9aeffed-c5dd-4dd8-b210-440db06747db')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('9f417045-85ce-4225-a5c0-4c645c0d9688')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('fb5011ff-a09a-40ab-97c1-338b71ab8dcb')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('62fb2597-4095-4b66-8d1f-e98d314a0dfc')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('16407d7c-c943-48ed-8160-38c62fa87594')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('50b23561-aa1f-4671-8078-9cceb547d813')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('5d38b022-2290-4ca4-9883-b36d8ec24807')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('463f9859-41b9-4f2c-94d0-61639978df7d')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('97f490f6-44ed-44e9-9640-c6090108f179')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('44b14440-91c6-4fe5-81cd-bb19015637d4')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('fe4e7b4d-774c-4950-bd42-e755ff4294f8')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('ba91a18d-8a45-4f18-8c4f-6ac3290e36c0')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('9db32019-7f8a-4e92-8c9f-cd6fe447eb12')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('289c77a0-5c6b-4f34-ae3b-d3f3345e13c5')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('82d238c1-5d9f-4b3f-8417-05a7a9e26e7b')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('28a1620c-89d9-4de1-9ac0-174f4e00fbf4')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridVxlanVlan(
         BaremetalMultitenancyHybridBase):
@@ -894,6 +1797,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('d962e877-0e28-44b4-a0e8-d6f77433d609')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('6588092a-1edf-49b7-95aa-8045d0f527b4')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('29633360-b0d5-48e4-8c59-8a20be7af30d')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('a612512b-7947-484c-a009-7c579292b0bb')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('876914b2-da75-4481-a7d0-d2fd013e5777')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('917f28a9-56d3-48f8-a679-f39d51d69918')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('e63d46d4-8903-4b38-b56b-dc0ea73f2b92')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('1476f8da-e9fb-4ba6-9a3f-e94cbda154de')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('de2b29d1-4a7f-4f07-83a1-c4496ad012e6')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('080b18c6-bc80-4cbb-bd49-fc2ebc42e77a')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('c06be401-d79a-47cb-8ec0-9d905ec35327')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('29986f26-5c8a-41f8-8a42-12b16cf05742')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('8ed6eac4-1f31-44c1-b51c-59312b5e0d61')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('8d4af63b-2fbc-4ad3-9e9e-d14441494021')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('ec1a7e6a-d994-40a0-b74e-e74c72099b3f')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('f99be086-f4d4-4599-bccc-39f0a74f8f9e')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridVlanVxlan(
         BaremetalMultitenancyHybridBase):
@@ -965,6 +1932,70 @@
     def test_connectivity_vmb2_snat(self):
         self._test_connectivity_vmb2_snat()
 
+    @decorators.idempotent_id('1425312c-6e23-4b23-a90e-6d12bb0aaed5')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('184ecd60-69ad-4703-837d-60bb55e64b7f')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('ad4274dd-a0be-4358-b240-1f1518a901b0')
+    def test_connectivity_lbA_to_vmA1(self):
+        self._test_connectivity_lbA_to_vmA1()
+
+    @decorators.idempotent_id('a9fa2c83-6930-433b-b213-5e4871d7305c')
+    def test_connectivity_lbA_to_vmA1_fip(self):
+        self._test_connectivity_lbA_to_vmA1_fip()
+
+    @decorators.idempotent_id('e74e90b7-4274-46c8-829d-c1c8e9c17da0')
+    def test_connectivity_lbA_to_vmA2(self):
+        self._test_connectivity_lbA_to_vmA2()
+
+    @decorators.idempotent_id('fa2afb68-4d35-49b6-a67f-17df3d0098c3')
+    def test_connectivity_lbA_to_vmB1(self):
+        self._test_connectivity_lbA_to_vmB1()
+
+    @decorators.idempotent_id('9bef2e6e-dc7e-4c8b-834e-f0a143b07501')
+    def test_connectivity_lbA_to_vmB1_fip(self):
+        self._test_connectivity_lbA_to_vmB1_fip()
+
+    @decorators.idempotent_id('01aa395d-52ad-4066-8289-43cdafcc5565')
+    def test_connectivity_lbA_to_vmB2(self):
+        self._test_connectivity_lbA_to_vmB2()
+
+    @decorators.idempotent_id('aed60289-92fa-4b59-82f2-f0f9b63e6273')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('c7662247-69e3-4da9-8063-12ffb6f5edfb')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('c7b22259-73ef-444d-8a05-0f78a5467fb8')
+    def test_connectivity_lbB_to_vmA1(self):
+        self._test_connectivity_lbB_to_vmA1()
+
+    @decorators.idempotent_id('cae3abb6-d173-43e7-9bcc-dfd51be53209')
+    def test_connectivity_lbB_to_vmA1_fip(self):
+        self._test_connectivity_lbB_to_vmA1_fip()
+
+    @decorators.idempotent_id('b564fc90-a61a-4886-a584-658dfd2d5a0b')
+    def test_connectivity_lbB_to_vmA2(self):
+        self._test_connectivity_lbB_to_vmA2()
+
+    @decorators.idempotent_id('f7faf19f-89df-4e19-9885-32d2ecb2c9a7')
+    def test_connectivity_lbB_to_vmB1(self):
+        self._test_connectivity_lbB_to_vmB1()
+
+    @decorators.idempotent_id('0c829a96-6370-4dc4-9c64-1c21bd455965')
+    def test_connectivity_lbB_to_vmB1_fip(self):
+        self._test_connectivity_lbB_to_vmB1_fip()
+
+    @decorators.idempotent_id('1fa1a576-c7b7-461c-be91-cc242eedbb0e')
+    def test_connectivity_lbB_to_vmB2(self):
+        self._test_connectivity_lbB_to_vmB2()
+
 
 class BaremetalMultitenancyHybridBaseBM(
         BaremetalMultitenancyHybridBase):
@@ -972,11 +2003,11 @@
 
     ---- fip network -----
                        |
-                     ( r1 ) ------- netB --------
-                       |              |       |
-    --------- netA ------------    (bmB1)   (bmB2)
-            |        |              fipbmB1
-          (bmA1)   (bmA2)
+                     ( r1 ) ------- netB --------------
+                       |              |       |       |
+    --------- netA ------------    (bmB1)   (bmB2)   (lbB)
+     |      |        |              fipbmB1
+   (lbA)  (bmA1)   (bmA2)
          fipbmA1
 
     * Test can ping fips fipbmA, fipA1, fipB1
@@ -1000,7 +2031,7 @@
         netB_cidr = netaddr.IPNetwork("192.168.11.0/24")
         cls.ext_net_id = CONF.network.public_network_id
         cls.ping_timeout = 60
-        netA_kwargs = {"port_security_enabled": False}
+        netA_kwargs = {"port_security_enabled": True}
         if cls.netA_type:
             netA_kwargs["provider:network_type"] = cls.netA_type
 
@@ -1015,7 +2046,7 @@
             cls.routers_client.remove_router_interface,
             cls.r1['id'], subnet_id=cls.subnetA['id'])
 
-        netB_kwargs = {"port_security_enabled": False}
+        netB_kwargs = {"port_security_enabled": True}
         if cls.netB_type:
             netB_kwargs["provider:network_type"] = cls.netB_type
         cls.netB = cls.create_network(**netB_kwargs)
@@ -1031,6 +2062,32 @@
         cls.snat_check_ip = (cls.r1["external_gateway_info"]
                                    ["external_fixed_ips"][0]["ip_address"])
 
+        sg_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__class__.__name__ + '-sg')
+        cls.security_group = cls.security_groups_client.create_security_group(
+            name=sg_name
+        )['security_group']
+        cls.addClassCleanup(test_utils.call_and_ignore_notfound_exc,
+                            cls.security_groups_client.delete_security_group,
+                            cls.security_group['id'])
+
+        cls.security_group_rules_client.create_security_group_rule(
+            security_group_id=cls.security_group['id'],
+            direction='ingress',
+            remote_ip_prefix="0.0.0.0/0",
+            protocol='icmp',
+        )
+
+        cls.security_group_rules_client.create_security_group_rule(
+            security_group_id=cls.security_group['id'],
+            direction='ingress',
+            remote_ip_prefix="0.0.0.0/0",
+            protocol='tcp',
+            port_range_min=22,
+            port_range_max=22,
+        )
+
         cls.bmA1, cls.bmA1_ip, cls.bmA1_fip = cls.create_server(
             key_name=cls.keypair['name'],
             flavor=None,
@@ -1064,6 +2121,12 @@
             cls.bmB2_fip,
             private_key=cls.keypair['private_key'])
 
+        # Create load balancers
+        cls.lbA = cls.create_loadbalancer(cls.subnetA['id'])
+        cls.lbA_fip = cls.attach_fip_to_lb(cls.lbA)
+        cls.lbB = cls.create_loadbalancer(cls.subnetB['id'])
+        cls.lbB_fip = cls.attach_fip_to_lb(cls.lbB)
+
     def _test_connectivity_fip_bma1(self):
         self.assertTrue(
             self.ping_ip_address(
@@ -1108,6 +2171,186 @@
             self.snat_check_ip, conn_expected=True, timeout=self.ping_timeout,
             jump_host_ip=self.bmB1_fip)
 
+    def _test_connectivity_lbA_to_bmA1(self):
+        listener_port = 2201
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmA1_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_bmA1_fip(self):
+        listener_port = 2202
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmA1_fip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_bmA2(self):
+        listener_port = 2203
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmA2_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_bmB1(self):
+        listener_port = 2204
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmB1_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_bmB1_fip(self):
+        listener_port = 2205
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmB1_fip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbA_to_bmB2(self):
+        listener_port = 2206
+        self._create_listener_and_pool(
+            self.lbA['id'],
+            self.bmB2_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbA_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmA1(self):
+        listener_port = 2201
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmA1_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmA1_fip(self):
+        listener_port = 2202
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmA1_fip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmA2(self):
+        listener_port = 2203
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmA2_ip,
+            self.subnetA['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmB1(self):
+        listener_port = 2204
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmB1_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmB1_fip(self):
+        listener_port = 2205
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmB1_fip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
+    def _test_connectivity_lbB_to_bmB2(self):
+        listener_port = 2206
+        self._create_listener_and_pool(
+            self.lbB['id'],
+            self.bmB2_ip,
+            self.subnetB['id'],
+            listener_port
+        )
+        self.verify_l4_connectivity(
+            destination_ip=self.lbB_fip,
+            port=listener_port,
+            conn_expected=True,
+            timeout=self.ping_timeout
+        )
+
 
 class BaremetalMultitenancyHybridBaseBMGeneveGeneve(
         BaremetalMultitenancyHybridBaseBM):
@@ -1147,6 +2390,54 @@
     def test_connectivity_bmb2_snat(self):
         self._test_connectivity_bmb2_snat()
 
+    @decorators.idempotent_id('07db19f1-4208-40ad-a985-6c43752f21b2')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('63c2bcf7-f32c-4628-9ac9-11cd2ff4c1c8')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('5d8b7c67-44d1-4b27-a20b-4e5d2c889c34')
+    def test_connectivity_lbA_to_bmA2(self):
+        self._test_connectivity_lbA_to_bmA2()
+
+    @decorators.idempotent_id('f6cf8f1f-0834-48e3-a4a0-8c2f0101dc8e')
+    def test_connectivity_lbA_to_bmB1(self):
+        self._test_connectivity_lbA_to_bmB1()
+
+    @decorators.idempotent_id('62e8a54f-62b2-43b3-8895-b2468e7e1925')
+    def test_connectivity_lbA_to_bmB1_fip(self):
+        self._test_connectivity_lbA_to_bmB1_fip()
+
+    @decorators.idempotent_id('26f0d62b-8ed6-4225-b94a-e64f0b21c986')
+    def test_connectivity_lbA_to_bmB2(self):
+        self._test_connectivity_lbA_to_bmB2()
+
+    @decorators.idempotent_id('2e4f23c5-0a91-4698-933d-1a0c46c87214')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('df2a0d1a-1486-4690-9245-6f90f7c18c60')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('c8c8f1ec-c76e-46a6-84ad-87c943622d52')
+    def test_connectivity_lbB_to_bmA2(self):
+        self._test_connectivity_lbB_to_bmA2()
+
+    @decorators.idempotent_id('60c62f0d-4065-47c9-a7e1-c1dce501c796')
+    def test_connectivity_lbB_to_bmB1(self):
+        self._test_connectivity_lbB_to_bmB1()
+
+    @decorators.idempotent_id('a9e02bb1-5682-42c5-bd9b-53ff9c8dbb0a')
+    def test_connectivity_lbB_to_bmB1_fip(self):
+        self._test_connectivity_lbB_to_bmB1_fip()
+
+    @decorators.idempotent_id('9b82a77f-5b77-44c1-9160-5244072b49f4')
+    def test_connectivity_lbB_to_bmB2(self):
+        self._test_connectivity_lbB_to_bmB2()
+
 
 class BaremetalMultitenancyHybridBaseBMVxlanVxlan(
         BaremetalMultitenancyHybridBaseBM):
@@ -1186,6 +2477,54 @@
     def test_connectivity_bmb2_snat(self):
         self._test_connectivity_bmb2_snat()
 
+    @decorators.idempotent_id('59f3dc3d-36a5-41a0-b44b-21d2790fc352')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('e0b7b09c-2ab1-42d4-b0d6-2b98eeb5f53d')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('1ef35ff7-82cb-4535-bd9d-45e5c14f39f3')
+    def test_connectivity_lbA_to_bmA2(self):
+        self._test_connectivity_lbA_to_bmA2()
+
+    @decorators.idempotent_id('4c2a0d9b-579a-4b20-b1c6-0ed97953d31b')
+    def test_connectivity_lbA_to_bmB1(self):
+        self._test_connectivity_lbA_to_bmB1()
+
+    @decorators.idempotent_id('ce5441bb-80fb-4e43-98db-f93e63ee2b89')
+    def test_connectivity_lbA_to_bmB1_fip(self):
+        self._test_connectivity_lbA_to_bmB1_fip()
+
+    @decorators.idempotent_id('38f15bb3-4cc0-42f6-9d3b-0cf8cb3641b1')
+    def test_connectivity_lbA_to_bmB2(self):
+        self._test_connectivity_lbA_to_bmB2()
+
+    @decorators.idempotent_id('da89439d-145c-468a-9020-17d78eddb21c')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('8ea5cf89-9042-45d4-8d72-fec4d63f2eb6')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('8d1584b7-839c-43c5-a048-7dbcb779c282')
+    def test_connectivity_lbB_to_bmA2(self):
+        self._test_connectivity_lbB_to_bmA2()
+
+    @decorators.idempotent_id('5f6a47f1-45bc-4480-b43e-2eb6f3172201')
+    def test_connectivity_lbB_to_bmB1(self):
+        self._test_connectivity_lbB_to_bmB1()
+
+    @decorators.idempotent_id('d8f21a6f-08a7-4789-86c3-690e76b205a0')
+    def test_connectivity_lbB_to_bmB1_fip(self):
+        self._test_connectivity_lbB_to_bmB1_fip()
+
+    @decorators.idempotent_id('7a5376cb-fd61-47b4-bd02-d7b1735f1fc2')
+    def test_connectivity_lbB_to_bmB2(self):
+        self._test_connectivity_lbB_to_bmB2()
+
 
 class BaremetalMultitenancyHybridBaseBMVlanVlan(
         BaremetalMultitenancyHybridBaseBM):
@@ -1225,6 +2564,54 @@
     def test_connectivity_bmb2_snat(self):
         self._test_connectivity_bmb2_snat()
 
+    @decorators.idempotent_id('d0e9f8a7-6f5e-4e4f-9a3f-4e5b6c7d8a9f')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('f2a1b0c9-8b7a-4a5b-1c5b-6a7d8e9f0c1b')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('e1f0a9b8-7a6f-4f5a-0b4a-5f6c7d8e9b0a')
+    def test_connectivity_lbA_to_bmA2(self):
+        self._test_connectivity_lbA_to_bmA2()
+
+    @decorators.idempotent_id('a3b2c1d0-9c8b-4b5c-2d6c-7b8e9f0a1d2c')
+    def test_connectivity_lbA_to_bmB1(self):
+        self._test_connectivity_lbA_to_bmB1()
+
+    @decorators.idempotent_id('94fab4f6-de97-4974-98b7-c6860d84d2b2')
+    def test_connectivity_lbA_to_bmB1_fip(self):
+        self._test_connectivity_lbA_to_bmB1_fip()
+
+    @decorators.idempotent_id('b4c3d2e1-0d9c-4c5d-3e7d-8c9f0a1b2e3d')
+    def test_connectivity_lbA_to_bmB2(self):
+        self._test_connectivity_lbA_to_bmB2()
+
+    @decorators.idempotent_id('c5d4e3f2-1e0d-4d5e-4f8e-9d0a1b2c3f4e')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('d6e5f4a3-2f1e-4e5f-5a9f-0e1b2c3d4a5f')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('e7f6a5b4-3a2f-4f6a-6b0a-1f2c3d4e5b6a')
+    def test_connectivity_lbB_to_bmA2(self):
+        self._test_connectivity_lbB_to_bmA2()
+
+    @decorators.idempotent_id('a9b8c7d6-5c4b-4b6c-8d2c-3b4e5f6a7d8c')
+    def test_connectivity_lbB_to_bmB1(self):
+        self._test_connectivity_lbB_to_bmB1()
+
+    @decorators.idempotent_id('f8a7b6c5-4b3a-4a6b-7c1b-2a3d4e5f6c7b')
+    def test_connectivity_lbB_to_bmB1_fip(self):
+        self._test_connectivity_lbB_to_bmB1_fip()
+
+    @decorators.idempotent_id('b0c9d8e7-6d5c-4c6d-9e3d-4c5f6a7b8e9d')
+    def test_connectivity_lbB_to_bmB2(self):
+        self._test_connectivity_lbB_to_bmB2()
+
 
 class BaremetalMultitenancyHybridBaseBMGeneveVLAN(
         BaremetalMultitenancyHybridBaseBM):
@@ -1264,6 +2651,54 @@
     def test_connectivity_bmb2_snat(self):
         self._test_connectivity_bmb2_snat()
 
+    @decorators.idempotent_id('a9f6f5b2-3f49-4c62-86d8-23d6d2cb57e1')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('c8f7f9d3-6a3b-49b2-9511-bf91e2d74caa')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('9d4f2f7c-2d4b-493a-8b2c-5e6f1f4c2f1b')
+    def test_connectivity_lbA_to_bmA2(self):
+        self._test_connectivity_lbA_to_bmA2()
+
+    @decorators.idempotent_id('0c5a3f4b-7b2e-4d2f-84d2-1f9c6e2a4d2f')
+    def test_connectivity_lbA_to_bmB1(self):
+        self._test_connectivity_lbA_to_bmB1()
+
+    @decorators.idempotent_id('e7b2c4f6-1d3e-44b5-9f1d-9c2b6a7f5d1c')
+    def test_connectivity_lbA_to_bmB1_fip(self):
+        self._test_connectivity_lbA_to_bmB1_fip()
+
+    @decorators.idempotent_id('b2f1c6a4-3e5b-4d2a-8c7b-1f6d2e7c5a3b')
+    def test_connectivity_lbA_to_bmB2(self):
+        self._test_connectivity_lbA_to_bmB2()
+
+    @decorators.idempotent_id('3c4f2e1a-7b5d-4c2e-9d3b-2f6c1e7d4a2b')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('5e7d1f2c-6b3a-4c5d-8e2f-1d7b2c3a4f5e')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('7f2c5b4d-8a3e-4d6f-9b1c-3d2e4f7b6a8c')
+    def test_connectivity_lbB_to_bmA2(self):
+        self._test_connectivity_lbB_to_bmA2()
+
+    @decorators.idempotent_id('1a3b7c5d-4e2f-4b6d-8c2f-5e1d7b3a4c6e')
+    def test_connectivity_lbB_to_bmB1(self):
+        self._test_connectivity_lbB_to_bmB1()
+
+    @decorators.idempotent_id('2b4c6d5e-3a1b-4f5c-9d2e-7f3a1b6c4d8e')
+    def test_connectivity_lbB_to_bmB1_fip(self):
+        self._test_connectivity_lbB_to_bmB1_fip()
+
+    @decorators.idempotent_id('3d5e7f6a-2c1b-4e3f-8b6d-9a4c2f5b7e1d')
+    def test_connectivity_lbB_to_bmB2(self):
+        self._test_connectivity_lbB_to_bmB2()
+
 
 class BaremetalMultitenancyHybridBaseBMGeneveVXLAN(
         BaremetalMultitenancyHybridBaseBM):
@@ -1302,3 +2737,51 @@
     @decorators.idempotent_id('c2811a5b-cf2b-48c4-a33f-c844855d89be')
     def test_connectivity_bmb2_snat(self):
         self._test_connectivity_bmb2_snat()
+
+    @decorators.idempotent_id('b6a7c8d9-5f3e-4a2d-9b8c-1e2f3d4c5a6b')
+    def test_connectivity_lbA_to_bmA1(self):
+        self._test_connectivity_lbA_to_bmA1()
+
+    @decorators.idempotent_id('c9d8e7f6-4a3b-2c1d-8e9f-0a1b2c3d4e5f')
+    def test_connectivity_lbA_to_bmA1_fip(self):
+        self._test_connectivity_lbA_to_bmA1_fip()
+
+    @decorators.idempotent_id('e7f6d5c4-3b2a-1c0d-9e8f-7d6c5b4a3f2e')
+    def test_connectivity_lbA_to_bmA2(self):
+        self._test_connectivity_lbA_to_bmA2()
+
+    @decorators.idempotent_id('f1e2d3c4-5b6a-7d8c-9e0f-1a2b3c4d5e6f')
+    def test_connectivity_lbA_to_bmB1(self):
+        self._test_connectivity_lbA_to_bmB1()
+
+    @decorators.idempotent_id('a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d')
+    def test_connectivity_lbA_to_bmB1_fip(self):
+        self._test_connectivity_lbA_to_bmB1_fip()
+
+    @decorators.idempotent_id('b1c2d3e4-5f6a-7b8c-9d0e-1f2a3b4c5d6e')
+    def test_connectivity_lbA_to_bmB2(self):
+        self._test_connectivity_lbA_to_bmB2()
+
+    @decorators.idempotent_id('c1d2e3f4-6a7b-8c9d-0e1f-2a3b4c5d6e7f')
+    def test_connectivity_lbB_to_bmA1(self):
+        self._test_connectivity_lbB_to_bmA1()
+
+    @decorators.idempotent_id('d1e2f3a4-7b8c-9d0e-1f2a-3b4c5d6e7f8a')
+    def test_connectivity_lbB_to_bmA1_fip(self):
+        self._test_connectivity_lbB_to_bmA1_fip()
+
+    @decorators.idempotent_id('e1f2a3b4-8c9d-0e1f-2a3b-4c5d6e7f8a9b')
+    def test_connectivity_lbB_to_bmA2(self):
+        self._test_connectivity_lbB_to_bmA2()
+
+    @decorators.idempotent_id('f2a3b4c5-9d0e-1f2a-3b4c-5d6e7f8a9b0c')
+    def test_connectivity_lbB_to_bmB1(self):
+        self._test_connectivity_lbB_to_bmB1()
+
+    @decorators.idempotent_id('a3b4c5d6-0e1f-2a3b-4c5d-6e7f8a9b0c1d')
+    def test_connectivity_lbB_to_bmB1_fip(self):
+        self._test_connectivity_lbB_to_bmB1_fip()
+
+    @decorators.idempotent_id('b3c4d5e6-1f2a-3b4c-5d6e-7f8a9b0c1d2e')
+    def test_connectivity_lbB_to_bmB2(self):
+        self._test_connectivity_lbB_to_bmB2()