def test_cache_evict(self): scheduler = LocalScheduler(session_name="test_session", cache_size=1) test_file1 = join(self.test_dir, "test_file_1") test_file2 = join(self.test_dir, "test_file_2") role1 = Role("role1").runs("touch.sh", test_file1).on(self.test_container) role2 = Role("role2").runs("touch.sh", test_file2).on(self.test_container) app1 = Application(name="touch_test_file1").of(role1) app2 = Application(name="touch_test_file2").of(role2) cfg = RunConfig({"log_dir": self.test_dir}) app_id1 = scheduler.submit(app1, cfg) self.assertEqual(AppState.SUCCEEDED, self.wait(app_id1, scheduler).state) app_id2 = scheduler.submit(app2, cfg) self.assertEqual(AppState.SUCCEEDED, self.wait(app_id2, scheduler).state) # app1 should've been evicted self.assertIsNone(scheduler.describe(app_id1)) self.assertIsNone(self.wait(app_id1, scheduler)) self.assertIsNotNone(scheduler.describe(app_id2)) self.assertIsNotNone(self.wait(app_id2, scheduler))
def test_evict_non_existent_app(self): # tests that apps previously run with this session that are finished and eventually # removed by the scheduler also get removed from the session after a status() API has been # called on the app scheduler = LocalScheduler(self.image_fetcher, cache_size=1) session = StandaloneSession(name="test_session", scheduler=scheduler, wait_interval=1) test_file = os.path.join(self.test_dir, "test_file") role = (session.role(name="touch").runs("touch.sh", test_file).on( self.test_container)) app = session.app("touch_test_file").of(role) # local scheduler was setup with a cache size of 1 # run the same app twice (the first will be removed from the scheduler's cache) # then validate that the first one will drop from the session's app cache as well app_id1 = session.run(app) session.wait(app_id1) app_id2 = session.run(app) session.wait(app_id2) apps = session.list() self.assertEqual(1, len(apps)) self.assertFalse(app_id1 in apps) self.assertTrue(app_id2 in apps)
def test_cache_full(self): scheduler = LocalScheduler(self.image_fetcher, cache_size=1) role = Role("role1").runs("sleep.sh", "10").on(self.test_container).replicas(1) app = Application(name="test_app").of(role) scheduler.submit(app, RunMode.MANAGED) with self.assertRaises(IndexError): scheduler.submit(app, RunMode.MANAGED)
def test_cache_full(self): scheduler = LocalScheduler(session_name="test_session", cache_size=1) role = Role("role1").runs("sleep.sh", "10").on(self.test_container).replicas(1) app = Application(name="test_app").of(role) cfg = RunConfig({"log_dir": self.test_dir}) scheduler.submit(app, cfg) with self.assertRaises(IndexError): scheduler.submit(app, cfg)
def setUp(self): self.test_dir = tempfile.mkdtemp("LocalSchedulerTest") write_shell_script(self.test_dir, "touch.sh", ["touch $1"]) write_shell_script(self.test_dir, "fail.sh", ["exit 1"]) write_shell_script(self.test_dir, "sleep.sh", ["sleep $1"]) self.image_fetcher = LocalDirectoryImageFetcher() self.scheduler = LocalScheduler(self.image_fetcher) self.test_container = Container(image=self.test_dir)
def setUp(self): self.test_dir = tempfile.mkdtemp("StandaloneSessionTest") write_shell_script(self.test_dir, "touch.sh", ["touch $1"]) write_shell_script(self.test_dir, "fail.sh", ["exit 1"]) write_shell_script(self.test_dir, "sleep.sh", ["sleep $1"]) self.scheduler = LocalScheduler(SESSION_NAME) self.cfg = RunConfig({"image_fetcher": "dir"}) # resource ignored for local scheduler; adding as an example self.test_container = Container(image=self.test_dir).require(resource.SMALL)
def setUp(self): self.test_dir = tempfile.mkdtemp("StandaloneSessionTest") write_shell_script(self.test_dir, "touch.sh", ["touch $1"]) write_shell_script(self.test_dir, "fail.sh", ["exit 1"]) write_shell_script(self.test_dir, "sleep.sh", ["sleep $1"]) self.image_fetcher = LocalDirectoryImageFetcher() self.scheduler = LocalScheduler(self.image_fetcher) # resource ignored for local scheduler; adding as an example self.test_container = Container(image=self.test_dir).require( Resource.SMALL)
def setUp(self): self.test_dir = tempfile.mkdtemp("LocalSchedulerTest") write_shell_script(self.test_dir, "touch.sh", ["touch $1"]) write_shell_script(self.test_dir, "fail.sh", ["exit 1"]) write_shell_script(self.test_dir, "sleep.sh", ["sleep $1"]) write_shell_script(self.test_dir, "echo.sh", ["echo $1"]) write_shell_script(self.test_dir, "echo_stderr.sh", ["echo $1 1>&2"]) write_shell_script( self.test_dir, "echo_range.sh", ["for i in $(seq 0 $1); do echo $i 1>&2; sleep $2; done"], ) self.scheduler = LocalScheduler(session_name="test_session") self.test_container = Container(image=self.test_dir)
def setUp(self): self.test_dir = tempfile.mkdtemp(prefix=f"{self.__class__.__name__}_") write_shell_script(self.test_dir, "touch.sh", ["touch $1"]) write_shell_script(self.test_dir, "fail.sh", ["exit 1"]) write_shell_script(self.test_dir, "sleep.sh", ["sleep $1"]) write_shell_script(self.test_dir, "echo_stdout.sh", ["echo $1"]) write_shell_script(self.test_dir, "echo_stderr.sh", ["echo $1 1>&2"]) write_shell_script( self.test_dir, "echo_range.sh", ["for i in $(seq 0 $1); do echo $i 1>&2; sleep $2; done"], ) write_shell_script(self.test_dir, "echo_env_foo.sh", ["echo $FOO 1>&2"]) self.scheduler = LocalScheduler(session_name="test_session") self.test_container = Container(image=self.test_dir)
def test_cache_evict(self): scheduler = LocalScheduler(self.image_fetcher, cache_size=1) test_file1 = os.path.join(self.test_dir, "test_file_1") test_file2 = os.path.join(self.test_dir, "test_file_2") role1 = Role("role1").runs("touch.sh", test_file1).on(self.test_container) role2 = Role("role2").runs("touch.sh", test_file2).on(self.test_container) app1 = Application(name="touch_test_file1").of(role1) app2 = Application(name="touch_test_file2").of(role2) app_id1 = scheduler.submit(app1, RunMode.HEADLESS) self.assertEqual(AppState.SUCCEEDED, scheduler.wait(app_id1).state) app_id2 = scheduler.submit(app2, RunMode.HEADLESS) self.assertEqual(AppState.SUCCEEDED, scheduler.wait(app_id2).state) # app1 should've been evicted self.assertIsNone(scheduler.describe(app_id1)) self.assertIsNone(scheduler.wait(app_id1)) self.assertIsNotNone(scheduler.describe(app_id2)) self.assertIsNotNone(scheduler.wait(app_id2))
def test_invalid_cache_size(self): with self.assertRaises(ValueError): LocalScheduler(session_name="test_session", cache_size=0) with self.assertRaises(ValueError): LocalScheduler(session_name="test_session", cache_size=-1)
def test_invalid_cache_size(self): with self.assertRaises(ValueError): LocalScheduler(self.image_fetcher, cache_size=0) with self.assertRaises(ValueError): LocalScheduler(self.image_fetcher, cache_size=-1)