def test_facets(self):
        fake_request = unit_test_utils.get_fake_request(USER1, TENANT1, "/v1/search/facets", is_admin=False)

        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine

        mock_engine.search.return_value = {
            "aggregations": {
                "status": {"buckets": [{"key": "pending", "doc_count": 2}]},
                "type": {"buckets": [{"key": "PRIMARY", "doc_count": 2}]},
            }
        }

        facets = self.plugin.get_facets(fake_request.context)

        status_facet = list(filter(lambda f: f["name"] == "status", facets))[0]
        expected_status = {"name": "status", "options": [{"key": "pending", "doc_count": 2}], "type": "string"}
        self.assertEqual(expected_status, status_facet)

        expected_agg_query = {
            "aggs": dict(unit_test_utils.simple_facet_field_agg(name) for name in ("status", "type")),
            "query": {"filtered": {"filter": {"and": [{"term": {"project_id": TENANT1}}]}}},
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type="count",
        )
    def test_facets_non_admin(self):
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine
        # Don't care about the actual aggregation result; the base functions
        # are tested separately.
        mock_engine.search.return_value = {'aggregations': {}}

        fake_request = unit_test_utils.get_fake_request(
            USER1, TENANT1, '/v1/search/facets', is_admin=False
        )

        facets = self.plugin.get_facets(fake_request.context)
        facet_names = [f['name'] for f in facets]

        network_facets = ('name', 'version', 'ipv6_addr', 'ipv4_addr',
                          'OS-EXT-IPS-MAC:mac_addr', 'OS-EXT-IPS:type')
        expected_facet_names = [
            'OS-EXT-AZ:availability_zone', 'created_at', 'flavor.id', 'id',
            'image.id', 'name', 'owner', 'security_groups.name', 'status',
            'updated_at', 'user_id']
        expected_facet_names.extend(['networks.' + f for f in network_facets])

        self.assertEqual(set(expected_facet_names), set(facet_names))

        # Test fields with options
        complex_facet_option_fields = (
            'image.id', 'flavor.id', 'networks.name',
            'networks.OS-EXT-IPS:type', 'networks.version',
            'security_groups.name')
        aggs = dict(unit_test_utils.complex_facet_field_agg(name)
                    for name in complex_facet_option_fields)

        simple_facet_option_fields = (
            'status', 'OS-EXT-AZ:availability_zone'
        )
        aggs.update(dict(unit_test_utils.simple_facet_field_agg(name)
                         for name in simple_facet_option_fields))

        expected_agg_query = {
            'aggs': aggs,
            'query': {
                'filtered': {
                    'filter': {
                        'and': [
                            {'term': {ROLE_USER_FIELD: 'user'}},
                            {'term': {'tenant_id': TENANT1}}
                        ]
                    }
                }
            }
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type='count'
        )
    def test_facet_value_query(self):
        fields = ['simple', 'nested.single', 'nested.list']
        aggregation_query = plugin_utils.get_facets_query(fields, 10)

        expected = dict((
            unit_test_utils.simple_facet_field_agg('simple', size=10),
            unit_test_utils.complex_facet_field_agg('nested.single', size=10),
            unit_test_utils.complex_facet_field_agg('nested.list', size=10),
        ))
        self.assertEqual(expected, aggregation_query)
