Merge "port related volumes tests into nova v3 part2"
diff --git a/tempest/api/compute/v3/volumes/test_attach_volume.py b/tempest/api/compute/v3/servers/test_attach_volume.py
similarity index 87%
rename from tempest/api/compute/v3/volumes/test_attach_volume.py
rename to tempest/api/compute/v3/servers/test_attach_volume.py
index 660de95..4da527c 100644
--- a/tempest/api/compute/v3/volumes/test_attach_volume.py
+++ b/tempest/api/compute/v3/servers/test_attach_volume.py
@@ -23,19 +23,19 @@
 from tempest.test import attr
 
 
-class AttachVolumeTestJSON(base.BaseV2ComputeTest):
+class AttachVolumeV3TestJSON(base.BaseV3ComputeTest):
     _interface = 'json'
     run_ssh = tempest.config.TempestConfig().compute.run_ssh
 
     def __init__(self, *args, **kwargs):
-        super(AttachVolumeTestJSON, self).__init__(*args, **kwargs)
+        super(AttachVolumeV3TestJSON, self).__init__(*args, **kwargs)
         self.server = None
         self.volume = None
         self.attached = False
 
     @classmethod
     def setUpClass(cls):
-        super(AttachVolumeTestJSON, cls).setUpClass()
+        super(AttachVolumeV3TestJSON, cls).setUpClass()
         cls.device = cls.config.compute.volume_device_name
         if not cls.config.service_available.cinder:
             skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
@@ -55,7 +55,7 @@
         # Start a server and wait for it to become ready
         admin_pass = self.image_ssh_password
         resp, server = self.create_test_server(wait_until='ACTIVE',
-                                               adminPass=admin_pass)
+                                               admin_password=admin_pass)
         self.server = server
 
         # Record addresses so that we can ssh later
@@ -93,7 +93,8 @@
         self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
 
         linux_client = RemoteClient(server,
-                                    self.image_ssh_user, server['adminPass'])
+                                    self.image_ssh_user,
+                                    server['admin_password'])
         partitions = linux_client.get_partitions()
         self.assertIn(self.device, partitions)
 
@@ -107,10 +108,11 @@
         self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
 
         linux_client = RemoteClient(server,
-                                    self.image_ssh_user, server['adminPass'])
+                                    self.image_ssh_user,
+                                    server['admin_password'])
         partitions = linux_client.get_partitions()
         self.assertNotIn(self.device, partitions)
 
 
-class AttachVolumeTestXML(AttachVolumeTestJSON):
+class AttachVolumeV3TestXML(AttachVolumeV3TestJSON):
     _interface = 'xml'
