Exemplo n.º 1
0
def stop_dev_env_monitors(dev_env_key: str, redis_conn: redis.Redis,
                          labbook_name: str) -> None:
    """Method to stop a dev env monitor and all related activity monitors

    Args:
        dev_env_key(str): Key in redis containing the dev env monitor info
        redis_conn(redis.Redis): The redis instance to the state db
        labbook_name(str): The name of the related lab book - used only for logging / user messaging purposes

    Returns:

    """
    # Unschedule dev env monitor
    logger.info(f"Stopping dev env monitor {dev_env_key}")
    d = Dispatcher()
    process_id = redis_conn.hget(dev_env_key, "process_id")
    if process_id:
        logger.info("Dev Tool process id to stop: `{}` ".format(process_id))
        d.unschedule_task(JobKey(process_id.decode()))

        _, dev_env_name = dev_env_key.rsplit(":", 1)
        logger.info(
            "Stopped dev tool monitor `{}` for lab book `{}`. PID {}".format(
                dev_env_name, labbook_name, process_id))
        # Remove dev env monitor key
        redis_conn.delete(dev_env_key)

        # Make sure the monitor is unscheduled so it doesn't start activity monitors again
        time.sleep(2)
    else:
        logger.info(
            "Shutting down container with no Dev Tool monitoring processes to stop."
        )

    # Get all related activity monitor keys
    activity_monitor_keys = redis_conn.keys(
        "{}:activity_monitor*".format(dev_env_key))

    logger.info(f"Signaling {activity_monitor_keys} for shutdown.")
    # Signal all activity monitors to exit
    for am in activity_monitor_keys:
        # Set run flag in redis
        redis_conn.hset(am.decode(), "run", False)
        logger.info(
            "Signaled activity monitor for lab book `{}` to stop".format(
                labbook_name))
Exemplo n.º 2
0
    def test_unschedule_task(self):
        d = Dispatcher()
        path = "/tmp/labmanager-unit-test-{}".format(os.getpid())
        if os.path.exists(path):
            os.remove(path)

        future_t = datetime.datetime.utcnow() + datetime.timedelta(seconds=5)
        jr = d.schedule_task(bg_jobs.test_incr,
                             scheduled_time=future_t,
                             args=(path, ),
                             repeat=4,
                             interval=1)
        time.sleep(2)
        n = d.unschedule_task(jr)
        assert n, "Task should have been cancelled, instead it was not found."
        time.sleep(5)
        assert not os.path.exists(path=path)
Exemplo n.º 3
0
    def test_unschedule_midway_through(self):
        d = Dispatcher()

        path = "/tmp/labmanager-unit-test-{}".format(os.getpid())
        if os.path.exists(path):
            os.remove(path)

        future_t = None  # i.e., start right now.
        jr = d.schedule_task(bg_jobs.test_incr,
                             scheduled_time=future_t,
                             args=(path, ),
                             repeat=6,
                             interval=5)
        time.sleep(8)
        n = d.unschedule_task(jr)
        assert n, "Task should have been cancelled, instead it was not found."
        time.sleep(5)
        with open(path) as fp:
            assert json.load(fp)['amt'] in [2]
Exemplo n.º 4
0
    def test_schedule_with_repeat_is_zero(self):
        # When repeat is zero, it should run only once.
        d = Dispatcher()

        path = "/tmp/labmanager-unit-test-{}".format(os.getpid())
        if os.path.exists(path):
            os.remove(path)

        jr = d.schedule_task(bg_jobs.test_incr,
                             args=(path, ),
                             repeat=0,
                             interval=4)
        time.sleep(6)
        n = d.unschedule_task(jr)
        time.sleep(5)
        with open(path) as fp:
            assert json.load(fp)['amt'] in [
                1
            ], "When repeat=0, the task should run only once."