Merge "negative cases for router interface"
diff --git a/neutron_tempest_plugin/api/test_ports.py b/neutron_tempest_plugin/api/test_ports.py
index 8867eee..c59ee83 100644
--- a/neutron_tempest_plugin/api/test_ports.py
+++ b/neutron_tempest_plugin/api/test_ports.py
@@ -136,28 +136,6 @@
         expected = [s['id'], s['id']]
         self.assertEqual(expected, subnets)
 
-    @decorators.idempotent_id('9700828d-86eb-4f21-9fa3-da487a2d77f2')
-    @utils.requires_ext(extension="uplink-status-propagation",
-                        service="network")
-    def test_create_port_with_propagate_uplink_status(self):
-        body = self.create_port(self.network, propagate_uplink_status=True)
-        self.assertTrue(body['propagate_uplink_status'])
-        body = self.client.list_ports(id=body['id'])['ports'][0]
-        self.assertTrue(body['propagate_uplink_status'])
-        body = self.client.show_port(body['id'])['port']
-        self.assertTrue(body['propagate_uplink_status'])
-
-    @decorators.idempotent_id('c396a880-0c7b-409d-a80b-800a3d09bdc4')
-    @utils.requires_ext(extension="uplink-status-propagation",
-                        service="network")
-    def test_create_port_without_propagate_uplink_status(self):
-        body = self.create_port(self.network)
-        self.assertFalse(body['propagate_uplink_status'])
-        body = self.client.list_ports(id=body['id'])['ports'][0]
-        self.assertFalse(body['propagate_uplink_status'])
-        body = self.client.show_port(body['id'])['port']
-        self.assertFalse(body['propagate_uplink_status'])
-
 
 class PortsSearchCriteriaTest(base.BaseSearchCriteriaTest):
 
diff --git a/neutron_tempest_plugin/api/test_security_groups.py b/neutron_tempest_plugin/api/test_security_groups.py
index dd1597c..afce414 100644
--- a/neutron_tempest_plugin/api/test_security_groups.py
+++ b/neutron_tempest_plugin/api/test_security_groups.py
@@ -538,3 +538,32 @@
         # make sure the rbac-policy is invisible to the tenant for which it's
         # being shared
         self.assertFalse(self.client.list_rbac_policies()['rbac_policies'])
+
+
+class SecGroupSearchCriteriaTest(base.BaseSearchCriteriaTest):
+
+    required_extensions = ['security-group']
+    resource = 'security-group'
+
+    @classmethod
+    def resource_setup(cls):
+        super(SecGroupSearchCriteriaTest, cls).resource_setup()
+        cls.security_group = cls.create_security_group()
+        for name in cls.resource_names:
+            cls.create_security_group(name=name)
+
+    @decorators.idempotent_id('0064aa80-8a29-442d-a8de-9101af8210fa')
+    def test_list_sorts_by_name_asc(self):
+        self._test_list_sorts_asc()
+
+    @decorators.idempotent_id('35e86832-53cd-4e63-97ec-31a2413da591')
+    def test_list_sorts_by_name_desc(self):
+        self._test_list_sorts_desc()
+
+    @decorators.idempotent_id('b9654cdc-80bc-43f8-844e-dfe88fd2f125')
+    def test_list_pagination(self):
+        self._test_list_pagination()
+
+    @decorators.idempotent_id('5c78bd57-e6e9-4e71-a05c-9c4082a3f139')
+    def test_list_no_pagination_limit_0(self):
+        self._test_list_no_pagination_limit_0()
diff --git a/neutron_tempest_plugin/neutron_dynamic_routing/api/test_bgp_speaker_extensions.py b/neutron_tempest_plugin/neutron_dynamic_routing/api/test_bgp_speaker_extensions.py
index 6720c22..5cdd524 100644
--- a/neutron_tempest_plugin/neutron_dynamic_routing/api/test_bgp_speaker_extensions.py
+++ b/neutron_tempest_plugin/neutron_dynamic_routing/api/test_bgp_speaker_extensions.py
@@ -26,29 +26,8 @@
 CONF = config.CONF
 
 
-def _setup_client_args(auth_provider):
-    """Set up ServiceClient arguments using config settings. """
-    service = CONF.network.catalog_type or 'network'
-    region = CONF.network.region or 'regionOne'
-    endpoint_type = CONF.network.endpoint_type
-    build_interval = CONF.network.build_interval
-    build_timeout = CONF.network.build_timeout
-
-    # The disable_ssl appears in identity
-    disable_ssl_certificate_validation = (
-        CONF.identity.disable_ssl_certificate_validation)
-    ca_certs = CONF.identity.ca_certificates_file
-
-    # Trace in debug section
-    trace_requests = CONF.debug.trace_requests
-
-    return [auth_provider, service, region, endpoint_type,
-            build_interval, build_timeout,
-            disable_ssl_certificate_validation, ca_certs,
-            trace_requests]
-
-
 class BgpSpeakerTestJSONBase(base.BaseAdminNetworkTest):
