Source code for gssa.shadow_watcher

import asyncio
import shutil
import os
import logging

logger = logging.getLogger(__name__)

# Approximately max minutes * 6
_MAX_CHECKS = 600
_TESTING = False

_PROGRESS_FILE = 'progress.vtp'


# This allows a development version of a code, say, to run, produce results and
# have those results adopted by the stable version. This is normally indicated by
# use of a parameter DEVELOPMENT=1. This allows the stable version to take care
# of all normal runs except those for while an experimental set-up is requested.
# However, this is very preliminary
# functionality, tested in very specific situations
@asyncio.coroutine
[docs]def observe(guid, transferrer, update_callback): """DEPRECATED""" transferrer.connect() completed = None checks = 0 target = {_PROGRESS_FILE: '%s/progress.vtp' % guid.lower()} target_dir = '/tmp/obs-%s' % guid try: shutil.rmtree(target_dir) except: pass os.mkdir(target_dir) while checks < _MAX_CHECKS: checks += 1 yield from asyncio.sleep(10) try: if not _TESTING: transferrer.pull_files(target, target_dir, '.') else: shutil.copyfile('/tmp/%s.vtp' % guid.lower(), os.path.join(target_dir, _PROGRESS_FILE)) except: logger.exception("Problem with observation") else: with open(os.path.join(target_dir, _PROGRESS_FILE), 'r') as f: lines = f.read().split('\n') if lines[1] == 'SUCCESS': completed = True elif lines[1] == 'IN_PROGRESS': update_callback(float(lines[2]) if len(lines[2]) > 0 else None, "\n".join(lines[3:])) else: completed = "%s\n%s" % (lines[1], "\n".join(lines[3:])) os.unlink(os.path.join(target_dir, _PROGRESS_FILE)) if completed is not None: break transferrer.disconnect() if completed is not True: raise RuntimeError(completed) return completed