def test__exception(self): model = webservice.SimpleDataModel("test") for method in [m for m in dir(model) if "_item" in m]: setattr(model, method, mock.Mock(side_effect=Exception())) resource_mgr = application.ResourceManager() app = application.ApiApplication(resource_mgr) collection_handler = webservice.CollectionHandler(r'/c', model) resource_mgr.register_handler(collection_handler) for method in ['GET', 'POST']: request = webob.Request.blank('/c', body='{}'.encode('utf-8'), method=method) response = app(request) self._check_base_exc_response(method, response, 500) element_handler = webservice.ElementHandler(r'/e', model) resource_mgr.register_handler(element_handler) for method in ['GET', 'PUT', 'PATCH', 'DELETE']: request = webob.Request.blank('/e', body='{}'.encode('utf-8'), method=method) response = app(request) self._check_base_exc_response(method, response, 500) # Tests that making a request to an invalid url returns 404. request = webob.Request.blank('/invalid', body='{}'.encode('utf-8'), method=method) response = app(request) self._check_base_exc_response(method, response, 404)
def test_data_model_exception(self): exc = webservice.DataModelException(1, "error1", [1, {'a': 'b'}], 409) model = webservice.SimpleDataModel("test") for method in [m for m in dir(model) if "_item" in m]: setattr(model, method, mock.Mock(side_effect=exc)) resource_mgr = application.ResourceManager() app = application.ApiApplication(resource_mgr) collection_handler = webservice.CollectionHandler(r'/c', model) resource_mgr.register_handler(collection_handler) for method in ['GET', 'POST']: request = webob.Request.blank('/c', body='{}'.encode('utf-8'), method=method) response = app(request) self._check_data_model_exc_response(method, exc, response) element_handler = webservice.ElementHandler(r'/e', model) resource_mgr.register_handler(element_handler) for method in ['GET', 'PUT', 'PATCH', 'DELETE']: request = webob.Request.blank('/e', body='{}'.encode('utf-8'), method=method) response = app(request) self._check_data_model_exc_response(method, exc, response)
def test_action(self): element_handler = webservice.ElementHandler(r'/', '') element_handler.model = webservice.SimpleDataModel("test") request = mock.MagicMock() request.path = "/" response = element_handler.action(request) self.assertEqual(400, response.status_code) self.assertEqual('application/json', response.content_type) self.assertEqual( json.loads(response.body.decode('utf-8'))['error']['message'], "Missing required action parameter.") request.params = mock.MagicMock() request.params.getall.return_value = ['do_test'] request.params["action"] = "do_test" request.path = "/" response = element_handler.action(request) self.assertEqual(501, response.status_code) self.assertEqual('application/json', response.content_type) self.assertEqual( json.loads(response.body.decode('utf-8'))['error']['message'], "Method not supported") # test action impl returning python primitives simple_data = [1, 2] element_handler.model.do_test_action = lambda *a, **kwa: simple_data response = element_handler.action(request) self.assertEqual(200, response.status_code) self.assertEqual('application/json', response.content_type) self.assertEqual(json.loads(response.body.decode('utf-8')), simple_data) # test action impl returning custom webob response custom_data = webob.Response(body="test".encode('utf-8'), status=599, content_type="custom/test") element_handler.model.do_test_action = lambda *a, **kwa: custom_data response = element_handler.action(request) self.assertEqual(599, response.status_code) self.assertEqual('custom/test', response.content_type) self.assertEqual(response.body.decode('utf-8'), "test")
def __init__(self, resource_mgr, cage): """Bootstrap data models and handlers for the API definition.""" policies = cage.service_object('api-policy') resource_mgr.register_model('policies', policies) policy_collection_handler = webservice.CollectionHandler( r'/v1/policies', policies) resource_mgr.register_handler(policy_collection_handler) policy_path = r'/v1/policies/(?P<policy_id>[^/]+)' policy_element_handler = webservice.ElementHandler( policy_path, policies, policy_collection_handler, allow_update=False, allow_replace=False) resource_mgr.register_handler(policy_element_handler) policy_rules = cage.service_object('api-rule') resource_mgr.register_model('rules', policy_rules) rule_collection_handler = webservice.CollectionHandler( r'/v1/policies/(?P<policy_id>[^/]+)/rules', policy_rules, "{policy_id}") resource_mgr.register_handler(rule_collection_handler) rule_element_handler = webservice.ElementHandler( r'/v1/policies/(?P<policy_id>[^/]+)/rules/(?P<rule_id>[^/]+)', policy_rules, "{policy_id}") resource_mgr.register_handler(rule_element_handler) # Setup /v1/data-sources data_sources = cage.service_object('api-datasource') resource_mgr.register_model('data_sources', data_sources) ds_collection_handler = webservice.CollectionHandler( r'/v1/data-sources', data_sources) resource_mgr.register_handler(ds_collection_handler) # Setup /v1/data-sources/<ds_id> ds_path = r'/v1/data-sources/(?P<ds_id>[^/]+)' ds_element_handler = webservice.ElementHandler(ds_path, data_sources) resource_mgr.register_handler(ds_element_handler) # Setup /v1/data-sources/<ds_id>/schema schema = cage.service_object('api-schema') schema_path = "%s/schema" % ds_path schema_element_handler = webservice.ElementHandler(schema_path, schema) resource_mgr.register_handler(schema_element_handler) # Setup /v1/data-sources/<ds_id>/tables/<table_id>/spec table_schema_path = "%s/tables/(?P<table_id>[^/]+)/spec" % ds_path table_schema_element_handler = webservice.ElementHandler( table_schema_path, schema) resource_mgr.register_handler(table_schema_element_handler) statuses = cage.service_object('api-status') status_path = "%s/status" % ds_path status_element_handler = webservice.ElementHandler(status_path, statuses) resource_mgr.register_handler(status_element_handler) tables = cage.service_object('api-table') resource_mgr.register_model('tables', tables) tables_path = "(%s|%s)/tables" % (ds_path, policy_path) table_collection_handler = webservice.CollectionHandler(tables_path, tables) resource_mgr.register_handler(table_collection_handler) table_path = "%s/(?P<table_id>[^/]+)" % tables_path table_element_handler = webservice.ElementHandler(table_path, tables) resource_mgr.register_handler(table_element_handler) table_rows = cage.service_object('api-row') resource_mgr.register_model('table_rows', table_rows) rows_path = "%s/rows" % table_path row_collection_handler = webservice.CollectionHandler(rows_path, table_rows) resource_mgr.register_handler(row_collection_handler) row_path = "%s/(?P<row_id>[^/]+)" % rows_path row_element_handler = webservice.ElementHandler(row_path, table_rows) resource_mgr.register_handler(row_element_handler) # Setup /v1/system/datasource-drivers system = cage.service_object('api-system') resource_mgr.register_model('system', system) # NOTE(arosen): start url out with datasource-drivers since we don't # yet implement /v1/system/ yet. system_collection_handler = webservice.CollectionHandler( r'/v1/system/drivers', system) resource_mgr.register_handler(system_collection_handler) # Setup /v1/system/datasource-drivers/<driver_id> driver_path = r'/v1/system/drivers/(?P<driver_id>[^/]+)' driver_element_handler = webservice.ElementHandler( driver_path, system) resource_mgr.register_handler(driver_element_handler)
def initialize_resources(resource_mgr, cage): """Bootstrap data models and handlers for the current API definition.""" policies = cage.service_object('api-policy') resource_mgr.register_model('policies', policies) policy_collection_handler = webservice.CollectionHandler( r'/v1/policies', policies) resource_mgr.register_handler(policy_collection_handler) policy_path = r'/v1/policies/(?P<policy_id>[^/]+)' policy_element_handler = webservice.ElementHandler( policy_path, policies, policy_collection_handler, allow_update=False, allow_replace=False) resource_mgr.register_handler(policy_element_handler) policy_rules = cage.service_object('api-rule') resource_mgr.register_model('rules', policy_rules) rule_collection_handler = webservice.CollectionHandler( r'/v1/policies/(?P<policy_id>[^/]+)/rules', policy_rules, "{policy_id}") resource_mgr.register_handler(rule_collection_handler) rule_element_handler = webservice.ElementHandler( r'/v1/policies/(?P<policy_id>[^/]+)/rules/(?P<rule_id>[^/]+)', policy_rules, "{policy_id}") resource_mgr.register_handler(rule_element_handler) data_sources = cage.service_object('api-datasource') resource_mgr.register_model('data_sources', data_sources) ds_collection_handler = webservice.CollectionHandler( r'/v1/data-sources', data_sources) resource_mgr.register_handler(ds_collection_handler) ds_path = r'/v1/data-sources/(?P<ds_id>[^/]+)' ds_element_handler = webservice.ElementHandler(ds_path, data_sources) resource_mgr.register_handler(ds_element_handler) schema = cage.service_object('api-schema') schema_path = "%s/schema" % ds_path schema_element_handler = webservice.ElementHandler(schema_path, schema) resource_mgr.register_handler(schema_element_handler) table_schema_path = "%s/tables/(?P<table_id>[^/]+)/spec" % ds_path table_schema_element_handler = webservice.ElementHandler( table_schema_path, schema) resource_mgr.register_handler(table_schema_element_handler) statuses = cage.service_object('api-status') status_path = "%s/status" % ds_path status_element_handler = webservice.CollectionHandler( status_path, statuses) resource_mgr.register_handler(status_element_handler) tables = cage.service_object('api-table') resource_mgr.register_model('tables', tables) tables_path = "(%s|%s)/tables" % (ds_path, policy_path) table_collection_handler = webservice.CollectionHandler( tables_path, tables) resource_mgr.register_handler(table_collection_handler) table_path = "%s/(?P<table_id>[^/]+)" % tables_path table_element_handler = webservice.ElementHandler(table_path, tables) resource_mgr.register_handler(table_element_handler) table_rows = cage.service_object('api-row') resource_mgr.register_model('table_rows', table_rows) rows_path = "%s/rows" % table_path row_collection_handler = webservice.CollectionHandler( rows_path, table_rows) resource_mgr.register_handler(row_collection_handler) row_path = "%s/(?P<row_id>[^/]+)" % rows_path row_element_handler = webservice.ElementHandler(row_path, table_rows) resource_mgr.register_handler(row_element_handler)
def __init__(self, resource_mgr, process_dict): """Bootstrap data models and handlers for the API definition.""" # Setup /v1/ version_v1_handler = versions.VersionV1Handler(r'/v1[/]?') resource_mgr.register_handler(version_v1_handler) policies = process_dict['api-policy'] policy_collection_handler = webservice.CollectionHandler( r'/v1/policies', policies) resource_mgr.register_handler(policy_collection_handler) policy_path = r'/v1/policies/(?P<policy_id>[^/]+)' policy_element_handler = webservice.ElementHandler( policy_path, policies, policy_collection_handler, allow_update=False, allow_replace=False) resource_mgr.register_handler(policy_element_handler) library_policies = process_dict['api-library-policy'] library_policy_collection_handler = webservice.CollectionHandler( r'/v1/librarypolicies', library_policies) resource_mgr.register_handler(library_policy_collection_handler) library_policy_path = r'/v1/librarypolicies/(?P<policy_id>[^/]+)' library_policy_element_handler = webservice.ElementHandler( library_policy_path, library_policies, library_policy_collection_handler, allow_update=False, allow_replace=True) resource_mgr.register_handler(library_policy_element_handler) policy_rules = process_dict['api-rule'] rule_collection_handler = webservice.CollectionHandler( r'/v1/policies/(?P<policy_id>[^/]+)/rules', policy_rules, "{policy_id}") resource_mgr.register_handler(rule_collection_handler) rule_path = (r'/v1/policies/(?P<policy_id>[^/]+)' + r'/rules/(?P<rule_id>[^/]+)') rule_element_handler = webservice.ElementHandler( rule_path, policy_rules, "{policy_id}") resource_mgr.register_handler(rule_element_handler) # Setup /v1/data-sources data_sources = process_dict['api-datasource'] ds_collection_handler = webservice.CollectionHandler( r'/v1/data-sources', data_sources) resource_mgr.register_handler(ds_collection_handler) # Setup /v1/data-sources/<ds_id> ds_path = r'/v1/data-sources/(?P<ds_id>[^/]+)' ds_element_handler = webservice.ElementHandler(ds_path, data_sources) resource_mgr.register_handler(ds_element_handler) # Setup /v1/data-sources/<ds_id>/schema schema = process_dict['api-schema'] schema_path = "%s/schema" % ds_path schema_element_handler = webservice.ElementHandler(schema_path, schema) resource_mgr.register_handler(schema_element_handler) # Setup /v1/data-sources/<ds_id>/tables/<table_id>/spec table_schema_path = "%s/tables/(?P<table_id>[^/]+)/spec" % ds_path table_schema_element_handler = webservice.ElementHandler( table_schema_path, schema) resource_mgr.register_handler(table_schema_element_handler) # Setup action handlers actions = process_dict['api-action'] ds_actions_path = "%s/actions" % ds_path ds_actions_collection_handler = webservice.CollectionHandler( ds_actions_path, actions) resource_mgr.register_handler(ds_actions_collection_handler) # Setup status handlers statuses = process_dict['api-status'] ds_status_path = "%s/status" % ds_path ds_status_element_handler = webservice.ElementHandler( ds_status_path, statuses) resource_mgr.register_handler(ds_status_element_handler) policy_status_path = "%s/status" % policy_path policy_status_element_handler = webservice.ElementHandler( policy_status_path, statuses) resource_mgr.register_handler(policy_status_element_handler) rule_status_path = "%s/status" % rule_path rule_status_element_handler = webservice.ElementHandler( rule_status_path, statuses) resource_mgr.register_handler(rule_status_element_handler) tables = process_dict['api-table'] tables_path = "(%s|%s)/tables" % (ds_path, policy_path) table_collection_handler = webservice.CollectionHandler( tables_path, tables) resource_mgr.register_handler(table_collection_handler) table_path = "%s/(?P<table_id>[^/]+)" % tables_path table_element_handler = webservice.ElementHandler(table_path, tables) resource_mgr.register_handler(table_element_handler) table_rows = process_dict['api-row'] rows_path = "%s/rows" % table_path row_collection_handler = webservice.CollectionHandler( rows_path, table_rows, allow_replace=True) resource_mgr.register_handler(row_collection_handler) row_path = "%s/(?P<row_id>[^/]+)" % rows_path row_element_handler = webservice.ElementHandler(row_path, table_rows) resource_mgr.register_handler(row_element_handler) # Setup /v1/data-sources/<ds_id>/webhook webhook = process_dict['api-webhook'] webhook_path = "%s/webhook" % ds_path webhook_collection_handler = webservice.CollectionHandler( webhook_path, webhook) resource_mgr.register_handler(webhook_collection_handler) # Setup /v1/data-sources/<ds_id>/tables/<table_name>/webhook if cfg.CONF.json_ingester.enable: json_ingester_webhook_path = \ "%s/tables/(?P<table_name>[^/]+)/webhook" % ds_path json_ingester_webhook_collection_handler = \ webservice.CollectionHandler(json_ingester_webhook_path, webhook) resource_mgr.register_handler( json_ingester_webhook_collection_handler) # Setup /v1/system/datasource-drivers system = process_dict['api-system'] # NOTE(arosen): start url out with datasource-drivers since we don't # yet implement /v1/system/ yet. system_collection_handler = webservice.CollectionHandler( r'/v1/system/drivers', system) resource_mgr.register_handler(system_collection_handler) # Setup /v1/system/datasource-drivers/<driver_id> driver_path = r'/v1/system/drivers/(?P<driver_id>[^/]+)' driver_element_handler = webservice.ElementHandler(driver_path, system) resource_mgr.register_handler(driver_element_handler)