Exemplo n.º 4
0
    def test_facet_value_query(self):
        fields = ['simple', 'nested.single', 'nested.list']
        aggregation_query = plugin_utils.get_facets_query(fields, 10)

        expected = dict((
            unit_test_utils.simple_facet_field_agg('simple', size=10),
            unit_test_utils.complex_facet_field_agg('nested.single', size=10),
            unit_test_utils.complex_facet_field_agg('nested.list', size=10),
        ))
        self.assertEqual(expected, aggregation_query)
    def test_facets(self):
        """Check that expected fields are faceted"""
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine
        mock_engine.search.return_value = {'aggregations': {},
                                           'hits': {'total': 0}}

        fake_request = unit_test_utils.get_fake_request(
            USER1, TENANT1, '/v1/search/facets', is_admin=False
        )

        facets, _ = self.plugin.get_facets(fake_request.context)
        facet_names = [f['name'] for f in facets]

        # Glance has no nested fields but owner and project id are excluded for
        # non admins
        expected_facet_names = self.plugin.get_mapping()['properties'].keys()
        expected_facet_names = set(expected_facet_names) - set(('owner',
                                                                'project_id'))

        self.assertEqual(set(expected_facet_names), set(facet_names))

        facet_option_fields = ('disk_format', 'container_format', 'tags',
                               'visibility', 'status', 'protected',
                               'image_type', 'image_state')
        expected_agg_query = {
            'aggs': dict(unit_test_utils.simple_facet_field_agg(name)
                         for name in facet_option_fields),
            'query': {
                'filtered': {
                    'filter': {
                        'and': [
                            {'term': {ROLE_USER_FIELD: 'user'}},
                            {
                                "or": [
                                    {'term': {'owner': TENANT1}},
                                    {'term': {'visibility': 'public'}},
                                    {'term': {'members': TENANT1}}
                                ]
                            }
                        ]
                    }
                }
            }
        }

        mock_engine.search.assert_called_with(
            index=self.plugin.alias_name_search,
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            size=0
        )
    def test_facets(self):
        """Check that expected fields are faceted"""
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine
        mock_engine.search.return_value = {'aggregations': {},
                                           'hits': {'total': 0}}

        fake_request = unit_test_utils.get_fake_request(
            USER1, TENANT1, '/v1/search/facets', is_admin=False
        )

        facets, _ = self.plugin.get_facets(fake_request.context)
        facet_names = [f['name'] for f in facets]

        # Glance has no nested fields but owner and project id are excluded for
        # non admins
        expected_facet_names = self.plugin.get_mapping()['properties'].keys()
        expected_facet_names = set(expected_facet_names) - set(('owner',
                                                                'project_id'))

        self.assertEqual(set(expected_facet_names), set(facet_names))

        facet_option_fields = ('disk_format', 'container_format', 'tags',
                               'visibility', 'status', 'protected',
                               'image_type', 'image_state')
        expected_agg_query = {
            'aggs': dict(unit_test_utils.simple_facet_field_agg(name)
                         for name in facet_option_fields),
            'query': {
                'bool': {
                    'filter': {
                        'bool': {
                            'must': {'term': {ROLE_USER_FIELD: 'user'}},
                            'should': [
                                {'term': {'owner': TENANT1}},
                                {'term': {'visibility': 'public'}},
                                {'term': {'members': TENANT1}}
                            ],
                            'minimum_should_match': 1
                        }
                    }
                }
            }
        }

        mock_engine.search.assert_called_with(
            index=self.plugin.alias_name_search,
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            size=0
        )
    def test_facets_admin(self):
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine

        fake_request = unit_test_utils.get_fake_request(USER1, TENANT1, "/v1/search/facets", is_admin=True)

        mock_engine.search.return_value = {
            "aggregations": {
                "status": {"buckets": [{"key": "ACTIVE", "doc_count": 2}]},
                "OS-EXT-AZ:availability_zone": {"buckets": []},
                "image.id": {"buckets": [{"key": imagea["id"], "doc_count": 1}]},
                "flavor.id": {"buckets": [{"key": flavor1["id"], "doc_count": 1}]},
                "security_groups": {"buckets": []},
                "network.name": {"buckets": []},
            }
        }

        facets = self.plugin.get_facets(fake_request.context)

        # Check created and updated fields aren't present, even for admins
        self.assertFalse(list(filter(lambda f: f["name"] == "created", facets)))
        self.assertFalse(list(filter(lambda f: f["name"] == "updated", facets)))
        self.assertTrue(list(filter(lambda f: f["name"] == "created_at", facets)))
        self.assertTrue(list(filter(lambda f: f["name"] == "updated_at", facets)))

        # Check unprotected fields are still present
        self.assertTrue(list(filter(lambda f: f["name"] == "status", facets)))

        complex_facet_option_fields = (
            "image.id",
            "flavor.id",
            "networks.name",
            "networks.OS-EXT-IPS:type",
            "networks.version",
            "security_groups.name",
        )
        aggs = dict(unit_test_utils.complex_facet_field_agg(name) for name in complex_facet_option_fields)

        simple_facet_option_fields = ("status", "OS-EXT-AZ:availability_zone")
        aggs.update(dict(unit_test_utils.simple_facet_field_agg(name) for name in simple_facet_option_fields))

        expected_agg_query = {
            "aggs": aggs,
            "query": {"filtered": {"filter": {"and": [{"term": {"tenant_id": TENANT1}}]}}},
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type="count",
        )
    def test_facets(self):
        fake_request = unit_test_utils.get_fake_request(
            USER1, TENANT1, '/v1/search/facets', is_admin=False
        )

        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine

        mock_engine.search.return_value = {
            'aggregations': {
                'status': {
                    'buckets': [{'key': 'pending', 'doc_count': 2}]
                },
                'type': {
                    'buckets': [{'key': 'PRIMARY', 'doc_count': 2}]
                }
            }
        }

        facets = self.plugin.get_facets(fake_request.context)

        status_facet = list(filter(lambda f: f['name'] == 'status', facets))[0]
        expected_status = {
            'name': 'status',
            'options': [{'key': 'pending', 'doc_count': 2}],
            'type': 'string'
        }
        self.assertEqual(expected_status, status_facet)

        expected_agg_query = {
            'aggs': dict(unit_test_utils.simple_facet_field_agg(name)
                         for name in ('status', 'type')),
            'query': {
                'filtered': {
                    'filter': {
                        'and': [
                            {'term': {ROLE_USER_FIELD: 'user'}},
                            {'term': {'project_id': TENANT1}}
                        ]
                    }
                }
            }
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.alias_name_search,
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            size=0
        )
    def test_facets(self):
        """Check that expected fields are faceted"""
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine
        mock_engine.search.return_value = {'aggregations': {}}

        fake_request = unit_test_utils.get_fake_request(
            USER1, TENANT1, '/v1/search/facets', is_admin=False
        )

        facets = self.plugin.get_facets(fake_request.context)
        facet_names = [f['name'] for f in facets]

        # Glance has no nested fields and no special ones that would be faceted
        expected_facet_names = self.plugin.get_mapping()['properties'].keys()

        self.assertEqual(set(expected_facet_names), set(facet_names))

        facet_option_fields = ('disk_format', 'container_format', 'tags',
                               'visibility', 'status', 'protected')
        expected_agg_query = {
            'aggs': dict(unit_test_utils.simple_facet_field_agg(name)
                         for name in facet_option_fields),
            'query': {
                'filtered': {
                    'filter': {
                        'and': [
                            {'term': {ROLE_USER_FIELD: 'user'}},
                            {
                                "or": [
                                    {'term': {'owner': TENANT1}},
                                    {'term': {'visibility': 'public'}},
                                    {'term': {'members': TENANT1}}
                                ]
                            }
                        ]
                    }
                }
            }
        }

        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type='count'
        )
    def test_facets(self):
        fake_request = unit_test_utils.get_fake_request(USER1,
                                                        TENANT1,
                                                        '/v1/search/facets',
                                                        is_admin=False)

        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine

        mock_engine.search.return_value = {
            'aggregations': {
                'status': {
                    'buckets': [{
                        'key': 'pending',
                        'doc_count': 2
                    }]
                },
                'type': {
                    'buckets': [{
                        'key': 'A',
                        'doc_count': 2
                    }]
                }
            }
        }

        facets = self.plugin.get_facets(fake_request.context)

        zone_id_facet = list(filter(lambda f: f['name'] == 'zone_id',
                                    facets))[0]
        expected_zone_id = {
            'name': 'zone_id',
            'type': 'string',
            'resource_type': self.plugin.parent_plugin_type(),
            'parent': True
        }

        self.assertEqual(expected_zone_id, zone_id_facet)

        status_facet = list(filter(lambda f: f['name'] == 'status', facets))[0]
        expected_status = {
            'name': 'status',
            'options': [{
                'key': 'pending',
                'doc_count': 2
            }],
            'type': 'string'
        }
        self.assertEqual(expected_status, status_facet)

        expected_agg_query = {
            'aggs':
            dict(
                unit_test_utils.simple_facet_field_agg(name)
                for name in ('status', 'type')),
            'query': {
                'filtered': {
                    'filter': {
                        'and': [{
                            'term': {
                                ROLE_USER_FIELD: 'user'
                            }
                        }, {
                            'term': {
                                'project_id': TENANT1
                            }
                        }]
                    }
                }
            }
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.alias_name_search,
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            size=0)
    def test_facets(self):
        # Nova tests are more thorough; checking that the right fields are
        # faceted
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine

        fake_request = unit_test_utils.get_fake_request(
            USER1, TENANT1, '/v1/search/facets', is_admin=False
        )

        mock_engine.search.return_value = {
            'aggregations': {
                'container_format': {'buckets': []},
                'disk_format': {'buckets': [{'key': 'raw', 'doc_count': 3}]},
                'tags': {'buckets': []},
                'status': {'buckets': []},
                'visibility': {'buckets': []},
                'protected': {'buckets': []}
            }
        }

        facets = self.plugin.get_facets(fake_request.context)

        disk_format_facets = list(filter(lambda f: f['name'] == 'disk_format',
                                         facets))[0]
        expected_disk_format_facet = {
            'name': 'disk_format',
            'options': [{'key': 'raw', 'doc_count': 3}],
            'type': 'string'
        }
        self.assertEqual(expected_disk_format_facet, disk_format_facets)

        facet_option_fields = ('disk_format', 'container_format', 'tags',
                               'visibility', 'status', 'protected')
        expected_agg_query = {
            'aggs': dict(unit_test_utils.simple_facet_field_agg(name)
                         for name in facet_option_fields),
            'query': {
                'filtered': {
                    'filter': {
                        'and': [
                            {
                                "or": [
                                    {'term': {'owner': TENANT1}},
                                    {'term': {'visibility': 'public'}},
                                    {'term': {'members': TENANT1}}
                                ]
                            }
                        ]
                    }
                }
            }
        }

        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type='count'
        )
    def test_facets_admin(self):
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine
        mock_engine.search.return_value = {'aggregations': {}}

        fake_request = unit_test_utils.get_fake_request(USER1,
                                                        TENANT1,
                                                        '/v1/search/facets',
                                                        is_admin=True)

        facets = self.plugin.get_facets(fake_request.context)
        facet_names = [f['name'] for f in facets]

        network_facets = ('name', 'version', 'ipv6_addr', 'ipv4_addr',
                          'OS-EXT-IPS-MAC:mac_addr', 'OS-EXT-IPS:type')
        expected_facet_names = [
            'OS-EXT-AZ:availability_zone', 'created_at', 'flavor.id', 'id',
            'image.id', 'name', 'owner', 'security_groups', 'status',
            'tenant_id', 'updated_at', 'user_id'
        ]
        expected_facet_names.extend(['networks.' + f for f in network_facets])

        self.assertEqual(set(expected_facet_names), set(facet_names))

        complex_facet_option_fields = ('image.id', 'flavor.id',
                                       'networks.name',
                                       'networks.OS-EXT-IPS:type',
                                       'networks.version')
        aggs = dict(
            unit_test_utils.complex_facet_field_agg(name)
            for name in complex_facet_option_fields)

        simple_facet_option_fields = ('status', 'OS-EXT-AZ:availability_zone',
                                      'security_groups')
        aggs.update(
            dict(
                unit_test_utils.simple_facet_field_agg(name)
                for name in simple_facet_option_fields))

        expected_agg_query = {
            'aggs': aggs,
            'query': {
                'filtered': {
                    'filter': {
                        'and': [{
                            'term': {
                                ROLE_USER_FIELD: 'admin'
                            }
                        }, {
                            'term': {
                                'tenant_id': TENANT1
                            }
                        }]
                    }
                }
            }
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.alias_name_search,
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            size=0)
    def test_facets_all_projects(self):
        # For non admins, all_projects should have no effect
        mock_engine = mock.Mock()
        self.plugin.engine = mock_engine

        # Don't really care about the return values
        mock_engine.search.return_value = {"aggregations": {}}

        fake_request = unit_test_utils.get_fake_request(USER1, TENANT1, "/v1/search/facets", is_admin=False)

        self.plugin.get_facets(fake_request.context, all_projects=True)

        complex_facet_option_fields = (
            "image.id",
            "flavor.id",
            "networks.name",
            "networks.OS-EXT-IPS:type",
            "networks.version",
            "security_groups.name",
        )
        aggs = dict(unit_test_utils.complex_facet_field_agg(name) for name in complex_facet_option_fields)

        simple_facet_option_fields = ("status", "OS-EXT-AZ:availability_zone")
        aggs.update(dict(unit_test_utils.simple_facet_field_agg(name) for name in simple_facet_option_fields))

        expected_agg_query = {
            "aggs": aggs,
            "query": {"filtered": {"filter": {"and": [{"term": {"tenant_id": TENANT1}}]}}},
        }
        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type="count",
        )

        # Admins can request all_projects
        fake_request = unit_test_utils.get_fake_request(USER1, TENANT1, "/v1/search/facets", is_admin=True)

        self.plugin.get_facets(fake_request.context, all_projects=True)
        complex_facet_option_fields = (
            "image.id",
            "flavor.id",
            "networks.name",
            "networks.OS-EXT-IPS:type",
            "networks.version",
            "security_groups.name",
        )
        aggs = dict(unit_test_utils.complex_facet_field_agg(name) for name in complex_facet_option_fields)
        simple_facet_option_fields = ("status", "OS-EXT-AZ:availability_zone")
        aggs.update(dict(unit_test_utils.simple_facet_field_agg(name) for name in simple_facet_option_fields))

        # No query here
        expected_agg_query = {"aggs": aggs}
        mock_engine.search.assert_called_with(
            index=self.plugin.get_index_name(),
            doc_type=self.plugin.get_document_type(),
            body=expected_agg_query,
            ignore_unavailable=True,
            search_type="count",
        )