Exemplo n.º 1
0
    def _runWorker(self, worker_id, logDir):
        iteration = 0
        while worker_id in self.threads:
            iteration += 1
            log_path = self._workerLogFile(worker_id, iteration, logDir)
            logging.info("adding worker. script: %s, log: %s",
                         self.worker_path, log_path)
            with open(log_path, 'a') as logfile:

                def writeline(msg):
                    logfile.write(msg + '\n')

                env = dict(os.environ)
                env['UFORA_WORKER_BASE_PORT'] = str(30009 +
                                                    2 * self.num_ever_started)
                proc = SubprocessRunner.SubprocessRunner(
                    [sys.executable, '-u', self.worker_path],
                    writeline,
                    writeline,
                    env=env)

                logfile.write("***Starting worker***\n")
                logging.info("Starting worker %s", worker_id)
                logfile.flush()
                proc.start()
                self.processes[worker_id] = proc
                proc.wait()
                logging.info("Worker exited: %s", worker_id)
Exemplo n.º 2
0
    def tryToStartRelayProcess(self, relayScript):
        env = dict(os.environ)
        env['NODE_ENV'] = 'test'

        hasStartedEvent = threading.Event()

        def onStdOut(msg):
            hasStartedEvent.set()
            logging.critical("RELAY STDOUT> %s", msg)

        def onStdErr(msg):
            logging.critical("RELAY STDERR> %s", msg)

        coffeeCommand = './run_coffee.sh'
        if 'UFORA_DEBUG_RELAY' in os.environ:
            coffeeCommand = 'coffee-debug'

        nodejsOptions = []
        if 'UFORA_PROFILE_RELAY' in os.environ:
            nodejsOptions = ['--nodejs', '--prof']

        args = [
            relayScript, '--port',
            str(self.relayPort), '--gatewayport',
            str(self.subscribableWebObjectsPort)
        ]

        command = [
            'forever', '-f', '-l', self.relayLogFile, '--workingDir',
            self.webPath, 'start', '-c', coffeeCommand
        ] + nodejsOptions + args

        SubprocessRunner.SubprocessRunner(command, onStdOut, onStdErr,
                                          env).start()
        return hasStartedEvent
Exemplo n.º 3
0
    def startSharedState(self):
        cacheDir = Setup.config().getConfigValue(
            "SHARED_STATE_CACHE",
            os.path.join(Setup.config().fakeAwsBaseDir, 'ss_cache'))

        logging.info(
            "Starting shared state with cache dir '%s' and log file '%s'",
            cacheDir, self.sharedStateLogFile)

        with DirectoryScope.DirectoryScope(self.sharedStatePath):
            args = [
                'forever', '--killSignal', 'SIGTERM', '-l',
                self.sharedStateLogFile, 'start', '-c', 'python',
                self.sharedStateMainline, '--cacheDir', cacheDir, '--logging',
                'info'
            ]

            def sharedStateStdout(msg):
                logging.info("SHARED STATE OUT> %s", msg)

            def sharedStateStderr(msg):
                logging.info("SHARED STATE ERR> %s", msg)

            startSharedState = SubprocessRunner.SubprocessRunner(
                args, sharedStateStdout, sharedStateStderr, dict(os.environ))
            startSharedState.start()
            startSharedState.wait(60.0)
            startSharedState.stop()
Exemplo n.º 4
0
    def start(self):
        assert not self.hasStarted

        if self.actuallyRunOutOfProcess:

            def onStdout(msg):
                logging.info("OutOfProcessDownloader Out> %s", msg)

            def onStderr(msg):
                logging.info("OutOfProcessDownloader Err> %s", msg)

            self.childSubprocess = SubprocessRunner.SubprocessRunner(
                [sys.executable, __file__,
                 str(self.childSocket.fileno())], onStdout, onStderr)
            self.childSubprocess.start()
            self.hasStarted = True

            self.backgroundThread = ManagedThread.ManagedThread(
                target=self.watchChild_)
            self.backgroundThread.start()
        else:
            self.hasStarted = True
            self.backgroundThread = ManagedThread.ManagedThread(
                target=self.executeChild_)
            self.backgroundThread.start()
