From 7767e6bc7fa326f41a7434cd7e55c2a10f039b46 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Fri, 24 Jan 2020 11:25:32 -0800 Subject: [PATCH] Added API to get and delete uuid from RMS service Change-Id: I12b86e8b4264205ea7daa6729e37215a2d4dfb79 --- .../uuidgen/controllers/v1/uuid_controller.py | 52 +++++++++++++ .../id_generator/uuidgen/db/db_manager.py | 32 +++++++- .../id_generator/uuidgen/db/uuid_db.py | 8 ++ .../rms/controllers/v2/orm/resources/uuid.py | 77 +++++++++++++++++++ .../rms/controllers/v2/orm/root.py | 4 +- .../region_manager/rms/etc/policy.json | 3 + 6 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 orm/services/region_manager/rms/controllers/v2/orm/resources/uuid.py diff --git a/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py b/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py index c31cab2e..e9babb6e 100755 --- a/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py +++ b/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py @@ -22,6 +22,58 @@ def respond(reason, code, message): class UUIDController(RestController): + @expose(template='json') + def get(self, **kw): + if 'uuid' in kw: + uuid = kw['uuid'] + else: + response.status = 400 + messageToReturn = respond( + "badRequest", response.status, 'Missing UUID parameter.') + return messageToReturn + + try: + db_manager = DBManager() + results = db_manager.get_uuid_details(uuid) + if results is None: + response.status = 404 + messageToReturn = respond( + "badRequest", response.status, 'UUID not found') + return messageToReturn + + return results.get_dict() + except Exception as e: + response.status = 500 + messageToReturn = respond( + "badRequest", response.status, 'Database error') + LOG.error(str(messageToReturn) + "Exception: " + str(e)) + return messageToReturn + + @expose(template='json') + def delete(self, **kw): + if 'uuid' in kw: + uuid = kw['uuid'] + else: + response.status = 400 + messageToReturn = respond( + "badRequest", response.status, 'Missing UUID parameter.') + return messageToReturn + + try: + db_manager = DBManager() + results = db_manager.delete_uuid(uuid) + if results == 0: + response.status = 404 + messageToReturn = respond( + "badRequest", response.status, 'UUID not found') + return messageToReturn + except Exception as e: + response.status = 500 + messageToReturn = respond( + "badRequest", response.status, 'Database error') + LOG.error(str(messageToReturn) + "Exception: " + str(e)) + return messageToReturn + @expose(template='json') def post(self, **kw): """Method to handle POST /v1/uuids - create and return a new uuid diff --git a/orm/services/id_generator/uuidgen/db/db_manager.py b/orm/services/id_generator/uuidgen/db/db_manager.py index 02809f7b..620e7804 100755 --- a/orm/services/id_generator/uuidgen/db/db_manager.py +++ b/orm/services/id_generator/uuidgen/db/db_manager.py @@ -13,7 +13,8 @@ class DBManager(object): if not connection_string: connection_string = conf.database.connection_string - self._engine_facade = LegacyEngineFacade(connection_string, autocommit=False) + self._engine_facade = LegacyEngineFacade(connection_string, + autocommit=False) self._session = None def get_session(self): @@ -52,6 +53,31 @@ class DBManager(object): self.session.commit() self.session.close() self.engine.dispose() - except SystemError as ex: - logger.exception(ex) + except Exception as ex: + logger.exception( + "Error adding uuid {} : {}".format(_uuid, str(exp))) + raise ex + + def get_uuid_details(self, _uuid): + try: + self.begin_transaction() + uuid = self.session.query(UUID).filter(UUID.uuid == _uuid) + self.close() + return uuid.first() + except Exception as ex: + logger.exception( + "Error getting uuid {} : {}".format(_uuid, str(exp))) + raise ex + + def delete_uuid(self, _uuid): + try: + self.begin_transaction() + result = self.session.query(UUID).filter( + UUID.uuid == _uuid).delete() + self.session.commit() + self.close() + return result + except Exception as ex: + logger.exception( + "Error deleting uuid {} : {}".format(_uuid, str(exp))) raise ex diff --git a/orm/services/id_generator/uuidgen/db/uuid_db.py b/orm/services/id_generator/uuidgen/db/uuid_db.py index f51a48d3..fa72fc18 100755 --- a/orm/services/id_generator/uuidgen/db/uuid_db.py +++ b/orm/services/id_generator/uuidgen/db/uuid_db.py @@ -19,3 +19,11 @@ class UUID(declarative_base(), UUIDBaseModel): id = Column(Integer, primary_key=True) uuid = Column(String, nullable=False, unique=True) uuid_type = Column(String, nullable=True, unique=True) + + def __json__(self): + return dict(id=self.id, + uuid=self.uuid, + uuid_type=self.uuid_type) + + def get_dict(self): + return self.__json__() diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/uuid.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/uuid.py new file mode 100644 index 00000000..1d45be23 --- /dev/null +++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/uuid.py @@ -0,0 +1,77 @@ +import json +import logging + +from orm.common.orm_common.utils import api_error_utils as err_utils +from orm.services.region_manager.rms.utils import authentication + +from pecan import conf +from pecan import request +from pecan import rest +import requests +import wsme +from wsme import types as wtypes +from wsmeext.pecan import wsexpose + +logger = logging.getLogger(__name__) + + +class UUIDData(wtypes.DynamicBase): + id = wsme.wsattr(wtypes.text, mandatory=True) + uuid = wsme.wsattr(wtypes.text, mandatory=True) + uuid_type = wsme.wsattr(wtypes.text, mandatory=True) + + def __init__(self, id=None, uuid=None, uuid_type=None): + self.id = id + self.uuid = uuid + self.uuid_type = uuid_type + + +class UUIDController(rest.RestController): + + @wsexpose(UUIDData, str, status_code=200, rest_content_types='json') + def get_one(self, uuid): + logger.info("UUIDController - Getting UUID " + uuid) + authentication.authorize(request, 'uuid:get_one') + + url = conf.api.uuid_server.base + conf.api.uuid_server.uuids + try: + resp = requests.get(url, params={'uuid': uuid}) + except Exception as ex: + logger.exception( + "Failed to get uuid : {}".format(str(ex))) + raise err_utils.get_error(request.transaction_id, + status_code=500, + error_details=str(ex)) + + if resp.status_code != 200: + message = "Failed to uuid {}: {}".format(uuid, resp.text) + raise err_utils.get_error(request.transaction_id, + status_code=resp.status_code, + error_details=message) + + uuid_data = json.loads(resp.content) + return UUIDData(id=str(uuid_data['id']), + uuid=uuid_data['uuid'], + uuid_type=uuid_data['uuid_type']) + + @wsexpose(None, str, rest_content_types='json', status_code=204) + def delete(self, uuid): + logger.info("UUIDController - Deleting UUID " + uuid) + authentication.authorize(request, 'uuid:delete') + + url = conf.api.uuid_server.base + conf.api.uuid_server.uuids + try: + resp = requests.delete(url, params={'uuid': uuid}) + except Exception as ex: + logger.exception( + "Failed to delete uuid : {}".format(str(ex))) + raise err_utils.get_error(request.transaction_id, + status_code=500, + error_details=str(ex)) + + if resp.status_code != 200: + message = "Failed to delete uuid {}: {}".format(uuid, resp.text) + raise err_utils.get_error(request.transaction_id, + status_code=resp.status_code, + error_details=message) + return diff --git a/orm/services/region_manager/rms/controllers/v2/orm/root.py b/orm/services/region_manager/rms/controllers/v2/orm/root.py index 403a4d42..653d4e18 100755 --- a/orm/services/region_manager/rms/controllers/v2/orm/root.py +++ b/orm/services/region_manager/rms/controllers/v2/orm/root.py @@ -1,5 +1,6 @@ """ORM controller module.""" -from orm.services.region_manager.rms.controllers.v2.orm.resources import groups, regions +from orm.services.region_manager.rms.controllers.v2.orm.resources import \ + groups, regions, uuid class OrmController(object): @@ -7,3 +8,4 @@ class OrmController(object): regions = regions.RegionsController() groups = groups.GroupsController() + uuid = uuid.UUIDController() diff --git a/orm/services/region_manager/rms/etc/policy.json b/orm/services/region_manager/rms/etc/policy.json index e8144275..1cc4f735 100755 --- a/orm/services/region_manager/rms/etc/policy.json +++ b/orm/services/region_manager/rms/etc/policy.json @@ -11,6 +11,9 @@ "lcp:get_one": "", "lcp:get_all": "", + "uuid:get_one": "", + "uuid:delete": "rule:admin", + "region:get_one": "", "region:get_all": "", "region:create": "rule:admin_or_support",