Skip to content

Commit eb5416a

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Fix --image-property option in 'create server'"
2 parents 3902efc + fbd2c00 commit eb5416a

3 files changed

Lines changed: 76 additions & 3 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -765,19 +765,27 @@ def _match_image(image_api, wanted_properties):
765765
images_matched = []
766766
for img in image_list:
767767
img_dict = {}
768+
768769
# exclude any unhashable entries
769-
for key, value in img.items():
770+
img_dict_items = list(img.items())
771+
if img.properties:
772+
img_dict_items.extend(list(img.properties.items()))
773+
for key, value in img_dict_items:
770774
try:
771775
set([key, value])
772776
except TypeError:
777+
if key != 'properties':
778+
LOG.debug('Skipped the \'%s\' attribute. '
779+
'That cannot be compared. '
780+
'(image: %s, value: %s)',
781+
key, img.id, value)
773782
pass
774783
else:
775784
img_dict[key] = value
785+
776786
if all(k in img_dict and img_dict[k] == v
777787
for k, v in wanted_properties.items()):
778788
images_matched.append(img)
779-
else:
780-
return []
781789
return images_matched
782790

783791
images = _match_image(image_client, parsed_args.image_property)

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2048,6 +2048,65 @@ def test_server_create_image_property_missed(self):
20482048
self.cmd.take_action,
20492049
parsed_args)
20502050

2051+
def test_server_create_image_property_with_image_list(self):
2052+
arglist = [
2053+
'--image-property',
2054+
'owner_specified.openstack.object=image/cirros',
2055+
'--flavor', 'flavor1',
2056+
'--nic', 'none',
2057+
self.new_server.name,
2058+
]
2059+
2060+
verifylist = [
2061+
('image_property',
2062+
{'owner_specified.openstack.object': 'image/cirros'}),
2063+
('flavor', 'flavor1'),
2064+
('nic', ['none']),
2065+
('server_name', self.new_server.name),
2066+
]
2067+
# create a image_info as the side_effect of the fake image_list()
2068+
image_info = {
2069+
'properties': {
2070+
'owner_specified.openstack.object': 'image/cirros'
2071+
}
2072+
}
2073+
2074+
target_image = image_fakes.FakeImage.create_one_image(image_info)
2075+
another_image = image_fakes.FakeImage.create_one_image({})
2076+
self.images_mock.return_value = [target_image, another_image]
2077+
2078+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2079+
2080+
columns, data = self.cmd.take_action(parsed_args)
2081+
2082+
# Set expected values
2083+
kwargs = dict(
2084+
files={},
2085+
reservation_id=None,
2086+
min_count=1,
2087+
max_count=1,
2088+
security_groups=[],
2089+
userdata=None,
2090+
key_name=None,
2091+
availability_zone=None,
2092+
block_device_mapping_v2=[],
2093+
nics='none',
2094+
meta=None,
2095+
scheduler_hints={},
2096+
config_drive=None,
2097+
)
2098+
2099+
# ServerManager.create(name, image, flavor, **kwargs)
2100+
self.servers_mock.create.assert_called_with(
2101+
self.new_server.name,
2102+
target_image,
2103+
self.flavor,
2104+
**kwargs
2105+
)
2106+
2107+
self.assertEqual(self.columns, columns)
2108+
self.assertEqual(self.datalist(), data)
2109+
20512110
def test_server_create_invalid_hint(self):
20522111
# Not a key-value pair
20532112
arglist = [
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- Support for image search via properties of image. Currently
4+
"openstack server create --image-property" only takes image property.
5+
Now it can also search image via properties (user defined) too.
6+
Story https://storyboard.openstack.org/#!/story/2007860.

0 commit comments

Comments
 (0)