From d57bc3b59c69ced870dc11b764adc6ac98583d99 Mon Sep 17 00:00:00 2001 From: adamscmRH Date: Wed, 5 Jul 2017 10:33:08 -0400 Subject: [PATCH 1/3] Add --diff feature to API --- awx/api/serializers.py | 4 ++-- awx/main/migrations/0044_v320_diff_mode.py | 24 ++++++++++++++++++++++ awx/main/models/jobs.py | 5 ++++- awx/main/tasks.py | 4 ++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 awx/main/migrations/0044_v320_diff_mode.py diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 3ef89809cc..604905c240 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2390,7 +2390,7 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO model = JobTemplate fields = ('*', 'host_config_key', 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_verbosity_on_launch', 'ask_inventory_on_launch', - 'ask_credential_on_launch', 'survey_enabled', 'become_enabled', + 'ask_credential_on_launch', 'survey_enabled', 'become_enabled', 'diff_mode', 'allow_simultaneous') def get_related(self, obj): @@ -2454,7 +2454,7 @@ class JobSerializer(UnifiedJobSerializer, JobOptionsSerializer): 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_verbosity_on_launch', 'ask_inventory_on_launch', 'ask_credential_on_launch', 'allow_simultaneous', 'artifacts', 'scm_revision', - 'instance_group') + 'instance_group', 'diff_mode') def get_related(self, obj): res = super(JobSerializer, self).get_related(obj) diff --git a/awx/main/migrations/0044_v320_diff_mode.py b/awx/main/migrations/0044_v320_diff_mode.py new file mode 100644 index 0000000000..dd0a766f9c --- /dev/null +++ b/awx/main/migrations/0044_v320_diff_mode.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0043_v320_instancegroups'), + ] + + operations = [ + migrations.AddField( + model_name='job', + name='diff_mode', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='jobtemplate', + name='diff_mode', + field=models.BooleanField(default=False), + ), + ] diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 7cf2b5a5c5..402411021b 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -60,6 +60,9 @@ class JobOptions(BaseModel): class Meta: abstract = True + diff_mode = models.BooleanField( + default=False, + ) job_type = models.CharField( max_length=64, choices=JOB_TYPE_CHOICES, @@ -293,7 +296,7 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, SurveyJobTemplateMixin, Resour 'job_tags', 'extra_vars', 'launch_type', 'force_handlers', 'skip_tags', 'start_at_task', 'become_enabled', 'labels', 'survey_passwords', 'allow_simultaneous', 'timeout', - 'use_fact_cache',] + 'use_fact_cache', 'diff_mode',] def resource_validation_data(self): ''' diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 4d68c18fa6..9736147bc8 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -1012,6 +1012,8 @@ class RunJob(BaseTask): args.append('--ask-pass') if job.become_enabled: args.append('--become') + if job.diff_mode: + args.append('--diff') if become_method: args.extend(['--become-method', become_method]) if become_username: @@ -2011,6 +2013,8 @@ class RunAdHocCommand(BaseTask): args.append('--forks=%d' % ad_hoc_command.forks) if ad_hoc_command.verbosity: args.append('-%s' % ('v' * min(5, ad_hoc_command.verbosity))) + # if ad_hoc_command.diff_mode: + # args.append('--diff') if ad_hoc_command.extra_vars_dict: args.extend(['-e', json.dumps(ad_hoc_command.extra_vars_dict)]) From ecef799a5a0457ade5b70ab1706e4d8fd96df833 Mon Sep 17 00:00:00 2001 From: adamscmRH Date: Thu, 6 Jul 2017 16:33:06 -0400 Subject: [PATCH 2/3] adds Playbook & AdHoc Diff --- awx/api/serializers.py | 2 +- awx/main/migrations/0044_v320_diff_mode.py | 5 +++++ awx/main/models/ad_hoc_commands.py | 5 ++++- awx/main/tasks.py | 4 ++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 604905c240..b7bca2329d 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2585,7 +2585,7 @@ class AdHocCommandSerializer(UnifiedJobSerializer): model = AdHocCommand fields = ('*', 'job_type', 'inventory', 'limit', 'credential', 'module_name', 'module_args', 'forks', 'verbosity', 'extra_vars', - 'become_enabled', '-unified_job_template', '-description') + 'become_enabled', 'diff_mode', '-unified_job_template', '-description') extra_kwargs = { 'name': { 'read_only': True, diff --git a/awx/main/migrations/0044_v320_diff_mode.py b/awx/main/migrations/0044_v320_diff_mode.py index dd0a766f9c..f27f96f605 100644 --- a/awx/main/migrations/0044_v320_diff_mode.py +++ b/awx/main/migrations/0044_v320_diff_mode.py @@ -21,4 +21,9 @@ class Migration(migrations.Migration): name='diff_mode', field=models.BooleanField(default=False), ), + migrations.AddField( + model_name='adhoccommand', + name='diff_mode', + field=models.BooleanField(default=False), + ), ] diff --git a/awx/main/models/ad_hoc_commands.py b/awx/main/models/ad_hoc_commands.py index d5662c7faa..b18c23d7f3 100644 --- a/awx/main/models/ad_hoc_commands.py +++ b/awx/main/models/ad_hoc_commands.py @@ -34,6 +34,9 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin): class Meta(object): app_label = 'main' + diff_mode = models.BooleanField( + default=False, + ) job_type = models.CharField( max_length=64, choices=AD_HOC_JOB_TYPE_CHOICES, @@ -195,7 +198,7 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin): data = {} for field in ('job_type', 'inventory_id', 'limit', 'credential_id', 'module_name', 'module_args', 'forks', 'verbosity', - 'extra_vars', 'become_enabled'): + 'extra_vars', 'become_enabled', 'diff_mode'): data[field] = getattr(self, field) return AdHocCommand.objects.create(**data) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 9736147bc8..a20db257c3 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -2011,10 +2011,10 @@ class RunAdHocCommand(BaseTask): if ad_hoc_command.forks: # FIXME: Max limit? args.append('--forks=%d' % ad_hoc_command.forks) + if ad_hoc_command.diff_mode: + args.append('--diff') if ad_hoc_command.verbosity: args.append('-%s' % ('v' * min(5, ad_hoc_command.verbosity))) - # if ad_hoc_command.diff_mode: - # args.append('--diff') if ad_hoc_command.extra_vars_dict: args.extend(['-e', json.dumps(ad_hoc_command.extra_vars_dict)]) From b5d0224720e5469550bbb37bbb7952d1825c5f6d Mon Sep 17 00:00:00 2001 From: adamscmRH Date: Fri, 7 Jul 2017 12:29:05 -0400 Subject: [PATCH 3/3] Adds on_launch --diff on api --- awx/api/serializers.py | 11 ++++---- awx/main/migrations/0038_v320_release.py | 20 +++++++++++++++ awx/main/migrations/0044_v320_diff_mode.py | 29 ---------------------- awx/main/models/jobs.py | 12 ++++++++- 4 files changed, 37 insertions(+), 35 deletions(-) delete mode 100644 awx/main/migrations/0044_v320_diff_mode.py diff --git a/awx/api/serializers.py b/awx/api/serializers.py index b7bca2329d..a28597ec6c 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2388,7 +2388,7 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO class Meta: model = JobTemplate - fields = ('*', 'host_config_key', 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', + fields = ('*', 'host_config_key', 'ask_diff_mode_on_launch', 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_verbosity_on_launch', 'ask_inventory_on_launch', 'ask_credential_on_launch', 'survey_enabled', 'become_enabled', 'diff_mode', 'allow_simultaneous') @@ -2438,6 +2438,7 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO class JobSerializer(UnifiedJobSerializer, JobOptionsSerializer): passwords_needed_to_start = serializers.ReadOnlyField() + ask_diff_mode_on_launch = serializers.ReadOnlyField() ask_variables_on_launch = serializers.ReadOnlyField() ask_limit_on_launch = serializers.ReadOnlyField() ask_skip_tags_on_launch = serializers.ReadOnlyField() @@ -2450,8 +2451,8 @@ class JobSerializer(UnifiedJobSerializer, JobOptionsSerializer): class Meta: model = Job - fields = ('*', 'job_template', 'passwords_needed_to_start', 'ask_variables_on_launch', - 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', + fields = ('*', 'job_template', 'passwords_needed_to_start', 'ask_diff_mode_on_launch', + 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_verbosity_on_launch', 'ask_inventory_on_launch', 'ask_credential_on_launch', 'allow_simultaneous', 'artifacts', 'scm_revision', 'instance_group', 'diff_mode') @@ -3058,12 +3059,12 @@ class JobLaunchSerializer(BaseSerializer): fields = ('can_start_without_user_input', 'passwords_needed_to_start', 'extra_vars', 'limit', 'job_tags', 'skip_tags', 'job_type', 'inventory', 'credential', 'extra_credentials', 'ask_variables_on_launch', 'ask_tags_on_launch', - 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_limit_on_launch', + 'ask_diff_mode_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_limit_on_launch', 'ask_verbosity_on_launch', 'ask_inventory_on_launch', 'ask_credential_on_launch', 'survey_enabled', 'variables_needed_to_start', 'credential_needed_to_start', 'inventory_needed_to_start', 'job_template_data', 'defaults', 'verbosity') read_only_fields = ( - 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', + 'ask_diff_mode_on_launch', 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', 'ask_verbosity_on_launch', 'ask_inventory_on_launch', 'ask_credential_on_launch',) extra_kwargs = { diff --git a/awx/main/migrations/0038_v320_release.py b/awx/main/migrations/0038_v320_release.py index 4ef84465e6..3a4191e913 100644 --- a/awx/main/migrations/0038_v320_release.py +++ b/awx/main/migrations/0038_v320_release.py @@ -331,4 +331,24 @@ class Migration(migrations.Migration): name='timeout', field=models.IntegerField(default=0, help_text='The amount of time (in seconds) to run before the task is canceled.', blank=True), ), + migrations.AddField( + model_name='job', + name='diff_mode', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='jobtemplate', + name='diff_mode', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='adhoccommand', + name='diff_mode', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='jobtemplate', + name='ask_diff_mode_on_launch', + field=models.BooleanField(default=False), + ), ] diff --git a/awx/main/migrations/0044_v320_diff_mode.py b/awx/main/migrations/0044_v320_diff_mode.py deleted file mode 100644 index f27f96f605..0000000000 --- a/awx/main/migrations/0044_v320_diff_mode.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('main', '0043_v320_instancegroups'), - ] - - operations = [ - migrations.AddField( - model_name='job', - name='diff_mode', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='jobtemplate', - name='diff_mode', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='adhoccommand', - name='diff_mode', - field=models.BooleanField(default=False), - ), - ] diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 402411021b..8ed3771061 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -240,7 +240,10 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, SurveyJobTemplateMixin, Resour blank=True, default='', ) - + ask_diff_mode_on_launch = models.BooleanField( + blank=True, + default=False, + ) ask_variables_on_launch = models.BooleanField( blank=True, default=False, @@ -364,6 +367,7 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, SurveyJobTemplateMixin, Resour def _ask_for_vars_dict(self): return dict( + diff_mode=self.ask_diff_mode_on_launch, extra_vars=self.ask_variables_on_launch, limit=self.ask_limit_on_launch, job_tags=self.ask_tags_on_launch, @@ -525,6 +529,12 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin): h = hmac.new(settings.SECRET_KEY, self.created.isoformat(), digestmod=hashlib.sha1) return '%d-%s' % (self.pk, h.hexdigest()) + @property + def ask_diff_mode_on_launch(self): + if self.job_template is not None: + return self.job_template.ask_diff_mode_on_launch + return False + @property def ask_variables_on_launch(self): if self.job_template is not None: