From 051e9fa22b1b17d8c0405d940c7f7c593fcff28d Mon Sep 17 00:00:00 2001 From: Eyal Date: Tue, 30 Jul 2019 15:15:16 +0300 Subject: [PATCH] Some resource managers are not using the base underscore methods Refactor the base class so they can use these methods Change-Id: I8455772eee4865d535b3002e2d922149fb8f8a6e Closes-bug: #1765087 --- mistralclient/api/base.py | 52 +++++++++++++---------- mistralclient/api/v2/actions.py | 64 ++++++++++------------------- mistralclient/api/v2/workbooks.py | 58 ++++++++------------------ mistralclient/api/v2/workflows.py | 68 ++++++++++++------------------- 4 files changed, 97 insertions(+), 145 deletions(-) diff --git a/mistralclient/api/base.py b/mistralclient/api/base.py index f15244b9..7a71c100 100644 --- a/mistralclient/api/base.py +++ b/mistralclient/api/base.py @@ -128,42 +128,54 @@ class ResourceManager(object): (self.resource_class.__name__, name) ) - def _copy_if_defined(self, data, **kwargs): - for name, value in kwargs.items(): - if value is not None: - data[name] = value + def _validate(self, url, data, response_key=None, dump_json=True, + headers=None, is_iter_resp=False): + return self._create(url, data, response_key, dump_json, + headers, is_iter_resp, resp_status_ok=200, + as_class=False) - def _create(self, url, data, response_key=None, dump_json=True): + def _create(self, url, data, response_key=None, dump_json=True, + headers=None, is_iter_resp=False, resp_status_ok=201, + as_class=True): if dump_json: data = jsonutils.dumps(data) try: - resp = self.http_client.post(url, data) + resp = self.http_client.post(url, data, headers) except exceptions.HttpError as ex: self._raise_api_exception(ex.response) - if resp.status_code != 201: + if resp.status_code != resp_status_ok: self._raise_api_exception(resp) - return self.resource_class(self, extract_json(resp, response_key)) + resource = extract_json(resp, response_key) + if is_iter_resp: + return [self.resource_class(self, resource_data) + for resource_data in resource] + return self.resource_class(self, resource) if as_class else resource - def _update(self, url, data, response_key=None, dump_json=True): + def _update(self, url, data, response_key=None, dump_json=True, + headers=None, is_iter_resp=False): if dump_json: data = jsonutils.dumps(data) try: - resp = self.http_client.put(url, data) + resp = self.http_client.put(url, data, headers) except exceptions.HttpError as ex: self._raise_api_exception(ex.response) if resp.status_code != 200: self._raise_api_exception(resp) - return self.resource_class(self, extract_json(resp, response_key)) + resource = extract_json(resp, response_key) + if is_iter_resp: + return [self.resource_class(self, resource_data) + for resource_data in resource] + return self.resource_class(self, resource) - def _list(self, url, response_key=None): + def _list(self, url, response_key=None, headers=None): try: - resp = self.http_client.get(url) + resp = self.http_client.get(url, headers) except exceptions.HttpError as ex: self._raise_api_exception(ex.response) @@ -173,9 +185,9 @@ class ResourceManager(object): return [self.resource_class(self, resource_data) for resource_data in extract_json(resp, response_key)] - def _get(self, url, response_key=None): + def _get(self, url, response_key=None, headers=None): try: - resp = self.http_client.get(url) + resp = self.http_client.get(url, headers) except exceptions.HttpError as ex: self._raise_api_exception(ex.response) @@ -184,19 +196,17 @@ class ResourceManager(object): else: self._raise_api_exception(resp) - def _delete(self, url): + def _delete(self, url, headers=None): try: - resp = self.http_client.delete(url) + resp = self.http_client.delete(url, headers) except exceptions.HttpError as ex: self._raise_api_exception(ex.response) if resp.status_code != 204: self._raise_api_exception(resp) - def _plurify_resource_name(self): - return self.resource_class.resource_name + 's' - - def _raise_api_exception(self, resp): + @staticmethod + def _raise_api_exception(resp): try: error_data = (resp.headers.get("Server-Error-Message", None) or get_json(resp).get("faultstring")) diff --git a/mistralclient/api/v2/actions.py b/mistralclient/api/v2/actions.py index 498de452..58a7bfc7 100644 --- a/mistralclient/api/v2/actions.py +++ b/mistralclient/api/v2/actions.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from keystoneauth1 import exceptions from mistralclient.api import base from mistralclient import utils @@ -31,20 +30,14 @@ class ActionManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.post( - '/actions?scope=%s' % scope, - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 201: - self._raise_api_exception(resp) - - return [self.resource_class(self, resource_data) - for resource_data in base.extract_json(resp, 'actions')] + return self._create( + '/actions?scope=%s' % scope, + definition, + response_key='actions', + dump_json=False, + headers={'content-type': 'text/plain'}, + is_iter_resp=True + ) def update(self, definition, scope='private', id=None): self._ensure_not_empty(definition=definition) @@ -55,20 +48,14 @@ class ActionManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.put( - '%s?scope=%s' % (url_pre, scope), - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 200: - self._raise_api_exception(resp) - - return [self.resource_class(self, resource_data) - for resource_data in base.extract_json(resp, 'actions')] + return self._update( + '%s?scope=%s' % (url_pre, scope), + definition, + response_key='actions', + dump_json=False, + headers={'content-type': 'text/plain'}, + is_iter_resp=True + ) def list(self, marker='', limit=None, sort_keys='', sort_dirs='', fields='', **filters): @@ -104,16 +91,9 @@ class ActionManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.post( - '/actions/validate', - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 200: - self._raise_api_exception(resp) - - return base.extract_json(resp, None) + return self._validate( + '/actions/validate', + definition, + dump_json=False, + headers={'content-type': 'text/plain'} + ) diff --git a/mistralclient/api/v2/workbooks.py b/mistralclient/api/v2/workbooks.py index f5d578af..64cd3647 100644 --- a/mistralclient/api/v2/workbooks.py +++ b/mistralclient/api/v2/workbooks.py @@ -13,7 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from keystoneauth1 import exceptions from mistralclient.api import base from mistralclient import utils @@ -47,19 +46,12 @@ class WorkbookManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.post( - self._get_workbooks_url(None, namespace, scope), - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 201: - self._raise_api_exception(resp) - - return self.resource_class(self, base.extract_json(resp, None)) + return self._create( + self._get_workbooks_url(None, namespace, scope), + definition, + dump_json=False, + headers={'content-type': 'text/plain'} + ) def update(self, definition, namespace='', scope='private'): self._ensure_not_empty(definition=definition) @@ -68,19 +60,12 @@ class WorkbookManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.put( - self._get_workbooks_url(None, namespace, scope), - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 200: - self._raise_api_exception(resp) - - return self.resource_class(self, base.extract_json(resp, None)) + return self._update( + self._get_workbooks_url(None, namespace, scope), + definition, + dump_json=False, + headers={'content-type': 'text/plain'} + ) def list(self, namespace='', marker='', limit=None, sort_keys='', sort_dirs='', fields='', **filters): @@ -115,16 +100,9 @@ class WorkbookManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.post( - '/workbooks/validate', - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 200: - self._raise_api_exception(resp) - - return base.extract_json(resp, None) + return self._validate( + '/workbooks/validate', + definition, + dump_json=False, + headers={'content-type': 'text/plain'} + ) diff --git a/mistralclient/api/v2/workflows.py b/mistralclient/api/v2/workflows.py index 237a4f9d..a1f687fe 100644 --- a/mistralclient/api/v2/workflows.py +++ b/mistralclient/api/v2/workflows.py @@ -13,7 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from keystoneauth1 import exceptions from mistralclient.api import base from mistralclient import utils @@ -32,20 +31,14 @@ class WorkflowManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.post( - '/workflows?scope=%s&namespace=%s' % (scope, namespace), - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 201: - self._raise_api_exception(resp) - - return [self.resource_class(self, resource_data) - for resource_data in base.extract_json(resp, 'workflows')] + return self._create( + '/workflows?scope=%s&namespace=%s' % (scope, namespace), + definition, + response_key='workflows', + dump_json=False, + headers={'content-type': 'text/plain'}, + is_iter_resp=True + ) def update(self, definition, namespace='', scope='private', id=None): self._ensure_not_empty(definition=definition) @@ -56,23 +49,21 @@ class WorkflowManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.put( - '%s?namespace=%s&scope=%s' % (url_pre, namespace, scope), - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 200: - self._raise_api_exception(resp) + is_iter_resp = True + response_key = 'workflows' if id: - return self.resource_class(self, base.extract_json(resp, None)) + is_iter_resp = False + response_key = None - return [self.resource_class(self, resource_data) - for resource_data in base.extract_json(resp, 'workflows')] + return self._update( + '%s?namespace=%s&scope=%s' % (url_pre, namespace, scope), + definition, + response_key=response_key, + dump_json=False, + headers={'content-type': 'text/plain'}, + is_iter_resp=is_iter_resp, + ) def list(self, namespace='', marker='', limit=None, sort_keys='', sort_dirs='', fields='', **filters): @@ -117,16 +108,9 @@ class WorkflowManager(base.ResourceManager): # definition file definition = utils.get_contents_if_file(definition) - try: - resp = self.http_client.post( - '/workflows/validate', - definition, - headers={'content-type': 'text/plain'} - ) - except exceptions.HttpError as ex: - self._raise_api_exception(ex.response) - - if resp.status_code != 200: - self._raise_api_exception(resp) - - return base.extract_json(resp, None) + return self._validate( + '/workflows/validate', + definition, + dump_json=False, + headers={'content-type': 'text/plain'} + )