# pylint: disable=C0301, C0103, W0212, E1101, R0903
"""
.. module:: radical.pilot.compute_unit_description
:platform: Unix
:synopsis: Implementation of the ComputeUnitDescription class.
.. moduleauthor:: Ole Weidner <ole.weidner@rutgers.edu>
"""
__copyright__ = "Copyright 2013-2014, http://radical.rutgers.edu"
__license__ = "MIT"
import saga.attributes as attributes
# ------------------------------------------------------------------------------
# Attribute description keys
NAME = 'name'
EXECUTABLE = 'executable'
ARGUMENTS = 'arguments'
ENVIRONMENT = 'environment'
CORES = 'cores'
INPUT_STAGING = 'input_staging'
OUTPUT_STAGING = 'output_staging'
MPI = 'mpi'
PRE_EXEC = 'pre_exec'
POST_EXEC = 'post_exec'
KERNEL = 'kernel'
CLEANUP = 'cleanup'
STDOUT = 'stdout'
STDERR = 'stderr'
RESTARTABLE = 'restartable'
# ------------------------------------------------------------------------------
#
[docs]class ComputeUnitDescription(attributes.Attributes) :
"""A ComputeUnitDescription object describes the requirements and
properties of a :class:`radical.pilot.ComputeUnit` and is passed as a parameter to
:meth:`radical.pilot.UnitManager.submit_units` to instantiate and run a new
ComputeUnit.
.. note:: A ComputeUnitDescription **MUST** define at least an :data:`executable`.
**Example**::
# TODO
.. data:: executable
(`Attribute`) The executable to launch (`string`) [`mandatory`].
.. data:: cores
(`Attribute`) The number of cores (int) required by the executable. (int) [`mandatory`].
.. data:: mpi
(`Attribute`) Set to true if the task is an MPI task. (bool) [`optional`].
.. data:: name
(`Attribute`) A descriptive name for the compute unit (`string`) [`optional`].
.. data:: arguments
(`Attribute`) The arguments for :data:`executable` (`list` of `strings`) [`optional`].
.. data:: environment
(`Attribute`) Environment variables to set in the execution environment (`dict`) [`optional`].
.. data:: stdout
(`Attribute`) the name of the file to store stdout in.
.. data:: stderr
(`Attribute`) the name of the file to store stderr in.
.. data:: input_staging
(`Attribute`) The files that need to be staged before execution (`list` of `staging directives`) [`optional`].
.. note:: TODO: Explain input staging.
.. data:: output_staging
(`Attribute`) The files that need to be staged after execution (`list` of `staging directives`) [`optional`].
.. note:: TODO: Explain output staging.
.. data:: pre_exec
(`Attribute`) Actions to perform before this task starts (`list` of `strings`) [`optional`].
.. data:: post_exec
(`Attribute`) Actions to perform after this task finishes (`list` of `strings`) [`optional`].
.. note:: Before the BigBang, there was nothing ...
.. data:: kernel
(`Attribute`) Name of a simulation kernel which expands to description
attributes once the unit is scheduled to a pilot (and resource).
.. note:: TODO: explain in detal, reference ENMDTK.
.. data:: restartable
(`Attribute`) If the unit starts to execute on a pilot, but cannot finish
because the pilot fails or is canceled, can the unit be restarted on
a different pilot / resource? (default: False)
.. note:: TODO: explain in detal, reference ENMDTK.
.. data:: cleanup
[Type: `bool`] [optional] If cleanup is set to True, the pilot will
delete the entire unit sandbox upon termination. This includes all
generated output data in that sandbox. Output staging will be performed
before cleanup.
"""
def __init__(self):
"""Le constructeur.
"""
# initialize attributes
attributes.Attributes.__init__(self)
# set attribute interface properties
self._attributes_extensible (False)
self._attributes_camelcasing (True)
# register properties with the attribute interface
# action description
self._attributes_register(KERNEL, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(NAME, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(EXECUTABLE, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(ARGUMENTS, None, attributes.STRING, attributes.VECTOR, attributes.WRITEABLE)
self._attributes_register(ENVIRONMENT, None, attributes.STRING, attributes.DICT, attributes.WRITEABLE)
self._attributes_register(PRE_EXEC, None, attributes.STRING, attributes.VECTOR, attributes.WRITEABLE)
self._attributes_register(POST_EXEC, None, attributes.STRING, attributes.VECTOR, attributes.WRITEABLE)
self._attributes_register(RESTARTABLE, None, attributes.BOOL, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(CLEANUP, None, attributes.BOOL, attributes.SCALAR, attributes.WRITEABLE)
# self._attributes_register(START_TIME, None, attributes.TIME, attributes.SCALAR, attributes.WRITEABLE)
# self._attributes_register(RUN_TIME, None, attributes.TIME, attributes.SCALAR, attributes.WRITEABLE)
# I/O
self._attributes_register(STDOUT, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(STDERR, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(INPUT_STAGING, None, attributes.ANY, attributes.VECTOR, attributes.WRITEABLE)
self._attributes_register(OUTPUT_STAGING, None, attributes.ANY, attributes.VECTOR, attributes.WRITEABLE)
# resource requirements
self._attributes_register(CORES, None, attributes.INT, attributes.SCALAR, attributes.WRITEABLE)
self._attributes_register(MPI, None, attributes.BOOL, attributes.SCALAR, attributes.WRITEABLE)
# self._attributes_register(CPU_ARCHITECTURE, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
# self._attributes_register(OPERATING_SYSTEM, None, attributes.STRING, attributes.SCALAR, attributes.WRITEABLE)
# self._attributes_register(MEMORY, None, attributes.INT, attributes.SCALAR, attributes.WRITEABLE)
# dependencies
# self._attributes_register(RUN_AFTER, None, attributes.STRING, attributes.VECTOR, attributes.WRITEABLE)
# self._attributes_register(START_AFTER, None, attributes.STRING, attributes.VECTOR, attributes.WRITEABLE)
# self._attributes_register(CONCURRENT_WITH, None, attributes.STRING, attributes.VECTOR, attributes.WRITEABLE)
# disabled deprecated attributes
# self._attributes_register_deprecated ('input_data', 'input_staging', flow=self._DOWN)
# self._attributes_register_deprecated ('output_data', 'output_staging', flow=self._DOWN)
# explicitly set attrib defaults so they get listed and included via as_dict()
self.set_attribute (KERNEL, None)
self.set_attribute (NAME, None)
self.set_attribute (EXECUTABLE, None)
self.set_attribute (ARGUMENTS, None)
self.set_attribute (ENVIRONMENT, None)
self.set_attribute (PRE_EXEC, None)
self.set_attribute (POST_EXEC, None)
self.set_attribute (STDOUT, None)
self.set_attribute (STDERR, None)
self.set_attribute (INPUT_STAGING, None)
self.set_attribute (OUTPUT_STAGING, None)
self.set_attribute (CORES, 1)
self.set_attribute (MPI, False)
self.set_attribute (RESTARTABLE, False)
self.set_attribute (CLEANUP, False)
#------------------------------------------------------------------------------
#
def __deepcopy__ (self, memo):
other = ComputeUnitDescription ()
for key in self.list_attributes () :
other.set_attribute (key, self.get_attribute (key))
return other
# ---------------------------------------------------------------------------------