From cbf480ffa2933daf1ee736229fd0151ec239b92a Mon Sep 17 00:00:00 2001 From: Ghanshyam Date: Thu, 11 Jul 2019 11:53:57 +0000 Subject: [PATCH] Fix request body for compute unshelve action API Compute unshelve action API accept request body with action name and null value. For exmaple: {'unshelve': null}. But Tempest pass the empty dict instead of null- {'unshelve': {}}. This works fine till 2.77 microversionbut after that nova started rejecting the empty dict {}. Defaulting the request body to None so that it works for older as well newer microversion. Closes-Bug: #1836187 - https://developer.openstack.org/api-ref/compute/?expanded=unshelve-restore-shelved-server-unshelve-action-detail#unshelve-restore-shelved-server-unshelve-action Change-Id: I5b4be77d5ae88aedf6fd700e34a293064e655ba8 --- tempest/lib/services/compute/servers_client.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tempest/lib/services/compute/servers_client.py b/tempest/lib/services/compute/servers_client.py index f2270f83e8..0b47c20a8a 100644 --- a/tempest/lib/services/compute/servers_client.py +++ b/tempest/lib/services/compute/servers_client.py @@ -204,7 +204,10 @@ class ServersClient(base_compute_client.BaseComputeClient): def action(self, server_id, action_name, schema=schema.server_actions_common_schema, **kwargs): - post_body = json.dumps({action_name: kwargs}) + if 'body' in kwargs: + post_body = json.dumps(kwargs['body']) + else: + post_body = json.dumps({action_name: kwargs}) resp, body = self.post('servers/%s/action' % server_id, post_body) if body: @@ -598,6 +601,15 @@ class ServersClient(base_compute_client.BaseComputeClient): API reference: https://developer.openstack.org/api-ref/compute/#unshelve-restore-shelved-server-unshelve-action """ + # NOTE(gmann): pass None as request body if nothing is requested. + # Nova started the request body check since 2.77 microversion and only + # accept AZ or None as valid req body and reject the empty dict {}. + # Before 2.77 microverison anything is valid body as Nova does not + # check the request body but as per api-ref None is valid request + # body to pass so we do not need to check the requested microversion + # here and always default req body to None. + if not kwargs: + kwargs['body'] = {'unshelve': None} return self.action(server_id, 'unshelve', **kwargs) def shelve_offload_server(self, server_id, **kwargs):