Merge "Add test that ensures subnet is usable after update"
diff --git a/neutron/tests/tempest/api/admin/test_external_network_extension.py b/neutron/tests/tempest/api/admin/test_external_network_extension.py
index a99d78c..ed56144 100644
--- a/neutron/tests/tempest/api/admin/test_external_network_extension.py
+++ b/neutron/tests/tempest/api/admin/test_external_network_extension.py
@@ -85,6 +85,21 @@
             object_id=net_id, action='access_as_external',
             target_tenant='*')['rbac_policies']))
 
+    @test.idempotent_id('a5539002-5bdb-48b5-b124-abcd12347865')
+    def test_external_update_policy_from_wildcard_to_specific_tenant(self):
+        net_id = self._create_network(external=True)['id']
+        rbac_pol = self.admin_client.list_rbac_policies(
+            object_id=net_id, action='access_as_external',
+            target_tenant='*')['rbac_policies'][0]
+        r = self.client2.create_router(
+            data_utils.rand_name('router-'),
+            external_gateway_info={'network_id': net_id})['router']
+        self.addCleanup(self.admin_client.delete_router, r['id'])
+        # changing wildcard to specific tenant should be okay since its the
+        # only one using the network
+        self.admin_client.update_rbac_policy(
+            rbac_pol['id'], target_tenant=self.client2.tenant_id)
+
     @test.idempotent_id('a5539002-5bdb-48b5-b124-e9eedd5975e6')
     def test_external_conversion_on_policy_create(self):
         net_id = self._create_network(external=False)['id']
