diff --git a/awx/main/managers.py b/awx/main/managers.py index f8afdca9e1..15e1c9d655 100644 --- a/awx/main/managers.py +++ b/awx/main/managers.py @@ -2,7 +2,6 @@ # All Rights Reserved. import sys -import socket from django.db import models @@ -27,7 +26,7 @@ class InstanceManager(models.Manager): """Return the currently active instance.""" # If we are running unit tests, return a stub record. if len(sys.argv) >= 2 and sys.argv[1] == 'test': - return self.model(id=1, primary=True, + return self.model(id=1, hostname='localhost', uuid='00000000-0000-0000-0000-000000000000') diff --git a/awx/main/socket_queue.py b/awx/main/socket_queue.py index b2b78396fa..40dba76366 100644 --- a/awx/main/socket_queue.py +++ b/awx/main/socket_queue.py @@ -61,7 +61,7 @@ class Socket(object): def port(self): return { 'callbacks': os.environ.get('CALLBACK_CONSUMER_PORT', - settings.CALLBACK_CONSUMER_PORT), + getattr(settings, 'CALLBACK_CONSUMER_PORT', 'tcp://127.0.0.1:5557')), 'task_commands': settings.TASK_COMMAND_PORT, 'websocket': settings.SOCKETIO_NOTIFICATION_PORT, 'fact_cache': settings.FACT_CACHE_PORT, diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 8c8f564917..fe46166afb 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -958,7 +958,7 @@ class RunJob(BaseTask): update_inventory_computed_fields.delay(inventory.id, True) # Update job event fields after job has completed (only when using REST # API callback). - if not settings.CALLBACK_CONSUMER_PORT: + if not getattr(settings, 'CALLBACK_CONSUMER_PORT', None) and not getattr(settings, 'CALLBACK_QUEUE', None): for job_event in job.job_events.order_by('pk'): job_event.save(post_process=True) @@ -1519,7 +1519,8 @@ class RunAdHocCommand(BaseTask): env['ANSIBLE_LOAD_CALLBACK_PLUGINS'] = '1' env['REST_API_URL'] = settings.INTERNAL_API_URL env['REST_API_TOKEN'] = ad_hoc_command.task_auth_token or '' - env['CALLBACK_CONSUMER_PORT'] = str(settings.CALLBACK_CONSUMER_PORT) + env['CALLBACK_QUEUE'] = settings.CALLBACK_QUEUE + env['CALLBACK_CONNECTION'] = settings.BROKER_URL env['ANSIBLE_SFTP_BATCH_MODE'] = 'False' if getattr(settings, 'JOB_CALLBACK_DEBUG', False): env['JOB_CALLBACK_DEBUG'] = '2' diff --git a/awx/main/tests/base.py b/awx/main/tests/base.py index 63fa0ed571..6b35297a07 100644 --- a/awx/main/tests/base.py +++ b/awx/main/tests/base.py @@ -13,7 +13,6 @@ import tempfile import time import urllib from multiprocessing import Process -from subprocess import Popen import re import mock @@ -31,7 +30,6 @@ from django.utils.encoding import force_text # AWX from awx.main.models import * # noqa -from awx.main.management.commands.run_callback_receiver import CallbackReceiver from awx.main.management.commands.run_task_system import run_taskmanager from awx.main.utils import get_ansible_version from awx.main.task_engine import TaskEngager as LicenseWriter @@ -45,45 +43,6 @@ TEST_PLAYBOOK = '''- hosts: mygroup command: test 1 = 1 ''' -class QueueTestMixin(object): - def start_queue(self): - self.start_redis() - receiver = CallbackReceiver() - self.queue_process = Process(target=receiver.run_subscriber, - args=(False,)) - self.queue_process.start() - - def terminate_queue(self): - if hasattr(self, 'queue_process'): - self.queue_process.terminate() - self.stop_redis() - - def start_redis(self): - if not getattr(self, 'redis_process', None): - # Centos 6.5 redis is runnable by non-root user but is not in a normal users path by default - env = dict(os.environ) - env['PATH'] = '%s:/usr/sbin/' % env['PATH'] - self.redis_process = Popen('echo "port 16379" | redis-server - > /dev/null', - shell=True, executable='/bin/bash', - env=env) - - def stop_redis(self): - if getattr(self, 'redis_process', None): - self.redis_process.kill() - self.redis_process = None - - -# The observed effect of not calling terminate_queue() if you call start_queue() are -# an hang on test cleanup database delete. Thus, to ensure terminate_queue() is called -# whenever start_queue() is called just inherit from this class when you want to use the queue. -class QueueStartStopTestMixin(QueueTestMixin): - def setUp(self): - super(QueueStartStopTestMixin, self).setUp() - self.start_queue() - - def tearDown(self): - super(QueueStartStopTestMixin, self).tearDown() - self.terminate_queue() class MockCommonlySlowTestMixin(object): def __init__(self, *args, **kwargs): @@ -92,7 +51,7 @@ class MockCommonlySlowTestMixin(object): super(MockCommonlySlowTestMixin, self).__init__(*args, **kwargs) ansible_version = get_ansible_version() -class BaseTestMixin(QueueTestMixin, MockCommonlySlowTestMixin): +class BaseTestMixin(MockCommonlySlowTestMixin): ''' Mixin with shared code for use by all test cases. ''' @@ -733,7 +692,7 @@ class BaseLiveServerTest(BaseTestMixin, django.test.LiveServerTestCase): CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, ANSIBLE_TRANSPORT='local', DEBUG=True) -class BaseJobExecutionTest(QueueStartStopTestMixin, BaseLiveServerTest): +class BaseJobExecutionTest(BaseLiveServerTest): ''' Base class for celery task tests. ''' diff --git a/awx/main/tests/factories/fixtures.py b/awx/main/tests/factories/fixtures.py index c51c29e83c..e52b627076 100644 --- a/awx/main/tests/factories/fixtures.py +++ b/awx/main/tests/factories/fixtures.py @@ -29,7 +29,7 @@ def mk_instance(persisted=True): if not persisted: raise RuntimeError('creating an Instance requires persisted=True') from django.conf import settings - return Instance.objects.get_or_create(uuid=settings.SYSTEM_UUID, primary=True, hostname="instance.example.org") + return Instance.objects.get_or_create(uuid=settings.SYSTEM_UUID, hostname="instance.example.org") def mk_organization(name, description=None, persisted=True): diff --git a/awx/main/tests/functional/commands/test_run_fact_cache_receiver.py b/awx/main/tests/functional/commands/test_run_fact_cache_receiver.py index 1a8965e81c..0bb9da523d 100644 --- a/awx/main/tests/functional/commands/test_run_fact_cache_receiver.py +++ b/awx/main/tests/functional/commands/test_run_fact_cache_receiver.py @@ -85,7 +85,7 @@ def test_process_facts_message_ansible_overwrite(fact_scans, fact_msg_ansible): # Ensure that the message flows from the socket through to process_fact_message() @pytest.mark.django_db def test_run_receiver(mocker, fact_msg_ansible): - mocker.patch("awx.main.socket.Socket.listen", return_value=[fact_msg_ansible]) + mocker.patch("awx.main.socket_queue.Socket.listen", return_value=[fact_msg_ansible]) receiver = FactCacheReceiver() mocker.patch.object(receiver, 'process_fact_message', return_value=None) diff --git a/awx/main/tests/functional/conftest.py b/awx/main/tests/functional/conftest.py index e5e1222a39..0c620feb7e 100644 --- a/awx/main/tests/functional/conftest.py +++ b/awx/main/tests/functional/conftest.py @@ -152,7 +152,7 @@ def user_project(user): @pytest.fixture def instance(settings): - return Instance.objects.create(uuid=settings.SYSTEM_UUID, primary=True, hostname="instance.example.org") + return Instance.objects.create(uuid=settings.SYSTEM_UUID, hostname="instance.example.org") @pytest.fixture def organization(instance): diff --git a/setup.cfg b/setup.cfg index ea462fd7fa..1e0053eae4 100755 --- a/setup.cfg +++ b/setup.cfg @@ -18,4 +18,4 @@ exclude=.tox,venv,awx/lib/site-packages,awx/plugins/inventory/ec2.py,awx/plugins [flake8] ignore=E201,E203,E221,E225,E231,E241,E251,E261,E265,E302,E303,E501,W291,W391,W293,E731,F405 -exclude=.tox,venv,awx/lib/site-packages,awx/plugins/inventory,awx/ui,awx/api/urls.py,awx/main/migrations,awx/main/south_migrations,awx/main/tests/data,node_modules/,awx/projects/,tools/docker,awx/settings/local_settings.py +exclude=.tox,venv,awx/lib/site-packages,awx/plugins/inventory,awx/ui,awx/api/urls.py,awx/main/migrations,awx/main/south_migrations,awx/main/tests/data,node_modules/,awx/projects/,tools/docker,awx/settings/local_*.py