def on_put(self, request, response, project_id, pool): """Registers a new pool. Expects the following input: :: {"weight": 100, "uri": ""} An options object may also be provided. :returns: HTTP | [201, 204] """ LOG.debug(u'PUT pool - name: %s', pool) conf = self._ctrl.driver.conf data = wsgi_utils.load(request) wsgi_utils.validate(self._validators['create'], data) if not storage_utils.can_connect(data['uri'], conf=conf): raise wsgi_errors.HTTPBadRequestBody( 'cannot connect to %s' % data['uri'] ) try: self._ctrl.create(pool, weight=data['weight'], uri=data['uri'], group=data.get('group'), options=data.get('options', {})) response.status = falcon.HTTP_201 response.location = request.path except errors.PoolCapabilitiesMismatch as e: LOG.exception(e) title = _(u'Unable to create pool') raise falcon.HTTPBadRequest(title, six.text_type(e)) except errors.PoolAlreadyExists as e: LOG.exception(e) raise wsgi_errors.HTTPConflict(six.text_type(e))
def on_patch(self, req, resp, project_id, queue_name, subscription_id): if req.content_length: document = wsgi_utils.deserialize(req.stream, req.content_length) else: document = {} try: self._validate.subscription_patching(document) self._subscription_controller.update(queue_name, subscription_id, project=project_id, **document) resp.status = falcon.HTTP_204 resp.location = req.path except storage_errors.SubscriptionDoesNotExist as ex: LOG.debug(ex) raise wsgi_errors.HTTPNotFound(six.text_type(ex)) except storage_errors.SubscriptionAlreadyExists as ex: LOG.debug(ex) raise wsgi_errors.HTTPConflict(six.text_type(ex)) except validation.ValidationFailed as ex: LOG.debug(ex) raise wsgi_errors.HTTPBadRequestAPI(six.text_type(ex)) except Exception as ex: LOG.exception(ex) description = (_(u'Subscription %(subscription_id)s could not be' ' updated.') % dict(subscription_id=subscription_id)) raise falcon.HTTPBadRequest(_('Unable to update subscription'), description)
def _do_remove(self, req, metadata, reserved_metadata, change): path = change['path'] path_child = path[1] if path_child in metadata: metadata.pop(path_child) elif path_child not in reserved_metadata: msg = _("Can't remove non-existent object %s.") raise wsgi_errors.HTTPConflict(msg % path_child)
def _do_replace(self, req, metadata, reserved_metadata, change): path = change['path'] path_child = path[1] value = change['value'] if path_child in metadata or path_child in reserved_metadata: metadata[path_child] = value else: msg = _("Can't replace non-existent object %s.") raise wsgi_errors.HTTPConflict(msg % path_child)
def on_post(self, req, resp, project_id, queue_name): if req.content_length: document = wsgi_utils.deserialize(req.stream, req.content_length) else: document = {} try: if not self._queue_controller.exists(queue_name, project_id): self._queue_controller.create(queue_name, project=project_id) self._validate.subscription_posting(document) subscriber = document['subscriber'] options = document.get('options', {}) url = netutils.urlsplit(subscriber) ttl = document.get('ttl', self._default_subscription_ttl) mgr = driver.DriverManager('zaqar.notification.tasks', url.scheme, invoke_on_load=True) req_data = req.headers.copy() req_data.update(req.env) mgr.driver.register(subscriber, options, ttl, project_id, req_data) created = self._subscription_controller.create(queue_name, subscriber, ttl, options, project=project_id) except validation.ValidationFailed as ex: LOG.debug(ex) raise wsgi_errors.HTTPBadRequestAPI(six.text_type(ex)) except Exception as ex: LOG.exception(ex) description = _(u'Subscription could not be created.') raise wsgi_errors.HTTPServiceUnavailable(description) now = timeutils.utcnow_ts() now_dt = datetime.datetime.utcfromtimestamp(now) expires = now_dt + datetime.timedelta(seconds=ttl) api_version = req.path.split('/')[1] if created: subscription = self._subscription_controller.get( queue_name, created, project_id) # send confirm notification self._notification.send_confirm_notification( queue_name, subscription, self._conf, project_id, str(expires), api_version) resp.location = req.path resp.status = falcon.HTTP_201 resp.body = utils.to_json( {'subscription_id': six.text_type(created)}) else: subscription = self._subscription_controller.get_with_subscriber( queue_name, subscriber, project_id) confirmed = subscription.get('confirmed', True) if confirmed: description = _(u'Such subscription already exists.' u'Subscriptions are unique by project + queue ' u'+ subscriber URI.') raise wsgi_errors.HTTPConflict(description, headers={'location': req.path}) else: # The subscription is not confirmed, re-send confirm # notification self._notification.send_confirm_notification( queue_name, subscription, self._conf, project_id, str(expires), api_version) resp.location = req.path resp.status = falcon.HTTP_201 resp.body = utils.to_json( {'subscription_id': six.text_type(subscription['id'])})