From cdc7f03c58651ac88d7160fd6fd6327a4deea2a2 Mon Sep 17 00:00:00 2001 From: Luke Sneeringer Date: Tue, 2 Jun 2015 15:53:10 -0500 Subject: [PATCH] Move MongoDB control to tasks. --- awx/api/views.py | 5 +++-- awx/main/tasks.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/awx/api/views.py b/awx/api/views.py index b9ed7142b1..c5ec4e6c74 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -46,6 +46,7 @@ import ansiconv # AWX from awx.main.task_engine import TaskSerializer, TASK_FILE +from awx.main.tasks import mongodb_control from awx.main.access import get_user_queryset from awx.main.ha import is_ha_environment from awx.api.authentication import TaskAuthentication @@ -243,9 +244,9 @@ class ApiV1ConfigView(APIView): # Spawn a task to ensure that MongoDB is started (or stopped) # as appropriate, based on whether the license uses it. if license_data['features']['system_tracking']: - subprocess.call('sudo service mongod start', shell=True) + mongodb_control.delay('start') else: - subprocess.call('sudo service mongod stop', shell=True) + mongodb_control.delay('stop') # Done; return the response. return Response(license_data) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 174900a984..ebfc168573 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -13,6 +13,7 @@ import pipes import re import shutil import stat +import subprocess import tempfile import time import traceback @@ -119,6 +120,23 @@ def notify_task_runner(metadata_dict): queue = FifoQueue('tower_task_manager') queue.push(metadata_dict) + +@task() +def mongodb_control(cmd): + # Sanity check: Do not send arbitrary commands. + if cmd not in ('start', 'stop'): + raise ValueError('Only "start" and "stop" are allowed.') + + # Either start or stop mongo, as requested. + p = subprocess.Popen('sudo service mongod %s' % cmd, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + + # If there was an error, log it. + if err: + logger.error(err) + + @task(bind=True) def handle_work_error(self, task_id, subtasks=None): print('Executing error task id %s, subtasks: %s' %