Ejemplo n.º 1
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 as ex:
        logger.debug("OK: Process PID:%s doesn't exist now." % executor.proc.pid)
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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
Ejemplo n.º 8
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)
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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()
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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()