mirror of
https://github.com/ansible/awx.git
synced 2026-05-17 22:37:41 -02:30
Merge branch 'devel' of github.com:ansible/ansible-tower into 11th-hour
This commit is contained in:
@@ -463,9 +463,10 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, ResourceMixin):
|
||||
success_notifiers = list(base_notifiers.filter(unifiedjobtemplate_notifiers_for_success__in=[self, self.project]))
|
||||
any_notifiers = list(base_notifiers.filter(unifiedjobtemplate_notifiers_for_any__in=[self, self.project]))
|
||||
# Get Organization Notifiers
|
||||
error_notifiers = set(error_notifiers + list(base_notifiers.filter(organization_notifiers_for_errors=self.project.organization)))
|
||||
success_notifiers = set(success_notifiers + list(base_notifiers.filter(organization_notifiers_for_success=self.project.organization)))
|
||||
any_notifiers = set(any_notifiers + list(base_notifiers.filter(organization_notifiers_for_any=self.project.organization)))
|
||||
if self.project is not None and self.project.organization is not None:
|
||||
error_notifiers = set(error_notifiers + list(base_notifiers.filter(organization_notifiers_for_errors=self.project.organization)))
|
||||
success_notifiers = set(success_notifiers + list(base_notifiers.filter(organization_notifiers_for_success=self.project.organization)))
|
||||
any_notifiers = set(any_notifiers + list(base_notifiers.filter(organization_notifiers_for_any=self.project.organization)))
|
||||
return dict(error=list(error_notifiers), success=list(success_notifiers), any=list(any_notifiers))
|
||||
|
||||
class Job(UnifiedJob, JobOptions):
|
||||
@@ -533,14 +534,13 @@ class Job(UnifiedJob, JobOptions):
|
||||
def is_blocked_by(self, obj):
|
||||
from awx.main.models import InventoryUpdate, ProjectUpdate
|
||||
if type(obj) == Job:
|
||||
if obj.job_template is not None and obj.job_template == self.job_template:
|
||||
if obj.launch_type == 'callback' and self.launch_type == 'callback':
|
||||
if obj.limit != self.limit:
|
||||
# NOTE: This is overriden by api/views.py.JobTemplateCallback.post() check
|
||||
# which limits job runs on a JT to one per host in a callback scenario
|
||||
# I'm leaving this here in case we change that
|
||||
if obj.job_template is not None and obj.inventory is not None:
|
||||
if obj.job_template == self.job_template and \
|
||||
obj.inventory == self.inventory:
|
||||
if obj.launch_type == 'callback' and self.launch_type == 'callback' and \
|
||||
obj.limit != self.limit:
|
||||
return False
|
||||
return True
|
||||
return True
|
||||
return False
|
||||
if type(obj) == InventoryUpdate:
|
||||
if self.inventory == obj.inventory_source.inventory:
|
||||
|
||||
@@ -362,9 +362,10 @@ class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin):
|
||||
success_notifiers = list(base_notifiers.filter(unifiedjobtemplate_notifiers_for_success=self))
|
||||
any_notifiers = list(base_notifiers.filter(unifiedjobtemplate_notifiers_for_any=self))
|
||||
# Get Organization Notifiers
|
||||
error_notifiers = set(error_notifiers + list(base_notifiers.filter(organization_notifiers_for_errors=self.organization)))
|
||||
success_notifiers = set(success_notifiers + list(base_notifiers.filter(organization_notifiers_for_success=self.organization)))
|
||||
any_notifiers = set(any_notifiers + list(base_notifiers.filter(organization_notifiers_for_any=self.organization)))
|
||||
if self.organization is not None:
|
||||
error_notifiers = set(error_notifiers + list(base_notifiers.filter(organization_notifiers_for_errors=self.organization)))
|
||||
success_notifiers = set(success_notifiers + list(base_notifiers.filter(organization_notifiers_for_success=self.organization)))
|
||||
any_notifiers = set(any_notifiers + list(base_notifiers.filter(organization_notifiers_for_any=self.organization)))
|
||||
return dict(error=list(error_notifiers), success=list(success_notifiers), any=list(any_notifiers))
|
||||
|
||||
def get_absolute_url(self):
|
||||
|
||||
@@ -28,6 +28,7 @@ from awx.main.models.credential import Credential
|
||||
from awx.main.models.jobs import JobTemplate
|
||||
from awx.main.models.inventory import (
|
||||
Group,
|
||||
Inventory,
|
||||
)
|
||||
from awx.main.models.organization import (
|
||||
Organization,
|
||||
@@ -175,6 +176,16 @@ def machine_credential():
|
||||
def inventory(organization):
|
||||
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
|
||||
def label(organization):
|
||||
return organization.labels.create(name="test-label", description="test-label-desc")
|
||||
|
||||
24
awx/main/tests/functional/test_jobs.py
Normal file
24
awx/main/tests/functional/test_jobs.py
Normal 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)
|
||||
Reference in New Issue
Block a user