mirror of
https://github.com/ansible/awx.git
synced 2026-05-06 17:07:36 -02:30
expose single_fact via related and tests
This commit is contained in:
@@ -778,6 +778,7 @@ class InventorySerializer(BaseSerializerWithVariables):
|
|||||||
activity_stream = reverse('api:inventory_activity_stream_list', args=(obj.pk,)),
|
activity_stream = reverse('api:inventory_activity_stream_list', args=(obj.pk,)),
|
||||||
scan_job_templates = reverse('api:inventory_scan_job_template_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,)),
|
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:
|
if obj.organization and obj.organization.active:
|
||||||
res['organization'] = reverse('api:organization_detail', args=(obj.organization.pk,))
|
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_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,)),
|
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,)),
|
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:
|
if obj.inventory and obj.inventory.active:
|
||||||
res['inventory'] = reverse('api:inventory_detail', args=(obj.inventory.pk,))
|
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,)),
|
activity_stream = reverse('api:group_activity_stream_list', args=(obj.pk,)),
|
||||||
inventory_sources = reverse('api:group_inventory_sources_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,)),
|
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:
|
if obj.inventory and obj.inventory.active:
|
||||||
res['inventory'] = reverse('api:inventory_detail', args=(obj.inventory.pk,))
|
res['inventory'] = reverse('api:inventory_detail', args=(obj.inventory.pk,))
|
||||||
|
|||||||
@@ -943,7 +943,7 @@ class InventorySingleFactView(MongoAPIView):
|
|||||||
datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now()
|
datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now()
|
||||||
inventory_obj = self.get_parent_object()
|
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)
|
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):
|
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()
|
datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now()
|
||||||
host_obj = self.get_parent_object()
|
host_obj = self.get_parent_object()
|
||||||
fact_data = Fact.get_single_facts([host_obj.name], fact_key, fact_value, datetime_actual, module_spec)
|
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):
|
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()
|
datetime_actual = dateutil.parser.parse(datetime_spec) if datetime_spec is not None else now()
|
||||||
group_obj = self.get_parent_object()
|
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)
|
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):
|
class InventoryGroupsList(SubListCreateAttachDetachAPIView):
|
||||||
|
|
||||||
|
|||||||
@@ -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.fact.tests.base import BaseFactTestMixin, FactScanBuilder, TEST_FACT_ANSIBLE, TEST_FACT_PACKAGES, TEST_FACT_SERVICES
|
||||||
from awx.main.utils import build_url
|
from awx.main.utils import build_url
|
||||||
|
|
||||||
__all__ = ['FactVersionApiTest', 'FactViewApiTest']
|
__all__ = ['FactVersionApiTest', 'FactViewApiTest', 'SingleFactApiTest',]
|
||||||
|
|
||||||
class FactApiBaseTest(BaseLiveServerTest, BaseFactTestMixin):
|
class FactApiBaseTest(BaseLiveServerTest, BaseFactTestMixin):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -94,7 +94,6 @@ class FactVersionApiTest(FactApiBaseTest):
|
|||||||
for entry in response['results']:
|
for entry in response['results']:
|
||||||
self.assertIn('fact_view', entry['related'])
|
self.assertIn('fact_view', entry['related'])
|
||||||
r = self.get(entry['related']['fact_view'], expect=200)
|
r = self.get(entry['related']['fact_view'], expect=200)
|
||||||
print(r)
|
|
||||||
|
|
||||||
def test_list(self):
|
def test_list(self):
|
||||||
self.setup_facts(2)
|
self.setup_facts(2)
|
||||||
@@ -180,3 +179,58 @@ class FactViewApiTest(FactApiBaseTest):
|
|||||||
ts = self.builder.get_timestamp(3)
|
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],
|
self.get_fact(Fact.objects.filter(host=self.fact_host, module='ansible', timestamp__lte=ts).order_by('-timestamp')[0],
|
||||||
dict(datetime=ts))
|
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')
|
||||||
|
|||||||
Reference in New Issue
Block a user