Add relaunch capability to a job. fill in related links for various serializers

This commit is contained in:
Matthew Jones 2014-09-05 14:02:14 -04:00
parent 9ec267ff89
commit b5763f078d
4 changed files with 35 additions and 2 deletions

View File

@ -1233,6 +1233,7 @@ class JobTemplateSerializer(UnifiedJobTemplateSerializer, JobOptionsSerializer):
jobs = reverse('api:job_template_jobs_list', args=(obj.pk,)),
schedules = reverse('api:job_template_schedules_list', args=(obj.pk,)),
activity_stream = reverse('api:job_template_activity_stream_list', args=(obj.pk,)),
launch = reverse('api:job_template_launch', args=(obj.pk,)),
))
if obj.host_config_key:
res['callback'] = reverse('api:job_template_callback', args=(obj.pk,))
@ -1264,6 +1265,7 @@ 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,))
res['relaunch'] = reverse('api:job_relaunch', args=(obj.pk,))
return res
def from_native(self, data, files):

View File

@ -130,7 +130,7 @@ permission_urls = patterns('awx.api.views',
job_template_urls = patterns('awx.api.views',
url(r'^$', 'job_template_list'),
url(r'^(?P<pk>[0-9]+)/$', 'job_template_detail'),
url(r'^(?P<pk>[0-9]+)launch/$', 'job_template_launch'),
url(r'^(?P<pk>[0-9]+)/launch/$', 'job_template_launch'),
url(r'^(?P<pk>[0-9]+)/jobs/$', 'job_template_jobs_list'),
url(r'^(?P<pk>[0-9]+)/callback/$', 'job_template_callback'),
url(r'^(?P<pk>[0-9]+)/schedules/$', 'job_template_schedules_list'),
@ -142,6 +142,7 @@ job_urls = patterns('awx.api.views',
url(r'^(?P<pk>[0-9]+)/$', 'job_detail'),
url(r'^(?P<pk>[0-9]+)/start/$', 'job_start'),
url(r'^(?P<pk>[0-9]+)/cancel/$', 'job_cancel'),
url(r'^(?P<pk>[0-9]+)/relaunch/$', 'job_relaunch'),
url(r'^(?P<pk>[0-9]+)/job_host_summaries/$', 'job_job_host_summaries_list'),
url(r'^(?P<pk>[0-9]+)/job_events/$', 'job_job_events_list'),
url(r'^(?P<pk>[0-9]+)/job_plays/$', 'job_job_plays_list'),

View File

@ -1349,7 +1349,7 @@ class JobTemplateLaunch(GenericAPIView):
data['ask_variables_on_launch'] = obj.ask_variables_on_launch
return Response(data)
def post(self, request, *args, **obj):
def post(self, request, *args, **kwargs):
obj = self.get_object()
if not request.user.can_access(self.model, 'start', obj):
raise PermissionDenied()
@ -1598,6 +1598,31 @@ class JobCancel(GenericAPIView):
else:
return self.http_method_not_allowed(request, *args, **kwargs)
class JobRelaunch(GenericAPIView):
model = Job
def get(self, request, *args, **kwargs):
obj = self.get_object()
data = {}
data['passwords_needed_to_start'] = obj.passwords_needed_to_start
data['ask_variables_on_launch'] = obj.ask_variables_on_launch
return Response(data)
def post(self, request, *args, **kwargs):
obj = self.get_object()
if not request.user.can_access(self.model, 'start', obj):
raise PermissionDenied()
new_job = obj.copy()
result = new_job.signal_start(**request.DATA)
if not result:
data = dict(passwords_needed_to_start=obj.passwords_needed_to_start)
return Response(data, status=status.HTTP_400_BAD_REQUEST)
else:
data = dict(job=new_job.id)
return Response(data, status=status.HTTP_202_ACCEPTED)
class BaseJobHostSummariesList(SubListAPIView):
model = JobHostSummary

View File

@ -366,6 +366,11 @@ class Job(UnifiedJob, JobOptions):
dependencies.append(source.create_inventory_update(launch_type='dependency'))
return dependencies
def copy(self):
presets = {}
for kw in self.job_template._get_unified_job_field_names():
presets[kw] = getattr(self, kw)
return self.job_template.create_unified_job(**presets)
class JobHostSummary(CreatedModifiedModel):
'''