From b59d9b766fce38b8f3deacb205a169a4c172e025 Mon Sep 17 00:00:00 2001 From: Chris Church Date: Thu, 21 Nov 2013 17:41:51 -0500 Subject: [PATCH] AC-620 Updates to tests to create temp job output root, update tasks to write to stdout file directly instead of storing any stdout in memory. --- awx/main/tasks.py | 12 +++++++----- awx/main/tests/base.py | 6 ++++-- awx/settings/defaults.py | 5 +++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index c32c8e1a14..4ec74a1ef3 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -166,7 +166,7 @@ class BaseTask(Task): passwords when requested. ''' status, stdout = 'error', '' - logfile = cStringIO.StringIO() + logfile = task_stdout_handle#cStringIO.StringIO() logfile_pos = logfile.tell() child = pexpect.spawn(args[0], args[1:], cwd=cwd, env=env) child.logfile_read = logfile @@ -187,11 +187,11 @@ class BaseTask(Task): if result_id in expect_passwords: child.sendline(expect_passwords[result_id]) if logfile_pos != logfile.tell(): - old_logfile_pos = logfile_pos + #old_logfile_pos = logfile_pos logfile_pos = logfile.tell() #updates['result_stdout'] = logfile.getvalue() - task_stdout_handle.write(logfile.getvalue()[old_logfile_pos:logfile_pos]) - task_stdout_handle.flush() + #task_stdout_handle.write(logfile.getvalue()[old_logfile_pos:logfile_pos]) + #task_stdout_handle.flush() last_stdout_update = time.time() instance = self.get_model(instance.pk) # Commit transaction needed when running unit tests. FIXME: Is it @@ -210,7 +210,7 @@ class BaseTask(Task): status = 'successful' else: status = 'failed' - stdout = logfile.getvalue() + #stdout = logfile.getvalue() return status, stdout def pre_run_check(self, instance, **kwargs): @@ -271,6 +271,8 @@ class BaseTask(Task): cwd = self.build_cwd(instance, **kwargs) env = self.build_env(instance, **kwargs) safe_env = self.build_safe_env(instance, **kwargs) + if not os.path.exists(settings.JOBOUTPUT_ROOT): + os.makedirs(settings.JOBOUTPUT_ROOT) stdout_filename = os.path.join(settings.JOBOUTPUT_ROOT, str(uuid.uuid1()) + ".out") stdout_handle = open(stdout_filename, 'w') instance = self.update_model(pk, job_args=json.dumps(safe_args), diff --git a/awx/main/tests/base.py b/awx/main/tests/base.py index 74ef2eb227..97527fe54e 100644 --- a/awx/main/tests/base.py +++ b/awx/main/tests/base.py @@ -47,8 +47,10 @@ class BaseTestMixin(object): # commands that run from tests. for opt in ('ENGINE', 'NAME', 'USER', 'PASSWORD', 'HOST', 'PORT'): os.environ['AWX_TEST_DATABASE_%s' % opt] = settings.DATABASES['default'][opt] - if not os.path.exists(settings.JOBOUTPUT_ROOT): - os.makedirs(settings.JOBOUTPUT_ROOT) + # Make temp job status directory for unit tests. + job_status_dir = tempfile.mkdtemp() + self._temp_project_dirs.append(job_status_dir) + settings.JOBOUTPUT_ROOT = os.path.abspath(job_status_dir) def tearDown(self): super(BaseTestMixin, self).tearDown() diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 5d97cfc564..08671efd2f 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -83,8 +83,9 @@ MEDIA_URL = '/media/' # This directory should not be web-accessible. PROJECTS_ROOT = os.path.join(BASE_DIR, 'projects') -# Absolute filesystem path to the directory to host job stdout -# This directory should not be web-accessible. +# Absolute filesystem path to the directory for job status stdout (default for +# development and tests, default for production defined in production.py). This +# directory should not be web-accessible JOBOUTPUT_ROOT = os.path.join(BASE_DIR, 'job_output') SITE_ID = 1