Always return chassis UUID in node's API representation

It should be returned no matter if a node belongs to a chassis (in
which case it is that chassis' UUID) or not (in which case it should
be None).

Closes-Bug: #1620749
Change-Id: If088f604ad9bb766d591d29466fdd1456734c8df
This commit is contained in:
Vladyslav Drok 2016-09-22 16:19:34 +03:00
parent e041e238be
commit d42a94a130
3 changed files with 26 additions and 4 deletions

View File

@ -635,7 +635,9 @@ class Node(base.APIBase):
return self._chassis_uuid return self._chassis_uuid
def _set_chassis_uuid(self, value): def _set_chassis_uuid(self, value):
if value and self._chassis_uuid != value: if value in (wtypes.Unset, None):
self._chassis_uuid = value
elif self._chassis_uuid != value:
try: try:
chassis = objects.Chassis.get(pecan.request.context, value) chassis = objects.Chassis.get(pecan.request.context, value)
self._chassis_uuid = chassis.uuid self._chassis_uuid = chassis.uuid
@ -648,8 +650,6 @@ class Node(base.APIBase):
# response for a POST request to create a Port # response for a POST request to create a Port
e.code = http_client.BAD_REQUEST e.code = http_client.BAD_REQUEST
raise raise
elif value == wtypes.Unset:
self._chassis_uuid = wtypes.Unset
uuid = types.uuid uuid = types.uuid
"""Unique UUID for this node""" """Unique UUID for this node"""

View File

@ -1662,9 +1662,12 @@ class TestPost(test_api_base.BaseApiTest):
self.addCleanup(p.stop) self.addCleanup(p.stop)
@mock.patch.object(timeutils, 'utcnow') @mock.patch.object(timeutils, 'utcnow')
def _test_create_node(self, mock_utcnow, headers=None, **kwargs): def _test_create_node(self, mock_utcnow, headers=None,
remove_chassis_uuid=False, **kwargs):
headers = headers or {} headers = headers or {}
ndict = test_api_utils.post_get_test_node(**kwargs) ndict = test_api_utils.post_get_test_node(**kwargs)
if remove_chassis_uuid:
del ndict['chassis_uuid']
test_time = datetime.datetime(2000, 1, 1, 0, 0) test_time = datetime.datetime(2000, 1, 1, 0, 0)
mock_utcnow.return_value = test_time mock_utcnow.return_value = test_time
response = self.post_json('/nodes', ndict, response = self.post_json('/nodes', ndict,
@ -1687,6 +1690,20 @@ class TestPost(test_api_base.BaseApiTest):
def test_create_node(self): def test_create_node(self):
self._test_create_node() self._test_create_node()
def test_create_node_chassis_uuid_always_in_response(self):
result = self._test_create_node(chassis_uuid=None)
self.assertEqual(None, result['chassis_uuid'])
result = self._test_create_node(uuid=uuidutils.generate_uuid(),
remove_chassis_uuid=True)
self.assertEqual(None, result['chassis_uuid'])
def test_create_node_invalid_chassis(self):
ndict = test_api_utils.post_get_test_node(chassis_uuid=0)
response = self.post_json('/nodes', ndict, expect_errors=True)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
self.assertEqual('application/json', response.content_type)
self.assertTrue(response.json['error_message'])
def test_create_node_explicit_network_interface(self): def test_create_node_explicit_network_interface(self):
headers = {api_base.Version.string: '1.20'} headers = {api_base.Version.string: '1.20'}
result = self._test_create_node(headers=headers, result = self._test_create_node(headers=headers,

View File

@ -0,0 +1,5 @@
---
fixes:
- Fixed an issue of not returning ``chassis_uuid`` field of a node in API
responses if it does not belong to a chassis. It should be always returned,
either set to None, or to a corresponding chassis UUID.