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
This commit is contained in:
Eyal
2019-07-30 15:15:16 +03:00
parent ae72a810af
commit 051e9fa22b
4 changed files with 97 additions and 145 deletions

View File

@@ -128,42 +128,54 @@ class ResourceManager(object):
(self.resource_class.__name__, name) (self.resource_class.__name__, name)
) )
def _copy_if_defined(self, data, **kwargs): def _validate(self, url, data, response_key=None, dump_json=True,
for name, value in kwargs.items(): headers=None, is_iter_resp=False):
if value is not None: return self._create(url, data, response_key, dump_json,
data[name] = value 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: if dump_json:
data = jsonutils.dumps(data) data = jsonutils.dumps(data)
try: try:
resp = self.http_client.post(url, data) resp = self.http_client.post(url, data, headers)
except exceptions.HttpError as ex: except exceptions.HttpError as ex:
self._raise_api_exception(ex.response) self._raise_api_exception(ex.response)
if resp.status_code != 201: if resp.status_code != resp_status_ok:
self._raise_api_exception(resp) 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: if dump_json:
data = jsonutils.dumps(data) data = jsonutils.dumps(data)
try: try:
resp = self.http_client.put(url, data) resp = self.http_client.put(url, data, headers)
except exceptions.HttpError as ex: except exceptions.HttpError as ex:
self._raise_api_exception(ex.response) self._raise_api_exception(ex.response)
if resp.status_code != 200: if resp.status_code != 200:
self._raise_api_exception(resp) 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: try:
resp = self.http_client.get(url) resp = self.http_client.get(url, headers)
except exceptions.HttpError as ex: except exceptions.HttpError as ex:
self._raise_api_exception(ex.response) self._raise_api_exception(ex.response)
@@ -173,9 +185,9 @@ class ResourceManager(object):
return [self.resource_class(self, resource_data) return [self.resource_class(self, resource_data)
for resource_data in extract_json(resp, response_key)] 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: try:
resp = self.http_client.get(url) resp = self.http_client.get(url, headers)
except exceptions.HttpError as ex: except exceptions.HttpError as ex:
self._raise_api_exception(ex.response) self._raise_api_exception(ex.response)
@@ -184,19 +196,17 @@ class ResourceManager(object):
else: else:
self._raise_api_exception(resp) self._raise_api_exception(resp)
def _delete(self, url): def _delete(self, url, headers=None):
try: try:
resp = self.http_client.delete(url) resp = self.http_client.delete(url, headers)
except exceptions.HttpError as ex: except exceptions.HttpError as ex:
self._raise_api_exception(ex.response) self._raise_api_exception(ex.response)
if resp.status_code != 204: if resp.status_code != 204:
self._raise_api_exception(resp) self._raise_api_exception(resp)
def _plurify_resource_name(self): @staticmethod
return self.resource_class.resource_name + 's' def _raise_api_exception(resp):
def _raise_api_exception(self, resp):
try: try:
error_data = (resp.headers.get("Server-Error-Message", None) or error_data = (resp.headers.get("Server-Error-Message", None) or
get_json(resp).get("faultstring")) get_json(resp).get("faultstring"))

View File

@@ -12,7 +12,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from keystoneauth1 import exceptions
from mistralclient.api import base from mistralclient.api import base
from mistralclient import utils from mistralclient import utils
@@ -31,20 +30,14 @@ class ActionManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._create(
resp = self.http_client.post( '/actions?scope=%s' % scope,
'/actions?scope=%s' % scope, definition,
definition, response_key='actions',
headers={'content-type': 'text/plain'} dump_json=False,
) headers={'content-type': 'text/plain'},
except exceptions.HttpError as ex: is_iter_resp=True
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')]
def update(self, definition, scope='private', id=None): def update(self, definition, scope='private', id=None):
self._ensure_not_empty(definition=definition) self._ensure_not_empty(definition=definition)
@@ -55,20 +48,14 @@ class ActionManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._update(
resp = self.http_client.put( '%s?scope=%s' % (url_pre, scope),
'%s?scope=%s' % (url_pre, scope), definition,
definition, response_key='actions',
headers={'content-type': 'text/plain'} dump_json=False,
) headers={'content-type': 'text/plain'},
except exceptions.HttpError as ex: is_iter_resp=True
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')]
def list(self, marker='', limit=None, sort_keys='', sort_dirs='', def list(self, marker='', limit=None, sort_keys='', sort_dirs='',
fields='', **filters): fields='', **filters):
@@ -104,16 +91,9 @@ class ActionManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._validate(
resp = self.http_client.post( '/actions/validate',
'/actions/validate', definition,
definition, dump_json=False,
headers={'content-type': 'text/plain'} 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)

View File

@@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from keystoneauth1 import exceptions
from mistralclient.api import base from mistralclient.api import base
from mistralclient import utils from mistralclient import utils
@@ -47,19 +46,12 @@ class WorkbookManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._create(
resp = self.http_client.post( self._get_workbooks_url(None, namespace, scope),
self._get_workbooks_url(None, namespace, scope), definition,
definition, dump_json=False,
headers={'content-type': 'text/plain'} 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))
def update(self, definition, namespace='', scope='private'): def update(self, definition, namespace='', scope='private'):
self._ensure_not_empty(definition=definition) self._ensure_not_empty(definition=definition)
@@ -68,19 +60,12 @@ class WorkbookManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._update(
resp = self.http_client.put( self._get_workbooks_url(None, namespace, scope),
self._get_workbooks_url(None, namespace, scope), definition,
definition, dump_json=False,
headers={'content-type': 'text/plain'} 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))
def list(self, namespace='', marker='', limit=None, sort_keys='', def list(self, namespace='', marker='', limit=None, sort_keys='',
sort_dirs='', fields='', **filters): sort_dirs='', fields='', **filters):
@@ -115,16 +100,9 @@ class WorkbookManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._validate(
resp = self.http_client.post( '/workbooks/validate',
'/workbooks/validate', definition,
definition, dump_json=False,
headers={'content-type': 'text/plain'} 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)

View File

@@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from keystoneauth1 import exceptions
from mistralclient.api import base from mistralclient.api import base
from mistralclient import utils from mistralclient import utils
@@ -32,20 +31,14 @@ class WorkflowManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._create(
resp = self.http_client.post( '/workflows?scope=%s&namespace=%s' % (scope, namespace),
'/workflows?scope=%s&namespace=%s' % (scope, namespace), definition,
definition, response_key='workflows',
headers={'content-type': 'text/plain'} dump_json=False,
) headers={'content-type': 'text/plain'},
except exceptions.HttpError as ex: is_iter_resp=True
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')]
def update(self, definition, namespace='', scope='private', id=None): def update(self, definition, namespace='', scope='private', id=None):
self._ensure_not_empty(definition=definition) self._ensure_not_empty(definition=definition)
@@ -56,23 +49,21 @@ class WorkflowManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: is_iter_resp = True
resp = self.http_client.put( response_key = 'workflows'
'%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)
if id: 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) return self._update(
for resource_data in base.extract_json(resp, 'workflows')] '%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='', def list(self, namespace='', marker='', limit=None, sort_keys='',
sort_dirs='', fields='', **filters): sort_dirs='', fields='', **filters):
@@ -117,16 +108,9 @@ class WorkflowManager(base.ResourceManager):
# definition file # definition file
definition = utils.get_contents_if_file(definition) definition = utils.get_contents_if_file(definition)
try: return self._validate(
resp = self.http_client.post( '/workflows/validate',
'/workflows/validate', definition,
definition, dump_json=False,
headers={'content-type': 'text/plain'} 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)