Add missing 'changed' and 'ignore_error' to results
The callback was sending them but for some reason we did not have those fields in the model yet. Change-Id: I78c5ed6315d2c300f382b7a2b282722aec73d9a6
This commit is contained in:
parent
c864d0dafa
commit
7bb2cd5bfc
23
ara/api/migrations/0003_add_missing_result_properties.py
Normal file
23
ara/api/migrations/0003_add_missing_result_properties.py
Normal file
@ -0,0 +1,23 @@
|
||||
# Generated by Django 2.2.1 on 2019-05-30 16:00
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('api', '0002_remove_host_alias'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='result',
|
||||
name='changed',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='result',
|
||||
name='ignore_errors',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
@ -253,6 +253,9 @@ class Result(Duration):
|
||||
)
|
||||
|
||||
status = models.CharField(max_length=25, choices=STATUS, default=UNKNOWN)
|
||||
changed = models.BooleanField(default=False)
|
||||
ignore_errors = models.BooleanField(default=False)
|
||||
|
||||
# todo use a single Content table
|
||||
content = models.BinaryField(max_length=(2 ** 32) - 1)
|
||||
host = models.ForeignKey(Host, on_delete=models.CASCADE, related_name="results")
|
||||
|
@ -20,6 +20,22 @@ from rest_framework import serializers
|
||||
from ara.api import fields as ara_fields, models
|
||||
|
||||
|
||||
class ResultStatusSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
status = serializers.SerializerMethodField()
|
||||
|
||||
@staticmethod
|
||||
def get_status(obj):
|
||||
if obj.status == "ok" and obj.changed:
|
||||
return "changed"
|
||||
elif obj.status == "failed" and obj.ignore_errors:
|
||||
return "ignored"
|
||||
else:
|
||||
return obj.status
|
||||
|
||||
|
||||
class DurationSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
abstract = True
|
||||
@ -90,7 +106,7 @@ class SimpleTaskSerializer(DurationSerializer):
|
||||
exclude = ("tags", "created", "updated")
|
||||
|
||||
|
||||
class SimpleResultSerializer(DurationSerializer):
|
||||
class SimpleResultSerializer(DurationSerializer, ResultStatusSerializer):
|
||||
class Meta:
|
||||
model = models.Result
|
||||
exclude = ("content", "created", "updated")
|
||||
@ -133,7 +149,7 @@ class NestedPlaybookHostSerializer(serializers.ModelSerializer):
|
||||
fields = ("id", "name")
|
||||
|
||||
|
||||
class NestedPlaybookResultSerializer(DurationSerializer):
|
||||
class NestedPlaybookResultSerializer(DurationSerializer, ResultStatusSerializer):
|
||||
class Meta:
|
||||
model = models.Result
|
||||
exclude = ("content", "created", "updated", "playbook", "play", "task")
|
||||
@ -230,7 +246,7 @@ class DetailedHostSerializer(serializers.ModelSerializer):
|
||||
facts = ara_fields.CompressedObjectField(read_only=True)
|
||||
|
||||
|
||||
class DetailedResultSerializer(serializers.ModelSerializer):
|
||||
class DetailedResultSerializer(DurationSerializer, ResultStatusSerializer):
|
||||
class Meta:
|
||||
model = models.Result
|
||||
fields = "__all__"
|
||||
@ -306,7 +322,7 @@ class ListHostSerializer(serializers.ModelSerializer):
|
||||
playbook = serializers.PrimaryKeyRelatedField(read_only=True)
|
||||
|
||||
|
||||
class ListResultSerializer(DurationSerializer):
|
||||
class ListResultSerializer(DurationSerializer, ResultStatusSerializer):
|
||||
class Meta:
|
||||
model = models.Result
|
||||
exclude = ("content", "created", "updated")
|
||||
|
@ -113,6 +113,8 @@ class ResultFactory(factory.DjangoModelFactory):
|
||||
task = factory.SubFactory(TaskFactory)
|
||||
play = factory.SubFactory(PlayFactory)
|
||||
playbook = factory.SubFactory(PlaybookFactory)
|
||||
changed = False
|
||||
ignore_errors = False
|
||||
|
||||
|
||||
class RecordFactory(factory.DjangoModelFactory):
|
||||
|
@ -36,12 +36,16 @@ class ResultTestCase(APITestCase):
|
||||
"task": task.id,
|
||||
"play": task.play.id,
|
||||
"playbook": task.playbook.id,
|
||||
"changed": False,
|
||||
"ignore_errors": False,
|
||||
}
|
||||
)
|
||||
serializer.is_valid()
|
||||
result = serializer.save()
|
||||
result.refresh_from_db()
|
||||
self.assertEqual(result.status, "skipped")
|
||||
self.assertEqual(result.changed, False)
|
||||
self.assertEqual(result.ignore_errors, False)
|
||||
self.assertEqual(result.host.id, host.id)
|
||||
self.assertEqual(result.task.id, task.id)
|
||||
|
||||
@ -98,9 +102,13 @@ class ResultTestCase(APITestCase):
|
||||
"task": task.id,
|
||||
"play": task.play.id,
|
||||
"playbook": task.playbook.id,
|
||||
"changed": True,
|
||||
"ignore_errors": False,
|
||||
},
|
||||
)
|
||||
self.assertEqual(201, request.status_code)
|
||||
self.assertEqual(request.data["changed"], True)
|
||||
self.assertEqual(request.data["ignore_errors"], False)
|
||||
self.assertEqual(1, models.Result.objects.count())
|
||||
|
||||
def test_partial_update_result(self):
|
||||
@ -146,3 +154,28 @@ class ResultTestCase(APITestCase):
|
||||
self.assertEqual(2, len(results))
|
||||
self.assertEqual(failed_result.status, results[0]["status"])
|
||||
self.assertEqual(skipped_result.status, results[1]["status"])
|
||||
|
||||
def test_result_status_serializer(self):
|
||||
ok = factories.ResultFactory(status="ok")
|
||||
result = self.client.get("/api/v1/results/%s" % ok.id)
|
||||
self.assertEqual(result.data["status"], "ok")
|
||||
|
||||
changed = factories.ResultFactory(status="ok", changed=True)
|
||||
result = self.client.get("/api/v1/results/%s" % changed.id)
|
||||
self.assertEqual(result.data["status"], "changed")
|
||||
|
||||
failed = factories.ResultFactory(status="failed")
|
||||
result = self.client.get("/api/v1/results/%s" % failed.id)
|
||||
self.assertEqual(result.data["status"], "failed")
|
||||
|
||||
ignored = factories.ResultFactory(status="failed", ignore_errors=True)
|
||||
result = self.client.get("/api/v1/results/%s" % ignored.id)
|
||||
self.assertEqual(result.data["status"], "ignored")
|
||||
|
||||
skipped = factories.ResultFactory(status="skipped")
|
||||
result = self.client.get("/api/v1/results/%s" % skipped.id)
|
||||
self.assertEqual(result.data["status"], "skipped")
|
||||
|
||||
unreachable = factories.ResultFactory(status="unreachable")
|
||||
result = self.client.get("/api/v1/results/%s" % unreachable.id)
|
||||
self.assertEqual(result.data["status"], "unreachable")
|
||||
|
@ -337,10 +337,8 @@ class CallbackModule(CallbackBase):
|
||||
started=self.task["started"],
|
||||
ended=datetime.datetime.now().isoformat(),
|
||||
changed=result._result.get("changed", False),
|
||||
failed=result._result.get("failed", False),
|
||||
skipped=result._result.get("skipped", False),
|
||||
unreachable=result._result.get("unreachable", False),
|
||||
ignore_errors=kwargs.get("ignore_errors", False),
|
||||
# Note: ignore_errors might be None instead of a boolean
|
||||
ignore_errors=kwargs.get("ignore_errors", False) or False,
|
||||
)
|
||||
|
||||
if self.task["action"] == "setup" and "ansible_facts" in results:
|
||||
|
Loading…
x
Reference in New Issue
Block a user