def test_get_workflow_platforms_conf(broadcast, workflow, platforms, expected): """Test TaskEventsManager._get_polling_interval_conf().""" task_events_mgr = TaskEventsManager( None, None, None, None, None, None, None, None, None) KEY = "execution polling intervals" task_events_mgr.broadcast_mgr = Mock( get_broadcast=lambda x: { KEY: broadcast } ) itask = Mock( identity='foo.1', tdef=Mock( rtconfig={ KEY: workflow } ), platform={ KEY: platforms } ) assert ( task_events_mgr._get_workflow_platforms_conf(itask, KEY, DEFAULT) == expected )
def test_get_remote_conf(broadcast, remote, platforms, expected): """Test TaskEventsManager._get_remote_conf().""" task_events_mgr = TaskEventsManager( None, None, None, None, None, None, None, None, None) task_events_mgr.broadcast_mgr = Mock( get_broadcast=lambda x: { "remote": { "host": broadcast } } ) itask = Mock( identity='foo.1', tdef=Mock( rtconfig={ 'remote': { 'host': remote } } ), platform={ 'host': platforms } ) assert task_events_mgr._get_remote_conf(itask, 'host') == expected
def test_log_debug_on_noerror_exit_code(self, cylc_log): """Test that a debug log is emitted when the log retrieval command exited with an non-error code (i.e. 0). :param cylc_log: mocked cylc logger :type cylc_log: mock.MagicMock """ task_events_manager = TaskEventsManager(None, None, None, None, None) proc_ctx = SubProcContext(cmd_key=None, cmd="ls /tmp/123", ret_code=0, err="", id_keys=[]) task_events_manager._job_logs_retrieval_callback(proc_ctx, None) self.assertEqual(1, cylc_log.debug.call_count) self.assertTrue(cylc_log.debug.call_args.contains("ls /tmp/123"))
def test_log_error_on_error_exit_code(self, cylc_log): """Test that an error log is emitted when the log retrieval command exited with a code different than zero. :param cylc_log: mocked cylc logger :type cylc_log: mock.MagicMock """ task_events_manager = TaskEventsManager(None, None, None, None, None) proc_ctx = SubProcContext(cmd_key=None, cmd="error", ret_code=1, err="Error!", id_keys=[]) task_events_manager._job_logs_retrieval_callback(proc_ctx, None) self.assertEqual(1, cylc_log.error.call_count) self.assertTrue(cylc_log.error.call_args.contains("Error!"))
def main(parser, options, suite, *task_ids): """cylc submit CLI. No TASK EVENT HOOKS are set for the submit command because there is no scheduler instance watching for task failure etc. Note: a suite contact env file is not written by this command (it would overwrite the real one if the suite is running). """ if not options.verbose and not options.debug: LOG.setLevel(WARNING) for task_id in task_ids: if not TaskID.is_valid_id(task_id): raise UserInputError("Invalid task ID %s" % task_id) suiterc = get_suite_rc(suite) suite_dir = os.path.dirname(suiterc) # For user-defined batch system handlers sys.path.append(os.path.join(suite_dir, 'python')) # Load suite config and tasks config = SuiteConfig( suite, suiterc, options, load_template_vars(options.templatevars, options.templatevars_file)) itasks = [] for task_id in task_ids: name_str, point_str = TaskID.split(task_id) taskdefs = config.find_taskdefs(name_str) if not taskdefs: raise UserInputError("No task found for %s" % task_id) for taskdef in taskdefs: itasks.append( TaskProxy(taskdef, get_point(point_str).standardise(), is_startup=True)) # Initialise job submit environment make_suite_run_tree(suite) # Extract job.sh from library, for use in job scripts. extract_resources(get_suite_srv_dir(suite), ['etc/job.sh']) pool = SubProcPool() owner = get_user() job_pool = JobPool(suite, owner) db_mgr = SuiteDatabaseManager() task_job_mgr = TaskJobManager( suite, pool, db_mgr, TaskEventsManager(suite, pool, db_mgr, BroadcastMgr(db_mgr), job_pool), job_pool) task_job_mgr.task_remote_mgr.single_task_mode = True task_job_mgr.job_file_writer.set_suite_env({ 'CYLC_UTC': str(config.cfg['cylc']['UTC mode']), 'CYLC_DEBUG': str(cylc.flow.flags.debug).lower(), 'CYLC_VERBOSE': str(cylc.flow.flags.verbose).lower(), 'CYLC_SUITE_NAME': suite, 'CYLC_CYCLING_MODE': str(config.cfg['scheduling']['cycling mode']), 'CYLC_SUITE_INITIAL_CYCLE_POINT': str(config.cfg['scheduling']['initial cycle point']), 'CYLC_SUITE_FINAL_CYCLE_POINT': str(config.cfg['scheduling']['final cycle point']), }) ret_code = 0 waiting_tasks = list(itasks) if options.dry_run: while waiting_tasks: prep_tasks, bad_tasks = task_job_mgr.prep_submit_task_jobs( suite, waiting_tasks, dry_run=True) for itask in prep_tasks + bad_tasks: waiting_tasks.remove(itask) if waiting_tasks: task_job_mgr.proc_pool.process() sleep(1.0) for itask in itasks: if itask.local_job_file_path: print(('JOB SCRIPT=%s' % itask.local_job_file_path)) else: print(('Unable to prepare job file for %s' % itask.identity), file=sys.stderr) ret_code = 1 else: while waiting_tasks: for itask in task_job_mgr.submit_task_jobs(suite, waiting_tasks): waiting_tasks.remove(itask) if waiting_tasks: task_job_mgr.proc_pool.process() sleep(1.0) while task_job_mgr.proc_pool.is_not_done(): task_job_mgr.proc_pool.process() for itask in itasks: if itask.summary.get('submit_method_id') is not None: print(('[%s] Job ID: %s' % (itask.identity, itask.summary['submit_method_id']))) if itask.state(TASK_STATUS_SUBMIT_FAILED): ret_code = 1 sys.exit(ret_code)