def __check_if_stopped(self, log_reader: LogReader, metadata_updater: MetadataUpdater) -> str: """ Check if a run has stopped. Parameters ---------- log_reader : LogReader The object which reads log files metadata_updater : MetadataUpdater Object which updates the database Returns ------- latest_status : str The latest status Raises ------ RuntimeError In case log_reader.ended() is True and log_reader.end_time is None """ if log_reader.ended(): end_time = log_reader.end_time # Assert to prevent "Incompatible types in assignment" with Optional if end_time is None: raise RuntimeError("log_reader.end_time is None although " "log_reader.ended() is True") metadata_updater.update_stop_time(end_time) latest_status = "complete" else: latest_status = self.check_if_running_or_errored(log_reader) return latest_status
def __check_submitted(self, metadata_updater: MetadataUpdater, submitted_to_check: DataFrame) -> None: """ Check the status of all runs which has status `submitted`. Parameters ---------- metadata_updater : MetadataUpdater Object which updates the database submitted_to_check : DataFrame DataFrame containing the `id` and `name` of the runs with status `submitted` Raises ------ RuntimeError In case log_reader.started() is True and log_reader.start_time is None """ for name, run_id in submitted_to_check.itertuples(index=False): metadata_updater.run_id = run_id log_path = self.__project_path.joinpath(name, "BOUT.log.0") if log_path.is_file(): log_reader = LogReader(log_path) if log_reader.started(): start_time = log_reader.start_time # Assert to prevent "Incompatible types in assignment" with Optional if start_time is None: msg = ("log_reader.start_time is None although " "log_reader.started is True") logging.critical(msg) raise RuntimeError(msg) metadata_updater.update_start_time(start_time) latest_status = self.__check_if_stopped( log_reader, metadata_updater) else: # No started time is found in the log latest_status = self.check_if_running_or_errored( log_reader) else: # No log file exists # NOTE: This means that the execution is either in a # queue or has failed the submission. # For now, we still consider this as submitted # This can maybe be decided by checking either the # pid or the status from the submitter latest_status = "submitted" metadata_updater.update_latest_status(latest_status)
def check_and_update_status(self) -> None: """ Check and update the status for the schema. Raises ------ RuntimeError If the schema does not exist """ # Check that run table exist if not self.__db_reader.check_tables_created(): logging.error( "No tables found in %s", self.__db_reader.db_connector.db_path, ) message = "Can not check the status of schemas that does not exist" raise RuntimeError(message) # Create place holder metadata_updater metadata_updater = MetadataUpdater(self.__db_connector, run_id=-1) # Check runs with status 'submitted' query = ("SELECT name, id AS run_id FROM run WHERE\n" "latest_status = 'submitted' OR\n" "latest_status = 'created'") submitted_to_check = self.__db_reader.query(query) self.__check_submitted(metadata_updater, submitted_to_check) # Check runs with status 'running' query = 'SELECT name, id FROM run WHERE latest_status = "running"' running_to_check = self.__db_reader.query(query) self.__check_running(metadata_updater, running_to_check)
def __check_running(self, metadata_updater: MetadataUpdater, running_to_check: DataFrame) -> None: """ Check the status of all runs which has status `running`. Parameters ---------- metadata_updater : MetadataUpdater Object which updates the database running_to_check : DataFrame DataFrame containing the `id` and `name` of the runs with status `running` """ for name, run_id in running_to_check.itertuples(index=False): metadata_updater.run_id = run_id log_path = self.__project_path.joinpath(name, "BOUT.log.0") log_reader = LogReader(log_path) latest_status = self.check_if_running_or_errored(log_reader) metadata_updater.update_latest_status(latest_status)
def _get_metadata_updater_and_db_reader( name: str, ) -> Tuple[MetadataUpdater, DatabaseReader]: """ Return a MetadataUpdater and its DatabaseConnector. Parameters ---------- name : str Name of the temporary database Returns ------- metadata_updater : MetadataUpdater Object to update the database with db_reader : DatabaseReader The corresponding database reader """ db_connector = get_test_db_copy(name) db_reader = DatabaseReader(db_connector) metadata_updater = MetadataUpdater(db_connector, 1) return metadata_updater, db_reader