mirror of
https://github.com/ansible/awx.git
synced 2026-02-26 23:46:05 -03:30
Apply policy task more selectively
This commit is contained in:
@@ -1,15 +1,66 @@
|
||||
import pytest
|
||||
import mock
|
||||
|
||||
from awx.main.models import AdHocCommand, InventoryUpdate, Job, JobTemplate, ProjectUpdate, Instance
|
||||
from awx.main.models import AdHocCommand, InventoryUpdate, Job, JobTemplate, ProjectUpdate
|
||||
from awx.main.models.ha import Instance, InstanceGroup
|
||||
from awx.main.tasks import apply_cluster_membership_policies
|
||||
from awx.api.versioning import reverse
|
||||
|
||||
from django.utils.timezone import now
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_default_tower_instance_group(default_instance_group, job_factory):
|
||||
assert default_instance_group in job_factory().preferred_instance_groups
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
class TestPolicyTaskScheduling:
|
||||
"""Tests make assertions about when the policy task gets scheduled"""
|
||||
|
||||
@pytest.mark.parametrize('field, value, expect', [
|
||||
('name', 'foo-bar-foo-bar', False),
|
||||
('policy_instance_percentage', 35, True),
|
||||
('policy_instance_minimum', 3, True),
|
||||
('policy_instance_list', ['bar?'], True),
|
||||
('modified', now(), False)
|
||||
])
|
||||
def test_policy_task_ran_for_ig_when_needed(self, instance_group_factory, field, value, expect):
|
||||
# always run on instance group creation
|
||||
with mock.patch('awx.main.models.ha.schedule_policy_task') as mock_policy:
|
||||
ig = InstanceGroup.objects.create(name='foo')
|
||||
mock_policy.assert_called_once()
|
||||
# selectively run on instance group modification
|
||||
with mock.patch('awx.main.models.ha.schedule_policy_task') as mock_policy:
|
||||
setattr(ig, field, value)
|
||||
ig.save()
|
||||
if expect:
|
||||
mock_policy.assert_called_once()
|
||||
else:
|
||||
mock_policy.assert_not_called()
|
||||
|
||||
@pytest.mark.parametrize('field, value, expect', [
|
||||
('hostname', 'foo-bar-foo-bar', True),
|
||||
('managed_by_policy', False, True),
|
||||
('enabled', False, False),
|
||||
('capacity_adjustment', 0.42, True),
|
||||
('capacity', 42, False)
|
||||
])
|
||||
def test_policy_task_ran_for_instance_when_needed(self, instance_group_factory, field, value, expect):
|
||||
# always run on instance group creation
|
||||
with mock.patch('awx.main.models.ha.schedule_policy_task') as mock_policy:
|
||||
inst = Instance.objects.create(hostname='foo')
|
||||
mock_policy.assert_called_once()
|
||||
# selectively run on instance group modification
|
||||
with mock.patch('awx.main.models.ha.schedule_policy_task') as mock_policy:
|
||||
setattr(inst, field, value)
|
||||
inst.save()
|
||||
if expect:
|
||||
mock_policy.assert_called_once()
|
||||
else:
|
||||
mock_policy.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_instance_dup(org_admin, organization, project, instance_factory, instance_group_factory, get, system_auditor):
|
||||
i1 = instance_factory("i1")
|
||||
@@ -167,18 +218,23 @@ def test_policy_instance_list_manually_assigned(instance_factory, instance_group
|
||||
def test_policy_instance_list_explicitly_pinned(instance_factory, instance_group_factory):
|
||||
i1 = instance_factory("i1")
|
||||
i2 = instance_factory("i2")
|
||||
i2.managed_by_policy = False
|
||||
i2.save()
|
||||
ig_1 = instance_group_factory("ig1", percentage=100, minimum=2)
|
||||
ig_2 = instance_group_factory("ig2")
|
||||
ig_2.policy_instance_list = [i2.hostname]
|
||||
ig_2.save()
|
||||
|
||||
# without being marked as manual, i2 will be picked up by ig_1
|
||||
apply_cluster_membership_policies()
|
||||
assert len(ig_1.instances.all()) == 1
|
||||
assert i1 in ig_1.instances.all()
|
||||
assert i2 not in ig_1.instances.all()
|
||||
assert len(ig_2.instances.all()) == 1
|
||||
assert i2 in ig_2.instances.all()
|
||||
assert set(ig_1.instances.all()) == set([i1, i2])
|
||||
assert set(ig_2.instances.all()) == set([i2])
|
||||
|
||||
i2.managed_by_policy = False
|
||||
i2.save()
|
||||
|
||||
# after marking as manual, i2 no longer available for ig_1
|
||||
apply_cluster_membership_policies()
|
||||
assert set(ig_1.instances.all()) == set([i1])
|
||||
assert set(ig_2.instances.all()) == set([i2])
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
Reference in New Issue
Block a user