services.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # Copyright 2020 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. from oslo_log import log as logging
  4. from webob import exc
  5. from coriolis import exception
  6. from coriolis.api.v1.views import service_view
  7. from coriolis.api import wsgi as api_wsgi
  8. from coriolis.policies import services as service_policies
  9. from coriolis.services import api
  10. LOG = logging.getLogger(__name__)
  11. class ServiceController(api_wsgi.Controller):
  12. def __init__(self):
  13. self._service_api = api.API()
  14. super(ServiceController, self).__init__()
  15. def show(self, req, id):
  16. context = req.environ["coriolis.context"]
  17. context.can(service_policies.get_services_policy_label("show"))
  18. service = self._service_api.get_service(context, id)
  19. if not service:
  20. raise exc.HTTPNotFound()
  21. return service_view.single(req, service)
  22. def index(self, req):
  23. context = req.environ["coriolis.context"]
  24. context.can(service_policies.get_services_policy_label("list"))
  25. return service_view.collection(
  26. req, self._service_api.get_services(context))
  27. def _validate_create_body(self, body):
  28. try:
  29. service = body["service"]
  30. host = service["host"]
  31. binary = service["binary"]
  32. topic = service.get("topic")
  33. mapped_regions = service.get('mapped_regions', [])
  34. enabled = service.get("enabled", True)
  35. return host, binary, topic, mapped_regions, enabled
  36. except Exception as ex:
  37. LOG.exception(ex)
  38. if hasattr(ex, "message"):
  39. msg = ex.message
  40. else:
  41. msg = str(ex)
  42. raise exception.InvalidInput(msg)
  43. def create(self, req, body):
  44. context = req.environ["coriolis.context"]
  45. context.can(service_policies.get_services_policy_label("create"))
  46. (host, binary, topic, mapped_regions, enabled) = (
  47. self._validate_create_body(body))
  48. return service_view.single(req, self._service_api.create(
  49. context, host=host, binary=binary, topic=topic,
  50. mapped_regions=mapped_regions, enabled=enabled,
  51. # NOTE: providers and specs should be auto-discovered later:
  52. providers={}, specs={}))
  53. def _validate_update_body(self, body):
  54. try:
  55. service = body["service"]
  56. return {k: service[k] for k in service.keys() & {
  57. "enabled", "mapped_regions"}}
  58. except Exception as ex:
  59. LOG.exception(ex)
  60. if hasattr(ex, "message"):
  61. msg = ex.message
  62. else:
  63. msg = str(ex)
  64. raise exception.InvalidInput(msg)
  65. def update(self, req, id, body):
  66. context = req.environ["coriolis.context"]
  67. context.can(service_policies.get_services_policy_label("update"))
  68. updated_values = self._validate_update_body(body)
  69. return service_view.single(req, self._service_api.update(
  70. req.environ['coriolis.context'], id, updated_values))
  71. def delete(self, req, id):
  72. context = req.environ["coriolis.context"]
  73. context.can(service_policies.get_services_policy_label("delete"))
  74. try:
  75. self._service_api.delete(req.environ['coriolis.context'], id)
  76. raise exc.HTTPNoContent()
  77. except exception.NotFound as ex:
  78. raise exc.HTTPNotFound(explanation=ex.msg)
  79. def create_resource():
  80. return api_wsgi.Resource(ServiceController())