def on_delete(self, req, resp, dataset_id, **kwargs):
"""Delete a dataset from the service
This method will delete the entry from the datbase and will also
delete the entire datasets generated by them on filesystem.
:param integer dataset_id: Unique ID of dataset
:returns: Nothing if operation was successful
:rtype: 204 NO CONTENT
"""
try:
delete_task = async_tasks.delete_dataset_by_id(dataset_id)
except LookupError:
raise falcon.HTTPNotFound(description="Couldn't locate dataset")
except OSError as err:
raise falcon.HTTPInternalServerError(description=str(err))
else:
resp.status = falcon.HTTP_204
python类HTTPInternalServerError()的实例源码
def test_on_get(self):
time.sleep(1)
req = None
resp = falcon.Response()
resp.status = None
resp.body = None
self.elb_resource.on_get(req, resp)
response_body = json.loads(resp.body)
self.assertEquals(response_body['capacity'], 100)
self.assertEquals(response_body['requests'], 1)
self.assertGreaterEqual(response_body['uptime'], 1)
self.assertEquals(resp.status, falcon.HTTP_200)
self.load_balancer.check_if_model_to_workers_map_is_empty = MagicMock(return_value = True)
resp_1 = falcon.Response()
resp_1.status = None
resp_1.body = None
self.assertRaises(falcon.HTTPInternalServerError, lambda : self.elb_resource.on_get(req, resp_1))
def on_get(self, req, resp):
"""
Handles GET requests for ELB HealthCheck Resource
:param req:
:param resp:
:return:
"""
uptime = int(time.time()) - self.start_time
if self.load_balancer.check_if_model_to_workers_map_is_empty():
resp.status = falcon.HTTP_500
resp.body = "Model To Workers Map is Empty"
raise falcon.HTTPInternalServerError('Internal Server Error', 'Model To Workers Map is Empty! ')
resp.status = falcon.HTTP_200
# TODO requests and capacity have to be calculated. They are hardcoded for now
resp.body = json.dumps({'uptime':uptime, 'requests': 1, 'capacity': 100})
def on_post(self, req, resp):
payload = json.loads(req.stream.read())
pi = PredictionInput()
if ('url' in payload.keys()) and ('modelId' in payload.keys()):
pi.url = payload['url']
pi.model_id = payload['modelId']
else:
resp.status = falcon.HTTP_400
raise falcon.HTTPBadRequest("Bad Request", "Url and(or) modelId missing in the payload")
po = self.caffe_worker_client.predict(pi)
if po.bo.status == 'Success':
resp.status = falcon.HTTP_200
resp.body = (str(po.values))
elif po.bo.status == 'Failure':
resp.body = json.dumps({'status': 'Failure', 'message' : 'Error occurred'})
resp.status = falcon.HTTP_500
raise falcon.HTTPInternalServerError('Internal Server Error', 'Predict failed! ')
def on_get(self, req, resp):
token = req.get_param('token', True)
data = {}
for key in self.data_keys:
data[key] = req.get_param(key, True)
if not self.validate_token(token, data):
raise falcon.HTTPForbidden('Invalid token for these given values', '')
endpoint = self.config['iris']['hook']['gmail_one_click']
try:
result = self.iclient.post(endpoint, data)
except MaxRetryError:
logger.exception('Hitting iris-api failed for gmail oneclick')
else:
if result.status == 204:
resp.status = falcon.HTTP_204
return
else:
logger.error('Unexpected status code from api %s for gmail oneclick', result.status)
raise falcon.HTTPInternalServerError('Internal Server Error', 'Invalid response from API')
def on_post(self, req, resp):
"""
Accept twilio POST that has message delivery status, and pass it
to iris-api
"""
try:
re = self.iclient.post(self.endpoint, req.context['body'], raw=True)
except MaxRetryError:
logger.exception('Failed posting data to iris-api')
raise falcon.HTTPInternalServerError('Internal Server Error', 'API call failed')
if re.status is not 204:
logger.error('Invalid response from API for delivery status update: %s', re.status)
raise falcon.HTTPBadRequest('Likely bad params passed', 'Invalid response from API')
resp.status = falcon.HTTP_204
def handle_exception(exception):
logging.exception('An exception with the following traceback occurred:')
raise falcon.HTTPInternalServerError('error', str(exception))
def _error_handler(self, exc, request, response, params):
"""Handler error"""
if isinstance(exc, falcon.HTTPError):
raise exc
LOG.exception(exc)
raise falcon.HTTPInternalServerError('Internal server error',
six.text_type(exc))
def _post_validate(self, documents):
# Perform schema validation post-rendering to ensure that rendering
# and substitution didn't break anything.
doc_validator = document_validation.DocumentValidation(documents)
try:
doc_validator.validate_all()
except (errors.InvalidDocumentFormat,
errors.InvalidDocumentSchema) as e:
LOG.error('Failed to post-validate rendered documents.')
LOG.exception(e.format_message())
raise falcon.HTTPInternalServerError(
description=e.format_message())
def _create_revision_documents(self, bucket_name, documents,
validations):
try:
created_documents = db_api.documents_create(
bucket_name, documents, validations=validations)
except (deckhand_errors.DocumentExists,
deckhand_errors.SingletonDocumentConflict) as e:
raise falcon.HTTPConflict(description=e.format_message())
except Exception as e:
raise falcon.HTTPInternalServerError(description=six.text_type(e))
return created_documents
def test_misc(self, client):
self._misc_test(client, falcon.HTTPBadRequest, falcon.HTTP_400)
self._misc_test(client, falcon.HTTPNotAcceptable, falcon.HTTP_406,
needs_title=False)
self._misc_test(client, falcon.HTTPConflict, falcon.HTTP_409)
self._misc_test(client, falcon.HTTPPreconditionFailed, falcon.HTTP_412)
self._misc_test(client, falcon.HTTPUnsupportedMediaType, falcon.HTTP_415,
needs_title=False)
self._misc_test(client, falcon.HTTPUnprocessableEntity, falcon.HTTP_422)
self._misc_test(client, falcon.HTTPUnavailableForLegalReasons, falcon.HTTP_451,
needs_title=False)
self._misc_test(client, falcon.HTTPInternalServerError, falcon.HTTP_500)
self._misc_test(client, falcon.HTTPBadGateway, falcon.HTTP_502)
def on_get(self, req, resp):
from_currency = req.get_param("from", required=True)
to_currency = req.get_param("to", required=True)
date_of_exchange = req.get_param_as_date("date")
date_of_exchange = date_of_exchange if date_of_exchange else date.today()
invalid_currencies = [currency for currency in (from_currency, to_currency) if currency not in SUPPORTED_CURRENCIES]
if invalid_currencies:
raise falcon.HTTPInvalidParam("Invalid currency", " and ".join(invalid_currencies))
exchange_rate = None
try:
exchange_rate = self.container.exchange_rate_manager.get_exchange_rate_by_date(date_of_exchange, from_currency, to_currency)
except DatabaseError:
self.container.db_session.rollback()
self.container.logger.exception("Database error occurred. Rollback session to allow reconnect to the DB on next request.")
except Exception:
self.container.logger.exception("Unexpected exception while rate request %s->%s (%s)", from_currency, to_currency, date_of_exchange)
if not exchange_rate:
self.container.logger.error("Exchange rate not found: rate %s %s->%s", date_of_exchange, from_currency, to_currency)
raise falcon.HTTPInternalServerError("Exchange rate not found", "Exchange rate not found")
self.container.logger.info("GET rate %s %s->%s %s", date_of_exchange, from_currency, to_currency, exchange_rate)
resp.status = falcon.HTTP_200
resp.body = json.dumps(
{
"date": date_of_exchange.strftime(format="%Y-%m-%d"),
"from_currency": from_currency,
"to_currency": to_currency,
"exchange_rate": str(exchange_rate)
}
)
def on_get(self, req, resp):
from_currency = req.get_param("from", required=True)
to_currency = req.get_param("to", required=True)
start_date = req.get_param_as_date("start_date", required=True)
end_date = req.get_param_as_date("end_date", required=True)
invalid_currencies = [currency for currency in (from_currency, to_currency) if currency not in SUPPORTED_CURRENCIES]
if invalid_currencies:
raise falcon.HTTPInvalidParam("Invalid currency", " and ".join(invalid_currencies))
exchange_rate = None
try:
if start_date == end_date:
exchange_rate = self.container.exchange_rate_manager.get_exchange_rate_by_date(start_date, from_currency, to_currency)
else:
exchange_rate = self.container.exchange_rate_manager.get_average_exchange_rate_by_dates(start_date, end_date, from_currency, to_currency)
except DatabaseError:
self.container.db_session.rollback()
self.container.logger.exception("Database error occurred. Rollback session to allow reconnect to the DB on next request.")
except Exception:
self.container.logger.exception("Unexpected exception while range request %s->%s (%s - %s)", from_currency, to_currency, start_date, end_date)
if not exchange_rate:
self.container.logger.error("Exchange rate not found: range %s/%s %s->%s", start_date, end_date, from_currency, to_currency)
raise falcon.HTTPInternalServerError("Exchange rate not found", "Exchange rate not found")
self.container.logger.info("GET range %s/%s %s->%s %s", start_date, end_date, from_currency, to_currency, exchange_rate)
resp.status = falcon.HTTP_200
resp.body = json.dumps(
{
"start_date": start_date.strftime(format="%Y-%m-%d"),
"end_date": end_date.strftime(format="%Y-%m-%d"),
"from_currency": from_currency,
"to_currency": to_currency,
"exchange_rate": str(exchange_rate)
}
)
def on_put(self, req, resp, dataset_id, **kwargs):
"""Change the description of choosen dataset
:param HTTPUserDatasetDTO dataset_info: Object with description param
:param integer dataset_id: Unique ID of dataset
:returns: The dataset with changed values
:rtype: DatasetDTO
"""
dataset_info = HTTPUserDatasetDTO()
try:
dataset_info.load(kwargs["dataset_info"])
except KeyError:
pass
dataset_dao = data_access.DatasetDAO()
if dataset_info.description is not None:
res, err = dataset_dao.set_description(
dataset_id, dataset_info.description)
if res is None:
raise falcon.HTTPInternalServerError(
title="Server Error",
description="Unable to process description param")
resource, err = dataset_dao.get_dataset_by_id(dataset_id)
response = {
"dataset": resource.to_dict(),
}
resp.body = json.dumps(response)
resp.content_type = 'application/json'
resp.status = falcon.HTTP_200
def on_post(self, req, resp, dataset_info, **kwargs):
"""Create a new dataset on the service
This method will create a new empty dataset, and returns a 201 CREATED
with Location header filled with the URI of new dataset.
:param HTTPUserDatasetDTO dataset_info: HTTP Client dataset information
:query int dataset_type: The dataset type (optional)
:returns: Location header with new path to dataset object
"""
dao = data_access.DatasetDAO()
# Get dataset type
dts_type = req.get_param_as_int("dataset_type")
dataset_type = dao.get_dataset_types()[dts_type]["class"]
id_dts, err = dao.insert_empty_dataset(
dataset_type, name=dataset_info.name,
description=dataset_info.description)
if id_dts is None and err[0] == 409:
raise falcon.HTTPConflict(
title="The dataset name is already used", description=err[1])
elif id_dts is None and err[0] == 500:
raise falcon.HTTPInternalServerError(description=err[1])
else:
# Dataset created, evrything is done
resp.status = falcon.HTTP_201
resp.body = json.dumps({"dataset": {"id": id_dts}})
resp.location = "/datasets/" + str(id_dts)
def process(self, req, resp):
if req.method == 'OPTIONS':
if self.cors_origin is not False:
self.process_preflight_request(req, resp)
response_body = '\n'
response_body += 'nothing here\n\n'
resp.body = response_body
resp.status = falcon.HTTP_200
return
try:
if self.cors_origin is not False:
self.process_preflight_request(req, resp)
self.dispatch(req, resp)
except Exception as e:
self.log.error_trace('process failed')
error_type = type(e)
error_map = {
falcon.errors.HTTPNotFound: http_falcon_handler,
falcon.errors.HTTPMissingParam: http_falcon_handler,
falcon.errors.HTTPInvalidParam: http_falcon_handler,
falcon.errors.HTTPInternalServerError: http_falcon_handler,
}
if self.custom_error_map:
error_map.update(self.custom_error_map)
error_func = error_map.get(error_type)
if error_func:
error_func(req, resp, e)
else:
default_error_handler(req, resp, e)
def on_post(self, req, resp):
"""
Accept slack's message from interactive buttons
"""
try:
form_post = falcon.uri.parse_query_string(req.context['body'])
payload = ujson.loads(form_post['payload'])
if not self.valid_token(payload['token']):
logger.error('Invalid token sent in the request.')
raise falcon.HTTPUnauthorized('Access denied',
'Not a valid auth token')
try:
msg_id = int(payload['callback_id'])
except KeyError as e:
logger.error('callback_id not found in the json payload.')
raise falcon.HTTPBadRequest('Bad Request', 'Callback id not found')
except ValueError as e:
logger.error('Callback ID not an integer: %s', payload['callback_id'])
raise falcon.HTTPBadRequest('Bad Request', 'Callback id must be int')
data = {'msg_id': msg_id,
'source': payload['user']['name'],
'content': payload['actions'][0]['name']}
endpoint = self.config['iris']['hook']['slack']
try:
result = self.iclient.post(endpoint, data)
except MaxRetryError as e:
logger.error(e.reason)
return
if result.status == 400:
raise falcon.HTTPBadRequest('Bad Request', '')
elif result.status is not 200:
raise falcon.HTTPInternalServerError('Internal Server Error', 'Unknown response from the api')
else:
content = process_api_response(result.data)
self.return_slack_message(resp, content)
return
except Exception:
logger.exception('Unable to read payload from slack. Our post body: %s', req.context['body'])
raise falcon.HTTPBadRequest('Bad Request', 'Unable to read the payload from slack')
def do_get(self, req, resp, hostname, asset_type):
"""Render ``unit`` type boot action assets for hostname.
Get the boot action context for ``hostname`` from the database
and render all ``unit`` type assets for the host. Validate host
is providing the correct idenity key in the ``X-Bootaction-Key``
header.
:param req: falcon request object
:param resp: falcon response object
:param hostname: URL path parameter indicating the calling host
:param asset_type: Asset type to include in the response - ``unit``, ``file``, ``pkg_list``, ``all``
"""
try:
ba_ctx = self.state_manager.get_boot_action_context(hostname)
except Exception as ex:
self.logger.error(
"Error locating boot action for %s" % hostname, exc_info=ex)
raise falcon.HTTPNotFound()
if ba_ctx is None:
raise falcon.HTTPNotFound(
description="Error locating boot action for %s" % hostname)
BootactionUtils.check_auth(ba_ctx, req)
asset_type_filter = None if asset_type == 'all' else asset_type
try:
task = self.state_manager.get_task(ba_ctx['task_id'])
design_status, site_design = self.orchestrator.get_effective_site(
task.design_ref)
assets = list()
ba_status_list = self.state_manager.get_boot_actions_for_node(
hostname)
for ba in site_design.bootactions:
if hostname in ba.target_nodes:
ba_status = ba_status_list.get(ba.name, None)
action_id = ba_status.get('action_id')
assets.extend(
ba.render_assets(
hostname,
site_design,
action_id,
type_filter=asset_type_filter))
tarball = BootactionUtils.tarbuilder(asset_list=assets)
resp.set_header('Content-Type', 'application/gzip')
resp.set_header('Content-Disposition',
"attachment; filename=\"%s-%s.tar.gz\"" %
(hostname, asset_type))
resp.data = tarball
resp.status = falcon.HTTP_200
return
except Exception as ex:
self.logger.debug("Exception in boot action API.", exc_info=ex)
raise falcon.HTTPInternalServerError(str(ex))
def dispatch(self, req, resp):
base_before, base_after, base_excp, base_final = self.op_loader.load_base(self.specs)
for uri_regex, spec in self.specs.items():
# try:
route_signature = '/' + req.method.lower() + req.relative_uri
if route_signature.find('?') > 0:
route_signature = route_signature[:route_signature.find('?')]
if type(uri_regex) == str:
continue
spec['route_signature'] = route_signature
req.spec = copy.deepcopy(spec)
match = uri_regex.match(route_signature)
if match:
handler, params, before, after, excp, final, mode = self.op_loader.load(req=req, spec=spec,
matched_uri=match)
handler_return = None
try:
if base_before:
base_before(req=req, resp=resp, **params)
if before:
before(req=req, resp=resp, **params)
if mode == 'raw':
handler_return = handler(req=req, resp=resp)
else:
if mode == 'more':
handler_return = handler(req=req, resp=resp, **params)
else:
handler_return = handler(**params)
content_type = self.produces(spec.get('produces'), self.specs.get('produces'))
self.process_response(req, resp, handler_return, content_type)
if after:
after(req=req, resp=resp, response=handler_return, **params)
if base_after:
base_after(req=req, resp=resp, **params)
except Exception as e:
throw_out = True
if base_excp is not None:
throw_out = base_excp(req=req, resp=resp, error=e)
if excp is not None:
throw_out = excp(req=req, resp=resp, error=e)
if throw_out:
raise e
finally:
if final:
final(req=req, resp=resp, response=handler_return, **params)
if base_final:
base_final(req=req, resp=resp, **params)
return
# except falcon.HTTPInvalidParam as e:
# self.log.error_trace("http invalid param: {}".format(e))
# raise e
# except Exception as e:
# self.log.error_trace("process error: {}".format(e))
# raise falcon.HTTPInternalServerError(title=str(type(e)), description=str(e))
self.log.info("url does not match any route signature or match error: {}".format(route_signature))
raise falcon.HTTPNotFound()