From a8e46021f86e5e83ebde99b5a06378e3f69922a9 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 18 Jan 2017 12:11:31 -0500 Subject: [PATCH] conservative method to validating that a job can be launched from a node --- awx/main/models/jobs.py | 9 ++++----- awx/main/models/unified_jobs.py | 3 +++ awx/main/scheduler/__init__.py | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 595289dee7..514b37db36 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -606,11 +606,10 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin): evars.update(extra_vars) self.update_fields(extra_vars=json.dumps(evars)) - def signal_start(self, **kwargs): - # Block cases that would cause the task manager to error - if self.inventory_id is None or self.project_id is None: - return False - return super(Job, self).signal_start(**kwargs) + def _resources_sufficient_for_launch(self): + if self.job_type == PERM_INVENTORY_SCAN: + return self.inventory_id is not None + return not (self.inventory_id is None or self.project_id is None) def display_artifacts(self): ''' diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py index bda60b0c1d..773f786cbd 100644 --- a/awx/main/models/unified_jobs.py +++ b/awx/main/models/unified_jobs.py @@ -561,6 +561,9 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique "Override in child classes, None value indicates this is not configurable" return None + def _resources_sufficient_for_launch(self): + return True + def __unicode__(self): return u'%s-%s-%s' % (self.created, self.id, self.status) diff --git a/awx/main/scheduler/__init__.py b/awx/main/scheduler/__init__.py index 42afbc5337..bb98cec776 100644 --- a/awx/main/scheduler/__init__.py +++ b/awx/main/scheduler/__init__.py @@ -121,7 +121,10 @@ class TaskManager(): job = spawn_node.unified_job_template.create_unified_job(**kv) spawn_node.job = job spawn_node.save() - can_start = job.signal_start(**kv) + if job._resources_sufficient_for_launch(): + can_start = job.signal_start(**kv) + else: + can_start = False if not can_start: job.status = 'failed' job.job_explanation = _("Job spawned from workflow could not start because it "