diff --git a/awx/main/models/ad_hoc_commands.py b/awx/main/models/ad_hoc_commands.py index 9787f014231d..536ac8a9122d 100644 --- a/awx/main/models/ad_hoc_commands.py +++ b/awx/main/models/ad_hoc_commands.py @@ -198,8 +198,8 @@ def task_impact(self): def copy(self): data = {} for field in ('job_type', 'inventory_id', 'limit', 'credential_id', - 'module_name', 'module_args', 'forks', 'verbosity', - 'extra_vars', 'become_enabled', 'diff_mode'): + 'execution_environment_id', 'module_name', 'module_args', + 'forks', 'verbosity', 'extra_vars', 'become_enabled', 'diff_mode'): data[field] = getattr(self, field) return AdHocCommand.objects.create(**data) diff --git a/awx/main/models/mixins.py b/awx/main/models/mixins.py index 1cd1366a92c7..459eadabcf9f 100644 --- a/awx/main/models/mixins.py +++ b/awx/main/models/mixins.py @@ -455,6 +455,25 @@ class Meta: help_text=_('The container image to be used for execution.'), ) + def resolve_execution_environment(self): + """ + Return the execution environment that should be used when creating a new job. + """ + from awx.main.models.execution_environments import ExecutionEnvironment + + if self.execution_environment is not None: + return self.execution_environment + if getattr(self, 'project_id', None) and self.project.default_environment is not None: + return self.project.default_environment + if getattr(self, 'organization', None) and self.organization.default_environment is not None: + return self.organization.default_environment + if getattr(self, 'inventory', None) and self.inventory.organization is not None: + if self.inventory.organization.default_environment is not None: + return self.inventory.organization.default_environment + if settings.DEFAULT_EXECUTION_ENVIRONMENT is not None: + return settings.DEFAULT_EXECUTION_ENVIRONMENT + return ExecutionEnvironment.objects.filter(organization=None, managed_by_tower=True).first() + class CustomVirtualEnvMixin(models.Model): class Meta: diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py index 3df9ee433d9e..02719d983eea 100644 --- a/awx/main/models/unified_jobs.py +++ b/awx/main/models/unified_jobs.py @@ -40,7 +40,6 @@ from awx.main.dispatch.control import Control as ControlDispatcher from awx.main.registrar import activity_stream_registrar from awx.main.models.mixins import ResourceMixin, TaskManagerUnifiedJobMixin, ExecutionEnvironmentMixin -from awx.main.models.execution_environments import ExecutionEnvironment from awx.main.utils import ( camelcase_to_underscore, get_model_for_type, encrypt_dict, decrypt_field, _inventory_updates, @@ -339,23 +338,6 @@ def notification_templates(self): from awx.main.models.notifications import NotificationTemplate return NotificationTemplate.objects.none() - def resolve_execution_environment(self): - """ - Return the execution environment that should be used when creating a new job. - """ - if self.execution_environment is not None: - return self.execution_environment - if getattr(self, 'project_id', None) and self.project.default_environment is not None: - return self.project.default_environment - if getattr(self, 'organization', None) and self.organization.default_environment is not None: - return self.organization.default_environment - if getattr(self, 'inventory', None) and self.inventory.organization is not None: - if self.inventory.organization.default_environment is not None: - return self.inventory.organization.default_environment - if settings.DEFAULT_EXECUTION_ENVIRONMENT is not None: - return settings.DEFAULT_EXECUTION_ENVIRONMENT - return ExecutionEnvironment.objects.filter(organization=None, managed_by_tower=True).first() - def create_unified_job(self, **kwargs): ''' Create a new unified job based on this unified job template. diff --git a/awx/main/tasks.py b/awx/main/tasks.py index ffdb20d846c2..7436565a8c97 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -881,6 +881,9 @@ def get_path_to(self, *args): return os.path.abspath(os.path.join(os.path.dirname(__file__), *args)) def build_execution_environment_params(self, instance): + if instance.execution_environment_id is None: + self.update_model(instance.pk, execution_environment=instance.resolve_execution_environment()) + image = instance.execution_environment.image params = { "container_image": image,