diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 307012653d..60d1ba7866 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1717,8 +1717,17 @@ class SystemJobSerializer(UnifiedJobSerializer): if obj.system_job_template and obj.system_job_template.active: res['system_job_template'] = reverse('api:system_job_template_detail', args=(obj.system_job_template.pk,)) + if obj.can_cancel or True: + res['cancel'] = reverse('api:system_job_cancel', args=(obj.pk,)) return res +class SystemJobCancelSerializer(SystemJobSerializer): + + can_cancel = serializers.BooleanField(source='can_cancel', read_only=True) + + class Meta: + fields = ('can_cancel',) + class JobListSerializer(JobSerializer, UnifiedJobListSerializer): pass diff --git a/awx/api/urls.py b/awx/api/urls.py index 872e25a4d2..830c79bac9 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -206,6 +206,7 @@ system_job_template_urls = patterns('awx.api.views', system_job_urls = patterns('awx.api.views', url(r'^$', 'system_job_list'), url(r'^(?P[0-9]+)/$', 'system_job_detail'), + url(r'^(?P[0-9]+)/cancel/$', 'system_job_cancel'), ) schedule_urls = patterns('awx.api.views', diff --git a/awx/api/views.py b/awx/api/views.py index 83919f007f..d6fb88a07f 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -2745,6 +2745,21 @@ class SystemJobDetail(RetrieveDestroyAPIView): model = SystemJob serializer_class = SystemJobSerializer +class SystemJobCancel(RetrieveAPIView): + + model = SystemJob + serializer_class = SystemJobCancelSerializer + is_job_cancel = True + + def post(self, request, *args, **kwargs): + obj = self.get_object() + if obj.can_cancel: + obj.cancel() + return Response(status=status.HTTP_202_ACCEPTED) + else: + return self.http_method_not_allowed(request, *args, **kwargs) + + class UnifiedJobTemplateList(ListAPIView): model = UnifiedJobTemplate