From c9e0c01f67a00e63bb5d8b5781d7e8e87b39136c Mon Sep 17 00:00:00 2001 From: Huanxuan Ao Date: Tue, 27 Sep 2016 12:27:05 +0800 Subject: Add and modify options for "volume create" command 1.Add mutually exclusive options into a mutually exclusive group. 2.Add "--source-replicated", "--consistency-group", "--hint" and "multi-attach" options 3.Make --size option to be optional under some cases Closes-Bug: #1568005 Closes-Bug: #1627913 Implements: bp implement-cinder-features Co-Authored-By: Roman Vasilets Change-Id: I2c4c3073195d33774e477f4d7f22e383b14b41dd --- .../tests/unit/volume/v1/test_volume.py | 62 ++++++++++ .../tests/unit/volume/v2/test_volume.py | 131 +++++++++++++++++++-- 2 files changed, 183 insertions(+), 10 deletions(-) (limited to 'openstackclient/tests') diff --git a/openstackclient/tests/unit/volume/v1/test_volume.py b/openstackclient/tests/unit/volume/v1/test_volume.py index 895f1f87..73c00844 100644 --- a/openstackclient/tests/unit/volume/v1/test_volume.py +++ b/openstackclient/tests/unit/volume/v1/test_volume.py @@ -23,6 +23,7 @@ from osc_lib import utils from openstackclient.tests.unit import fakes from openstackclient.tests.unit.identity.v2_0 import fakes as identity_fakes +from openstackclient.tests.unit import utils as tests_utils from openstackclient.tests.unit.volume.v1 import fakes as volume_fakes from openstackclient.volume.v1 import volume @@ -411,6 +412,67 @@ class TestVolumeCreate(TestVolume): self.assertEqual(self.columns, columns) self.assertEqual(self.datalist, data) + def test_volume_create_with_source(self): + self.volumes_mock.get.return_value = self.new_volume + arglist = [ + '--source', self.new_volume.id, + self.new_volume.display_name, + ] + verifylist = [ + ('source', self.new_volume.id), + ('name', self.new_volume.display_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.volumes_mock.create.assert_called_with( + None, + None, + self.new_volume.id, + self.new_volume.display_name, + None, + None, + None, + None, + None, + None, + None, + ) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) + + def test_volume_create_without_size(self): + arglist = [ + self.new_volume.display_name, + ] + verifylist = [ + ('name', self.new_volume.display_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertRaises(exceptions.CommandError, self.cmd.take_action, + parsed_args) + + def test_volume_create_with_multi_source(self): + arglist = [ + '--image', 'source_image', + '--source', 'source_volume', + '--snapshot', 'source_snapshot', + '--size', str(self.new_volume.size), + self.new_volume.display_name, + ] + verifylist = [ + ('image', 'source_image'), + ('source', 'source_volume'), + ('snapshot', 'source_snapshot'), + ('size', self.new_volume.size), + ('name', self.new_volume.display_name), + ] + + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) + class TestVolumeDelete(TestVolume): diff --git a/openstackclient/tests/unit/volume/v2/test_volume.py b/openstackclient/tests/unit/volume/v2/test_volume.py index 5bdde9de..f4a7c142 100644 --- a/openstackclient/tests/unit/volume/v2/test_volume.py +++ b/openstackclient/tests/unit/volume/v2/test_volume.py @@ -21,6 +21,7 @@ from osc_lib import utils from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes from openstackclient.tests.unit.image.v2 import fakes as image_fakes +from openstackclient.tests.unit import utils as tests_utils from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes from openstackclient.volume.v2 import volume @@ -45,6 +46,10 @@ class TestVolume(volume_fakes.TestVolume): self.snapshots_mock = self.app.client_manager.volume.volume_snapshots self.snapshots_mock.reset_mock() + self.consistencygroups_mock = ( + self.app.client_manager.volume.consistencygroups) + self.consistencygroups_mock.reset_mock() + def setup_volumes_mock(self, count): volumes = volume_fakes.FakeVolume.create_volumes(count=count) @@ -123,18 +128,28 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata=None, imageRef=None, - source_volid=None + source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) self.assertEqual(self.datalist, data) def test_volume_create_options(self): + consistency_group = ( + volume_fakes.FakeConsistencyGroup.create_one_consistency_group()) + self.consistencygroups_mock.get.return_value = consistency_group arglist = [ '--size', str(self.new_volume.size), '--description', self.new_volume.description, '--type', self.new_volume.volume_type, '--availability-zone', self.new_volume.availability_zone, + '--consistency-group', consistency_group.id, + '--hint', 'k=v', + '--multi-attach', self.new_volume.name, ] verifylist = [ @@ -142,6 +157,9 @@ class TestVolumeCreate(TestVolume): ('description', self.new_volume.description), ('type', self.new_volume.volume_type), ('availability_zone', self.new_volume.availability_zone), + ('consistency_group', consistency_group.id), + ('hint', {'k': 'v'}), + ('multi_attach', True), ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -162,7 +180,11 @@ class TestVolumeCreate(TestVolume): availability_zone=self.new_volume.availability_zone, metadata=None, imageRef=None, - source_volid=None + source_volid=None, + consistencygroup_id=consistency_group.id, + source_replica=None, + multiattach=True, + scheduler_hints={'k': 'v'}, ) self.assertEqual(self.columns, columns) @@ -204,7 +226,11 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata=None, imageRef=None, - source_volid=None + source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) @@ -246,7 +272,11 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata=None, imageRef=None, - source_volid=None + source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) @@ -282,7 +312,11 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata={'Alpha': 'a', 'Beta': 'b'}, imageRef=None, - source_volid=None + source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) @@ -321,6 +355,10 @@ class TestVolumeCreate(TestVolume): metadata=None, imageRef=image.id, source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) @@ -358,7 +396,11 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata=None, imageRef=image.id, - source_volid=None + source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) @@ -368,12 +410,10 @@ class TestVolumeCreate(TestVolume): snapshot = volume_fakes.FakeSnapshot.create_one_snapshot() self.new_volume.snapshot_id = snapshot.id arglist = [ - '--size', str(self.new_volume.size), '--snapshot', self.new_volume.snapshot_id, self.new_volume.name, ] verifylist = [ - ('size', self.new_volume.size), ('snapshot', self.new_volume.snapshot_id), ('name', self.new_volume.name), ] @@ -387,7 +427,7 @@ class TestVolumeCreate(TestVolume): columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_once_with( - size=self.new_volume.size, + size=None, snapshot_id=snapshot.id, name=self.new_volume.name, description=None, @@ -397,12 +437,83 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata=None, imageRef=None, - source_volid=None + source_volid=None, + consistencygroup_id=None, + source_replica=None, + multiattach=False, + scheduler_hints=None, ) self.assertEqual(self.columns, columns) self.assertEqual(self.datalist, data) + def test_volume_create_with_source_replicated(self): + self.volumes_mock.get.return_value = self.new_volume + arglist = [ + '--source-replicated', self.new_volume.id, + self.new_volume.name, + ] + verifylist = [ + ('source_replicated', self.new_volume.id), + ('name', self.new_volume.name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.volumes_mock.create.assert_called_once_with( + size=None, + snapshot_id=None, + 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, + consistencygroup_id=None, + source_replica=self.new_volume.id, + multiattach=False, + scheduler_hints=None, + ) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) + + def test_volume_create_without_size(self): + arglist = [ + self.new_volume.name, + ] + verifylist = [ + ('name', self.new_volume.name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertRaises(exceptions.CommandError, self.cmd.take_action, + parsed_args) + + def test_volume_create_with_multi_source(self): + arglist = [ + '--image', 'source_image', + '--source', 'source_volume', + '--snapshot', 'source_snapshot', + '--source-replicated', 'source_replicated_volume', + '--size', str(self.new_volume.size), + self.new_volume.name, + ] + verifylist = [ + ('image', 'source_image'), + ('source', 'source_volume'), + ('snapshot', 'source_snapshot'), + ('source-replicated', 'source_replicated_volume'), + ('size', self.new_volume.size), + ('name', self.new_volume.name), + ] + + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) + class TestVolumeDelete(TestVolume): -- cgit v1.2.1