mirror of
https://github.com/ansible/awx.git
synced 2026-02-13 10:55:15 -03:30
we recently made a change so that instances no longer bind to instance-group specific queues, but now instead they each bind to a direct queue for their specific hostname (https://github.com/ansible/tower/pull/1922) Because of this, we shouldn't *need* to reconfigure the queue binds at runtime anymore when group membership changes. Under our new model, every celeryd listens on a queue named after its hostname; when the scheduler finds a task to run, it picks an Instance in the target Instance Group and sends the task to the queue for that Instance's hostname.
69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright (c) 2017 Ansible Tower by Red Hat
|
|
# All Rights Reserved.
|
|
|
|
# python
|
|
import pytest
|
|
import mock
|
|
|
|
# AWX
|
|
from awx.main.utils.ha import (
|
|
AWXCeleryRouter,
|
|
)
|
|
|
|
|
|
class TestAddRemoveCeleryWorkerQueues():
|
|
@pytest.fixture
|
|
def instance_generator(self, mocker):
|
|
def fn(hostname='east-1'):
|
|
groups=['east', 'west', 'north', 'south']
|
|
instance = mocker.MagicMock()
|
|
instance.hostname = hostname
|
|
instance.rampart_groups = mocker.MagicMock()
|
|
instance.rampart_groups.values_list = mocker.MagicMock(return_value=groups)
|
|
|
|
return instance
|
|
return fn
|
|
|
|
@pytest.fixture
|
|
def worker_queues_generator(self, mocker):
|
|
def fn(queues=['east', 'west']):
|
|
return [dict(name=n, alias='') for n in queues]
|
|
return fn
|
|
|
|
@pytest.fixture
|
|
def mock_app(self, mocker):
|
|
app = mocker.MagicMock()
|
|
app.control = mocker.MagicMock()
|
|
app.control.cancel_consumer = mocker.MagicMock()
|
|
return app
|
|
|
|
|
|
class TestUpdateCeleryWorkerRouter():
|
|
|
|
@pytest.mark.parametrize("is_controller,expected_routes", [
|
|
(False, {
|
|
'awx.main.tasks.cluster_node_heartbeat': {'queue': 'east-1', 'routing_key': 'east-1'},
|
|
'awx.main.tasks.purge_old_stdout_files': {'queue': 'east-1', 'routing_key': 'east-1'}
|
|
}),
|
|
(True, {
|
|
'awx.main.tasks.cluster_node_heartbeat': {'queue': 'east-1', 'routing_key': 'east-1'},
|
|
'awx.main.tasks.purge_old_stdout_files': {'queue': 'east-1', 'routing_key': 'east-1'},
|
|
'awx.main.tasks.awx_isolated_heartbeat': {'queue': 'east-1', 'routing_key': 'east-1'},
|
|
}),
|
|
])
|
|
def test_update_celery_worker_routes(self, mocker, is_controller, expected_routes):
|
|
def get_or_register():
|
|
instance = mock.MagicMock()
|
|
instance.hostname = 'east-1'
|
|
instance.is_controller = mock.MagicMock(return_value=is_controller)
|
|
return (False, instance)
|
|
|
|
with mock.patch('awx.main.models.Instance.objects.get_or_register', get_or_register):
|
|
router = AWXCeleryRouter()
|
|
|
|
for k,v in expected_routes.iteritems():
|
|
assert router.route_for_task(k) == v
|
|
|