Add API endpoints for hosts

This makes the API endpoints for hosts available for consumption.

Change-Id: Ifab3b27e81b27808aa33f484e228b90356e2406c
This commit is contained in:
David Moreau Simard 2018-06-20 16:32:40 -04:00
parent 5b301c3b4f
commit ccffd48287
No known key found for this signature in database
GPG Key ID: 33A07694CBB71ECC
5 changed files with 117 additions and 1 deletions

View File

@ -105,6 +105,14 @@ class FileSerializer(serializers.ModelSerializer):
content = FileContentField()
class HostSerializer(serializers.ModelSerializer):
class Meta:
model = models.Host
fields = '__all__'
facts = CompressedObjectField(default=zlib.compress(json.dumps({}).encode('utf8')))
class ResultSerializer(serializers.ModelSerializer):
class Meta:
model = models.Result

View File

@ -51,3 +51,17 @@ class TaskFactory(factory.DjangoModelFactory):
tags = b'x\x9c\x8bVJ\xcb\xcfW\xd2QPJJ,R\x8a\x05\x00\x1eH\x04\x06'
play = factory.SubFactory(PlayFactory)
file = factory.SubFactory(FileFactory)
class HostFactory(factory.DjangoModelFactory):
class Meta:
model = models.Host
facts = b'x\x9c\xabVJ\xcb\xcfW\xb2RPJJ,R\xaa\x05\x00 \x98\x04T'
name = 'hostname'
changed = 1
failed = 0
ok = 2
skipped = 1
unreachable = 0
play = factory.SubFactory(PlayFactory)

View File

@ -0,0 +1,81 @@
from rest_framework.test import APITestCase
from ara.api import models, serializers
from ara.api.tests import factories
class HostTestCase(APITestCase):
def test_host_factory(self):
host = factories.HostFactory(name='testhost')
self.assertEqual(host.name, 'testhost')
def test_host_serializer(self):
play = factories.PlayFactory()
serializer = serializers.HostSerializer(data={
'name': 'serializer',
'play': play.id
})
serializer.is_valid()
host = serializer.save()
host.refresh_from_db()
self.assertEqual(host.name, 'serializer')
self.assertEqual(host.play.id, play.id)
def test_host_serializer_compress_facts(self):
play = factories.PlayFactory()
serializer = serializers.HostSerializer(data={
'name': 'compress',
'facts': {'foo': 'bar'},
'play': play.id,
})
serializer.is_valid()
host = serializer.save()
host.refresh_from_db()
self.assertEqual(host.facts, b'x\x9c\xabVJ\xcb\xcfW\xb2RPJJ,R\xaa\x05\x00 \x98\x04T')
def test_host_serializer_decompress_facts(self):
host = factories.HostFactory(facts=b'x\x9c\xabVJ\xcb\xcfW\xb2RPJJ,R\xaa\x05\x00 \x98\x04T')
serializer = serializers.HostSerializer(instance=host)
self.assertEqual(serializer.data['facts'], {'foo': 'bar'})
def test_get_no_hosts(self):
request = self.client.get('/api/v1/hosts/')
self.assertEqual(0, len(request.data['results']))
def test_get_hosts(self):
host = factories.HostFactory()
request = self.client.get('/api/v1/hosts/')
self.assertEqual(1, len(request.data['results']))
self.assertEqual(host.name, request.data['results'][0]['name'])
def test_delete_host(self):
host = factories.HostFactory()
self.assertEqual(1, models.Host.objects.all().count())
request = self.client.delete('/api/v1/hosts/%s/' % host.id)
self.assertEqual(204, request.status_code)
self.assertEqual(0, models.Host.objects.all().count())
def test_create_host(self):
play = factories.PlayFactory()
self.assertEqual(0, models.Host.objects.count())
request = self.client.post('/api/v1/hosts/', {
'name': 'create',
'play': play.id
})
self.assertEqual(201, request.status_code)
self.assertEqual(1, models.Host.objects.count())
def test_partial_update_host(self):
host = factories.HostFactory()
self.assertNotEqual(1, host.ok)
request = self.client.patch('/api/v1/hosts/%s/' % host.id, {
'ok': 1
})
self.assertEqual(200, request.status_code)
host_updated = models.Host.objects.get(id=host.id)
self.assertEqual(1, host_updated.ok)
def test_get_host(self):
host = factories.HostFactory()
request = self.client.get('/api/v1/hosts/%s/' % host.id)
self.assertEqual(host.name, request.data['name'])

View File

@ -28,6 +28,8 @@ urlpatterns = [
url(r'^plays/(?P<pk>[0-9]+)/$', views.PlayDetail.as_view(), name='play-detail'),
url(r'^tasks/$', views.TaskList.as_view(), name='task-list'),
url(r'^tasks/(?P<pk>[0-9]+)/$', views.TaskDetail.as_view(), name='task-detail'),
url(r'^hosts/$', views.HostList.as_view(), name='host-list'),
url(r'^hosts/(?P<pk>[0-9]+)/$', views.HostDetail.as_view(), name='host-detail'),
url(r'^files/$', views.FileList.as_view(), name='file-list'),
url(r'^files/(?P<pk>[0-9]+)/$', views.FileDetail.as_view(), name='file-detail'),
]

View File

@ -29,7 +29,8 @@ def api_root(request, format=None):
'playbooks': reverse('playbook-list', request=request, format=format),
'plays': reverse('play-list', request=request, format=format),
'tasks': reverse('task-list', request=request, format=format),
'files': reverse('file-list', request=request, format=format)
'files': reverse('file-list', request=request, format=format),
'hosts': reverse('host-list', request=request, format=format)
})
@ -77,6 +78,16 @@ class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = serializers.TaskSerializer
class HostList(generics.ListCreateAPIView):
queryset = models.Host.objects.all()
serializer_class = serializers.HostSerializer
class HostDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Host.objects.all()
serializer_class = serializers.HostSerializer
class FileList(generics.ListCreateAPIView):
queryset = models.File.objects.all()
serializer_class = serializers.FileSerializer