def testFDTDKillProcess2(): c = """ [general] port = 6700 debug = DEBUG killCommand = ../wrapper_kill.sh %(pid)s portRangeFDTServer = 54321,54400 """ f = getTempFile(c) inputOption = "--config=%s" % f.name conf = ConfigFDTD(inputOption.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) # need long-running, non blocking process command = "dd if=/dev/zero of=/dev/null count=100000000 bs=102400" executor = Executor("some_id", command, blocking=False, caller=daemon, logger=logger, killTimeout=0) try: executor.execute() daemon.killProcess("some_id", logger) finally: # definitely release port and kill the process daemon.shutdown() daemon.pyroDaemon.closedown() try: p = Process(executor.proc.pid) m = "FAIL: Process PID:%s should have been " "killed." % executor.proc.pid logger.debug(m) py.test.fail(m) except NoSuchProcess as ex: logger.debug("OK: Process PID:%s doesn't exist now." % executor.proc.pid)
def testFDTDAndExecutorContainerHandling(): c = """ [general] port = 6700 debug = DEBUG portRangeFDTServer = 54321,54323 killCommand = "kill -9 %(pid)s" killCommandSudo = "kill -9 %(pid)s" """ f = getTempFile(c) inputOptions = "-d DEBUG -p 6700 --config=%s" % f.name conf = ConfigFDTD(inputOptions.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) assert len(daemon._executors) == 0 # needs to be blocking command, since simple ls finishes too quickly # for default blocking it would be considered that it failed # just needed existing process and executor container handling with it executor = Executor("some_id", "ls /tmp", logger=logger, blocking=True) executor.execute() daemon.addExecutor(executor) # subsequent adding of the same executor shall raise exception # (the same id) py.test.raises(FDTDException, daemon.addExecutor, executor) daemon.removeExecutor(executor) assert len(daemon._executors) == 0 # need long running job command = "dd if=/dev/zero of=/dev/null count=100000000 bs=102400" # caller is not explicitly specified, so all executors container # manipulation is done from this test executor = Executor("some_id", command, blocking=False, killTimeout=0, logger=logger) executor.execute() daemon.addExecutor(executor) assert len(daemon._executors) == 1 # check getting the executor reference from the container ex = daemon.getExecutor("some_id_nonsence") # doens't exist assert ex == None ex = daemon.getExecutor("some_id") assert ex == executor # this in fact should discover that the process is still running # and not remove it daemon.removeExecutor(executor) assert len(daemon._executors) == 1 # now kill the process and try to remove it afterwards - test # different branch of removeExecutor daemon.killProcess(executor.id, logger) assert len(daemon._executors) == 0 # should have been removed daemon.shutdown() daemon.pyroDaemon.closedown()
def testFDTDKillProcess(): inputOptions = "-d DEBUG -p 6700" conf = ConfigFDTD(inputOptions.split()) logger = Logger("test logger", level = logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) # now doesn't fail, just says "some_id" process doesn't exist in the executors container daemon.killProcess("some_id", logger) daemon.shutdown()
def testFDTDAndExecutorContainerHandling(): c = """ [general] port = 6700 debug = DEBUG portRangeFDTServer = 54321,54323 killCommand = "kill -9 %(pid)s" killCommandSudo = "kill -9 %(pid)s" """ f = getTempFile(c) inputOptions = "-d DEBUG -p 6700 --config=%s" % f.name conf = ConfigFDTD(inputOptions.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) assert len(daemon._executors) == 0 # needs to be blocking command, since simple ls finishes too quickly # for default blocking it would be considered that it failed # just needed existing process and executor container handling with it executor = Executor("some_id", "ls /tmp", logger=logger, blocking=True) executor.execute() daemon.addExecutor(executor) # subsequent adding of the same executor shall raise exception # (the same id) py.test.raises(FDTDException, daemon.addExecutor, executor) daemon.removeExecutor(executor) assert len(daemon._executors) == 0 # need long running job command = "dd if=/dev/zero of=/dev/null count=100000000 bs=102400" # caller is not explicitly specified, so all executors container # manipulation is done from this test executor = Executor("some_id", command, blocking=False, killTimeout=0, logger=logger) executor.execute() daemon.addExecutor(executor) assert len(daemon._executors) == 1 # check getting the executor reference from the container ex = daemon.getExecutor("some_id_nonsence") # doens't exist assert ex is None ex = daemon.getExecutor("some_id") assert ex == executor # this in fact should discover that the process is still running # and not remove it daemon.removeExecutor(executor) assert len(daemon._executors) == 1 # now kill the process and try to remove it afterwards - test # different branch of removeExecutor daemon.killProcess(executor.id, logger) assert len(daemon._executors) == 0 # should have been removed daemon.shutdown() daemon.pyroDaemon.closedown()
def testFDTDKillProcess1(): inputOptions = "-d DEBUG -p 6700 -H localhost" conf = ConfigFDTD(inputOptions.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) # now doesn't fail, just says "some_id" process doesn't exist in the # executors container daemon.killProcess("some_id", logger) daemon.shutdown() daemon.pyroDaemon.closedown()
def testKillProcessTimeout(): script = """ c=$1 while [ $c -gt 0 ] do sleep 1 let "c -= 1" done exit 0 """ inputOptions = "-d DEBUG -p 6700" conf = ConfigFDTD(inputOptions.split()) logger = Logger("test logger", level = logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) f = getTempFile(script) # wait time 5s command = "bash %s 5" % f.name # wait only 2s for me before killing e = Executor("some_id", command, caller = daemon, blocking = False, killTimeout = 3) try: output = e.execute() daemon.killProcess("some_id", logger) finally: daemon.shutdown() assert e.proc.poll() == -9 # the process was still running, timeout elapsed and was killed # try different port, even if the previous was released, # immediate rebinding attempt makes PYRO fail inputOptions = "-d DEBUG -p 6701" conf = ConfigFDTD(inputOptions.split()) apMon = None daemon = FDTD(conf, apMon, logger) # wait time 2s command = "bash %s 2" % f.name e = Executor("some_id", command, caller = daemon, blocking = False, killTimeout = 4) try: output = e.execute() daemon.killProcess("some_id", logger) finally: daemon.shutdown() # the process should have normally finished, waiting killTimeout assert e.proc.poll() == 0
def testFDTDKillProcess2(): c = """ [general] port = 6700 debug = DEBUG killCommand = ../wrapper_kill.sh %(pid)s portRangeFDTServer = 54321,54400 """ f = getTempFile(c) inputOption = "--config=%s" % f.name conf = ConfigFDTD(inputOption.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) # need long-running, non blocking process command = "dd if=/dev/zero of=/dev/null count=100000000 bs=102400" executor = Executor("some_id", command, blocking=False, caller=daemon, logger=logger, killTimeout=0) try: executor.execute() daemon.killProcess("some_id", logger) finally: # definitely release port and kill the process daemon.shutdown() daemon.pyroDaemon.closedown() try: p = Process(executor.proc.pid) m = ("FAIL: Process PID:%s should have been " "killed." % executor.proc.pid) logger.debug(m) py.test.fail(m) except NoSuchProcess, ex: logger.debug("OK: Process PID:%s doesn't exist now." % executor.proc.pid)
def testFDTDKillProcess(): inputOptions = "-d DEBUG -p 6700" conf = ConfigFDTD(inputOptions.split()) logger = Logger("test logger", level = logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) # need long-running, non blocking process command = "dd if=/dev/zero of=/dev/null count=100000000 bs=102400" executor = Executor("some_id", command, blocking = False, caller = daemon, logger = logger) try: executor.execute() daemon.killProcess("some_id", logger) finally: # definitely release port and kill the process daemon.shutdown() # if kill wasn't successful try again try: os.kill(executor.proc.pid, signal.SIGKILL) except OSError: pass
def testReceivingServerAddressAlreadyInUse(): c = """ [general] port = 6700 debug = DEBUG portRangeFDTServer = 54321,54323 fdtReceivingServerCommand = java -jar ../fdtjava/fdt.jar -bs 64K -p %(port)s -wCount 5 -S -noupdates fdtServerLogOutputTimeout = 2 fdtServerLogOutputToWaitFor = "FDTServer start listening on port: %(port)s" fdtReceivingServerKillTimeout = 1 killCommand = "kill -9 %(pid)s" killCommandSudo = "kill -9 %(pid)s" """ f = getTempFile(c) inputOptions = "-d DEBUG -p 6700 --config=%s" % f.name conf = ConfigFDTD(inputOptions.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) assert len(daemon._executors) == 0 files = ["/mnt/data", "/etc/passwd", "/etc/something/nonsence", "/tmp"] options = dict(gridUserDest="someuser", destFiles=files) a = ReceivingServerAction("some_id", options) a._checkForAddressAlreadyInUseError("some message", 222, logger) a._checkForAddressAlreadyInUseError("some message", 25, logger) a._checkForAddressAlreadyInUseError("Address already in use", 25, logger) a._checkForAddressAlreadyInUseError("Address already in use", 22225, logger) logger.info("Now real FDT Java server real attempts") logger.info('#' * 78) # 1) successful attempt logger.info('1' * 78) options = dict(gridUserDest="someuser", destFiles=files) a = ReceivingServerAction("some_id", options) assert len(daemon._executors) == 0 result = a.execute(conf=conf, caller=daemon, apMon=apMon, logger=logger) assert len(daemon._executors) == 1 assert result.status == 0 assert result.serverPort == 54321 assert result.msg == "FDT server is running" # 2) this executor attempt shall fail with Address already in use, # fool into reusing the same port 54321 as the previous process # by replacing caller.getFreePort() method which is used in # ReceivingServerAction.exectute() def myFoolGetFreePort(inp, logger): def returner(): logger.debug("myFoolGetFreePort called, returning %s" % inp) return inp return returner daemon.getFreePort = myFoolGetFreePort(54321, logger) logger.info('2' * 78) options = dict(gridUserDest="someuser", destFiles=files) a = ReceivingServerAction("some_id-2", options) py.test.raises(FDTDException, a.execute, conf=conf, caller=daemon, apMon=apMon, logger=logger) # starting FDT Java command failed, but the request remains in the # executor container for later cleanup assert len(daemon._executors) == 2 # 3) kill both executors / processes - one running, other failed logger.info('3' * 78) daemon.killProcess("some_id", logger, waitTimeout=False) assert len(daemon._executors) == 1 daemon.killProcess("some_id-2", logger, waitTimeout=False) assert len(daemon._executors) == 0 # 4) try starting FDT Java server on privileged port - will fail logger.info('4' * 78) options = dict(gridUserDest="someuser", destFiles=files) a = ReceivingServerAction("some_id", options) daemon.getFreePort = myFoolGetFreePort(999, logger) py.test.raises(FDTDException, a.execute, conf=conf, caller=daemon, apMon=apMon, logger=logger) assert len(daemon._executors) == 1 daemon.killProcess("some_id", logger, waitTimeout=False) assert len(daemon._executors) == 0 daemon.shutdown() daemon.pyroDaemon.closedown()
def testKillProcessTimeout(): c = """ [general] port = 6700 debug = DEBUG killCommand = ../wrapper_kill.sh %(pid)s portRangeFDTServer = 54321,54400 """ script = """ c=$1 while [ $c -gt 0 ] do sleep 1 let "c -= 1" done exit 0 """ f = getTempFile(c) inputOption = "--config=%s" % f.name conf = ConfigFDTD(inputOption.split()) testName = inspect.stack()[0][3] logger = Logger(name=testName, level=logging.DEBUG) apMon = None daemon = FDTD(conf, apMon, logger) f = getTempFile(script) # wait time 5s command = "bash %s 5" % f.name # wait only 2s for me before killing e = Executor("some_id", command, caller=daemon, blocking=False, killTimeout=3, logger=logger) try: output = e.execute() daemon.killProcess("some_id", logger) finally: daemon.shutdown() daemon.pyroDaemon.closedown() # the process was still running, timeout elapsed and was killed assert e.proc.poll() == -9 # try different port, even if the previous was released, # immediate rebinding attempt makes PYRO fail inputOptions = "-d DEBUG -p 6701" conf = ConfigFDTD(inputOptions.split()) apMon = None daemon = FDTD(conf, apMon, logger) # wait time 2s command = "bash %s 2" % f.name e = Executor("some_id", command, caller=daemon, blocking=False, killTimeout=4, logger=logger) try: output = e.execute() daemon.killProcess("some_id", logger) finally: daemon.shutdown() daemon.pyroDaemon.closedown() # the process should have normally finished, waiting killTimeout assert e.proc.poll() == 0