Moved swift container cleanup to a class method.

The same piece of code was used in almost every tearDownClass method, moved it
into a separate method to remove code redundancy.

Change-Id: I173af3f46fc2f6771237ab29b472249b00a9ed2d
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index 745de22..bf013ec 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -47,3 +47,31 @@
         except exceptions.EndpointNotFound:
             skip_msg = "No OpenStack Object Storage API endpoint"
             raise cls.skipException(skip_msg)
+
+    @classmethod
+    def delete_containers(cls, containers, container_client=None,
+                          object_client=None):
+        """Remove given containers and all objects in them.
+
+        The containers should be visible from the container_client given.
+        Will not throw any error if the containers don't exist.
+
+        :param containers: list of container names to remove
+        :param container_client: if None, use cls.container_client, this means
+            that the default testing user will be used (see 'username' in
+            'etc/tempest.conf')
+        :param object_client: if None, use cls.object_client
+        """
+        if container_client is None:
+            container_client = cls.container_client
+        if object_client is None:
+            object_client = cls.object_client
+        for cont in containers:
+            try:
+                objlist = container_client.list_all_container_objects(cont)
+                # delete every object in the container
+                for obj in objlist:
+                    object_client.delete_object(cont, obj['name'])
+                container_client.delete_container(cont)
+            except exceptions.NotFound:
+                pass
diff --git a/tempest/api/object_storage/test_container_services.py b/tempest/api/object_storage/test_container_services.py
index 0b4b57b..70f704f 100644
--- a/tempest/api/object_storage/test_container_services.py
+++ b/tempest/api/object_storage/test_container_services.py
@@ -29,15 +29,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        for container in cls.containers:
-            objlist = \
-                cls.container_client.list_all_container_objects(container)
-            # delete every object in the container
-            for obj in objlist:
-                resp, _ = \
-                    cls.object_client.delete_object(container, obj['name'])
-            # delete the container
-            resp, _ = cls.container_client.delete_container(container)
+        cls.delete_containers(cls.containers)
 
     @attr(type='smoke')
     def test_create_container(self):
@@ -125,8 +117,3 @@
         self.assertEqual(resp['status'], '204')
         self.assertNotIn('x-container-meta-name', resp)
         self.assertNotIn('x-container-meta-description', resp)
-
-        # delete container
-        resp, _ = self.container_client.delete_container(container_name)
-        self.assertEqual(resp['status'], '204')
-        self.containers.remove(container_name)
diff --git a/tempest/api/object_storage/test_container_sync.py b/tempest/api/object_storage/test_container_sync.py
index 3243990..64f227c 100644
--- a/tempest/api/object_storage/test_container_sync.py
+++ b/tempest/api/object_storage/test_container_sync.py
@@ -48,14 +48,8 @@
 
     @classmethod
     def tearDownClass(cls):
-        for cont_name, client in cls.clients.items():
-            objlist = client[0].list_all_container_objects(cont_name)
-            # delete every object in the container
-            if objlist:
-                for obj in objlist:
-                    resp, _ = client[1].delete_object(cont_name, obj['name'])
-            # delete the container
-            resp, _ = client[0].delete_container(cont_name)
+        for client in cls.clients.values():
+            cls.delete_containers(cls.containers, client[0], client[1])
 
     @testtools.skip('Until Bug #1093743 is resolved.')
     @attr(type='positive')
