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))
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)
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]
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."