Skip to content

Commit ae00019

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Fix volume create --image"
2 parents 6d589ac + 39116bf commit ae00019

3 files changed

Lines changed: 174 additions & 3 deletions

File tree

‎openstackclient/tests/volume/v1/fakes.py‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,24 @@
6565
'links': extension_links,
6666
}
6767

68+
# NOTE(dtroyer): duplicating here the minimum image info needed to test
69+
# volume create --image until circular references can be
70+
# avoided by refactoring the test fakes.
71+
72+
image_id = 'im1'
73+
image_name = 'graven'
74+
75+
76+
IMAGE = {
77+
'id': image_id,
78+
'name': image_name,
79+
}
80+
81+
82+
class FakeImagev1Client(object):
83+
def __init__(self, **kwargs):
84+
self.images = mock.Mock()
85+
6886

6987
class FakeVolumev1Client(object):
7088
def __init__(self, **kwargs):
@@ -91,3 +109,8 @@ def setUp(self):
91109
endpoint=fakes.AUTH_URL,
92110
token=fakes.AUTH_TOKEN,
93111
)
112+
113+
self.app.client_manager.image = FakeImagev1Client(
114+
endpoint=fakes.AUTH_URL,
115+
token=fakes.AUTH_TOKEN,
116+
)

‎openstackclient/tests/volume/v1/test_volume.py‎

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ def setUp(self):
3838
self.users_mock = self.app.client_manager.identity.users
3939
self.users_mock.reset_mock()
4040

41+
# Get a shortcut to the ImageManager Mock
42+
self.images_mock = self.app.client_manager.image.images
43+
self.images_mock.reset_mock()
44+
4145

4246
# TODO(dtroyer): The volume create tests are incomplete, only the minimal
4347
# options and the options that require additional processing
@@ -389,3 +393,135 @@ def test_volume_create_properties(self):
389393
volume_fakes.volume_type,
390394
)
391395
self.assertEqual(datalist, data)
396+
397+
def test_volume_create_image_id(self):
398+
self.images_mock.get.return_value = fakes.FakeResource(
399+
None,
400+
copy.deepcopy(volume_fakes.IMAGE),
401+
loaded=True,
402+
)
403+
404+
arglist = [
405+
'--image', volume_fakes.image_id,
406+
'--size', str(volume_fakes.volume_size),
407+
volume_fakes.volume_name,
408+
]
409+
verifylist = [
410+
('image', volume_fakes.image_id),
411+
('size', volume_fakes.volume_size),
412+
('name', volume_fakes.volume_name),
413+
]
414+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
415+
416+
# DisplayCommandBase.take_action() returns two tuples
417+
columns, data = self.cmd.take_action(parsed_args)
418+
419+
# VolumeManager.create(size, snapshot_id=, source_volid=,
420+
# display_name=, display_description=,
421+
# volume_type=, user_id=,
422+
# project_id=, availability_zone=,
423+
# metadata=, imageRef=)
424+
self.volumes_mock.create.assert_called_with(
425+
volume_fakes.volume_size,
426+
None,
427+
None,
428+
volume_fakes.volume_name,
429+
None,
430+
None,
431+
None,
432+
None,
433+
None,
434+
None,
435+
volume_fakes.image_id,
436+
)
437+
438+
collist = (
439+
'attach_status',
440+
'availability_zone',
441+
'display_description',
442+
'display_name',
443+
'id',
444+
'properties',
445+
'size',
446+
'status',
447+
'type',
448+
)
449+
self.assertEqual(collist, columns)
450+
datalist = (
451+
'detached',
452+
volume_fakes.volume_zone,
453+
volume_fakes.volume_description,
454+
volume_fakes.volume_name,
455+
volume_fakes.volume_id,
456+
volume_fakes.volume_metadata_str,
457+
volume_fakes.volume_size,
458+
'',
459+
volume_fakes.volume_type,
460+
)
461+
self.assertEqual(datalist, data)
462+
463+
def test_volume_create_image_name(self):
464+
self.images_mock.get.return_value = fakes.FakeResource(
465+
None,
466+
copy.deepcopy(volume_fakes.IMAGE),
467+
loaded=True,
468+
)
469+
470+
arglist = [
471+
'--image', volume_fakes.image_name,
472+
'--size', str(volume_fakes.volume_size),
473+
volume_fakes.volume_name,
474+
]
475+
verifylist = [
476+
('image', volume_fakes.image_name),
477+
('size', volume_fakes.volume_size),
478+
('name', volume_fakes.volume_name),
479+
]
480+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
481+
482+
# DisplayCommandBase.take_action() returns two tuples
483+
columns, data = self.cmd.take_action(parsed_args)
484+
485+
# VolumeManager.create(size, snapshot_id=, source_volid=,
486+
# display_name=, display_description=,
487+
# volume_type=, user_id=,
488+
# project_id=, availability_zone=,
489+
# metadata=, imageRef=)
490+
self.volumes_mock.create.assert_called_with(
491+
volume_fakes.volume_size,
492+
None,
493+
None,
494+
volume_fakes.volume_name,
495+
None,
496+
None,
497+
None,
498+
None,
499+
None,
500+
None,
501+
volume_fakes.image_id,
502+
)
503+
504+
collist = (
505+
'attach_status',
506+
'availability_zone',
507+
'display_description',
508+
'display_name',
509+
'id',
510+
'properties',
511+
'size',
512+
'status',
513+
'type',
514+
)
515+
self.assertEqual(collist, columns)
516+
datalist = (
517+
'detached',
518+
volume_fakes.volume_zone,
519+
volume_fakes.volume_description,
520+
volume_fakes.volume_name,
521+
volume_fakes.volume_id,
522+
volume_fakes.volume_metadata_str,
523+
volume_fakes.volume_size,
524+
'',
525+
volume_fakes.volume_type,
526+
)
527+
self.assertEqual(datalist, data)

‎openstackclient/volume/v1/volume.py‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def take_action(self, parsed_args):
9999
self.log.debug('take_action(%s)', parsed_args)
100100

101101
identity_client = self.app.client_manager.identity
102+
image_client = self.app.client_manager.image
102103
volume_client = self.app.client_manager.volume
103104

104105
source_volume = None
@@ -111,12 +112,23 @@ def take_action(self, parsed_args):
111112
project = None
112113
if parsed_args.project:
113114
project = utils.find_resource(
114-
identity_client.tenants, parsed_args.project).id
115+
identity_client.tenants,
116+
parsed_args.project,
117+
).id
115118

116119
user = None
117120
if parsed_args.user:
118121
user = utils.find_resource(
119-
identity_client.users, parsed_args.user).id
122+
identity_client.users,
123+
parsed_args.user,
124+
).id
125+
126+
image = None
127+
if parsed_args.image:
128+
image = utils.find_resource(
129+
image_client.images,
130+
parsed_args.image,
131+
).id
120132

121133
volume = volume_client.volumes.create(
122134
parsed_args.size,
@@ -129,7 +141,7 @@ def take_action(self, parsed_args):
129141
project,
130142
parsed_args.availability_zone,
131143
parsed_args.property,
132-
parsed_args.image
144+
image,
133145
)
134146
# Map 'metadata' column to 'properties'
135147
volume._info.update(

0 commit comments

Comments
 (0)