diff --git a/awx/api/serializers.py b/awx/api/serializers.py index bda037c878..6c0a28c9e4 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -75,10 +75,11 @@ SUMMARIZABLE_FK_FIELDS = { 'groups_with_active_failures', 'has_inventory_sources'), 'project': DEFAULT_SUMMARY_FIELDS + ('status',), + 'project_update': DEFAULT_SUMMARY_FIELDS + ('status', 'failed',), 'credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud'), 'cloud_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud'), 'network_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'net'), - 'job': DEFAULT_SUMMARY_FIELDS + ('status', 'failed',), + 'job': DEFAULT_SUMMARY_FIELDS + ('status', 'failed', 'project_update',), 'job_template': DEFAULT_SUMMARY_FIELDS, 'schedule': DEFAULT_SUMMARY_FIELDS + ('next_run',), 'unified_job_template': DEFAULT_SUMMARY_FIELDS + ('unified_job_type',), @@ -1963,6 +1964,8 @@ class JobSerializer(UnifiedJobSerializer, JobOptionsSerializer): res['start'] = reverse('api:job_start', args=(obj.pk,)) if obj.can_cancel or True: res['cancel'] = reverse('api:job_cancel', args=(obj.pk,)) + if obj.project_update: + res['project_update'] = reverse('api:project_update_detail', args=(obj.project_update.pk,)) res['relaunch'] = reverse('api:job_relaunch', args=(obj.pk,)) return res diff --git a/awx/main/migrations/0051_v310_job_project_update.py b/awx/main/migrations/0051_v310_job_project_update.py new file mode 100644 index 0000000000..2732f6973d --- /dev/null +++ b/awx/main/migrations/0051_v310_job_project_update.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0050_v310_JSONField_changes'), + ] + + operations = [ + migrations.AddField( + model_name='job', + name='project_update', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='main.ProjectUpdate', help_text='The SCM Refresh task used to make sure the playbooks were available for the job run', null=True), + ), + ] diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 50f34e00eb..34f811d0b4 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -432,6 +432,15 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin): verbose_name=_('SCM Revision'), help_text=_('The SCM Revision from the Project used for this job, if available'), ) + project_update = models.ForeignKey( + 'ProjectUpdate', + blank=True, + null=True, + default=None, + on_delete=models.SET_NULL, + help_text=_('The SCM Refresh task used to make sure the playbooks were available for the job run'), + ) + @classmethod diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 47a6583e9a..670ab60c70 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -1025,6 +1025,7 @@ class RunJob(BaseTask): try: project_update_task().run(local_project_sync.id) job.scm_revision = job.project.scm_revision + job.project_update = local_project_sync job.save() except Exception: job.status = 'failed'