model: change playbook.completed to playbook.status

We want a bit more granularity regarding the status of the
playbooks, "completed" is not enough.
In 0.x, the status was inferred at runtime. We'll set it so we don't
need to compute it every time.

Change-Id: Ib854ea70827e736fb687a7065986f14d0071291b
This commit is contained in:
David Moreau Simard 2018-10-15 20:53:14 -04:00
parent 3c415a4930
commit 6440416a60
4 changed files with 29 additions and 8 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 2.1.1 on 2018-10-15 14:51
# Generated by Django 2.1.2 on 2018-10-16 00:43
from django.db import migrations, models
import django.db.models.deletion
@ -91,7 +91,7 @@ class Migration(migrations.Migration):
('ended', models.DateTimeField(blank=True, null=True)),
('name', models.CharField(max_length=255, null=True)),
('ansible_version', models.CharField(max_length=255)),
('completed', models.BooleanField(default=False)),
('status', models.CharField(choices=[('unknown', 'unknown'), ('running', 'running'), ('completed', 'completed'), ('failed', 'failed')], default='unknown', max_length=25)),
('arguments', models.BinaryField(max_length=4294967295)),
('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playbooks', to='api.File')),
('files', models.ManyToManyField(to='api.File')),

View File

@ -109,9 +109,16 @@ class Playbook(Duration):
class Meta:
db_table = "playbooks"
# A playbook in ARA can be running (in progress), completed (succeeded) or failed.
UNKNOWN = "unknown"
RUNNING = "running"
COMPLETED = "completed"
FAILED = "failed"
STATUS = ((UNKNOWN, "unknown"), (RUNNING, "running"), (COMPLETED, "completed"), (FAILED, "failed"))
name = models.CharField(max_length=255, null=True)
ansible_version = models.CharField(max_length=255)
completed = models.BooleanField(default=False)
status = models.CharField(max_length=25, choices=STATUS, default=UNKNOWN)
arguments = models.BinaryField(max_length=(2 ** 32) - 1)
file = models.ForeignKey(File, on_delete=models.CASCADE, related_name="playbooks")
files = models.ManyToManyField(File)

View File

@ -59,7 +59,7 @@ class PlaybookFactory(factory.DjangoModelFactory):
model = models.Playbook
ansible_version = "2.4.0"
completed = True
status = "running"
arguments = utils.compressed_obj(PLAYBOOK_ARGUMENTS)
file = factory.SubFactory(FileFactory)

View File

@ -42,6 +42,7 @@ class PlaybookTestCase(APITestCase):
playbook.refresh_from_db()
self.assertEqual(playbook.name, "serializer-playbook")
self.assertEqual(playbook.ansible_version, "2.4.0")
self.assertEqual(playbook.status, "unknown")
def test_playbook_serializer_compress_arguments(self):
serializer = serializers.PlaybookSerializer(
@ -82,18 +83,31 @@ class PlaybookTestCase(APITestCase):
self.assertEqual(0, models.Playbook.objects.count())
request = self.client.post(
"/api/v1/playbooks",
{"ansible_version": "2.4.0", "file": {"path": "/path/playbook.yml", "content": factories.FILE_CONTENTS}},
{
"ansible_version": "2.4.0",
"status": "running",
"file": {"path": "/path/playbook.yml", "content": factories.FILE_CONTENTS},
},
)
self.assertEqual(201, request.status_code)
self.assertEqual(1, models.Playbook.objects.count())
self.assertEqual(request.data["status"], "running")
def test_partial_update_playbook(self):
playbook = factories.PlaybookFactory()
self.assertNotEqual("2.3.0", playbook.ansible_version)
request = self.client.patch("/api/v1/playbooks/%s" % playbook.id, {"ansible_version": "2.3.0"})
self.assertNotEqual("completed", playbook.status)
request = self.client.patch("/api/v1/playbooks/%s" % playbook.id, {"status": "completed"})
self.assertEqual(200, request.status_code)
playbook_updated = models.Playbook.objects.get(id=playbook.id)
self.assertEqual("2.3.0", playbook_updated.ansible_version)
self.assertEqual("completed", playbook_updated.status)
def test_update_wrong_playbook_status(self):
playbook = factories.PlaybookFactory()
self.assertNotEqual("wrong", playbook.status)
request = self.client.patch("/api/v1/playbooks/%s" % playbook.id, {"status": "wrong"})
self.assertEqual(400, request.status_code)
playbook_updated = models.Playbook.objects.get(id=playbook.id)
self.assertNotEqual("wrong", playbook_updated.status)
def test_get_playbook(self):
playbook = factories.PlaybookFactory()