+    credentials = ['primary', 'admin']
 
     default_bgp_speaker_args = {'local_as': '1234',
                                 'ip_version': 4,
@@ -65,18 +44,20 @@
         super(BgpSpeakerTestJSONBase, self).setUp()
 
     @classmethod
-    def _setup_bgp_admin_client(cls):
-        mgr = cls.get_client_manager(credential_type='admin')
-        auth_provider = mgr.auth_provider
-        client_args = _setup_client_args(auth_provider)
-        cls.bgp_adm_client = bgp_client.BgpSpeakerClientJSON(*client_args)
+    def setup_clients(cls):
+        super(BgpSpeakerTestJSONBase, cls).setup_clients()
+        cls.bgp_client = cls.os_primary.bgp_client
+        cls.bgp_adm_client = cls.os_admin.bgp_client
 
     @classmethod
-    def _setup_bgp_non_admin_client(cls):
-        mgr = cls.get_client_manager()
-        auth_provider = mgr.auth_provider
-        client_args = _setup_client_args(auth_provider)
-        cls.bgp_client = bgp_client.BgpSpeakerClientJSON(*client_args)
+    def get_client_manager(cls, credential_type=None, roles=None,
+                           force_new=None):
+        manager = super(BgpSpeakerTestJSONBase, cls).get_client_manager(
+            credential_type=credential_type,
+            roles=roles,
+            force_new=force_new
+        )
+        return bgp_client.Manager(manager.credentials)
 
     @classmethod
     def resource_setup(cls):
@@ -89,8 +70,6 @@
         cls.admin_floatingips = []
         cls.admin_routers = []
         cls.ext_net_id = CONF.network.public_network_id
-        cls._setup_bgp_admin_client()
-        cls._setup_bgp_non_admin_client()
 
     @classmethod
     def resource_cleanup(cls):
diff --git a/neutron_tempest_plugin/scenario/base.py b/neutron_tempest_plugin/scenario/base.py
index 9223893..78b766b 100644
--- a/neutron_tempest_plugin/scenario/base.py
+++ b/neutron_tempest_plugin/scenario/base.py
@@ -302,7 +302,8 @@
     def _check_remote_connectivity(self, source, dest, count,
                                    should_succeed=True,
                                    nic=None, mtu=None, fragmentation=True,
-                                   timeout=None, pattern=None):
+                                   timeout=None, pattern=None,
+                                   forbid_packet_loss=False):
         """check ping server via source ssh connection
 
         :param source: RemoteClient: an ssh connection from which to ping
@@ -314,6 +315,7 @@
         :param fragmentation: Flag for packet fragmentation
         :param timeout: Timeout for all ping packet(s) to succeed
         :param pattern: hex digits included in ICMP messages
+        :param forbid_packet_loss: forbid or allow some lost packets
         :returns: boolean -- should_succeed == ping
         :returns: ping is false if ping failed
         """
@@ -352,6 +354,10 @@
                 return not should_succeed
             LOG.debug('ping result: %s', result)
 
+            if forbid_packet_loss and ' 0% packet loss' not in result:
+                LOG.debug('Packet loss detected')
+                return not should_succeed
+
             if validators.validate_ip_address(dest) is None:
                 # Assert that the return traffic was from the correct
                 # source address.
@@ -366,12 +372,13 @@
                                   nic=None, mtu=None, fragmentation=True,
                                   servers=None, timeout=None,
                                   ping_count=CONF.validation.ping_count,
-                                  pattern=None):
+                                  pattern=None, forbid_packet_loss=False):
         try:
             self.assertTrue(self._check_remote_connectivity(
                 source, dest, ping_count, should_succeed, nic, mtu,
                 fragmentation,
-                timeout=timeout, pattern=pattern))
+                timeout=timeout, pattern=pattern,
+                forbid_packet_loss=forbid_packet_loss))
         except lib_exc.SSHTimeout as ssh_e:
             LOG.debug(ssh_e)
             self._log_console_output(servers)
diff --git a/neutron_tempest_plugin/services/bgp/bgp_client.py b/neutron_tempest_plugin/services/bgp/bgp_client.py
index ae51427..7d46e29 100644
--- a/neutron_tempest_plugin/services/bgp/bgp_client.py
+++ b/neutron_tempest_plugin/services/bgp/bgp_client.py
@@ -15,6 +15,25 @@
 from oslo_serialization import jsonutils
 from tempest.lib.common import rest_client
 
+from neutron_tempest_plugin.api import clients as manager
+from neutron_tempest_plugin import config
+
+
+CONF = config.CONF
+
+
+class Manager(manager.Manager):
+    def __init__(self, credentials=None, service=None):
+        super(Manager, self).__init__(credentials, service)
+        self.bgp_client = BgpSpeakerClientJSON(
+            self.auth_provider,
+            CONF.network.catalog_type,
+            CONF.network.region or CONF.identity.region,
+            endpoint_type=CONF.network.endpoint_type,
+            build_interval=CONF.network.build_interval,
+            build_timeout=CONF.network.build_timeout,
+            **self.default_params)
+
 
 class BgpSpeakerClientJSON(rest_client.RestClient):
 
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 3086d6c..db4d6e1 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -27,7 +27,6 @@
     check:
       jobs:
         - neutron-tempest-plugin-api-queens
-        - neutron-tempest-plugin-dvr-multinode-scenario-queens
         - neutron-tempest-plugin-scenario-linuxbridge-queens
         - neutron-tempest-plugin-scenario-openvswitch-queens
     gate: