Adjust job launch blocking logic

Previously a job template would always block another job template launch
regardless of the details of the job template.   We now restrict that
blocking logic to only block in the case that the job template was
launched with the same inventory.   We keep the exclusion where if the
launch type is 'callback' and the limits differ then they won't be blocked
This commit is contained in:
Matthew Jones
2016-04-18 15:57:31 -04:00
parent 226cb9acdf
commit d87213705b
3 changed files with 41 additions and 7 deletions

View File

@@ -531,14 +531,13 @@ class Job(UnifiedJob, JobOptions):
def is_blocked_by(self, obj): def is_blocked_by(self, obj):
from awx.main.models import InventoryUpdate, ProjectUpdate from awx.main.models import InventoryUpdate, ProjectUpdate
if type(obj) == Job: if type(obj) == Job:
if obj.job_template is not None and obj.job_template == self.job_template: if obj.job_template is not None and obj.inventory is not None:
if obj.launch_type == 'callback' and self.launch_type == 'callback': if obj.job_template == self.job_template and \
if obj.limit != self.limit: obj.inventory == self.inventory:
# NOTE: This is overriden by api/views.py.JobTemplateCallback.post() check if obj.launch_type == 'callback' and self.launch_type == 'callback' and \
# which limits job runs on a JT to one per host in a callback scenario obj.limit != self.limit:
# I'm leaving this here in case we change that
return False return False
return True return True
return False return False
if type(obj) == InventoryUpdate: if type(obj) == InventoryUpdate:
if self.inventory == obj.inventory_source.inventory: if self.inventory == obj.inventory_source.inventory:

View File

@@ -28,6 +28,7 @@ from awx.main.models.credential import Credential
from awx.main.models.jobs import JobTemplate from awx.main.models.jobs import JobTemplate
from awx.main.models.inventory import ( from awx.main.models.inventory import (
Group, Group,
Inventory,
) )
from awx.main.models.organization import ( from awx.main.models.organization import (
Organization, Organization,
@@ -175,6 +176,16 @@ def machine_credential():
def inventory(organization): def inventory(organization):
return organization.inventories.create(name="test-inv") return organization.inventories.create(name="test-inv")
@pytest.fixture
def inventory_factory(organization):
def factory(name, org=organization):
try:
inv = Inventory.objects.get(name=name, organization=org)
except Inventory.DoesNotExist:
inv = Inventory.objects.create(name=name, organization=org)
return inv
return factory
@pytest.fixture @pytest.fixture
def label(organization): def label(organization):
return organization.labels.create(name="test-label", description="test-label-desc") return organization.labels.create(name="test-label", description="test-label-desc")

View File

@@ -0,0 +1,24 @@
from awx.main.models import Job
import pytest
@pytest.mark.django_db
def test_job_blocking(get, post, job_template, inventory, inventory_factory):
j1 = Job.objects.create(job_template=job_template,
inventory=inventory)
j2 = Job.objects.create(job_template=job_template,
inventory=inventory)
assert j1.is_blocked_by(j2)
j2.inventory = inventory_factory(name='test-different-inventory')
assert not j1.is_blocked_by(j2)
j_callback_1 = Job.objects.create(job_template=job_template,
inventory=inventory,
launch_type='callback',
limit='a')
j_callback_2 = Job.objects.create(job_template=job_template,
inventory=inventory,
launch_type='callback',
limit='a')
assert j_callback_1.is_blocked_by(j_callback_2)
j_callback_2.limit = 'b'
assert not j_callback_1.is_blocked_by(j_callback_2)