Merge "Convert cli tests to use global CONF object"
diff --git a/tempest/api/compute/admin/test_aggregates.py b/tempest/api/compute/admin/test_aggregates.py
index 362cf2d..98d2550 100644
--- a/tempest/api/compute/admin/test_aggregates.py
+++ b/tempest/api/compute/admin/test_aggregates.py
@@ -108,7 +108,6 @@
     @attr(type='gate')
     def test_aggregate_create_update_with_az(self):
         # Update an aggregate and ensure properties are updated correctly
-        self.useFixture(fixtures.LockFixture('availability_zone'))
         aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
         az_name = data_utils.rand_name(self.az_name_prefix)
         resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
diff --git a/tempest/api/volume/test_volume_metadata.py b/tempest/api/volume/test_volume_metadata.py
index 6d23c0a..ec732d1 100644
--- a/tempest/api/volume/test_volume_metadata.py
+++ b/tempest/api/volume/test_volume_metadata.py
@@ -13,6 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from testtools.matchers import ContainsAll
+
 from tempest.api.volume import base
 from tempest import test
 
@@ -49,7 +51,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(metadata, body)
+        self.assertThat(body.items(), ContainsAll(metadata.items()))
         # Delete one item metadata of the volume
         rsp, body = self.volumes_client.delete_volume_metadata_item(
             self.volume_id,
@@ -76,7 +78,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(metadata, body)
+        self.assertThat(body.items(), ContainsAll(metadata.items()))
         # Update metadata
         resp, body = self.volumes_client.update_volume_metadata(
             self.volume_id,
@@ -85,7 +87,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(update, body)
+        self.assertThat(body.items(), ContainsAll(update.items()))
 
     @test.attr(type='gate')
     def test_update_volume_metadata_item(self):
@@ -93,9 +95,6 @@
         metadata = {"key1": "value1",
                     "key2": "value2",
                     "key3": "value3"}
-        create_expect = {"key1": "value1",
-                         "key2": "value2",
-                         "key3": "value3"}
         update_item = {"key3": "value3_update"}
         expect = {"key1": "value1",
                   "key2": "value2",
@@ -105,7 +104,7 @@
             self.volume_id,
             metadata)
         self.assertEqual(200, resp.status)
-        self.assertEqual(create_expect, body)
+        self.assertThat(body.items(), ContainsAll(metadata.items()))
         # Update metadata item
         resp, body = self.volumes_client.update_volume_metadata_item(
             self.volume_id,
@@ -115,7 +114,7 @@
         # Get the metadata of the volume
         resp, body = self.volumes_client.get_volume_metadata(self.volume_id)
         self.assertEqual(200, resp.status)
-        self.assertEqual(expect, body)
+        self.assertThat(body.items(), ContainsAll(expect.items()))
 
 
 class VolumeMetadataTestXML(VolumeMetadataTest):
diff --git a/tempest/api/volume/test_volumes_get.py b/tempest/api/volume/test_volumes_get.py
index 28c332e..6d89e5b 100644
--- a/tempest/api/volume/test_volumes_get.py
+++ b/tempest/api/volume/test_volumes_get.py
@@ -13,6 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from testtools.matchers import ContainsAll
+
 from tempest.api.volume import base
 from tempest.common.utils import data_utils
 from tempest import config
@@ -69,16 +71,16 @@
         self.assertEqual(200, resp.status)
         self.assertEqual(v_name,
                          fetched_volume['display_name'],
-                         'The fetched Volume is different '
+                         'The fetched Volume name is different '
                          'from the created Volume')
         self.assertEqual(volume['id'],
                          fetched_volume['id'],
-                         'The fetched Volume is different '
+                         'The fetched Volume id is different '
                          'from the created Volume')
-        self.assertEqual(metadata,
-                         fetched_volume['metadata'],
-                         'The fetched Volume is different '
-                         'from the created Volume')
+        self.assertThat(fetched_volume['metadata'].items(),
+                        ContainsAll(metadata.items()),
+                        'The fetched Volume metadata misses data '
+                        'from the created Volume')
 
         # NOTE(jdg): Revert back to strict true/false checking
         # after fix for bug #1227837 merges
@@ -105,7 +107,10 @@
         self.assertEqual(volume['id'], updated_volume['id'])
         self.assertEqual(new_v_name, updated_volume['display_name'])
         self.assertEqual(new_desc, updated_volume['display_description'])
-        self.assertEqual(metadata, updated_volume['metadata'])
+        self.assertThat(updated_volume['metadata'].items(),
+                        ContainsAll(metadata.items()),
+                        'The fetched Volume metadata misses data '
+                        'from the created Volume')
 
         # NOTE(jdg): Revert back to strict true/false checking
         # after fix for bug #1227837 merges
@@ -115,18 +120,6 @@
         if 'imageRef' not in kwargs:
             self.assertEqual(boot_flag, False)
 
-    @attr(type='gate')
-    def test_volume_get_metadata_none(self):
-        # Create a volume without passing metadata, get details, and delete
-
-        # Create a volume without metadata
-        volume = self.create_volume(metadata={})
-
-        # GET Volume
-        resp, fetched_volume = self.client.get_volume(volume['id'])
-        self.assertEqual(200, resp.status)
-        self.assertEqual(fetched_volume['metadata'], {})
-
     @attr(type='smoke')
     def test_volume_create_get_update_delete(self):
         self._volume_create_get_update_delete()
diff --git a/tempest/common/isolated_creds.py b/tempest/common/isolated_creds.py
index f2df061..146fac9 100644
--- a/tempest/common/isolated_creds.py
+++ b/tempest/common/isolated_creds.py
@@ -472,7 +472,11 @@
         net_client = self.network_admin_client
         for cred in self.isolated_net_resources:
             network, subnet, router = self.isolated_net_resources.get(cred)
-            if self.network_resources.get('router'):
+            LOG.debug("Clearing network: %(network)s, "
+                      "subnet: %(subnet)s, router: %(router)s",
+                      {'network': network, 'subnet': subnet, 'router': router})
+            if (not self.network_resources or
+                self.network_resources.get('router')):
                 try:
                     if self.tempest_client:
                         net_client.remove_router_interface_with_subnet_id(
@@ -485,13 +489,16 @@
                              router['name'])
                     pass
                 self._clear_isolated_router(router['id'], router['name'])
-            if self.network_resources.get('network'):
+            if (not self.network_resources or
+                self.network_resources.get('network')):
                 # TODO(mlavalle) This method call will be removed once patch
                 # https://review.openstack.org/#/c/46563/ merges in Neutron
                 self._cleanup_ports(network['id'])
-            if self.network_resources.get('subnet'):
+            if (not self.network_resources or
+                self.network_resources.get('subnet')):
                 self._clear_isolated_subnet(subnet['id'], subnet['name'])
-            if self.network_resources.get('network'):
+            if (not self.network_resources or
+                self.network_resources.get('network')):
                 self._clear_isolated_network(network['id'], network['name'])
 
     def clear_isolated_creds(self):
diff --git a/tempest/services/compute/v3/json/flavors_client.py b/tempest/services/compute/v3/json/flavors_client.py
index f8c762c..739c870 100644
--- a/tempest/services/compute/v3/json/flavors_client.py
+++ b/tempest/services/compute/v3/json/flavors_client.py
@@ -63,7 +63,7 @@
         if kwargs.get('swap'):
             post_body['swap'] = kwargs.get('swap')
         if kwargs.get('rxtx'):
-            post_body['rxtx_factor'] = kwargs.get('rxtx')
+            post_body['os-flavor-rxtx:rxtx_factor'] = kwargs.get('rxtx')
         if kwargs.get('is_public'):
             post_body['flavor-access:is_public'] = kwargs.get('is_public')
         post_body = json.dumps({'flavor': post_body})
diff --git a/tempest/test.py b/tempest/test.py
index 61d1311..6754831 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -209,12 +209,12 @@
 
 def validate_tearDownClass():
     if at_exit_set:
-        raise RuntimeError("tearDownClass does not calls the super's "
+        raise RuntimeError("tearDownClass does not call the super's "
                            "tearDownClass in these classes: "
                            + str(at_exit_set) + "\n"
                            "If you see the exception, with another "
-                           "exception please do not report this one!"
-                           "If you are changing tempest code, make sure you",
+                           "exception please do not report this one! "
+                           "If you are changing tempest code, make sure you "
                            "are calling the super class's tearDownClass!")
 
 atexit.register(validate_tearDownClass)
diff --git a/tempest/tests/test_wrappers.py b/tempest/tests/test_wrappers.py
index dd0ea61..f6ed445 100644
--- a/tempest/tests/test_wrappers.py
+++ b/tempest/tests/test_wrappers.py
@@ -27,6 +27,7 @@
         super(TestWrappers, self).setUp()
         # Setup test dirs
         self.directory = tempfile.mkdtemp(prefix='tempest-unit')
+        self.addCleanup(shutil.rmtree, self.directory)
         self.test_dir = os.path.join(self.directory, 'tests')
         os.mkdir(self.test_dir)
         # Setup Test files