mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 17:37:37 -02:30
ensure project sync/inv updates are added to the dependencies
This commit is contained in:
@@ -17,8 +17,19 @@ from django.db.models import Q
|
|||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
|
||||||
# AWX
|
# AWX
|
||||||
from awx.main.models import * # noqa
|
from awx.main.models import (
|
||||||
#from awx.main.scheduler.dag_simple import SimpleDAG
|
AdHocCommand,
|
||||||
|
Instance,
|
||||||
|
InstanceGroup,
|
||||||
|
InventorySource,
|
||||||
|
InventoryUpdate,
|
||||||
|
Job,
|
||||||
|
Project,
|
||||||
|
ProjectUpdate,
|
||||||
|
SystemJob,
|
||||||
|
UnifiedJob,
|
||||||
|
WorkflowJob,
|
||||||
|
)
|
||||||
from awx.main.scheduler.dag_workflow import WorkflowDAG
|
from awx.main.scheduler.dag_workflow import WorkflowDAG
|
||||||
from awx.main.utils.pglock import advisory_lock
|
from awx.main.utils.pglock import advisory_lock
|
||||||
from awx.main.utils import get_type_for_model
|
from awx.main.utils import get_type_for_model
|
||||||
@@ -294,16 +305,23 @@ class TaskManager():
|
|||||||
# Add task + all deps except self
|
# Add task + all deps except self
|
||||||
dep.dependent_jobs.add(*([task] + filter(lambda d: d != dep, dependencies)))
|
dep.dependent_jobs.add(*([task] + filter(lambda d: d != dep, dependencies)))
|
||||||
|
|
||||||
|
def get_latest_inventory_update(self, inventory_source):
|
||||||
|
latest_inventory_update = InventoryUpdate.objects.filter(inventory_source=inventory_source).order_by("-created")
|
||||||
|
if not latest_inventory_update.exists():
|
||||||
|
return None
|
||||||
|
return latest_inventory_update.first()
|
||||||
|
|
||||||
def should_update_inventory_source(self, job, inventory_source):
|
def should_update_inventory_source(self, job, inventory_source):
|
||||||
now = tz_now()
|
now = tz_now()
|
||||||
|
|
||||||
# Already processed dependencies for this job
|
# Already processed dependencies for this job
|
||||||
if job.dependent_jobs.all():
|
if job.dependent_jobs.all():
|
||||||
return False
|
return False
|
||||||
latest_inventory_update = InventoryUpdate.objects.filter(inventory_source=inventory_source).order_by("-created")
|
|
||||||
if not latest_inventory_update.exists():
|
latest_inventory_update = self.get_latest_inventory_update(inventory_source)
|
||||||
|
|
||||||
|
if latest_inventory_update is None:
|
||||||
return True
|
return True
|
||||||
latest_inventory_update = latest_inventory_update.first()
|
|
||||||
'''
|
'''
|
||||||
If there's already a inventory update utilizing this job that's about to run
|
If there's already a inventory update utilizing this job that's about to run
|
||||||
then we don't need to create one
|
then we don't need to create one
|
||||||
@@ -319,14 +337,22 @@ class TaskManager():
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_latest_project_update(self, job):
|
||||||
|
latest_project_update = ProjectUpdate.objects.filter(project=job.project, job_type='check').order_by("-created")
|
||||||
|
if not latest_project_update.exists():
|
||||||
|
return None
|
||||||
|
return latest_project_update.first()
|
||||||
|
|
||||||
def should_update_related_project(self, job):
|
def should_update_related_project(self, job):
|
||||||
now = tz_now()
|
now = tz_now()
|
||||||
if job.dependent_jobs.all():
|
if job.dependent_jobs.all():
|
||||||
return False
|
return False
|
||||||
latest_project_update = ProjectUpdate.objects.filter(project=job.project, job_type='check').order_by("-created")
|
|
||||||
if not latest_project_update.exists():
|
latest_project_update = self.get_latest_project_update(job)
|
||||||
|
|
||||||
|
if latest_project_update is None:
|
||||||
return True
|
return True
|
||||||
latest_project_update = latest_project_update.first()
|
|
||||||
if latest_project_update.status in ['failed', 'canceled']:
|
if latest_project_update.status in ['failed', 'canceled']:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -358,16 +384,27 @@ class TaskManager():
|
|||||||
dependencies = []
|
dependencies = []
|
||||||
if type(task) is Job:
|
if type(task) is Job:
|
||||||
# TODO: Can remove task.project None check after scan-job-default-playbook is removed
|
# TODO: Can remove task.project None check after scan-job-default-playbook is removed
|
||||||
if task.project is not None and task.project.scm_update_on_launch is True and \
|
if task.project is not None and task.project.scm_update_on_launch is True:
|
||||||
self.should_update_related_project(task):
|
if self.should_update_related_project(task):
|
||||||
project_task = self.create_project_update(task)
|
project_task = self.create_project_update(task)
|
||||||
dependencies.append(project_task)
|
dependencies.append(project_task)
|
||||||
# Inventory created 2 seconds behind job
|
else:
|
||||||
|
latest_project_update = self.get_latest_project_update(task)
|
||||||
|
if latest_project_update.status in ['waiting', 'pending', 'running']:
|
||||||
|
dependencies.append(latest_project_update)
|
||||||
|
|
||||||
|
# Inventory created 2 seconds behind job
|
||||||
if task.launch_type != 'callback':
|
if task.launch_type != 'callback':
|
||||||
for inventory_source in [invsrc for invsrc in self.all_inventory_sources if invsrc.inventory == task.inventory]:
|
for inventory_source in [invsrc for invsrc in self.all_inventory_sources if invsrc.inventory == task.inventory]:
|
||||||
|
if not inventory_source.update_on_launch:
|
||||||
|
continue
|
||||||
if self.should_update_inventory_source(task, inventory_source):
|
if self.should_update_inventory_source(task, inventory_source):
|
||||||
inventory_task = self.create_inventory_update(task, inventory_source)
|
inventory_task = self.create_inventory_update(task, inventory_source)
|
||||||
dependencies.append(inventory_task)
|
dependencies.append(inventory_task)
|
||||||
|
else:
|
||||||
|
latest_inventory_update = self.get_latest_inventory_update(inventory_source)
|
||||||
|
if latest_inventory_update.status in ['waiting', 'pending', 'running']:
|
||||||
|
dependencies.append(latest_inventory_update)
|
||||||
|
|
||||||
if len(dependencies) > 0:
|
if len(dependencies) > 0:
|
||||||
self.capture_chain_failure_dependencies(task, dependencies)
|
self.capture_chain_failure_dependencies(task, dependencies)
|
||||||
|
|||||||
Reference in New Issue
Block a user