From fc7126cd685c34fce0eace15626107634130c79e Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Mon, 11 May 2015 10:09:20 -0400 Subject: [PATCH] expose single_fact via related and tests --- awx/api/serializers.py | 3 ++ awx/api/views.py | 6 ++-- awx/main/tests/fact/fact_api.py | 58 +++++++++++++++++++++++++++++++-- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index cb6d4eaeb6..f44361a79e 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -778,6 +778,7 @@ class InventorySerializer(BaseSerializerWithVariables): activity_stream = reverse('api:inventory_activity_stream_list', args=(obj.pk,)), scan_job_templates = reverse('api:inventory_scan_job_template_list', args=(obj.pk,)), ad_hoc_commands = reverse('api:inventory_ad_hoc_commands_list', args=(obj.pk,)), + single_fact = reverse('api:inventory_single_fact_view', args=(obj.pk,)), )) if obj.organization and obj.organization.active: res['organization'] = reverse('api:organization_detail', args=(obj.organization.pk,)) @@ -831,6 +832,7 @@ class HostSerializer(BaseSerializerWithVariables): ad_hoc_commands = reverse('api:host_ad_hoc_commands_list', args=(obj.pk,)), ad_hoc_command_events = reverse('api:host_ad_hoc_command_events_list', args=(obj.pk,)), fact_versions = reverse('api:host_fact_versions_list', args=(obj.pk,)), + single_fact = reverse('api:host_single_fact_view', args=(obj.pk,)), )) if obj.inventory and obj.inventory.active: res['inventory'] = reverse('api:inventory_detail', args=(obj.inventory.pk,)) @@ -932,6 +934,7 @@ class GroupSerializer(BaseSerializerWithVariables): activity_stream = reverse('api:group_activity_stream_list', args=(obj.pk,)), inventory_sources = reverse('api:group_inventory_sources_list', args=(obj.pk,)), ad_hoc_commands = reverse('api:group_ad_hoc_commands_list', args=(obj.pk,)), + single_fact = reverse('api:group_single_fact_view', args=(obj.pk,)), )) if obj.inventory and obj.inventory.active: res['inventory'] = reverse('api:inventory_detail', args=(obj.inventory.pk,)) diff --git a/awx/api/views.py b/awx/api/views.py index 9380c006d8..20a6681d36 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -943,7 +943,7 @@ class InventorySingleFactView(MongoAPIView): datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now() inventory_obj = self.get_parent_object() fact_data = Fact.get_single_facts([h.name for h in inventory_obj.hosts.all()], fact_key, fact_value, datetime_actual, module_spec) - return Response(FactSerializer(fact_data).data if fact_data is not None else {}) + return Response(dict(results=FactSerializer(fact_data).data if fact_data is not None else [])) class HostList(ListCreateAPIView): @@ -1067,7 +1067,7 @@ class HostSingleFactView(MongoAPIView): datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now() host_obj = self.get_parent_object() fact_data = Fact.get_single_facts([host_obj.name], fact_key, fact_value, datetime_actual, module_spec) - return Response(FactSerializer(fact_data, context=dict(host_obj=host_obj)).data if fact_data is not None else {}) + return Response(dict(results=FactSerializer(fact_data).data if fact_data is not None else [])) class HostFactCompareView(MongoAPIView): @@ -1245,7 +1245,7 @@ class GroupSingleFactView(MongoAPIView): datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now() group_obj = self.get_parent_object() fact_data = Fact.get_single_facts([h.name for h in group_obj.hosts.all()], fact_key, fact_value, datetime_actual, module_spec) - return Response(FactSerializer(fact_data).data if fact_data is not None else {}) + return Response(dict(results=FactSerializer(fact_data).data if fact_data is not None else [])) class InventoryGroupsList(SubListCreateAttachDetachAPIView): diff --git a/awx/main/tests/fact/fact_api.py b/awx/main/tests/fact/fact_api.py index 5d042dd714..55156d1436 100644 --- a/awx/main/tests/fact/fact_api.py +++ b/awx/main/tests/fact/fact_api.py @@ -14,7 +14,7 @@ from awx.fact.models import * # noqa from awx.fact.tests.base import BaseFactTestMixin, FactScanBuilder, TEST_FACT_ANSIBLE, TEST_FACT_PACKAGES, TEST_FACT_SERVICES from awx.main.utils import build_url -__all__ = ['FactVersionApiTest', 'FactViewApiTest'] +__all__ = ['FactVersionApiTest', 'FactViewApiTest', 'SingleFactApiTest',] class FactApiBaseTest(BaseLiveServerTest, BaseFactTestMixin): def setUp(self): @@ -94,7 +94,6 @@ class FactVersionApiTest(FactApiBaseTest): for entry in response['results']: self.assertIn('fact_view', entry['related']) r = self.get(entry['related']['fact_view'], expect=200) - print(r) def test_list(self): self.setup_facts(2) @@ -180,3 +179,58 @@ class FactViewApiTest(FactApiBaseTest): ts = self.builder.get_timestamp(3) self.get_fact(Fact.objects.filter(host=self.fact_host, module='ansible', timestamp__lte=ts).order_by('-timestamp')[0], dict(datetime=ts)) + +class SingleFactApiTest(FactApiBaseTest): + def setUp(self): + super(SingleFactApiTest, self).setUp() + + self.group = self.inventory.groups.create(name='test-group') + self.group.hosts.add(self.host, self.host2, self.host3) + + def test_permission_list(self): + url = reverse('api:host_fact_versions_list', args=(self.host.pk,)) + with self.current_user('admin'): + self.get(url, expect=200) + with self.current_user('normal'): + self.get(url, expect=200) + with self.current_user('other'): + self.get(url, expect=403) + with self.current_user('nobody'): + self.get(url, expect=403) + with self.current_user(None): + self.get(url, expect=401) + + def _test_related(self, url): + with self.current_user(self.super_django_user): + response = self.get(url, expect=200) + self.assertTrue(len(response['results']) > 0) + for entry in response['results']: + self.assertIn('single_fact', entry['related']) + # Requires fields + r = self.get(entry['related']['single_fact'], expect=400) + + def test_related_host_list(self): + self.setup_facts(2) + self._test_related(reverse('api:host_list')) + + def test_related_group_list(self): + self.setup_facts(2) + self._test_related(reverse('api:group_list')) + + def test_related_inventory_list(self): + self.setup_facts(2) + self._test_related(reverse('api:inventory_list')) + + def test_params(self): + self.setup_facts(2) + params = { + 'module': 'packages', + 'fact_key': 'name', + 'fact_value': 'acpid', + } + url = build_url('api:inventory_single_fact_view', args=(self.inventory.pk,), get=params) + with self.current_user(self.super_django_user): + response = self.get(url, expect=200) + self.assertEqual(len(response['results']), 3) + for entry in response['results']: + self.assertEqual(entry['fact'][0]['name'], 'acpid')