Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
yet in `TERMINATED` state, calling `progress` returns `None`.
:raises: exception :class:`UnexpectedStateError` if the
associated job goes into state `STOPPED` or `UNKNOWN`
:return: final returncode, or `None` if the execution
state is not `TERMINATED`.
"""
# first update state, we'll submit NEW jobs last, so that the
# state is not updated immediately after submission as ARC
# does not cope well with this...
if self.execution.state in [ Run.State.SUBMITTED,
Run.State.RUNNING,
Run.State.STOPPED,
Run.State.UNKNOWN ]:
self.update_state()
# now "do the right thing" based on actual state
if self.execution.state in [ Run.State.STOPPED,
Run.State.UNKNOWN ]:
raise gc3libs.exceptions.UnexpectedStateError(
"Task '%s' entered `%s` state." % (self, self.execution.state))
elif self.execution.state == Run.State.NEW:
self.submit()
elif self.execution.state == Run.State.TERMINATING:
self.fetch_output()
return self.execution.returncode
"""
# first update state, we'll submit NEW jobs last, so that the
# state is not updated immediately after submission as ARC
# does not cope well with this...
if self.execution.state in [Run.State.SUBMITTED,
Run.State.RUNNING,
Run.State.STOPPED,
Run.State.UNKNOWN]:
self.update_state()
# now "do the right thing" based on actual state
if self.execution.state in [Run.State.STOPPED,
Run.State.UNKNOWN]:
raise gc3libs.exceptions.UnexpectedStateError(
"Task '%s' entered `%s` state." % (self, self.execution.state))
elif self.execution.state == Run.State.NEW:
self.submit()
elif self.execution.state == Run.State.TERMINATING:
self.fetch_output()
return self.execution.returncode
oNCE the job reaches `TERMINATED` state, the return code
(stored also in `.returncode`) is returned; if the job is not
yet in `TERMINATED` state, calling `progress` returns `None`.
:raises: exception :class:`UnexpectedStateError` if the
associated job goes into state `STOPPED` or `UNKNOWN`
:return: final returncode, or `None` if the execution
state is not `TERMINATED`.
"""
# first update state, we'll submit NEW jobs last, so that the
# state is not updated immediately after submission as ARC
# does not cope well with this...
if self.execution.state in [ Run.State.SUBMITTED,
Run.State.RUNNING,
Run.State.STOPPED,
Run.State.UNKNOWN ]:
self.update_state()
# now "do the right thing" based on actual state
if self.execution.state in [ Run.State.STOPPED,
Run.State.UNKNOWN ]:
raise gc3libs.exceptions.UnexpectedStateError(
"Task '%s' entered `%s` state." % (self, self.execution.state))
elif self.execution.state == Run.State.NEW:
self.submit()
elif self.execution.state == Run.State.TERMINATING:
self.fetch_output()
return self.execution.returncode
# first update state, we'll submit NEW jobs last, so that the
# state is not updated immediately after submission as ARC
# does not cope well with this...
if self.execution.state in [ Run.State.SUBMITTED,
Run.State.RUNNING,
Run.State.STOPPED,
Run.State.UNKNOWN ]:
self.update_state()
# now "do the right thing" based on actual state
if self.execution.state in [ Run.State.STOPPED,
Run.State.UNKNOWN ]:
raise gc3libs.exceptions.UnexpectedStateError(
"Task '%s' entered `%s` state." % (self, self.execution.state))
elif self.execution.state == Run.State.NEW:
self.submit()
elif self.execution.state == Run.State.TERMINATING:
self.fetch_output()
return self.execution.returncode
associated job goes into state `STOPPED` or `UNKNOWN`
:return: final returncode, or `None` if the execution
state is not `TERMINATED`.
"""
# first update state, we'll submit NEW jobs last, so that the
# state is not updated immediately after submission as ARC
# does not cope well with this...
if self.execution.state in [ Run.State.SUBMITTED,
Run.State.RUNNING,
Run.State.STOPPED,
Run.State.UNKNOWN ]:
self.update_state()
# now "do the right thing" based on actual state
if self.execution.state in [ Run.State.STOPPED,
Run.State.UNKNOWN ]:
raise gc3libs.exceptions.UnexpectedStateError(
"Task '%s' entered `%s` state." % (self, self.execution.state))
elif self.execution.state == Run.State.NEW:
self.submit()
elif self.execution.state == Run.State.TERMINATING:
self.fetch_output()
return self.execution.returncode
Once the job reaches `TERMINATED` state, the return code
(stored also in `.returncode`) is returned; if the job is not
yet in `TERMINATED` state, calling `progress` returns `None`.
:raises: exception :class:`UnexpectedStateError` if the
associated job goes into state `STOPPED` or `UNKNOWN`
:return: final returncode, or `None` if the execution
state is not `TERMINATED`.
"""
# first update state, we'll submit NEW jobs last, so that the
# state is not updated immediately after submission as ARC
# does not cope well with this...
if self.execution.state in [Run.State.SUBMITTED,
Run.State.RUNNING,
Run.State.STOPPED,
Run.State.UNKNOWN]:
self.update_state()
# now "do the right thing" based on actual state
if self.execution.state in [Run.State.STOPPED,
Run.State.UNKNOWN]:
raise gc3libs.exceptions.UnexpectedStateError(
"Task '%s' entered `%s` state." % (self, self.execution.state))
elif self.execution.state == Run.State.NEW:
self.submit()
elif self.execution.state == Run.State.TERMINATING:
self.fetch_output()
return self.execution.returncode
Retrieve the outputs of the computational job associated with
this task into directory `output_dir`, or, if that is `None`,
into the directory whose path is stored in instance attribute
`.output_dir`.
If the execution state is `TERMINATING`, transition the state to
`TERMINATED` (which runs the appropriate hook).
See :meth:`gc3libs.Core.fetch_output` for a full explanation.
:return: Path to the directory where the job output has been
collected.
"""
if self.execution.state == Run.State.TERMINATED:
return self.output_dir
if self.execution.state == Run.State.TERMINATING:
# advance state to TERMINATED
self.output_dir = self._get_download_dir(output_dir)
if self.output_dir:
self.execution.info = (
"Final output downloaded to '%s'" % self.output_dir)
self.execution.state = Run.State.TERMINATED
self.changed = True
return self.output_dir
else:
download_dir = self._get_download_dir(output_dir)
self.execution.info = (
"Output snapshot downloaded to '%s'" % download_dir)
return download_dir
then return the job's return code. Note that this does not
automatically fetch the output.
:param integer interval: Poll job state every this number of seconds
"""
# FIXME: I'm not sure how to deal with this... Ideally, this
# call should suspend the current thread and wait for
# notifications from the Engine, but:
# - there's no way to tell if we are running threaded,
# - `self._controller` could be a `Core` instance, thus not capable
# of running independently.
# For now this is a poll+sleep loop, but we certainly need to revise
# it.
while True:
self.update_state()
if self.execution.state == Run.State.TERMINATED:
return self.returncode
time.sleep(interval)
def fset(self, value):
assert value in Run.State, \
("Value '%s' is not a legal `gc3libs.Run.State` value." %
value)
if self._state != value:
self.state_last_changed = time.time()
self.timestamp[value] = time.time()
self.history.append(value)
if self._ref is not None:
# mark as changed
self._ref.changed = True
# invoke state-transition method
handler = value.lower()
gc3libs.log.debug(
"Calling state-transition handler '%s' on %s ..."
% (handler, self._ref))
getattr(self._ref, handler)()
self._state = value