diff --git a/tempest/api/object_storage/test_object_expiry.py b/tempest/api/object_storage/test_object_expiry.py
index 1fe47ea..837c085 100644
--- a/tempest/api/object_storage/test_object_expiry.py
+++ b/tempest/api/object_storage/test_object_expiry.py
@@ -39,15 +39,7 @@
         But delete action for the expired object is raising
         NotFound exception and also non empty container cannot be deleted.
         """
-        objlist = \
-            cls.container_client.list_all_container_objects(cls.container_name)
-        # delete every object in the container
-        if objlist:
-            for obj in objlist:
-                resp, _ = cls.object_client.delete_object(cls.container_name,
-                                                          obj['name'])
-        # delete the container
-        resp, _ = cls.container_client.delete_container(cls.container_name)
+        cls.delete_containers([cls.container_name])
 
     @testtools.skip('Until Bug #1069849 is resolved.')
     def test_get_object_after_expiry_time(self):
diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py
index 4d7ee74..5c9f59e 100644
--- a/tempest/api/object_storage/test_object_services.py
+++ b/tempest/api/object_storage/test_object_services.py
@@ -32,6 +32,7 @@
         super(ObjectTest, cls).setUpClass()
         cls.container_name = rand_name(name='TestContainer')
         cls.container_client.create_container(cls.container_name)
+        cls.containers = [cls.container_name]
 
         cls.data.setup_test_user()
         resp, body = cls.token_client.auth(cls.data.test_user,
@@ -44,14 +45,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        objlist = cls.container_client.list_all_container_objects(
-            cls.container_name)
-        # delete every object in the container
-        for obj in objlist:
-            resp, _ = cls.object_client.delete_object(cls.container_name,
-                                                      obj['name'])
-        # delete the container
-        resp, _ = cls.container_client.delete_container(cls.container_name)
+        cls.delete_containers(cls.containers)
         # delete the user setup created
         cls.data.teardown_all()
 
@@ -198,9 +192,11 @@
         # create a container to use as  asource container
         src_container_name = rand_name(name='TestSourceContainer')
         self.container_client.create_container(src_container_name)
+        self.containers.append(src_container_name)
         # create a container to use as a destination container
         dst_container_name = rand_name(name='TestDestinationContainer')
         self.container_client.create_container(dst_container_name)
+        self.containers.append(dst_container_name)
         # create object in source container
         object_name = rand_name(name='Object')
         data = arbitrary_string(size=len(object_name) * 2,
@@ -233,17 +229,6 @@
         except Exception as e:
             self.fail("Got exception :%s ; while copying"
                       " object across containers" % e)
-        finally:
-            # delete objects from respective containers
-            resp, _ = self.object_client.delete_object(dst_container_name,
-                                                       object_name)
-            resp, _ = self.object_client.delete_object(src_container_name,
-                                                       object_name)
-            # delete containers created in this method
-            resp, _ = self.container_client.delete_container(
-                src_container_name)
-            resp, _ = self.container_client.delete_container(
-                dst_container_name)
 
     @attr(type='negative')
     def test_write_object_without_using_creds(self):
@@ -389,14 +374,7 @@
         self.container_client.create_container(self.container_name)
 
     def tearDown(self):
-        objlist = self.container_client.list_all_container_objects(
-            self.container_name)
-        # delete every object in the container
-        for obj in objlist:
-            resp, _ = self.object_client.delete_object(
-                self.container_name, obj['name'])
-        # delete the container
-        resp, _ = self.container_client.delete_container(self.container_name)
+        self.delete_containers([self.container_name])
         super(PublicObjectTest, self).tearDown()
 
     @attr(type='smoke')
diff --git a/tempest/api/object_storage/test_object_version.py b/tempest/api/object_storage/test_object_version.py
index d449c0a..cda3e4f 100644
--- a/tempest/api/object_storage/test_object_version.py
+++ b/tempest/api/object_storage/test_object_version.py
@@ -28,15 +28,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        for container in cls.containers:
-            objlist = \
-                cls.container_client.list_all_container_objects(container)
-            # delete every object in the container
-            for obj in objlist:
-                resp, _ = \
-                    cls.object_client.delete_object(container, obj['name'])
-            # delete the container
-            resp, _ = cls.container_client.delete_container(container)
+        cls.delete_containers(cls.containers)
 
     def assertContainer(self, container, count, byte, versioned):
         resp, _ = self.container_client.list_container_metadata(container)
@@ -94,10 +86,3 @@
                              vers_container_name)
         self.assertContainer(vers_container_name, '0', '0',
                              'Missing Header')
-        # delete containers
-        resp, _ = self.container_client.delete_container(base_container_name)
-        self.assertEqual(resp['status'], '204')
-        self.containers.remove(base_container_name)
-        resp, _ = self.container_client.delete_container(vers_container_name)
-        self.assertEqual(resp['status'], '204')
-        self.containers.remove(vers_container_name)