diff --git a/ara/api/migrations/0007_add_expired_status.py b/ara/api/migrations/0007_add_expired_status.py new file mode 100644 index 00000000..e67d71e2 --- /dev/null +++ b/ara/api/migrations/0007_add_expired_status.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2.16 on 2020-09-17 12:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0006_remove_result_statuses'), + ] + + operations = [ + migrations.AlterField( + model_name='play', + name='status', + field=models.CharField(choices=[('unknown', 'unknown'), ('running', 'running'), ('completed', 'completed'), ('expired', 'expired')], default='unknown', max_length=25), + ), + migrations.AlterField( + model_name='playbook', + name='status', + field=models.CharField(choices=[('unknown', 'unknown'), ('expired', 'expired'), ('running', 'running'), ('completed', 'completed'), ('failed', 'failed')], default='unknown', max_length=25), + ), + migrations.AlterField( + model_name='task', + name='status', + field=models.CharField(choices=[('unknown', 'unknown'), ('running', 'running'), ('completed', 'completed'), ('expired', 'expired')], default='unknown', max_length=25), + ), + ] diff --git a/ara/api/models.py b/ara/api/models.py index c59412ac..703245b0 100644 --- a/ara/api/models.py +++ b/ara/api/models.py @@ -87,7 +87,14 @@ class Playbook(Duration): RUNNING = "running" COMPLETED = "completed" FAILED = "failed" - STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed"), (FAILED, "failed")) + EXPIRED = "expired" + STATUS = ( + (UNKNOWN, "unknown"), + (EXPIRED, "expired"), + (RUNNING, "running"), + (COMPLETED, "completed"), + (FAILED, "failed"), + ) name = models.CharField(max_length=255, null=True) ansible_version = models.CharField(max_length=255) @@ -167,7 +174,8 @@ class Play(Duration): UNKNOWN = "unknown" RUNNING = "running" COMPLETED = "completed" - STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed")) + EXPIRED = "expired" + STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed"), (EXPIRED, "expired")) name = models.CharField(max_length=255, blank=True, null=True) uuid = models.UUIDField() @@ -189,7 +197,8 @@ class Task(Duration): UNKNOWN = "unknown" RUNNING = "running" COMPLETED = "completed" - STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed")) + EXPIRED = "expired" + STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed"), (EXPIRED, "expired")) name = models.TextField(blank=True, null=True) action = models.TextField() diff --git a/ara/api/tests/tests_play.py b/ara/api/tests/tests_play.py index ed30dc23..c43ac4c0 100644 --- a/ara/api/tests/tests_play.py +++ b/ara/api/tests/tests_play.py @@ -86,6 +86,15 @@ class PlayTestCase(APITestCase): play_updated = models.Play.objects.get(id=play.id) self.assertEqual("update", play_updated.name) + def test_expired_play(self): + play = factories.PlayFactory(status="running") + self.assertEqual("running", play.status) + + request = self.client.patch("/api/v1/plays/%s" % play.id, {"status": "expired"}) + self.assertEqual(200, request.status_code) + play_updated = models.Play.objects.get(id=play.id) + self.assertEqual("expired", play_updated.status) + def test_get_play(self): play = factories.PlayFactory() request = self.client.get("/api/v1/plays/%s" % play.id) diff --git a/ara/api/tests/tests_playbook.py b/ara/api/tests/tests_playbook.py index eb9ae115..f23496e1 100644 --- a/ara/api/tests/tests_playbook.py +++ b/ara/api/tests/tests_playbook.py @@ -111,6 +111,15 @@ class PlaybookTestCase(APITestCase): playbook_updated = models.Playbook.objects.get(id=playbook.id) self.assertNotEqual("wrong", playbook_updated.status) + def test_expired_playbook(self): + playbook = factories.PlaybookFactory(status="running") + self.assertEqual("running", playbook.status) + + request = self.client.patch("/api/v1/playbooks/%s" % playbook.id, {"status": "expired"}) + self.assertEqual(200, request.status_code) + playbook_updated = models.Playbook.objects.get(id=playbook.id) + self.assertEqual("expired", playbook_updated.status) + def test_get_playbook(self): playbook = factories.PlaybookFactory() request = self.client.get("/api/v1/playbooks/%s" % playbook.id) diff --git a/ara/api/tests/tests_task.py b/ara/api/tests/tests_task.py index e955b886..5faf6c90 100644 --- a/ara/api/tests/tests_task.py +++ b/ara/api/tests/tests_task.py @@ -122,6 +122,15 @@ class TaskTestCase(APITestCase): task_updated = models.Task.objects.get(id=task.id) self.assertEqual("update", task_updated.name) + def test_expired_task(self): + task = factories.TaskFactory(status="running") + self.assertEqual("running", task.status) + + request = self.client.patch("/api/v1/tasks/%s" % task.id, {"status": "expired"}) + self.assertEqual(200, request.status_code) + task_updated = models.Task.objects.get(id=task.id) + self.assertEqual("expired", task_updated.status) + def test_get_task(self): task = factories.TaskFactory() request = self.client.get("/api/v1/tasks/%s" % task.id) diff --git a/ara/ui/templates/partials/playbook_status_icon.html b/ara/ui/templates/partials/playbook_status_icon.html index 94e3d1aa..56118c99 100644 --- a/ara/ui/templates/partials/playbook_status_icon.html +++ b/ara/ui/templates/partials/playbook_status_icon.html @@ -10,6 +10,10 @@
+{% elif status == "expired" %} +
+ +
{% else %}
diff --git a/doc/source/cli.rst b/doc/source/cli.rst index 96ac5966..44258acb 100644 --- a/doc/source/cli.rst +++ b/doc/source/cli.rst @@ -86,9 +86,10 @@ Examples: # Return which playbooks would be deleted by ommitting --confirm ara playbook prune - # Different retention for successful and unsuccessful playbooks + # Different retention for successful, unsuccessful and expired playbooks ara playbook prune --status ok --days 30 --confirm ara playbook prune --status failed --days 90 --confirm + ara playbook prune --status expired --days 3 --confirm # Different retention based on labels ara playbook prune --label dev --days 7 --confirm