Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
 def test_get_action_type(self):
     collection_handler = webservice.CollectionHandler(r'/', '')
     self.assertEqual('get', collection_handler._get_action_type("GET"))
     self.assertEqual('create', collection_handler._get_action_type("POST"))
     self.assertEqual('delete',
                      collection_handler._get_action_type("DELETE"))
     self.assertEqual('update',
                      collection_handler._get_action_type("PATCH"))
     self.assertEqual('update', collection_handler._get_action_type("PUT"))
     self.assertRaises(TypeError, collection_handler._get_action_type,
                       'Wah!')
Esempio n. 4
0
    def test_replace_members(self):
        collection_handler = webservice.CollectionHandler(r'/', '')
        collection_handler.model = webservice.SimpleDataModel('test')
        request = webob.Request.blank('/')
        request.content_type = 'application/json'
        request.body = '{"key1": "value1", "key2": "value2"}'.encode('utf-8')
        response = collection_handler.replace_members(request)

        self.assertEqual('application/json', response.content_type)
        self.assertEqual(str(int(httplib.OK)) + " OK", response.status)
        expected_items = {
            "key1": "value1",
            "key2": "value2",
        }
        self.assertEqual(expected_items, collection_handler.model.items)
Esempio n. 5
0
 def test_create_member(self):
     collection_handler = webservice.CollectionHandler(r'/', '')
     collection_handler.model = webservice.SimpleDataModel("test")
     request = mock.MagicMock()
     request.body = '{"key": "value"}'
     request.path = "/"
     response = collection_handler.create_member(request, id_='123')
     self.assertEqual('application/json', response.content_type)
     self.assertEqual(str(httplib.CREATED) + " Created", response.status)
     self.assertEqual("%s/%s" % (request.path, '123'), response.location)
     actual_response = json.loads(response.body)
     actual_id = actual_response.get("id")
     actual_value = actual_response.get("key")
     self.assertEqual('123', actual_id)
     self.assertEqual('value', actual_value)
Esempio n. 6
0
    def test_list_members(self):
        collection_handler = webservice.CollectionHandler(r'/', '')
        collection_handler.model = webservice.SimpleDataModel("test")
        request = mock.MagicMock()
        request.body = '{"key": "value"}'
        request.params = mock.MagicMock()
        request.path = "/"
        response = collection_handler.list_members(request)
        items = collection_handler.model.get_items(
            request.params, context=collection_handler._get_context(request))

        expected_body = ("%s\n" % json.dumps(items, indent=2)).encode('utf-8')
        self.assertEqual('application/json', response.content_type)

        self.assertEqual(expected_body, response.body)
        self.assertEqual('application/json', response.content_type)
        self.assertEqual(str(int(httplib.OK)) + " OK", response.status)
Esempio n. 7
0
    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)
Esempio n. 8
0
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)
Esempio n. 9
0
    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)