Skip to content

Commit

Permalink
improve state logic
Browse files Browse the repository at this point in the history
  • Loading branch information
leoschwarz committed Feb 28, 2025
1 parent 8974a9b commit 154175a
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ def run(self) -> None:
workunit_config=workunit_config,
)
submitter = SlurmSubmitter(slurm_config_template)
submitter.submit(workunit_wrapper_data=workunit_wrapper_data)
submitter.create_log_resource(workunit_wrapper_data=workunit_wrapper_data, client=self._client)
submitter.submit(workunit_wrapper_data=workunit_wrapper_data, client=self._client)


@use_client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
id
mkdir -p "{working_directory}"
cd "{working_directory}"
{activate_log_resource}
set +x
tee app_version.yml <<YAML
Expand Down Expand Up @@ -55,7 +56,11 @@ def _compose_script(self, main_command: str, slurm_config: SlurmConfig) -> str:
return f"{script_header}\n\n{main_command}"

def _get_main_command(
self, workunit_wrapper_data: WorkunitWrapperData, working_directory: str, submitter_config: SubmitterSlurmSpec
self,
workunit_wrapper_data: WorkunitWrapperData,
working_directory: str,
submitter_config: SubmitterSlurmSpec,
log_resource_id: int | None,
) -> str:
app_version_yml = yaml.safe_dump(workunit_wrapper_data.app_version.model_dump(mode="json"))
workunit_definition_yml = yaml.safe_dump(workunit_wrapper_data.workunit_definition.model_dump(mode="json"))
Expand All @@ -65,13 +70,18 @@ def _get_main_command(
if not submitter_config.config.force_storage
else f"--force-storage {str(submitter_config.config.force_storage)}"
)
if log_resource_id is not None:
activate_log_resource = f"bfabric-cli api save resource {log_resource_id} status available"
else:
activate_log_resource = ""
render_args = dict(
app_version_yml=app_version_yml,
workunit_definition_yml=workunit_definition_yml,
app_runner_command=self._get_app_runner_command(version=app_runner_version),
working_directory=working_directory,
force_storage_flags=force_storage_flags,
workunit_id=workunit_wrapper_data.workunit_definition.registration.workunit_id,
activate_log_resource=activate_log_resource,
)
logger.info("Render args: {}", render_args)
return _MAIN_BASH_TEMPLATE.format(**render_args)
Expand All @@ -90,7 +100,7 @@ def evaluate_config(self, workunit_wrapper_data: WorkunitWrapperData) -> SlurmCo
workunit = VariablesWorkunit(id=workunit_wrapper_data.workunit_definition.registration.workunit_id)
return self._config_template.evaluate(app=app, workunit=workunit)

def submit(self, workunit_wrapper_data: WorkunitWrapperData) -> None:
def submit(self, workunit_wrapper_data: WorkunitWrapperData, client: Bfabric) -> None:
# Evaluate the config
slurm_config = self.evaluate_config(workunit_wrapper_data=workunit_wrapper_data)
logger.info("Slurm Config: {}", slurm_config)
Expand All @@ -99,6 +109,9 @@ def submit(self, workunit_wrapper_data: WorkunitWrapperData) -> None:
workunit_id = workunit_wrapper_data.workunit_definition.registration.workunit_id
script_path = slurm_config.submitter_config.config.local_script_dir / f"workunitid-{workunit_id}_run.bash"

# Create the log resource
log_resource_id = self._create_log_resource(config=slurm_config, workunit_id=workunit_id, client=client)

# Determine the working directory.
working_directory = slurm_config.get_scratch_dir()

Expand All @@ -107,6 +120,7 @@ def submit(self, workunit_wrapper_data: WorkunitWrapperData) -> None:
workunit_wrapper_data=workunit_wrapper_data,
working_directory=working_directory,
submitter_config=slurm_config.submitter_config,
log_resource_id=log_resource_id,
)
script = self._compose_script(main_command=main_command, slurm_config=slurm_config)
script_path.write_text(script)
Expand All @@ -120,20 +134,19 @@ def submit(self, workunit_wrapper_data: WorkunitWrapperData) -> None:
logger.info("Running {}", shlex.join(cmd))
subprocess.run(cmd, env=env, check=True)

def create_log_resource(self, workunit_wrapper_data: WorkunitWrapperData, client: Bfabric) -> None:
config = self.evaluate_config(workunit_wrapper_data=workunit_wrapper_data)
def _create_log_resource(self, config: SlurmConfig, workunit_id: int, client: Bfabric) -> int | None:
"""Creates the log resource and returns its id, or if no log storage ID is provided, returns None."""
if config.submitter_config.config.log_storage_id is None:
logger.info("No log storage ID provided, skipping log resource creation")
return
return None

workunit_id = workunit_wrapper_data.workunit_definition.registration.workunit_id
client.save(
return client.save(
"resource",
{
"name": f"Developer Log WU{workunit_id}",
"relativepath": config.submitter_config.config.log_storage_filename,
"storageid": config.submitter_config.config.log_storage_id,
"workunitid": workunit_id,
"status": "available",
"status": "pending",
},
)
)[0]["id"]
3 changes: 1 addition & 2 deletions tests/bfabric_app_runner/bfabric_app/test_submitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ def test_run(
mock_submitter.run()

# Verify
mock_slurm_submitter.submit.assert_called_once_with(workunit_wrapper_data=mock_workunit_wrapper_data)
mock_slurm_submitter.create_log_resource.assert_called_once_with(
mock_slurm_submitter.submit.assert_called_once_with(
workunit_wrapper_data=mock_workunit_wrapper_data, client=mock_client
)

0 comments on commit 154175a

Please sign in to comment.