Пример #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)
Пример #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)
Пример #3
0
    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")
Пример #4
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)
Пример #5
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)
Пример #6
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)