Merge "Create or attach interface should use specific network"
diff --git a/patrole_tempest_plugin/tests/api/compute/rbac_base.py b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
index 1bd1cc7..18d2f48 100644
--- a/patrole_tempest_plugin/tests/api/compute/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
@@ -35,6 +35,9 @@
         cls.setup_rbac_utils()
         cls.hosts_client = cls.os_primary.hosts_client
         cls.tenant_usages_client = cls.os_primary.tenant_usages_client
+        cls.networks_client = cls.os_primary.networks_client
+        cls.subnets_client = cls.os_primary.subnets_client
+        cls.ports_client = cls.os_primary.ports_client
 
     @classmethod
     def create_flavor(cls, **kwargs):
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
index 9cf476b..d393a4c 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
@@ -13,6 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import netaddr
+
 import testtools
 
 from tempest.common import utils
@@ -566,12 +568,48 @@
 
     @classmethod
     def resource_setup(cls):
+        def _cleanup_ports(network_id):
+            ports = cls.ports_client.\
+                list_ports(network_id=network_id)['ports']
+            for port in ports:
+                test_utils.call_and_ignore_notfound_exc(
+                    cls.ports_client.delete_port,
+                    port['id'])
+
         super(MiscPolicyActionsNetworkRbacTest, cls).resource_setup()
         cls.server = cls.create_test_server(wait_until='ACTIVE')
 
+        # Create network the interface will be attached to
+        network_name = \
+            data_utils.rand_name(cls.__class__.__name__ + '-network')
+        post_body = {'name': network_name}
+        post_body['router:external'] = False
+        post_body['shared'] = True
+        post_body['port_security_enabled'] = True
+        cls.network = \
+            cls.networks_client.create_network(**post_body)['network']
+        cls.addClassResourceCleanup(
+            cls.networks_client.delete_network,
+            cls.network['id'])
+
+        # Create subnet for network
+        cls.cidr = netaddr.IPNetwork(CONF.network.project_network_cidr)
+        cls.subnet = cls.subnets_client.create_subnet(
+            network_id=cls.network['id'],
+            cidr=cls.cidr,
+            ip_version=4)['subnet']
+        cls.addClassResourceCleanup(
+            cls.subnets_client.delete_subnet,
+            cls.subnet['id'])
+
+        # ports on the network need to be deleted before the network can
+        # be deleted
+        cls.addClassResourceCleanup(_cleanup_ports, cls.network['id'])
+
     def _attach_interface_to_server(self):
+        network_id = self.network['id']
         interface = self.interfaces_client.create_interface(
-            self.server['id'])['interfaceAttachment']
+            self.server['id'], net_id=network_id)['interfaceAttachment']
         waiters.wait_for_interface_status(
             self.interfaces_client, self.server['id'],
             interface['port_id'], 'ACTIVE')
@@ -616,9 +654,10 @@
         rule="os_compute_api:os-attach-interfaces:create")
     def test_create_interface(self):
         """Test create interface, part of os-attach-interfaces."""
+        network_id = self.network['id']
         with self.rbac_utils.override_role(self):
             interface = self.interfaces_client.create_interface(
-                self.server['id'])['interfaceAttachment']
+                self.server['id'], net_id=network_id)['interfaceAttachment']
         waiters.wait_for_interface_status(
             self.interfaces_client, self.server['id'],
             interface['port_id'], 'ACTIVE')