mirror of
https://github.com/ZwareBear/awx.git
synced 2026-04-23 00:11:48 -05:00
Add ability to prompt for several variable types on launch
This commit is contained in:
@@ -1673,7 +1673,9 @@ class JobTemplateSerializer(UnifiedJobTemplateSerializer, JobOptionsSerializer):
|
||||
|
||||
class Meta:
|
||||
model = JobTemplate
|
||||
fields = ('*', 'host_config_key', 'ask_variables_on_launch', 'survey_enabled', 'become_enabled')
|
||||
fields = ('*', 'host_config_key', 'ask_variables_on_launch', 'ask_limit_on_launch',
|
||||
'ask_tags_on_launch', 'ask_job_type_on_launch', 'ask_inventory_on_launch',
|
||||
'survey_enabled', 'become_enabled')
|
||||
|
||||
def get_related(self, obj):
|
||||
res = super(JobTemplateSerializer, self).get_related(obj)
|
||||
@@ -1730,10 +1732,16 @@ class JobSerializer(UnifiedJobSerializer, JobOptionsSerializer):
|
||||
|
||||
passwords_needed_to_start = serializers.ReadOnlyField()
|
||||
ask_variables_on_launch = serializers.ReadOnlyField()
|
||||
ask_limit_on_launch = serializers.ReadOnlyField()
|
||||
ask_tags_on_launch = serializers.ReadOnlyField()
|
||||
ask_job_type_on_launch = serializers.ReadOnlyField()
|
||||
ask_inventory_on_launch = serializers.ReadOnlyField()
|
||||
|
||||
class Meta:
|
||||
model = Job
|
||||
fields = ('*', 'job_template', 'passwords_needed_to_start', 'ask_variables_on_launch')
|
||||
fields = ('*', 'job_template', 'passwords_needed_to_start', 'ask_variables_on_launch',
|
||||
'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_job_type_on_launch',
|
||||
'ask_inventory_on_launch')
|
||||
|
||||
def get_related(self, obj):
|
||||
res = super(JobSerializer, self).get_related(obj)
|
||||
@@ -2102,9 +2110,13 @@ class JobLaunchSerializer(BaseSerializer):
|
||||
class Meta:
|
||||
model = JobTemplate
|
||||
fields = ('can_start_without_user_input', 'passwords_needed_to_start', 'extra_vars',
|
||||
'ask_variables_on_launch', 'survey_enabled', 'variables_needed_to_start',
|
||||
'ask_variables_on_launch', 'ask_tags_on_launch', 'ask_job_type_on_launch',
|
||||
'ask_inventory_on_launch', 'ask_limit_on_launch',
|
||||
'survey_enabled', 'variables_needed_to_start',
|
||||
'credential', 'credential_needed_to_start',)
|
||||
read_only_fields = ('ask_variables_on_launch',)
|
||||
read_only_fields = ('ask_variables_on_launch', 'ask_limit_on_launch',
|
||||
'ask_tags_on_launch', 'ask_job_type_on_launch',
|
||||
'ask_inventory_on_launch')
|
||||
extra_kwargs = {
|
||||
'credential': {
|
||||
'write_only': True,
|
||||
@@ -2164,7 +2176,9 @@ class JobLaunchSerializer(BaseSerializer):
|
||||
if errors:
|
||||
raise serializers.ValidationError(errors)
|
||||
|
||||
JT_extra_vars = obj.extra_vars
|
||||
attrs = super(JobLaunchSerializer, self).validate(attrs)
|
||||
obj.extra_vars = JT_extra_vars
|
||||
return attrs
|
||||
|
||||
class NotifierSerializer(BaseSerializer):
|
||||
|
||||
@@ -2115,8 +2115,60 @@ class JobTemplateLaunch(RetrieveAPIView, GenericAPIView):
|
||||
kv = {
|
||||
'credential': serializer.instance.credential.pk,
|
||||
}
|
||||
|
||||
# -- following code will be moved to JobTemplate model --
|
||||
# Sort the runtime fields allowed and disallowed by job template
|
||||
ignored_fields = {}
|
||||
if 'extra_vars' in request.data:
|
||||
kv['extra_vars'] = request.data['extra_vars']
|
||||
kv['extra_vars'] = {}
|
||||
ignored_fields['extra_vars'] = {}
|
||||
if obj.ask_variables_on_launch:
|
||||
# Accept all extra_vars if the flag is set
|
||||
kv['extra_vars'] = request.data['extra_vars']
|
||||
else:
|
||||
if obj.survey_enabled:
|
||||
# Accept vars defined in the survey and no others
|
||||
survey_vars = [question['variable'] for question in obj.survey_spec['spec']]
|
||||
for key in request.data['extra_vars']:
|
||||
if key in survey_vars:
|
||||
kv['extra_vars'][key] = request.data['extra_vars'][key]
|
||||
else:
|
||||
ignored_fields['extra_vars'][key] = request.data['extra_vars'][key]
|
||||
else:
|
||||
# No survey & prompt flag is false - ignore all
|
||||
ignored_fields['extra_vars'] = request.data['extra_vars']
|
||||
|
||||
if 'limit' in request.data:
|
||||
if obj.ask_limit_on_launch:
|
||||
kv['limit'] = request.data['limit']
|
||||
else:
|
||||
ignored_fields['limit'] = request.data['limit']
|
||||
|
||||
if 'job_tags' or 'skip_tags' in request.data:
|
||||
if obj.ask_tags_on_launch:
|
||||
if 'job_tags' in request.data:
|
||||
kv['job_tags'] = request.data['job_tags']
|
||||
if 'skip_tags' in request.data:
|
||||
kv['skip_tags'] = request.data['skip_tags']
|
||||
else:
|
||||
if 'job_tags' in request.data:
|
||||
ignored_fields['job_tags'] = request.data['job_tags']
|
||||
if 'skip_tags' in request.data:
|
||||
ignored_fields['skip_tags'] = request.data['skip_tags']
|
||||
|
||||
if 'job_type' in request.data:
|
||||
if obj.ask_job_type_on_launch:
|
||||
kv['job_type'] = request.data['job_type']
|
||||
else:
|
||||
ignored_fields['job_type'] = request.data['job_type']
|
||||
|
||||
if 'inventory' in request.data:
|
||||
inv_id = request.data['inventory']
|
||||
if obj.ask_inventory_on_launch and Inventory.objects.get(pk=inv_id).accessible_by(self.request.user, {'write': True}):
|
||||
kv['inventory'] = inv_id
|
||||
else:
|
||||
ignored_fields['inventory'] = inv_id
|
||||
|
||||
kv.update(passwords)
|
||||
|
||||
new_job = obj.create_unified_job(**kv)
|
||||
@@ -2127,6 +2179,9 @@ class JobTemplateLaunch(RetrieveAPIView, GenericAPIView):
|
||||
return Response(data, status=status.HTTP_400_BAD_REQUEST)
|
||||
else:
|
||||
data = dict(job=new_job.id)
|
||||
serializer = JobSerializer(new_job)
|
||||
data['job_data'] = serializer.data
|
||||
data['ignored_fields'] = ignored_fields
|
||||
return Response(data, status=status.HTTP_202_ACCEPTED)
|
||||
|
||||
class JobTemplateSchedulesList(SubListCreateAttachDetachAPIView):
|
||||
|
||||
Reference in New Issue
Block a user