diff --git a/tempest/api/compute/v3/volumes/__init__.py b/tempest/api/compute/v3/volumes/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/api/compute/v3/volumes/__init__.py
+++ /dev/null
diff --git a/tempest/api/compute/v3/volumes/test_volumes_get.py b/tempest/api/compute/v3/volumes/test_volumes_get.py
deleted file mode 100644
index ae6996d..0000000
--- a/tempest/api/compute/v3/volumes/test_volumes_get.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-#    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.api.compute import base
-from tempest.common.utils import data_utils
-from tempest.test import attr
-
-
-class VolumesGetTestJSON(base.BaseV2ComputeTest):
-
-    _interface = 'json'
-
-    @classmethod
-    def setUpClass(cls):
-        super(VolumesGetTestJSON, cls).setUpClass()
-        cls.client = cls.volumes_extensions_client
-        if not cls.config.service_available.cinder:
-            skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
-            raise cls.skipException(skip_msg)
-
-    @attr(type='smoke')
-    def test_volume_create_get_delete(self):
-        # CREATE, GET, DELETE Volume
-        volume = None
-        v_name = data_utils.rand_name('Volume-%s-') % self._interface
-        metadata = {'Type': 'work'}
-        # Create volume
-        resp, volume = self.client.create_volume(size=1,
-                                                 display_name=v_name,
-                                                 metadata=metadata)
-        self.addCleanup(self._delete_volume, volume)
-        self.assertEqual(200, resp.status)
-        self.assertIn('id', volume)
-        self.assertIn('displayName', volume)
-        self.assertEqual(volume['displayName'], v_name,
-                         "The created volume name is not equal "
-                         "to the requested name")
-        self.assertTrue(volume['id'] is not None,
-                        "Field volume id is empty or not found.")
-        # Wait for Volume status to become ACTIVE
-        self.client.wait_for_volume_status(volume['id'], 'available')
-        # GET Volume
-        resp, fetched_volume = self.client.get_volume(volume['id'])
-        self.assertEqual(200, resp.status)
-        # Verfication of details of fetched Volume
-        self.assertEqual(v_name,
-                         fetched_volume['displayName'],
-                         'The fetched Volume is different '
-                         'from the created Volume')
-        self.assertEqual(volume['id'],
-                         fetched_volume['id'],
-                         'The fetched Volume is different '
-                         'from the created Volume')
-        self.assertEqual(metadata,
-                         fetched_volume['metadata'],
-                         'The fetched Volume is different '
-                         'from the created Volume')
-
-    @attr(type='gate')
-    def test_volume_get_metadata_none(self):
-        # CREATE, GET empty metadata dict
-        v_name = data_utils.rand_name('Volume-')
-        # Create volume
-        resp, volume = self.client.create_volume(size=1,
-                                                 display_name=v_name,
-                                                 metadata={})
-        self.addCleanup(self._delete_volume, volume)
-        self.assertEqual(200, resp.status)
-        self.assertIn('id', volume)
-        self.assertIn('displayName', volume)
-        # Wait for Volume status to become ACTIVE
-        self.client.wait_for_volume_status(volume['id'], 'available')
-        # GET Volume
-        resp, fetched_volume = self.client.get_volume(volume['id'])
-        self.assertEqual(200, resp.status)
-        self.assertEqual(fetched_volume['metadata'], {})
-
-    def _delete_volume(self, volume):
-        # Delete the Volume created in this method
-        try:
-            resp, _ = self.client.delete_volume(volume['id'])
-            self.assertEqual(202, resp.status)
-            # Checking if the deleted Volume still exists
-            self.client.wait_for_resource_deletion(volume['id'])
-        except KeyError:
-            return
-
-
-class VolumesGetTestXML(VolumesGetTestJSON):
-    _interface = "xml"
diff --git a/tempest/api/compute/v3/volumes/test_volumes_list.py b/tempest/api/compute/v3/volumes/test_volumes_list.py
deleted file mode 100644
index b57dcfe..0000000
--- a/tempest/api/compute/v3/volumes/test_volumes_list.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-#    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.api.compute import base
-from tempest.common.utils import data_utils
-from tempest.test import attr
-
-
-class VolumesTestJSON(base.BaseV2ComputeTest):
-
-    """
-    This test creates a number of 1G volumes. To run successfully,
-    ensure that the backing file for the volume group that Nova uses
-    has space for at least 3 1G volumes!
-    If you are running a Devstack environment, ensure that the
-    VOLUME_BACKING_FILE_SIZE is atleast 4G in your localrc
-    """
-
-    _interface = 'json'
-
-    @classmethod
-    def setUpClass(cls):
-        super(VolumesTestJSON, cls).setUpClass()
-        cls.client = cls.volumes_extensions_client
-        if not cls.config.service_available.cinder:
-            skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
-            raise cls.skipException(skip_msg)
-        # Create 3 Volumes
-        cls.volume_list = []
-        cls.volume_id_list = []
-        for i in range(3):
-            v_name = data_utils.rand_name('volume-%s' % cls._interface)
-            metadata = {'Type': 'work'}
-            try:
-                resp, volume = cls.client.create_volume(size=1,
-                                                        display_name=v_name,
-                                                        metadata=metadata)
-                cls.client.wait_for_volume_status(volume['id'], 'available')
-                resp, volume = cls.client.get_volume(volume['id'])
-                cls.volume_list.append(volume)
-                cls.volume_id_list.append(volume['id'])
-            except Exception:
-                if cls.volume_list:
-                    # We could not create all the volumes, though we were able
-                    # to create *some* of the volumes. This is typically
-                    # because the backing file size of the volume group is
-                    # too small. So, here, we clean up whatever we did manage
-                    # to create and raise a SkipTest
-                    for volume in cls.volume_list:
-                        cls.client.delete_volume(volume)
-                    msg = ("Failed to create ALL necessary volumes to run "
-                           "test. This typically means that the backing file "
-                           "size of the nova-volumes group is too small to "
-                           "create the 3 volumes needed by this test case")
-                    raise cls.skipException(msg)
-                raise
-
-    @classmethod
-    def tearDownClass(cls):
-        # Delete the created Volumes
-        for volume in cls.volume_list:
-            resp, _ = cls.client.delete_volume(volume['id'])
-            cls.client.wait_for_resource_deletion(volume['id'])
-        super(VolumesTestJSON, cls).tearDownClass()
-
-    @attr(type='gate')
-    def test_volume_list(self):
-        # Should return the list of Volumes
-        # Fetch all Volumes
-        resp, fetched_list = self.client.list_volumes()
-        self.assertEqual(200, resp.status)
-        # Now check if all the Volumes created in setup are in fetched list
-        missing_volumes = [
-            v for v in self.volume_list if v not in fetched_list
-        ]
-
-        self.assertFalse(missing_volumes,
-                         "Failed to find volume %s in fetched list" %
-                         ', '.join(m_vol['displayName']
-                                   for m_vol in missing_volumes))
-
-    @attr(type='gate')
-    def test_volume_list_with_details(self):
-        # Should return the list of Volumes with details
-        # Fetch all Volumes
-        resp, fetched_list = self.client.list_volumes_with_detail()
-        self.assertEqual(200, resp.status)
-        # Now check if all the Volumes created in setup are in fetched list
-        missing_volumes = [
-            v for v in self.volume_list if v not in fetched_list
-        ]
-
-        self.assertFalse(missing_volumes,
-                         "Failed to find volume %s in fetched list" %
-                         ', '.join(m_vol['displayName']
-                                   for m_vol in missing_volumes))
-
-    @attr(type='gate')
-    def test_volume_list_param_limit(self):
-        # Return the list of volumes based on limit set
-        params = {'limit': 2}
-        resp, fetched_vol_list = self.client.list_volumes(params=params)
-        self.assertEqual(200, resp.status)
-
-        self.assertEqual(len(fetched_vol_list), params['limit'],
-                         "Failed to list volumes by limit set")
-
-    @attr(type='gate')
-    def test_volume_list_with_detail_param_limit(self):
-        # Return the list of volumes with details based on limit set.
-        params = {'limit': 2}
-        resp, fetched_vol_list = \
-            self.client.list_volumes_with_detail(params=params)
-        self.assertEqual(200, resp.status)
-
-        self.assertEqual(len(fetched_vol_list), params['limit'],
-                         "Failed to list volume details by limit set")
-
-    @attr(type='gate')
-    def test_volume_list_param_offset_and_limit(self):
-        # Return the list of volumes based on offset and limit set.
-        # get all volumes list
-        response, all_vol_list = self.client.list_volumes()
-        params = {'offset': 1, 'limit': 1}
-        resp, fetched_vol_list = self.client.list_volumes(params=params)
-        self.assertEqual(200, resp.status)
-
-        # Validating length of the fetched volumes
-        self.assertEqual(len(fetched_vol_list), params['limit'],
-                         "Failed to list volumes by offset and limit")
-        # Validating offset of fetched volume
-        for index, volume in enumerate(fetched_vol_list):
-            self.assertEqual(volume['id'],
-                             all_vol_list[index + params['offset']]['id'],
-                             "Failed to list volumes by offset and limit")
-
-    @attr(type='gate')
-    def test_volume_list_with_detail_param_offset_and_limit(self):
-        # Return the list of volumes details based on offset and limit set.
-        # get all volumes list
-        response, all_vol_list = self.client.list_volumes_with_detail()
-        params = {'offset': 1, 'limit': 1}
-        resp, fetched_vol_list = \
-            self.client.list_volumes_with_detail(params=params)
-        self.assertEqual(200, resp.status)
-
-        # Validating length of the fetched volumes
-        self.assertEqual(len(fetched_vol_list), params['limit'],
-                         "Failed to list volume details by offset and limit")
-        # Validating offset of fetched volume
-        for index, volume in enumerate(fetched_vol_list):
-            self.assertEqual(volume['id'],
-                             all_vol_list[index + params['offset']]['id'],
-                             "Failed to list volume details by "
-                             "offset and limit")
-
-
-class VolumesTestXML(VolumesTestJSON):
-    _interface = 'xml'
diff --git a/tempest/api/compute/v3/volumes/test_volumes_negative.py b/tempest/api/compute/v3/volumes/test_volumes_negative.py
deleted file mode 100644
index 785902e..0000000
--- a/tempest/api/compute/v3/volumes/test_volumes_negative.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-#    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 uuid
-
-from tempest.api.compute import base
-from tempest.common.utils import data_utils
-from tempest import exceptions
-from tempest.test import attr
-
-
-class VolumesNegativeTest(base.BaseV2ComputeTest):
-    _interface = 'json'
-
-    @classmethod
-    def setUpClass(cls):
-        super(VolumesNegativeTest, cls).setUpClass()
-        cls.client = cls.volumes_extensions_client
-        if not cls.config.service_available.cinder:
-            skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
-            raise cls.skipException(skip_msg)
-
-    @attr(type=['negative', 'gate'])
-    def test_volume_get_nonexistant_volume_id(self):
-        # Negative: Should not be able to get details of nonexistant volume
-        # Creating a nonexistant volume id
-        # Trying to GET a non existant volume
-        self.assertRaises(exceptions.NotFound, self.client.get_volume,
-                          str(uuid.uuid4()))
-
-    @attr(type=['negative', 'gate'])
-    def test_volume_delete_nonexistant_volume_id(self):
-        # Negative: Should not be able to delete nonexistant Volume
-        # Creating nonexistant volume id
-        # Trying to DELETE a non existant volume
-        self.assertRaises(exceptions.NotFound, self.client.delete_volume,
-                          str(uuid.uuid4()))
-
-    @attr(type=['negative', 'gate'])
-    def test_create_volume_with_invalid_size(self):
-        # Negative: Should not be able to create volume with invalid size
-        # in request
-        v_name = data_utils.rand_name('Volume-')
-        metadata = {'Type': 'work'}
-        self.assertRaises(exceptions.BadRequest, self.client.create_volume,
-                          size='#$%', display_name=v_name, metadata=metadata)
-
-    @attr(type=['negative', 'gate'])
-    def test_create_volume_with_out_passing_size(self):
-        # Negative: Should not be able to create volume without passing size
-        # in request
-        v_name = data_utils.rand_name('Volume-')
-        metadata = {'Type': 'work'}
-        self.assertRaises(exceptions.BadRequest, self.client.create_volume,
-                          size='', display_name=v_name, metadata=metadata)
-
-    @attr(type=['negative', 'gate'])
-    def test_create_volume_with_size_zero(self):
-        # Negative: Should not be able to create volume with size zero
-        v_name = data_utils.rand_name('Volume-')
-        metadata = {'Type': 'work'}
-        self.assertRaises(exceptions.BadRequest, self.client.create_volume,
-                          size='0', display_name=v_name, metadata=metadata)
-
-    @attr(type=['negative', 'gate'])
-    def test_get_invalid_volume_id(self):
-        # Negative: Should not be able to get volume with invalid id
-        self.assertRaises(exceptions.NotFound,
-                          self.client.get_volume, '#$%%&^&^')
-
-    @attr(type=['negative', 'gate'])
-    def test_get_volume_without_passing_volume_id(self):
-        # Negative: Should not be able to get volume when empty ID is passed
-        self.assertRaises(exceptions.NotFound, self.client.get_volume, '')
-
-    @attr(type=['negative', 'gate'])
-    def test_delete_invalid_volume_id(self):
-        # Negative: Should not be able to delete volume when invalid ID is
-        # passed
-        self.assertRaises(exceptions.NotFound,
-                          self.client.delete_volume, '!@#$%^&*()')
-
-    @attr(type=['negative', 'gate'])
-    def test_delete_volume_without_passing_volume_id(self):
-        # Negative: Should not be able to delete volume when empty ID is passed
-        self.assertRaises(exceptions.NotFound, self.client.delete_volume, '')
-
-
-class VolumesNegativeTestXML(VolumesNegativeTest):
-    _interface = "xml"