diff --git a/ara/api/migrations/0001_initial.py b/ara/api/migrations/0001_initial.py index 071ef54..1702352 100644 --- a/ara/api/migrations/0001_initial.py +++ b/ara/api/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-18 19:29 +# Generated by Django 2.1.5 on 2019-01-10 22:42 from django.db import migrations, models import django.db.models.deletion @@ -107,7 +107,7 @@ class Migration(migrations.Migration): ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('key', models.CharField(max_length=255)), - ('value', models.TextField(blank=True, null=True)), + ('value', models.BinaryField(max_length=4294967295)), ('type', models.CharField(max_length=255)), ('playbook', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='records', to='api.Playbook')), ], diff --git a/ara/api/models.py b/ara/api/models.py index 0bbad52..f3fff09 100644 --- a/ara/api/models.py +++ b/ara/api/models.py @@ -140,7 +140,7 @@ class Record(Base): unique_together = ("key", "playbook") key = models.CharField(max_length=255) - value = models.TextField(null=True, blank=True) + value = models.BinaryField(max_length=(2 ** 32) - 1) type = models.CharField(max_length=255) playbook = models.ForeignKey(Playbook, on_delete=models.CASCADE, related_name="records") diff --git a/ara/api/serializers.py b/ara/api/serializers.py index af25312..29e4e0d 100644 --- a/ara/api/serializers.py +++ b/ara/api/serializers.py @@ -203,6 +203,11 @@ class RecordSerializer(serializers.ModelSerializer): model = models.Record fields = "__all__" + value = CompressedObjectField( + default=zlib.compress(json.dumps("").encode("utf8")), + help_text="A string, list, dict, json or other formatted data", + ) + class StatsSerializer(serializers.ModelSerializer): class Meta: diff --git a/ara/api/tests/factories.py b/ara/api/tests/factories.py index 05cc657..5f64c93 100644 --- a/ara/api/tests/factories.py +++ b/ara/api/tests/factories.py @@ -27,6 +27,7 @@ PLAYBOOK_ARGUMENTS = {"ansible_version": "2.5.5", "inventory": "/etc/ansible/hos RESULT_CONTENTS = {"results": [{"msg": "something happened"}]} LABEL_DESCRIPTION = "label description" TASK_TAGS = ["always", "never"] +RECORD_LIST = ["one", "two", "three"] class PlaybookFactory(factory.DjangoModelFactory): @@ -116,8 +117,8 @@ class RecordFactory(factory.DjangoModelFactory): model = models.Record key = "record-key" - value = "some-value" - type = "text" + value = utils.compressed_obj(RECORD_LIST) + type = "list" playbook = factory.SubFactory(PlaybookFactory) diff --git a/ara/api/tests/tests_records.py b/ara/api/tests/tests_records.py index bf7e1b4..d0dff5b 100644 --- a/ara/api/tests/tests_records.py +++ b/ara/api/tests/tests_records.py @@ -18,7 +18,7 @@ from rest_framework.test import APITestCase from ara.api import models, serializers -from ara.api.tests import factories +from ara.api.tests import factories, utils class RecordTestCase(APITestCase): @@ -29,14 +29,14 @@ class RecordTestCase(APITestCase): def test_record_serializer(self): playbook = factories.PlaybookFactory() serializer = serializers.RecordSerializer( - data={"key": "test", "value": "value", "type": "text", "playbook": playbook.id} + data={"key": "test", "value": factories.RECORD_LIST, "type": "list", "playbook": playbook.id} ) serializer.is_valid() record = serializer.save() record.refresh_from_db() self.assertEqual(record.key, "test") - self.assertEqual(record.value, "value") - self.assertEqual(record.type, "text") + self.assertEqual(record.value, utils.compressed_obj(factories.RECORD_LIST)) + self.assertEqual(record.type, "list") def test_get_no_records(self): request = self.client.get("/api/v1/records") @@ -55,7 +55,7 @@ class RecordTestCase(APITestCase): self.assertEqual(204, request.status_code) self.assertEqual(0, models.Record.objects.all().count()) - def test_create_record(self): + def test_create_text_record(self): playbook = factories.PlaybookFactory() self.assertEqual(0, models.Record.objects.count()) request = self.client.post( @@ -64,6 +64,50 @@ class RecordTestCase(APITestCase): self.assertEqual(201, request.status_code) self.assertEqual(1, models.Record.objects.count()) + def test_create_list_record(self): + playbook = factories.PlaybookFactory() + self.assertEqual(0, models.Record.objects.count()) + test_list = factories.RECORD_LIST + request = self.client.post( + "/api/v1/records", {"key": "listrecord", "value": test_list, "type": "list", "playbook": playbook.id} + ) + self.assertEqual(201, request.status_code) + self.assertEqual(1, models.Record.objects.count()) + self.assertEqual(test_list, request.data["value"]) + + def test_create_dict_record(self): + playbook = factories.PlaybookFactory() + self.assertEqual(0, models.Record.objects.count()) + test_dict = {"a": "dictionary"} + request = self.client.post( + "/api/v1/records", {"key": "dictrecord", "value": test_dict, "type": "dict", "playbook": playbook.id} + ) + self.assertEqual(201, request.status_code) + self.assertEqual(1, models.Record.objects.count()) + self.assertEqual(test_dict, request.data["value"]) + + def test_create_json_record(self): + playbook = factories.PlaybookFactory() + self.assertEqual(0, models.Record.objects.count()) + test_json = '{"a": "dictionary"}' + request = self.client.post( + "/api/v1/records", {"key": "dictrecord", "value": test_json, "type": "json", "playbook": playbook.id} + ) + self.assertEqual(201, request.status_code) + self.assertEqual(1, models.Record.objects.count()) + self.assertEqual(test_json, request.data["value"]) + + def test_create_url_record(self): + playbook = factories.PlaybookFactory() + self.assertEqual(0, models.Record.objects.count()) + test_url = "https://ara.recordsansible.org" + request = self.client.post( + "/api/v1/records", {"key": "dictrecord", "value": test_url, "type": "url", "playbook": playbook.id} + ) + self.assertEqual(201, request.status_code) + self.assertEqual(1, models.Record.objects.count()) + self.assertEqual(test_url, request.data["value"]) + def test_partial_update_record(self): record = factories.RecordFactory() self.assertNotEqual("update", record.key)