Exemplo n.º 5
0
    def runForeverCommand(script, foreverCommand, timeout=60.0):
        args = ['forever', foreverCommand, script]

        def foreverStdOut(msg):
            logging.info("FOREVER(%s) OUT> %s", script, msg)

        def foreverStdErr(msg):
            logging.info("FOREVER(%s) ERR> %s", script, msg)

        subprocess = SubprocessRunner.SubprocessRunner(args, foreverStdOut,
                                                       foreverStdErr,
                                                       dict(os.environ))
        subprocess.start()
        subprocess.wait(timeout)
        subprocess.stop()
Exemplo n.º 6
0
    def test_subprocess_runner_exception(self):
        err = []
        out = []

        runner = SubprocessRunner.SubprocessRunner(
            ["/bin/bash", "-c", "echo toErr 1>&2; echo toNormal"],
            out.append,
            err.append
            )

        runner.start()
        self.assertEqual(runner.wait(10), 0)
        self.assertEqual(out, ['toNormal'])
        self.assertEqual(err, ["toErr"])
        runner.stop()
Exemplo n.º 7
0
    def test_subprocess_runner_runner(self):
        err = []
        out = []

        runner = SubprocessRunner.SubprocessRunner(
            ["/bin/echo", "asdf"],
            out.append,
            err.append
            )

        runner.start()
        self.assertEqual(runner.wait(10), 0)
        self.assertEqual(out, ["asdf"])
        self.assertEqual(err, [])
        runner.stop()
Exemplo n.º 8
0
    def startGatewayService(self):
        args = [
            'forever', '--killSignal', 'SIGTERM', '-l', self.gatewayLogFile,
            'start', '-c', 'python', self.gatewayServiceMainline,
            '--cluster-name', 'test'
        ]

        def gatewayStdout(msg):
            logging.info("GATEWAY OUT> %s", msg)

        def gatewayStderr(msg):
            logging.info("GATEWAY ERR> %s", msg)

        gatewayProc = SubprocessRunner.SubprocessRunner(
            args, gatewayStdout, gatewayStderr, dict(os.environ))
        gatewayProc.start()
        gatewayProc.wait(60.0)
        gatewayProc.stop()
Exemplo n.º 9
0
    def onSubscribableConnection(self, sock, _):
        logging.info("creating a new process to handle connection")

        handlerPid = None
        with self._lock:
            if self.shouldStop():
                return

            scriptName = os.path.join(
                os.path.split(__file__)[0],
                'handleBackendGatewayConnection.py')

            def onStdOut(line):
                logging.info("%s > %s", handlerPid, line)

            def onStdErr(line):
                logging.error("%s > %s", handlerPid, line)

            connectProc = SubprocessRunner.SubprocessRunner(
                [sys.executable, scriptName], onStdOut, onStdErr)

            self.socketsToDisconnectOnExit.append(sock)

        connectProc.start()
        handlerPid = connectProc.pid
        with self._lock:
            self.procsToKillOnExit.add(connectProc)

        toWrite = pickle.dumps({
            'socketFd': sock.fileno(),
            'sharedStateAddress': self.sharedStateAddress
        })

        connectProc.write(struct.pack('I', len(toWrite)))
        connectProc.write(toWrite)
        connectProc.flush()

        def waitForProcToFinish():
            connectProc.wait()
            connectProc.stop()
            sock.close()

        threading.Thread(target=waitForProcToFinish).start()
Exemplo n.º 10
0
    def __call__(self):
        args = ['forever', self.foreverCommand, self.script]

        response = []

        def foreverStdOut(msg):
            response.append("FOREVER(%s) OUT> %s" % (self.script, msg))

        def foreverStdErr(msg):
            response.append("FOREVER(%s) ERR> %s" % (self.script, msg))

        subprocess = SubprocessRunner.SubprocessRunner(args, foreverStdOut,
                                                       foreverStdErr,
                                                       self.environ)
        subprocess.start()
        subprocess.wait(self.timeout)
        subprocess.stop()

        return "\n".join(response)
