hpcflow.sdk.submission.shells.powershell.WindowsPowerShell#

class hpcflow.sdk.submission.shells.powershell.WindowsPowerShell(*args, **kwargs)#

Bases: Shell

Class to represent using PowerShell on Windows to generate and submit a jobscript.

Methods

format_loop_check

Produce code to check the looping status of part of a workflow.

format_save_parameter

Produce code to save a parameter's value into the workflow persistent store.

format_stream_assignment

Produce code to assign the output of the command to a shell variable.

get_direct_submit_command

Get the command for submitting a non-scheduled jobscript.

get_version_info

Get powershell version information.

get_wait_command

Get the command to wait for a workflow.

prepare_JS_path

Prepare the jobscript path for use.

prepare_element_run_dirs

Prepare the element run directory names for use.

process_JS_header_args

Process the application invocation key in the jobscript header arguments.

process_app_invoc_executable

Perform any post-processing of an application invocation command name.

wrap_in_subshell

Format commands to run within a child scope.

Attributes

DEFAULT_EXE

Default for executable name.

JS_DIRECT_HEADER

Template for the jobscript header when directly executed.

JS_ELEMENT_LOOP

Template for the element processing loop in a jobscript.

JS_ENV_SETUP_INDENT

Indent for environment setup.

JS_EXT

File extension for jobscripts.

JS_HEADER

Template for the common part of the jobscript header.

JS_INDENT

Basic indent.

JS_MAIN

Template for the jobscript body.

JS_SHEBANG

Template for the jobscript shebang line.

executable

The executable to use plus any mandatory arguments.

shebang_executable

The executable to use in a shebang line.

DEFAULT_EXE = 'powershell.exe'#

Default for executable name.

JS_DIRECT_HEADER = '{shebang}\n\n{header}\n{wait_command}\n'#

Template for the jobscript header when directly executed.

JS_ELEMENT_LOOP = 'for ($JS_elem_idx = 0; $JS_elem_idx -lt {num_elements}; $JS_elem_idx += 1) {{\n{main}\n}}\nSet-Location $WK_PATH\n'#

Template for the element processing loop in a jobscript.

JS_ENV_SETUP_INDENT = '        '#

Indent for environment setup.

JS_EXT = '.ps1'#

File extension for jobscripts.

JS_HEADER = 'function {workflow_app_alias} {{\n    & {{\n{env_setup}{app_invoc} `\n            --with-config log_file_path "$pwd/{run_log_file}" `\n            --config-dir "{config_dir}" `\n            --config-key "{config_invoc_key}" `\n            $args\n    }} @args\n}}\n\nfunction get_nth_line($file, $line) {{\n    Get-Content $file | Select-Object -Skip $line -First 1\n}}\n\nfunction JoinMultiPath {{\n    $numArgs = $args.Length\n    $path = $args[0]\n    for ($i = 1; $i -lt $numArgs; $i++) {{\n        $path = Join-Path $path $args[$i]\n    }}\n    return $path\n}}\n\nfunction StartJobHere($block) {{\n    $jobInitBlock = [scriptblock]::Create(@"\n        Function wkflow_app {{ $function:wkflow_app }}\n        Function get_nth_line {{ $function:get_nth_line }}\n        Function JoinMultiPath {{ $function:JoinMultiPath }}\n        Set-Location \'$pwd\'\n"@)\n    Start-Job -InitializationScript $jobInitBlock -Script $block\n}}\n\n$WK_PATH = $(Get-Location)\n$WK_PATH_ARG = $WK_PATH\n$SUB_IDX = {sub_idx}\n$JS_IDX = {js_idx}\n$EAR_ID_FILE = JoinMultiPath $WK_PATH artifacts submissions $SUB_IDX {EAR_file_name}\n$ELEM_RUN_DIR_FILE = JoinMultiPath $WK_PATH artifacts submissions $SUB_IDX {element_run_dirs_file_path}\n'#

Template for the common part of the jobscript header.

JS_INDENT = '    '#

Basic indent.

