Merge "Fix wrong attribute name and add functional test for --snapshot"
This commit is contained in:
		| @@ -11,6 +11,7 @@ | |||||||
| #    under the License. | #    under the License. | ||||||
|  |  | ||||||
| import os | import os | ||||||
|  | import time | ||||||
| import uuid | import uuid | ||||||
|  |  | ||||||
| from functional.common import test | from functional.common import test | ||||||
| @@ -20,6 +21,8 @@ class VolumeTests(test.TestCase): | |||||||
|     """Functional tests for volume. """ |     """Functional tests for volume. """ | ||||||
|  |  | ||||||
|     NAME = uuid.uuid4().hex |     NAME = uuid.uuid4().hex | ||||||
|  |     SNAPSHOT_NAME = uuid.uuid4().hex | ||||||
|  |     VOLUME_FROM_SNAPSHOT_NAME = uuid.uuid4().hex | ||||||
|     OTHER_NAME = uuid.uuid4().hex |     OTHER_NAME = uuid.uuid4().hex | ||||||
|     HEADERS = ['"Display Name"'] |     HEADERS = ['"Display Name"'] | ||||||
|     FIELDS = ['name'] |     FIELDS = ['name'] | ||||||
| @@ -28,17 +31,20 @@ class VolumeTests(test.TestCase): | |||||||
|     def setUpClass(cls): |     def setUpClass(cls): | ||||||
|         os.environ['OS_VOLUME_API_VERSION'] = '2' |         os.environ['OS_VOLUME_API_VERSION'] = '2' | ||||||
|         opts = cls.get_show_opts(cls.FIELDS) |         opts = cls.get_show_opts(cls.FIELDS) | ||||||
|  |  | ||||||
|  |         # Create test volume | ||||||
|         raw_output = cls.openstack('volume create --size 1 ' + cls.NAME + opts) |         raw_output = cls.openstack('volume create --size 1 ' + cls.NAME + opts) | ||||||
|         expected = cls.NAME + '\n' |         expected = cls.NAME + '\n' | ||||||
|         cls.assertOutput(expected, raw_output) |         cls.assertOutput(expected, raw_output) | ||||||
|  |  | ||||||
|     @classmethod |     @classmethod | ||||||
|     def tearDownClass(cls): |     def tearDownClass(cls): | ||||||
|         # Rename test |         # Rename test volume | ||||||
|         raw_output = cls.openstack( |         raw_output = cls.openstack( | ||||||
|             'volume set --name ' + cls.OTHER_NAME + ' ' + cls.NAME) |             'volume set --name ' + cls.OTHER_NAME + ' ' + cls.NAME) | ||||||
|         cls.assertOutput('', raw_output) |         cls.assertOutput('', raw_output) | ||||||
|         # Delete test |  | ||||||
|  |         # Delete test volume | ||||||
|         raw_output = cls.openstack('volume delete ' + cls.OTHER_NAME) |         raw_output = cls.openstack('volume delete ' + cls.OTHER_NAME) | ||||||
|         cls.assertOutput('', raw_output) |         cls.assertOutput('', raw_output) | ||||||
|  |  | ||||||
| @@ -78,3 +84,47 @@ class VolumeTests(test.TestCase): | |||||||
|         opts = self.get_show_opts(["name", "size"]) |         opts = self.get_show_opts(["name", "size"]) | ||||||
|         raw_output = self.openstack('volume show ' + self.NAME + opts) |         raw_output = self.openstack('volume show ' + self.NAME + opts) | ||||||
|         self.assertEqual(self.NAME + "\n2\n", raw_output) |         self.assertEqual(self.NAME + "\n2\n", raw_output) | ||||||
|  |  | ||||||
|  |     def test_volume_snapshot(self): | ||||||
|  |         opts = self.get_show_opts(self.FIELDS) | ||||||
|  |  | ||||||
|  |         # Create snapshot from test volume | ||||||
|  |         raw_output = self.openstack('snapshot create ' + self.NAME + | ||||||
|  |                                     ' --name ' + self.SNAPSHOT_NAME + opts) | ||||||
|  |         expected = self.SNAPSHOT_NAME + '\n' | ||||||
|  |         self.assertOutput(expected, raw_output) | ||||||
|  |         self.wait_for("snapshot", self.SNAPSHOT_NAME, "available") | ||||||
|  |  | ||||||
|  |         # Create volume from snapshot | ||||||
|  |         raw_output = self.openstack('volume create --size 2 --snapshot ' + | ||||||
|  |                                     self.SNAPSHOT_NAME + ' ' + | ||||||
|  |                                     self.VOLUME_FROM_SNAPSHOT_NAME + opts) | ||||||
|  |         expected = self.VOLUME_FROM_SNAPSHOT_NAME + '\n' | ||||||
|  |         self.assertOutput(expected, raw_output) | ||||||
|  |         self.wait_for("volume", self.VOLUME_FROM_SNAPSHOT_NAME, "available") | ||||||
|  |  | ||||||
|  |         # Delete volume that create from snapshot | ||||||
|  |         raw_output = self.openstack('volume delete ' + | ||||||
|  |                                     self.VOLUME_FROM_SNAPSHOT_NAME) | ||||||
|  |         self.assertOutput('', raw_output) | ||||||
|  |  | ||||||
|  |         # Delete test snapshot | ||||||
|  |         raw_output = self.openstack('snapshot delete ' + self.SNAPSHOT_NAME) | ||||||
|  |         self.assertOutput('', raw_output) | ||||||
|  |  | ||||||
|  |     def wait_for(self, check_type, check_name, desired_status, wait=120, | ||||||
|  |                  interval=5, failures=['ERROR']): | ||||||
|  |         status = "notset" | ||||||
|  |         total_sleep = 0 | ||||||
|  |         opts = self.get_show_opts(['status']) | ||||||
|  |         while total_sleep < wait: | ||||||
|  |             status = self.openstack(check_type + ' show ' + check_name + opts) | ||||||
|  |             status = status.rstrip() | ||||||
|  |             print('Checking {} {} Waiting for {} current status: {}' | ||||||
|  |                   .format(check_type, check_name, desired_status, status)) | ||||||
|  |             if status == desired_status: | ||||||
|  |                 break | ||||||
|  |             self.assertNotIn(status, failures) | ||||||
|  |             time.sleep(interval) | ||||||
|  |             total_sleep += interval | ||||||
|  |         self.assertEqual(desired_status, status) | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ | |||||||
|  |  | ||||||
| import copy | import copy | ||||||
|  |  | ||||||
|  | import mock | ||||||
| from mock import call | from mock import call | ||||||
|  |  | ||||||
| from openstackclient.common import utils | from openstackclient.common import utils | ||||||
| @@ -40,6 +41,9 @@ class TestVolume(volume_fakes.TestVolume): | |||||||
|         self.images_mock = self.app.client_manager.image.images |         self.images_mock = self.app.client_manager.image.images | ||||||
|         self.images_mock.reset_mock() |         self.images_mock.reset_mock() | ||||||
|  |  | ||||||
|  |         self.snapshots_mock = self.app.client_manager.volume.volume_snapshots | ||||||
|  |         self.snapshots_mock.reset_mock() | ||||||
|  |  | ||||||
|     def setup_volumes_mock(self, count): |     def setup_volumes_mock(self, count): | ||||||
|         volumes = volume_fakes.FakeVolume.create_volumes(count=count) |         volumes = volume_fakes.FakeVolume.create_volumes(count=count) | ||||||
|  |  | ||||||
| @@ -376,6 +380,45 @@ class TestVolumeCreate(TestVolume): | |||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         self.assertEqual(self.datalist, data) |         self.assertEqual(self.datalist, data) | ||||||
|  |  | ||||||
|  |     def test_volume_create_with_snapshot(self): | ||||||
|  |         arglist = [ | ||||||
|  |             '--size', str(self.new_volume.size), | ||||||
|  |             '--snapshot', volume_fakes.snapshot_id, | ||||||
|  |             self.new_volume.name, | ||||||
|  |         ] | ||||||
|  |         verifylist = [ | ||||||
|  |             ('size', self.new_volume.size), | ||||||
|  |             ('snapshot', volume_fakes.snapshot_id), | ||||||
|  |             ('name', self.new_volume.name), | ||||||
|  |         ] | ||||||
|  |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
|  |         fake_snapshot = mock.Mock() | ||||||
|  |         fake_snapshot.id = volume_fakes.snapshot_id | ||||||
|  |         self.snapshots_mock.get.return_value = fake_snapshot | ||||||
|  |  | ||||||
|  |         # In base command class ShowOne in cliff, abstract method take_action() | ||||||
|  |         # returns a two-part tuple with a tuple of column names and a tuple of | ||||||
|  |         # data to be shown. | ||||||
|  |         columns, data = self.cmd.take_action(parsed_args) | ||||||
|  |  | ||||||
|  |         self.volumes_mock.create.assert_called_once_with( | ||||||
|  |             size=self.new_volume.size, | ||||||
|  |             snapshot_id=fake_snapshot.id, | ||||||
|  |             name=self.new_volume.name, | ||||||
|  |             description=None, | ||||||
|  |             volume_type=None, | ||||||
|  |             user_id=None, | ||||||
|  |             project_id=None, | ||||||
|  |             availability_zone=None, | ||||||
|  |             metadata=None, | ||||||
|  |             imageRef=None, | ||||||
|  |             source_volid=None | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         self.assertEqual(self.columns, columns) | ||||||
|  |         self.assertEqual(self.datalist, data) | ||||||
|  |  | ||||||
|  |  | ||||||
| class TestVolumeDelete(TestVolume): | class TestVolumeDelete(TestVolume): | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jenkins
					Jenkins