diff --git a/neutron/tests/tempest/api/test_bgp_speaker_extensions.py b/neutron/tests/tempest/api/test_bgp_speaker_extensions.py
deleted file mode 100644
index 123f43f..0000000
--- a/neutron/tests/tempest/api/test_bgp_speaker_extensions.py
+++ /dev/null
@@ -1,286 +0,0 @@
-# Copyright 2016 Hewlett Packard Enterprise Development Company LP
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import netaddr
-from tempest import config
-from tempest.lib import exceptions as lib_exc
-from tempest import test
-import testtools
-
-from neutron.tests.tempest.api import base
-from neutron.tests.tempest.common import tempest_fixtures as fixtures
-
-CONF = config.CONF
-
-
-class BgpSpeakerTestJSONBase(base.BaseAdminNetworkTest):
-
-    default_bgp_speaker_args = {'local_as': '1234',
-                                'ip_version': 4,
-                                'name': 'my-bgp-speaker',
-                                'advertise_floating_ip_host_routes': True,
-                                'advertise_tenant_networks': True}
-    default_bgp_peer_args = {'remote_as': '4321',
-                             'name': 'my-bgp-peer',
-                             'peer_ip': '192.168.1.1',
-                             'auth_type': 'md5', 'password': 'my-secret'}
-
-    @classmethod
-    @test.requires_ext(extension="bgp_speaker", service="network")
-    def resource_setup(cls):
-        super(BgpSpeakerTestJSONBase, cls).resource_setup()
-
-        cls.admin_routerports = []
-        cls.admin_floatingips = []
-        cls.admin_routers = []
-        cls.ext_net_id = CONF.network.public_network_id
-
-    @classmethod
-    def resource_cleanup(cls):
-        for floatingip in cls.admin_floatingips:
-            cls._try_delete_resource(cls.admin_client.delete_floatingip,
-                                     floatingip['id'])
-        for routerport in cls.admin_routerports:
-            cls._try_delete_resource(
-                      cls.admin_client.remove_router_interface_with_subnet_id,
-                      routerport['router_id'], routerport['subnet_id'])
-        for router in cls.admin_routers:
-            cls._try_delete_resource(cls.admin_client.delete_router,
-                                     router['id'])
-        super(BgpSpeakerTestJSONBase, cls).resource_cleanup()
-
-    def create_bgp_speaker(self, auto_delete=True, **args):
-        data = {'bgp_speaker': args}
-        bgp_speaker = self.admin_client.create_bgp_speaker(data)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        if auto_delete:
-            self.addCleanup(self.delete_bgp_speaker, bgp_speaker_id)
-        return bgp_speaker
-
-    def create_bgp_peer(self, **args):
-        bgp_peer = self.admin_client.create_bgp_peer({'bgp_peer': args})
-        bgp_peer_id = bgp_peer['bgp-peer']['id']
-        self.addCleanup(self.delete_bgp_peer, bgp_peer_id)
-        return bgp_peer
-
-    def update_bgp_speaker(self, id, **args):
-        data = {'bgp_speaker': args}
-        return self.admin_client.update_bgp_speaker(id, data)
-
-    def delete_bgp_speaker(self, id):
-        return self.admin_client.delete_bgp_speaker(id)
-
-    def get_bgp_speaker(self, id):
-        return self.admin_client.get_bgp_speaker(id)
-
-    def create_bgp_speaker_and_peer(self):
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_peer = self.create_bgp_peer(**self.default_bgp_peer_args)
-        return (bgp_speaker, bgp_peer)
-
-    def delete_bgp_peer(self, id):
-        return self.admin_client.delete_bgp_peer(id)
-
-    def add_bgp_peer(self, bgp_speaker_id, bgp_peer_id):
-        return self.admin_client.add_bgp_peer_with_id(bgp_speaker_id,
-                                                      bgp_peer_id)
-
-    def remove_bgp_peer(self, bgp_speaker_id, bgp_peer_id):
-        return self.admin_client.remove_bgp_peer_with_id(bgp_speaker_id,
-                                                         bgp_peer_id)
-
-    def delete_address_scope(self, id):
-        return self.admin_client.delete_address_scope(id)
-
-
-class BgpSpeakerTestJSON(BgpSpeakerTestJSONBase):
-
-    """
-    Tests the following operations in the Neutron API using the REST client for
-    Neutron:
-
-        Create bgp-speaker
-        Delete bgp-speaker
-        Create bgp-peer
-        Update bgp-peer
-        Delete bgp-peer
-    """
-
-    @test.idempotent_id('df259771-7104-4ffa-b77f-bd183600d7f9')
-    def test_delete_bgp_speaker(self):
-        bgp_speaker = self.create_bgp_speaker(auto_delete=False,
-                                              **self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.delete_bgp_speaker(bgp_speaker_id)
-        self.assertRaises(lib_exc.NotFound,
-                          self.get_bgp_speaker,
-                          bgp_speaker_id)
-
-    @test.idempotent_id('81d9dc45-19f8-4c6e-88b8-401d965cd1b0')
-    def test_create_bgp_peer(self):
-        self.create_bgp_peer(**self.default_bgp_peer_args)
-
-    @test.idempotent_id('6ade0319-1ee2-493c-ac4b-5eb230ff3a77')
-    def test_add_bgp_peer(self):
-        bgp_speaker, bgp_peer = self.create_bgp_speaker_and_peer()
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        bgp_peer_id = bgp_peer['bgp-peer']['id']
-
-        self.add_bgp_peer(bgp_speaker_id, bgp_peer_id)
-        bgp_speaker = self.admin_client.get_bgp_speaker(bgp_speaker_id)
-        bgp_peers_list = bgp_speaker['bgp-speaker']['peers']
-        self.assertEqual(1, len(bgp_peers_list))
-        self.assertTrue(bgp_peer_id in bgp_peers_list)
-
-    @test.idempotent_id('f9737708-1d79-440b-8350-779f97d882ee')
-    def test_remove_bgp_peer(self):
-        bgp_peer = self.create_bgp_peer(**self.default_bgp_peer_args)
-        bgp_peer_id = bgp_peer['bgp-peer']['id']
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.add_bgp_peer(bgp_speaker_id, bgp_peer_id)
-        bgp_speaker = self.admin_client.get_bgp_speaker(bgp_speaker_id)
-        bgp_peers_list = bgp_speaker['bgp-speaker']['peers']
-        self.assertTrue(bgp_peer_id in bgp_peers_list)
-
-        bgp_speaker = self.remove_bgp_peer(bgp_speaker_id, bgp_peer_id)
-        bgp_speaker = self.admin_client.get_bgp_speaker(bgp_speaker_id)
-        bgp_peers_list = bgp_speaker['bgp-speaker']['peers']
-        self.assertTrue(not bgp_peers_list)
-
-    @testtools.skip('bug/1553374')
-    @test.idempotent_id('23c8eb37-d10d-4f43-b2e7-6542cb6a4405')
-    def test_add_gateway_network(self):
-        self.useFixture(fixtures.LockFixture('gateway_network_binding'))
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-
-        self.admin_client.add_bgp_gateway_network(bgp_speaker_id,
-                                                  self.ext_net_id)
-        bgp_speaker = self.admin_client.get_bgp_speaker(bgp_speaker_id)
-        network_list = bgp_speaker['bgp-speaker']['networks']
-        self.assertEqual(1, len(network_list))
-        self.assertTrue(self.ext_net_id in network_list)
-
-    @testtools.skip('bug/1553374')
-    @test.idempotent_id('6cfc7137-0d99-4a3d-826c-9d1a3a1767b0')
-    def test_remove_gateway_network(self):
-        self.useFixture(fixtures.LockFixture('gateway_network_binding'))
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.admin_client.add_bgp_gateway_network(bgp_speaker_id,
-                                                  self.ext_net_id)
-        bgp_speaker = self.admin_client.get_bgp_speaker(bgp_speaker_id)
-        networks = bgp_speaker['bgp-speaker']['networks']
-
-        self.assertTrue(self.ext_net_id in networks)
-        self.admin_client.remove_bgp_gateway_network(bgp_speaker_id,
-                                                     self.ext_net_id)
-        bgp_speaker = self.admin_client.get_bgp_speaker(bgp_speaker_id)
-        network_list = bgp_speaker['bgp-speaker']['networks']
-        self.assertTrue(not network_list)
-
-    @testtools.skip('bug/1553374')
-    @test.idempotent_id('5bef22ad-5e70-4f7b-937a-dc1944642996')
-    def test_get_advertised_routes_null_address_scope(self):
-        self.useFixture(fixtures.LockFixture('gateway_network_binding'))
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.admin_client.add_bgp_gateway_network(bgp_speaker_id,
-                                                  self.ext_net_id)
-        routes = self.admin_client.get_bgp_advertised_routes(bgp_speaker_id)
-        self.assertEqual(0, len(routes['advertised_routes']))
-
-    @testtools.skip('bug/1553374')
-    @test.idempotent_id('cae9cdb1-ad65-423c-9604-d4cd0073616e')
-    def test_get_advertised_routes_floating_ips(self):
-        self.useFixture(fixtures.LockFixture('gateway_network_binding'))
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.admin_client.add_bgp_gateway_network(bgp_speaker_id,
-                                                  self.ext_net_id)
-        tenant_net = self.create_network()
-        tenant_subnet = self.create_subnet(tenant_net)
-        ext_gw_info = {'network_id': self.ext_net_id}
-        router = self.admin_client.create_router(
-                                            'my-router',
-                                            external_gateway_info=ext_gw_info,
-                                            admin_state_up=True,
-                                            distributed=False)
-        self.admin_routers.append(router['router'])
-        self.admin_client.add_router_interface_with_subnet_id(
-                                                       router['router']['id'],
-                                                       tenant_subnet['id'])
-        self.admin_routerports.append({'router_id': router['router']['id'],
-                                       'subnet_id': tenant_subnet['id']})
-        tenant_port = self.create_port(tenant_net)
-        floatingip = self.create_floatingip(self.ext_net_id)
-        self.admin_floatingips.append(floatingip)
-        self.client.update_floatingip(floatingip['id'],
-                                      port_id=tenant_port['id'])
-        routes = self.admin_client.get_bgp_advertised_routes(bgp_speaker_id)
-        self.assertEqual(1, len(routes['advertised_routes']))
-        self.assertEqual(floatingip['floating_ip_address'] + '/32',
-                         routes['advertised_routes'][0]['destination'])
-
-    @testtools.skip('bug/1553374')
-    @test.idempotent_id('c9ad566e-fe8f-4559-8303-bbad9062a30c')
-    def test_get_advertised_routes_tenant_networks(self):
-        self.useFixture(fixtures.LockFixture('gateway_network_binding'))
-        addr_scope = self.create_address_scope('my-scope', ip_version=4)
-        ext_net = self.create_shared_network(**{'router:external': True})
-        tenant_net = self.create_network()
-        ext_subnetpool = self.create_subnetpool(
-                                            'test-pool-ext',
-                                            is_admin=True,
-                                            default_prefixlen=24,
-                                            address_scope_id=addr_scope['id'],
-                                            prefixes=['8.0.0.0/8'])
-        tenant_subnetpool = self.create_subnetpool(
-                                            'tenant-test-pool',
-                                            default_prefixlen=25,
-                                            address_scope_id=addr_scope['id'],
-                                            prefixes=['10.10.0.0/16'])
-        self.create_subnet({'id': ext_net['id']},
-                           cidr=netaddr.IPNetwork('8.0.0.0/24'),
-                           ip_version=4,
-                           client=self.admin_client,
-                           subnetpool_id=ext_subnetpool['id'])
-        tenant_subnet = self.create_subnet(
-                                       {'id': tenant_net['id']},
-                                       cidr=netaddr.IPNetwork('10.10.0.0/24'),
-                                       ip_version=4,
-                                       subnetpool_id=tenant_subnetpool['id'])
-        ext_gw_info = {'network_id': ext_net['id']}
-        router = self.admin_client.create_router(
-                                            'my-router',
-                                            external_gateway_info=ext_gw_info,
-                                            distributed=False)['router']
-        self.admin_routers.append(router)
-        self.admin_client.add_router_interface_with_subnet_id(
-                                                       router['id'],
-                                                       tenant_subnet['id'])
-        self.admin_routerports.append({'router_id': router['id'],
-                                       'subnet_id': tenant_subnet['id']})
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.admin_client.add_bgp_gateway_network(bgp_speaker_id,
-                                                  ext_net['id'])
-        routes = self.admin_client.get_bgp_advertised_routes(bgp_speaker_id)
-        self.assertEqual(1, len(routes['advertised_routes']))
-        self.assertEqual(tenant_subnet['cidr'],
-                         routes['advertised_routes'][0]['destination'])
-        fixed_ip = router['external_gateway_info']['external_fixed_ips'][0]
-        self.assertEqual(fixed_ip['ip_address'],
-                         routes['advertised_routes'][0]['next_hop'])
diff --git a/neutron/tests/tempest/api/test_bgp_speaker_extensions_negative.py b/neutron/tests/tempest/api/test_bgp_speaker_extensions_negative.py
deleted file mode 100644
index 19c1a02..0000000
--- a/neutron/tests/tempest/api/test_bgp_speaker_extensions_negative.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright 2016 Hewlett Packard Enterprise Development Company LP
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import netaddr
-from tempest.lib import exceptions as lib_exc
-
-from neutron.tests.tempest.api import test_bgp_speaker_extensions as test_base
-from tempest import test
-
-
-class BgpSpeakerTestJSONNegative(test_base.BgpSpeakerTestJSONBase):
-
-    """Negative test cases asserting proper behavior of BGP API extension"""
-
-    @test.attr(type='negative')
-    @test.idempotent_id('75e9ee2f-6efd-4320-bff7-ae24741c8b06')
-    def test_create_bgp_speaker_illegal_local_asn(self):
-        self.assertRaises(lib_exc.BadRequest,
-                          self.create_bgp_speaker,
-                          local_as='65537')
-
-    @test.attr(type='negative')
-    @test.idempotent_id('6742ec2e-382a-4453-8791-13a19b47cd13')
-    def test_create_bgp_speaker_non_admin(self):
-        self.assertRaises(lib_exc.Forbidden,
-                          self.client.create_bgp_speaker,
-                          {'bgp_speaker': self.default_bgp_speaker_args})
-
-    @test.attr(type='negative')
-    @test.idempotent_id('33f7aaf0-9786-478b-b2d1-a51086a50eb4')
-    def test_create_bgp_peer_non_admin(self):
-        self.assertRaises(lib_exc.Forbidden,
-                          self.client.create_bgp_peer,
-                          {'bgp_peer': self.default_bgp_peer_args})
-
-    @test.attr(type='negative')
-    @test.idempotent_id('39435932-0266-4358-899b-0e9b1e53c3e9')
-    def test_update_bgp_speaker_local_asn(self):
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-
-        self.assertRaises(lib_exc.BadRequest, self.update_bgp_speaker,
-                          bgp_speaker_id, local_as='4321')
-
-    @test.idempotent_id('9cc33701-51e5-421f-a5d5-fd7b330e550f')
-    def test_get_advertised_routes_tenant_networks(self):
-        addr_scope1 = self.create_address_scope('my-scope1', ip_version=4)
-        addr_scope2 = self.create_address_scope('my-scope2', ip_version=4)
-        ext_net = self.create_shared_network(**{'router:external': True})
-        tenant_net1 = self.create_network()
-        tenant_net2 = self.create_network()
-        ext_subnetpool = self.create_subnetpool(
-                                           'test-pool-ext',
-                                           is_admin=True,
-                                           default_prefixlen=24,
-                                           address_scope_id=addr_scope1['id'],
-                                           prefixes=['8.0.0.0/8'])
-        tenant_subnetpool1 = self.create_subnetpool(
-                                           'tenant-test-pool',
-                                           default_prefixlen=25,
-                                           address_scope_id=addr_scope1['id'],
-                                           prefixes=['10.10.0.0/16'])
-        tenant_subnetpool2 = self.create_subnetpool(
-                                           'tenant-test-pool',
-                                           default_prefixlen=25,
-                                           address_scope_id=addr_scope2['id'],
-                                           prefixes=['11.10.0.0/16'])
-        self.create_subnet({'id': ext_net['id']},
-                           cidr=netaddr.IPNetwork('8.0.0.0/24'),
-                           ip_version=4,
-                           client=self.admin_client,
-                           subnetpool_id=ext_subnetpool['id'])
-        tenant_subnet1 = self.create_subnet(
-                                       {'id': tenant_net1['id']},
-                                       cidr=netaddr.IPNetwork('10.10.0.0/24'),
-                                       ip_version=4,
-                                       subnetpool_id=tenant_subnetpool1['id'])
-        tenant_subnet2 = self.create_subnet(
-                                       {'id': tenant_net2['id']},
-                                       cidr=netaddr.IPNetwork('11.10.0.0/24'),
-                                       ip_version=4,
-                                       subnetpool_id=tenant_subnetpool2['id'])
-        ext_gw_info = {'network_id': ext_net['id']}
-        router = self.admin_client.create_router(
-                                  'my-router',
-                                  distributed=False,
-                                  external_gateway_info=ext_gw_info)['router']
-        self.admin_routers.append(router)
-        self.admin_client.add_router_interface_with_subnet_id(
-                                                       router['id'],
-                                                       tenant_subnet1['id'])
-        self.admin_routerports.append({'router_id': router['id'],
-                                       'subnet_id': tenant_subnet1['id']})
-        self.admin_client.add_router_interface_with_subnet_id(
-                                                       router['id'],
-                                                       tenant_subnet2['id'])
-        self.admin_routerports.append({'router_id': router['id'],
-                                       'subnet_id': tenant_subnet2['id']})
-        bgp_speaker = self.create_bgp_speaker(**self.default_bgp_speaker_args)
-        bgp_speaker_id = bgp_speaker['bgp-speaker']['id']
-        self.admin_client.add_bgp_gateway_network(bgp_speaker_id,
-                                                  ext_net['id'])
-        routes = self.admin_client.get_bgp_advertised_routes(bgp_speaker_id)
-        self.assertEqual(1, len(routes['advertised_routes']))
-        self.assertEqual(tenant_subnet1['cidr'],
-                         routes['advertised_routes'][0]['destination'])
-        fixed_ip = router['external_gateway_info']['external_fixed_ips'][0]
-        self.assertEqual(fixed_ip['ip_address'],
-                         routes['advertised_routes'][0]['next_hop'])
diff --git a/neutron/tests/tempest/api/test_networks_negative.py b/neutron/tests/tempest/api/test_networks_negative.py
new file mode 100644
index 0000000..87da1b8
--- /dev/null
+++ b/neutron/tests/tempest/api/test_networks_negative.py
@@ -0,0 +1,36 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from tempest.lib import exceptions as lib_exc
+from tempest import test
+import testtools
+
+from neutron.tests.tempest.api import base
+
+
+class NetworksNegativeTest(base.BaseNetworkTest):
+
+    @classmethod
+    def resource_setup(cls):
+        super(NetworksNegativeTest, cls).resource_setup()
+        cls.network = cls.create_network()
+        cls.subnet = cls.create_subnet(cls.network)
+
+    @test.attr(type='negative')
+    @test.idempotent_id('9f80f25b-5d1b-4f26-9f6b-774b9b270819')
+    def test_delete_network_in_use(self):
+        port = self.client.create_port(network_id=self.network['id'])
+        self.addCleanup(self.client.delete_port, port['port']['id'])
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.client.delete_subnet(self.subnet['id'])
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.client.delete_network(self.network['id'])
diff --git a/neutron/tests/tempest/api/test_routers_negative.py b/neutron/tests/tempest/api/test_routers_negative.py
index 2ccb34a..6a028db 100644
--- a/neutron/tests/tempest/api/test_routers_negative.py
+++ b/neutron/tests/tempest/api/test_routers_negative.py
@@ -21,20 +21,41 @@
 from neutron.tests.tempest.api import base_routers as base
 
 
-class DvrRoutersNegativeTest(base.BaseRouterTest):
+class RoutersNegativeTestBase(base.BaseRouterTest):
+
+    @classmethod
+    def resource_setup(cls):
+        super(RoutersNegativeTestBase, cls).resource_setup()
+        cls.router = cls.create_router(data_utils.rand_name('router'))
+        cls.network = cls.create_network()
+        cls.subnet = cls.create_subnet(cls.network)
+
+
+class RoutersNegativeTest(RoutersNegativeTestBase):
+
+    @classmethod
+    @test.requires_ext(extension="router", service="network")
+    def skip_checks(cls):
+        super(RoutersNegativeTest, cls).skip_checks()
+
+    @test.attr(type='negative')
+    @test.idempotent_id('e3e751af-15a2-49cc-b214-a7154579e94f')
+    def test_delete_router_in_use(self):
+        # This port is deleted after a test by remove_router_interface.
+        port = self.client.create_port(network_id=self.network['id'])
+        self.client.add_router_interface_with_port_id(
+            self.router['id'], port['port']['id'])
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.client.delete_router(self.router['id'])
+
+
+class DvrRoutersNegativeTest(RoutersNegativeTestBase):
 
     @classmethod
     @test.requires_ext(extension="dvr", service="network")
     def skip_checks(cls):
         super(DvrRoutersNegativeTest, cls).skip_checks()
 
-    @classmethod
-    def resource_setup(cls):
-        super(DvrRoutersNegativeTest, cls).resource_setup()
-        cls.router = cls.create_router(data_utils.rand_name('router'))
-        cls.network = cls.create_network()
-        cls.subnet = cls.create_subnet(cls.network)
-
     @test.attr(type='negative')
     @test.idempotent_id('4990b055-8fc7-48ab-bba7-aa28beaad0b9')
     def test_router_create_tenant_distributed_returns_forbidden(self):
diff --git a/neutron/tests/tempest/api/test_subnetpools_negative.py b/neutron/tests/tempest/api/test_subnetpools_negative.py
index 3c70c75..a9a7d55 100644
--- a/neutron/tests/tempest/api/test_subnetpools_negative.py
+++ b/neutron/tests/tempest/api/test_subnetpools_negative.py
@@ -258,6 +258,7 @@
 
     @test.attr(type='negative')
     @test.idempotent_id('648fee7d-a909-4ced-bad3-3a169444c0a8')
+    @test.requires_ext(extension='address-scope', service='network')
     def test_update_subnetpool_associate_address_scope_wrong_ip_version(self):
         address_scope = self.create_address_scope(
             name=data_utils.rand_name('smoke-address-scope'),
diff --git a/neutron/tests/tempest/services/network/json/network_client.py b/neutron/tests/tempest/services/network/json/network_client.py
index e273f55..4a89ad5 100644
--- a/neutron/tests/tempest/services/network/json/network_client.py
+++ b/neutron/tests/tempest/services/network/json/network_client.py
@@ -47,8 +47,6 @@
         # the following map is used to construct proper URI
         # for the given neutron resource
         service_resource_prefix_map = {
-            'bgp-peers': '',
-            'bgp-speakers': '',
             'networks': '',
             'subnets': '',
             'subnetpools': '',
@@ -212,125 +210,6 @@
         self.expected_success(200, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    # BGP speaker methods
-    def create_bgp_speaker(self, post_data):
-        body = self.serialize_list(post_data, "bgp-speakers", "bgp-speaker")
-        uri = self.get_uri("bgp-speakers")
-        resp, body = self.post(uri, body)
-        body = {'bgp-speaker': self.deserialize_list(body)}
-        self.expected_success(201, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def get_bgp_speaker(self, id):
-        uri = self.get_uri("bgp-speakers")
-        bgp_speaker_uri = '%s/%s' % (uri, id)
-        resp, body = self.get(bgp_speaker_uri)
-        body = {'bgp-speaker': self.deserialize_list(body)}
-        self.expected_success(200, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def get_bgp_speakers(self):
-        uri = self.get_uri("bgp-speakers")
-        resp, body = self.get(uri)
-        body = {'bgp-speakers': self.deserialize_list(body)}
-        self.expected_success(200, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def update_bgp_speaker(self, id, put_data):
-        body = self.serialize_list(put_data, "bgp-speakers", "bgp-speaker")
-        uri = self.get_uri("bgp-speakers")
-        bgp_speaker_uri = '%s/%s' % (uri, id)
-        resp, body = self.put(bgp_speaker_uri, body)
-        body = {'bgp-speaker': self.deserialize_list(body)}
-        self.expected_success(200, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_bgp_speaker(self, id):
-        uri = self.get_uri("bgp-speakers")
-        bgp_speaker_uri = '%s/%s' % (uri, id)
-        resp, body = self.delete(bgp_speaker_uri)
-        self.expected_success(204, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def create_bgp_peer(self, post_data):
-        body = self.serialize_list(post_data, "bgp-peers", "bgp-peer")
-        uri = self.get_uri("bgp-peers")
-        resp, body = self.post(uri, body)
-        body = {'bgp-peer': self.deserialize_list(body)}
-        self.expected_success(201, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def get_bgp_peer(self, id):
-        uri = self.get_uri("bgp-peers")
-        bgp_speaker_uri = '%s/%s' % (uri, id)
-        resp, body = self.get(bgp_speaker_uri)
-        body = {'bgp-peer': self.deserialize_list(body)}
-        self.expected_success(200, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def delete_bgp_peer(self, id):
-        uri = self.get_uri("bgp-peers")
-        bgp_speaker_uri = '%s/%s' % (uri, id)
-        resp, body = self.delete(bgp_speaker_uri)
-        self.expected_success(204, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def add_bgp_peer_with_id(self, bgp_speaker_id, bgp_peer_id):
-        uri = '%s/bgp-speakers/%s/add_bgp_peer' % (self.uri_prefix,
-                                                   bgp_speaker_id)
-        update_body = {"bgp_peer_id": bgp_peer_id}
-        update_body = jsonutils.dumps(update_body)
-        resp, body = self.put(uri, update_body)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def remove_bgp_peer_with_id(self, bgp_speaker_id, bgp_peer_id):
-        uri = '%s/bgp-speakers/%s/remove_bgp_peer' % (self.uri_prefix,
-                                                      bgp_speaker_id)
-        update_body = {"bgp_peer_id": bgp_peer_id}
-        update_body = jsonutils.dumps(update_body)
-        resp, body = self.put(uri, update_body)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def add_bgp_gateway_network(self, bgp_speaker_id, network_id):
-        uri = '%s/bgp-speakers/%s/add_gateway_network' % (self.uri_prefix,
-                                                        bgp_speaker_id)
-        update_body = {"network_id": network_id}
-        update_body = jsonutils.dumps(update_body)
-        resp, body = self.put(uri, update_body)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def remove_bgp_gateway_network(self, bgp_speaker_id, network_id):
-        uri = '%s/bgp-speakers/%s/remove_gateway_network'
-        uri = uri % (self.uri_prefix, bgp_speaker_id)
-        update_body = {"network_id": network_id}
-        update_body = jsonutils.dumps(update_body)
-        resp, body = self.put(uri, update_body)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return service_client.ResponseBody(resp, body)
-
-    def get_bgp_advertised_routes(self, bgp_speaker_id):
-        base_uri = '%s/bgp-speakers/%s/get_advertised_routes'
-        uri = base_uri % (self.uri_prefix, bgp_speaker_id)
-        resp, body = self.get(uri)
-        body = {'advertised_routes': self.deserialize_list(body)}
-        self.expected_success(200, resp.status)
-        return service_client.ResponseBody(resp, body)
-
-    def get_bgp_router_routes(self, router_id):
-        base_uri = '%s/router-routes/%s'
-        uri = base_uri % (self.uri_prefix, router_id)
-        resp, body = self.get(uri)
-        body = self.deserialize_list(body)
-        self.expected_success(200, resp.status)
-        return service_client.ResponseBody(resp, body)
-
     # Common methods that are hard to automate
     def create_bulk_network(self, names, shared=False):
         network_list = [{'name': name, 'shared': shared} for name in names]