JS_MAIN = '$elem_EAR_IDs = get_nth_line $EAR_ID_FILE $JS_elem_idx\n$elem_run_dirs = get_nth_line $ELEM_RUN_DIR_FILE $JS_elem_idx\n\nfor ($JS_act_idx = 0; $JS_act_idx -lt {num_actions}; $JS_act_idx += 1) {{\n\n    $EAR_ID = ($elem_EAR_IDs -split "{EAR_files_delimiter}")[$JS_act_idx]\n    if ($EAR_ID -eq -1) {{\n        continue\n    }}\n\n    $run_dir = ($elem_run_dirs -split "{EAR_files_delimiter}")[$JS_act_idx]\n    $run_dir_abs = "$WK_PATH\\$run_dir"\n    Set-Location $run_dir_abs\n    $app_stream_file = "$pwd/{run_stream_file}"\n\n    $skip = {workflow_app_alias} internal workflow $WK_PATH get-ear-skipped $EAR_ID 2>> $app_stream_file\n    $exc_sk = $LASTEXITCODE\n\n    if ($exc_sk -eq 0) {{\n\n        if ($skip -eq "1") {{\n            continue\n        }}\n\n        {workflow_app_alias} internal workflow $WK_PATH write-commands $SUB_IDX $JS_IDX $JS_act_idx $EAR_ID 2>&1 >> $app_stream_file\n        $exc_wc = $LASTEXITCODE\n\n        {workflow_app_alias} internal workflow $WK_PATH set-ear-start $EAR_ID 2>&1 >> $app_stream_file\n        $exc_se = $LASTEXITCODE\n\n        if (($exc_wc -eq 0) -and ($exc_se -eq 0)) {{\n            . (Join-Path $run_dir_abs "{commands_file_name}")\n            $exit_code = $LASTEXITCODE\n        }}\n        else {{\n            $exit_code = If ($exc_wc -ne 0) {{$exc_wc}} Else {{$exc_se}}\n        }}\n    }}\n    else {{ \n        $exit_code = $exc_sk\n    }}\n    $global:LASTEXITCODE = $null\n    {workflow_app_alias} internal workflow $WK_PATH set-ear-end $JS_IDX $JS_act_idx $EAR_ID "--" "$exit_code" 2>&1 >> $app_stream_file\n\n}}\n'#

Template for the jobscript body.

JS_SHEBANG = ''#

Template for the jobscript shebang line.

property executable: List[str]#

The executable to use plus any mandatory arguments.

format_loop_check(workflow_app_alias, loop_name, run_ID)#

Produce code to check the looping status of part of a workflow.

Parameters:
  • workflow_app_alias (str) –

  • loop_name (str) –

  • run_ID (int) –

format_save_parameter(workflow_app_alias, param_name, shell_var_name, EAR_ID, cmd_idx, stderr)#

Produce code to save a parameter’s value into the workflow persistent store.

Parameters:
  • workflow_app_alias (str) –

  • param_name (str) –

  • shell_var_name (str) –

  • EAR_ID (int) –

  • cmd_idx (int) –

  • stderr (bool) –

format_stream_assignment(shell_var_name, command)#

Produce code to assign the output of the command to a shell variable.

get_direct_submit_command(js_path)#

Get the command for submitting a non-scheduled jobscript.

Return type:

List[str]

get_version_info(exclude_os=False)#

Get powershell version information.

Parameters:

exclude_os (bool | None) – If True, exclude operating system information.

Return type:

Dict

get_wait_command(workflow_app_alias, sub_idx, deps)#

Get the command to wait for a workflow.

Parameters:
  • workflow_app_alias (str) –

  • sub_idx (int) –

  • deps (Dict) –

prepare_JS_path(js_path)#

Prepare the jobscript path for use.

Parameters:

js_path (Path) –

Return type:

str

prepare_element_run_dirs(run_dirs)#

Prepare the element run directory names for use.

Parameters:

run_dirs (List[List[Path]]) –

Return type:

List[List[str]]

process_JS_header_args(header_args)#

Process the application invocation key in the jobscript header arguments.

Parameters:

header_args (Dict) –

Return type:

Dict

static process_app_invoc_executable(app_invoc_exe)#

Perform any post-processing of an application invocation command name.

property shebang_executable: str#

The executable to use in a shebang line.

wrap_in_subshell(commands, abortable)#

Format commands to run within a child scope.

This assumes commands ends in a newline.

Parameters:
  • commands (str) –

  • abortable (bool) –

Return type:

str