From 82c4f6bb88abb0aee132d20e1f9233ce5617daec Mon Sep 17 00:00:00 2001 From: Yanis Guenane Date: Mon, 17 May 2021 18:06:00 +0200 Subject: [PATCH] Define a DEFAULT_QUEUE_NAME --- awx/api/permissions.py | 4 ++- awx/api/serializers.py | 4 +-- awx/main/managers.py | 2 +- awx/main/models/unified_jobs.py | 2 +- awx/main/tests/conftest.py | 2 +- .../functional/api/test_instance_group.py | 6 ++-- .../tests/functional/models/test_inventory.py | 2 +- .../task_management/test_capacity.py | 12 +++---- awx/main/tests/unit/test_capacity.py | 36 +++++++++---------- awx/settings/defaults.py | 3 ++ 10 files changed, 39 insertions(+), 34 deletions(-) diff --git a/awx/api/permissions.py b/awx/api/permissions.py index 96cd3a5c1d..7740c3c003 100644 --- a/awx/api/permissions.py +++ b/awx/api/permissions.py @@ -4,6 +4,8 @@ # Python import logging +from django.conf import settings + # Django REST Framework from rest_framework.exceptions import MethodNotAllowed, PermissionDenied from rest_framework import permissions @@ -245,7 +247,7 @@ class IsSuperUser(permissions.BasePermission): class InstanceGroupTowerPermission(ModelAccessPermission): def has_object_permission(self, request, view, obj): - if request.method == 'DELETE' and obj.name == "tower": + if request.method == 'DELETE' and obj.name == settings.DEFAULT_QUEUE_NAME: return False return super(InstanceGroupTowerPermission, self).has_object_permission(request, view, obj) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index dc50b72237..cda97a5e8d 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4918,8 +4918,8 @@ class InstanceGroupSerializer(BaseSerializer): return value def validate_name(self, value): - if self.instance and self.instance.name == 'tower' and value != 'tower': - raise serializers.ValidationError(_('tower instance group name may not be changed.')) + if self.instance and self.instance.name == settings.DEFAULT_QUEUE_NAME and value != settings.DEFAULT_QUEUE_NAME: + raise serializers.ValidationError(_('%s instance group name may not be changed.' % settings.DEFAULT_QUEUE_NAME)) return value def validate_credential(self, value): diff --git a/awx/main/managers.py b/awx/main/managers.py index 3355b4e8e4..3359a6d7e3 100644 --- a/awx/main/managers.py +++ b/awx/main/managers.py @@ -33,7 +33,7 @@ class HostManager(models.Manager): - Only consider results that are unique - Return the count of this query """ - return self.order_by().exclude(inventory_sources__source='tower').values('name').distinct().count() + return self.order_by().exclude(inventory_sources__source=settings.DEFAULT_QUEUE_NAME).values('name').distinct().count() def org_active_count(self, org_id): """Return count of active, unique hosts used by an organization. diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py index 1407f8418a..273f894135 100644 --- a/awx/main/models/unified_jobs.py +++ b/awx/main/models/unified_jobs.py @@ -1419,7 +1419,7 @@ class UnifiedJob( def global_instance_groups(self): from awx.main.models.ha import InstanceGroup - default_instance_group = InstanceGroup.objects.filter(name='tower') + default_instance_group = InstanceGroup.objects.filter(name=settings.DEFAULT_QUEUE_NAME) if default_instance_group.exists(): return [default_instance_group.first()] return [] diff --git a/awx/main/tests/conftest.py b/awx/main/tests/conftest.py index 11c88823e5..012a8f1c93 100644 --- a/awx/main/tests/conftest.py +++ b/awx/main/tests/conftest.py @@ -81,7 +81,7 @@ def instance_group_factory(): @pytest.fixture def default_instance_group(instance_factory, instance_group_factory): - return create_instance_group("tower", instances=[create_instance("hostA")]) + return create_instance_group("default", instances=[create_instance("hostA")]) @pytest.fixture diff --git a/awx/main/tests/functional/api/test_instance_group.py b/awx/main/tests/functional/api/test_instance_group.py index 884856eed0..22309df142 100644 --- a/awx/main/tests/functional/api/test_instance_group.py +++ b/awx/main/tests/functional/api/test_instance_group.py @@ -13,7 +13,7 @@ from awx.main.utils import camelcase_to_underscore @pytest.fixture def tower_instance_group(): - ig = InstanceGroup(name='tower') + ig = InstanceGroup(name='default') ig.save() return ig @@ -117,8 +117,8 @@ def test_delete_rename_tower_instance_group_prevented(delete, options, tower_ins assert 'GET' in resp.data['actions'] assert 'PUT' in resp.data['actions'] - # Rename 'tower' instance group denied - patch(url, {'name': 'tower_prime'}, super_user, expect=400) + # Rename 'default' instance group denied + patch(url, {'name': 'default_prime'}, super_user, expect=400) # Rename, other instance group OK url = reverse("api:instance_group_detail", kwargs={'pk': instance_group.pk}) diff --git a/awx/main/tests/functional/models/test_inventory.py b/awx/main/tests/functional/models/test_inventory.py index eab7e02895..31bf62a168 100644 --- a/awx/main/tests/functional/models/test_inventory.py +++ b/awx/main/tests/functional/models/test_inventory.py @@ -104,7 +104,7 @@ class TestActiveCount: def test_active_count_minus_tower(self, inventory): inventory.hosts.create(name='locally-managed-host') - source = inventory.inventory_sources.create(name='tower-source', source='tower') + source = inventory.inventory_sources.create(name='tower-source', source='default') source.hosts.create(name='remotely-managed-host', inventory=inventory) assert Host.objects.active_count() == 1 diff --git a/awx/main/tests/functional/task_management/test_capacity.py b/awx/main/tests/functional/task_management/test_capacity.py index ee05150255..d50833fd8e 100644 --- a/awx/main/tests/functional/task_management/test_capacity.py +++ b/awx/main/tests/functional/task_management/test_capacity.py @@ -10,21 +10,21 @@ class TestCapacityMapping(TransactionTestCase): def sample_cluster(self): ig_small = InstanceGroup.objects.create(name='ig_small') ig_large = InstanceGroup.objects.create(name='ig_large') - tower = InstanceGroup.objects.create(name='tower') + default = InstanceGroup.objects.create(name='default') i1 = Instance.objects.create(hostname='i1', capacity=200) i2 = Instance.objects.create(hostname='i2', capacity=200) i3 = Instance.objects.create(hostname='i3', capacity=200) ig_small.instances.add(i1) ig_large.instances.add(i2, i3) - tower.instances.add(i2) - return [tower, ig_large, ig_small] + default.instances.add(i2) + return [default, ig_large, ig_small] def test_mapping(self): self.sample_cluster() with self.assertNumQueries(2): inst_map, ig_map = InstanceGroup.objects.capacity_mapping() assert inst_map['i1'] == set(['ig_small']) - assert inst_map['i2'] == set(['ig_large', 'tower']) + assert inst_map['i2'] == set(['ig_large', 'default']) assert ig_map['ig_small'] == set(['ig_small']) - assert ig_map['ig_large'] == set(['ig_large', 'tower']) - assert ig_map['tower'] == set(['ig_large', 'tower']) + assert ig_map['ig_large'] == set(['ig_large', 'default']) + assert ig_map['default'] == set(['ig_large', 'default']) diff --git a/awx/main/tests/unit/test_capacity.py b/awx/main/tests/unit/test_capacity.py index cbb4124b52..8f35210088 100644 --- a/awx/main/tests/unit/test_capacity.py +++ b/awx/main/tests/unit/test_capacity.py @@ -43,34 +43,34 @@ def sample_cluster(): ig_small = InstanceGroup(name='ig_small') ig_large = InstanceGroup(name='ig_large') - tower = InstanceGroup(name='tower') + default = InstanceGroup(name='default') i1 = Instance(hostname='i1', capacity=200) i2 = Instance(hostname='i2', capacity=200) i3 = Instance(hostname='i3', capacity=200) ig_small.instances.add(i1) ig_large.instances.add(i2, i3) - tower.instances.add(i2) - return [tower, ig_large, ig_small] + default.instances.add(i2) + return [default, ig_large, ig_small] return stand_up_cluster def test_committed_capacity(sample_cluster): - tower, ig_large, ig_small = sample_cluster() - tasks = [Job(status='waiting', instance_group=tower), Job(status='waiting', instance_group=ig_large), Job(status='waiting', instance_group=ig_small)] - capacities = InstanceGroup.objects.capacity_values(qs=[tower, ig_large, ig_small], tasks=tasks, breakdown=True) + default, ig_large, ig_small = sample_cluster() + tasks = [Job(status='waiting', instance_group=default), Job(status='waiting', instance_group=ig_large), Job(status='waiting', instance_group=ig_small)] + capacities = InstanceGroup.objects.capacity_values(qs=[default, ig_large, ig_small], tasks=tasks, breakdown=True) # Jobs submitted to either tower or ig_larg must count toward both - assert capacities['tower']['committed_capacity'] == 43 * 2 + assert capacities['default']['committed_capacity'] == 43 * 2 assert capacities['ig_large']['committed_capacity'] == 43 * 2 assert capacities['ig_small']['committed_capacity'] == 43 def test_running_capacity(sample_cluster): - tower, ig_large, ig_small = sample_cluster() + default, ig_large, ig_small = sample_cluster() tasks = [Job(status='running', execution_node='i1'), Job(status='running', execution_node='i2'), Job(status='running', execution_node='i3')] - capacities = InstanceGroup.objects.capacity_values(qs=[tower, ig_large, ig_small], tasks=tasks, breakdown=True) + capacities = InstanceGroup.objects.capacity_values(qs=[default, ig_large, ig_small], tasks=tasks, breakdown=True) # Tower is only given 1 instance - assert capacities['tower']['running_capacity'] == 43 + assert capacities['default']['running_capacity'] == 43 # Large IG has 2 instances assert capacities['ig_large']['running_capacity'] == 43 * 2 assert capacities['ig_small']['running_capacity'] == 43 @@ -81,10 +81,10 @@ def test_offline_node_running(sample_cluster): Assure that algorithm doesn't explode if a job is marked running in an offline node """ - tower, ig_large, ig_small = sample_cluster() + default, ig_large, ig_small = sample_cluster() ig_small.instance_list[0].capacity = 0 tasks = [Job(status='running', execution_node='i1', instance_group=ig_small)] - capacities = InstanceGroup.objects.capacity_values(qs=[tower, ig_large, ig_small], tasks=tasks) + capacities = InstanceGroup.objects.capacity_values(qs=[default, ig_large, ig_small], tasks=tasks) assert capacities['ig_small']['consumed_capacity'] == 43 @@ -92,10 +92,10 @@ def test_offline_node_waiting(sample_cluster): """ Same but for a waiting job """ - tower, ig_large, ig_small = sample_cluster() + default, ig_large, ig_small = sample_cluster() ig_small.instance_list[0].capacity = 0 tasks = [Job(status='waiting', instance_group=ig_small)] - capacities = InstanceGroup.objects.capacity_values(qs=[tower, ig_large, ig_small], tasks=tasks) + capacities = InstanceGroup.objects.capacity_values(qs=[default, ig_large, ig_small], tasks=tasks) assert capacities['ig_small']['consumed_capacity'] == 43 @@ -105,9 +105,9 @@ def test_RBAC_reduced_filter(sample_cluster): but user does not have permission to see those actual instance groups. Verify that this does not blow everything up. """ - tower, ig_large, ig_small = sample_cluster() - tasks = [Job(status='waiting', instance_group=tower), Job(status='waiting', instance_group=ig_large), Job(status='waiting', instance_group=ig_small)] - capacities = InstanceGroup.objects.capacity_values(qs=[tower], tasks=tasks, breakdown=True) + default, ig_large, ig_small = sample_cluster() + tasks = [Job(status='waiting', instance_group=default), Job(status='waiting', instance_group=ig_large), Job(status='waiting', instance_group=ig_small)] + capacities = InstanceGroup.objects.capacity_values(qs=[default], tasks=tasks, breakdown=True) # Cross-links between groups not visible to current user, # so a naieve accounting of capacities is returned instead - assert capacities['tower']['committed_capacity'] == 43 + assert capacities['default']['committed_capacity'] == 43 diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 1f4853b11d..67d9a39005 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -945,3 +945,6 @@ BROADCAST_WEBSOCKET_NEW_INSTANCE_POLL_RATE_SECONDS = 10 BROADCAST_WEBSOCKET_STATS_POLL_RATE_SECONDS = 5 DJANGO_GUID = {'GUID_HEADER_NAME': 'X-API-Request-Id'} + +# Default name of the task queue +DEFAULT_QUEUE_NAME = 'default'