Exemplo n.º 11
0
    def testUsingCoffeescript(self):
        args = [
            "mocha", "--reporter", "spec", "--compilers",
            "coffee:coffee-script/register",
            "testSubscribableWebObjects.coffee", "-b"
        ]

        def onOut(l):
            logging.info("Mocha Out> %s", l)

        def onErr(l):
            logging.info("Mocha Err> %s", l)

        subprocess = SubprocessRunner.SubprocessRunner(args, onOut, onErr)
        subprocess.start()
        result = subprocess.wait(720)
        subprocess.stop()

        self.assertEqual(result, 0)
Exemplo n.º 12
0
    def _runWorker(self, worker_id, logDir):
        iteration = 0
        while worker_id in self.threads:
            iteration += 1
            log_path = self._workerLogFile(worker_id, iteration, logDir)
            logging.info("adding worker. script: %s, log: %s",
                         self.worker_path, log_path)
            with open(log_path, 'a') as logfile:

                def writeline(msg):
                    logfile.write(msg + '\n')

                env = dict(os.environ)
                env['UFORA_WORKER_BASE_PORT'] = str(30009 +
                                                    2 * self.num_ever_started)

                core_log = log_path.split('.')
                core_log.insert(-1, 'core')
                env['UFORA_WORKER_CORE_LOG_FILE'] = '.'.join(core_log)

                env['CUMULUS_VECTOR_MB'] = "400"
                env['CUMULUS_MAX_MB'] = "500"
                env['CUMULUS_TRACK_TCMALLOC'] = '0'
                env['CUMULUS_DISK_STORAGE_SUBDIR'] = str(worker_id)

                self.num_ever_started += 1
                proc = SubprocessRunner.SubprocessRunner(
                    [sys.executable, '-u', self.worker_path],
                    writeline,
                    writeline,
                    env=env)

                logfile.write("***Starting worker***\n")
                logging.info("Starting worker %s", worker_id)
                logfile.flush()
                proc.start()
                self.processes[worker_id] = proc
                proc.wait()
                logging.info("Worker exited: %s", worker_id)
Exemplo n.º 13
0
    def runScript_(self, script):
        print
        print "Running %s" % script
        print "with a timeout of %s sec"% self.getTimeout(script)

        if sys.platform == 'linux2':
            directory, filename = os.path.split(script)
            args = [sys.executable, "-u", '-c', "print 'started'; execfile('%s')" % filename]

            with DirectoryScope(directory):
                tries = 0
                runner = None

                while tries < 5 and runner is None:
                    startedEvent = threading.Event()

                    def printOutput(line):
                        if line == 'started':
                            startedEvent.set()
                            print "Script %s started" % filename
                        else:
                            print "OUT> %s\n" % line,

                    def printErr(line):
                        print "ERR> %s\n" % line,

                    runner = SubprocessRunner.SubprocessRunner(
                        args,
                        printOutput,
                        printErr,
                        self.envVars
                        )
                    runner.start()

                    startedEvent.wait(5)
                    if not startedEvent.isSet():
                        runner.terminate()
                        runner = None
                        tries = tries + 1
                        print "Retrying script ", filename, " as python failed to start."

                if runner is None:
                    print "Test %s failed to start a python process in 5 tries" % filename
                    return False
                else:
                    result = runner.wait(self.getTimeout(script))

                    if result is None:
                        try:
                            runner.terminate()
                        except:
                            print "Failed to terminate test runner: ", traceback.format_exc()
                        print "Test %s timed out" % filename,
                        return False
                    runner.stop()


                    if result != 0:
                        print "Test %s failed" % filename,
                        return False

                return True
        else:
            subprocess.check_call('cd "%s" & c:\python27\python.exe %s '
                % os.path.split(script),
                shell = True
                )

        return True