Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
fslpy
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Analyze
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
FSL
fslpy
Commits
0ba5b9ea
Commit
0ba5b9ea
authored
4 years ago
by
Michiel Cottaar
Browse files
Options
Downloads
Patches
Plain Diff
ENH: update info to check multiple job IDs at once
parent
8d1ebf0a
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
fsl/utils/fslsub.py
+41
-14
41 additions, 14 deletions
fsl/utils/fslsub.py
tests/test_fslsub.py
+70
-0
70 additions, 0 deletions
tests/test_fslsub.py
with
111 additions
and
14 deletions
fsl/utils/fslsub.py
+
41
−
14
View file @
0ba5b9ea
...
...
@@ -50,7 +50,7 @@ import tempfile
import
logging
import
importlib
from
dataclasses
import
dataclass
,
asdict
from
typing
import
Optional
,
Collection
,
Union
,
Tuple
from
typing
import
Optional
,
Collection
,
Union
,
Tuple
,
Dict
import
argparse
import
warnings
...
...
@@ -252,28 +252,55 @@ def submit(*command, **kwargs):
return
SubmitParams
(
**
kwargs
)(
*
command
)
def
info
(
job_id
)
:
def
info
(
job_id
s
)
->
Dict
[
str
,
Optional
[
Dict
[
str
,
str
]]]
:
"""
Gets information on a given job id
Uses `qstat -j <job_id>`
Uses `qstat -j <job_id
s
>`
:arg job_id: string with job id
:return:
dictionary with information
on the submitted job (empty
if job does not exist)
:arg job_id
s
: string with job id
or (nested) sequence with jobs
:return:
dictionary of jobid -> another
dictionary with
job
information
(or None
if job does not exist)
"""
from
fsl.utils.run
import
run
job_ids_string
=
_flatten_job_ids
(
job_ids
)
try
:
result
=
run
([
'
qstat
'
,
'
-j
'
,
job_id
],
exitcode
=
True
)[
0
]
result
=
run
([
'
qstat
'
,
'
-j
'
,
job_id
s_string
],
exitcode
=
True
)[
0
]
except
FileNotFoundError
:
log
.
debug
(
"
qstat not found; assuming not on cluster
"
)
return
{}
if
'
Following jobs do not exist:
'
in
result
:
return
{}
res
=
{}
for
line
in
result
.
splitlines
()[
1
:]:
kv
=
line
.
split
(
'
:
'
,
1
)
if
len
(
kv
)
==
2
:
res
[
kv
[
0
].
strip
()]
=
kv
[
1
].
strip
()
return
_parse_qstat
(
job_ids_string
,
result
)
def
_parse_qstat
(
job_ids_string
,
qstat_stdout
):
"""
Parses the qstat output into a dictionary of dictionaries
:param job_ids_string: input job ids
:param qstat_stdout: qstat output
:return: dictionary of jobid -> another dictionary with job information
(or None if job does not exist)
"""
res
=
{
job_id
:
None
for
job_id
in
job_ids_string
.
split
(
'
,
'
)}
current_job_id
=
None
for
line
in
qstat_stdout
.
splitlines
()[
1
:]:
line
=
line
.
strip
()
if
len
(
line
)
==
0
:
continue
if
line
==
'
=
'
*
len
(
line
):
current_job_id
=
None
elif
'
:
'
in
line
:
current_key
,
value
=
[
part
.
strip
()
for
part
in
line
.
split
(
'
:
'
,
1
)]
if
current_key
==
'
job_number
'
:
current_job_id
=
value
if
current_job_id
not
in
job_ids_string
:
raise
ValueError
(
f
"
Unexpected job ID in qstat output:
\n
{
line
}
"
)
res
[
current_job_id
]
=
{}
else
:
if
current_job_id
is
None
:
raise
ValueError
(
f
"
Found job information before job ID in qstat output:
\n
{
line
}
"
)
res
[
current_job_id
][
current_key
]
=
value
else
:
res
[
current_job_id
][
current_key
]
+=
'
\n
'
+
line
return
res
...
...
This diff is collapsed.
Click to expand it.
tests/test_fslsub.py
+
70
−
0
View file @
0ba5b9ea
...
...
@@ -13,6 +13,7 @@ import sys
import
textwrap
as
tw
import
contextlib
import
argparse
import
pytest
import
fsl
from
fsl.utils
import
fslsub
...
...
@@ -189,3 +190,72 @@ def test_func_to_cmd():
assert
stdout
.
strip
()
==
'
standard output
'
assert
stderr
.
strip
()
==
'
standard error
'
example_qstat_reply
=
"""
==============================================================
job_number: 9985061
exec_file: job_scripts/9985061
owner: user
sge_o_home: /home/fs0/user
sge_o_log_name: user
sge_o_shell: /bin/bash
sge_o_workdir: /home/fs0/user
account: sge
cwd: /home/fs0/user
mail_options: a
notify: FALSE
job_name: echo
jobshare: 0
hard_queue_list: long.q
restart: y
job_args: test
script_file: echo
binding: set linear:slots
job_type: binary,noshell
scheduling info: queue instance
"
<some queue>
"
dropped because it is temporarily not available
queue instance
"
<some queue>
"
dropped because it is disabled
==============================================================
job_number: 9985062
exec_file: job_scripts/9985062
owner: user
sge_o_home: /home/fs0/user
sge_o_log_name: user
sge_o_shell: /bin/bash
sge_o_workdir: /home/fs0/user
account: sge
cwd: /home/fs0/user
mail_options: a
notify: FALSE
job_name: echo
jobshare: 0
hard_queue_list: long.q
restart: y
job_args: test
script_file: echo
binding: set linear:slots
job_type: binary,noshell
scheduling info: queue instance
"
<some queue>
"
dropped because it is temporarily not available
queue instance
"
<some queue>
"
dropped because it is disabled
"""
def
test_info
():
valid_job_ids
=
[
'
9985061
'
,
'
9985062
'
]
res
=
fslsub
.
_parse_qstat
(
'
,
'
.
join
(
valid_job_ids
),
example_qstat_reply
)
assert
len
(
res
)
==
2
for
job_id
in
valid_job_ids
:
assert
res
[
job_id
]
is
not
None
assert
res
[
job_id
][
'
account
'
]
==
'
sge
'
assert
res
[
job_id
][
'
job_type
'
]
==
'
binary,noshell
'
assert
len
(
res
[
job_id
][
'
scheduling info
'
].
splitlines
())
==
2
for
line
in
res
[
job_id
][
'
scheduling info
'
].
splitlines
():
assert
line
.
startswith
(
'
queue instance
'
)
res2
=
fslsub
.
_parse_qstat
(
'
,
'
.
join
(
valid_job_ids
+
[
'
1
'
]),
example_qstat_reply
)
assert
len
(
res2
)
==
3
for
job_id
in
valid_job_ids
:
assert
res
[
job_id
]
==
res2
[
job_id
]
assert
res2
[
'
1
'
]
is
None
with
pytest
.
raises
(
ValueError
):
fslsub
.
_parse_qstat
(
valid_job_ids
[
0
],
example_qstat_reply
)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment