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:
David Moreau Simard 2019-05-30 11:07:01 -04:00
parent c864d0dafa
commit 7bb2cd5bfc
No known key found for this signature in database
GPG Key ID: CBEB466764A9E621
6 changed files with 83 additions and 8 deletions

View 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),
),
]

View File

@ -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")

View File

@ -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")

View File

@ -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):

View File

@ -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")

View File

@ -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: