A python library for building adaptors that integrate applications with Open Job Description jobs.
Project description
Open Job Description - Adaptor Runtime
This package provides a runtime library for creating a command-line Adaptor to assist with integrating an existing application, such as a rendering application, into batch computing systems that run Jobs in a way that is compatible with Open Job Description Sessions. That is, when running a Job on a host consists of a phase to initialize a local compute environment, then running one or more Tasks that each run the same application for the Job on the host, and finally tearing down the initialized compute environment when complete.
Some of the reasons that you should consider creating an Adaptor are if you want to:
- Optimize the runtime of your Job on a compute host by loading the application once and dynamically running many units of work with that single application instance before shutting down the application;
- Programmatically respond to signals that the application provides, such as stopping the application early if it prints a message to stdout that indicates that the run may produce undesirable results like watermarks due to missing a floating license, or a bad image render due to missing textures;
- Dynamically select which version of an application to run based on what is available and modify the command-line options provided to the application based on which version will be run;
- Emit Open Job Description Stdout Messages, or equivalent, to update the batch computing system on the status or progress of the running unit of work; and/or
- Integrate Open Job Description Path Mapping information into the application in the format that it is expecting.
Compatibility
This library requires:
- Python 3.9 or higher; and
- Linux, MacOS, or Windows operating system.
Versioning
This package's version follows Semantic Versioning 2.0, but is still considered to be in its initial development, thus backwards incompatible versions are denoted by minor version bumps. To help illustrate how versions will increment during this initial development stage, they are described below:
- The MAJOR version is currently 0, indicating initial development.
- The MINOR version is currently incremented when backwards incompatible changes are introduced to the public API.
- The PATCH version is currently incremented when bug fixes or backwards compatible changes are introduced to the public API.
Downloading
You can download this package from:
Verifying GitHub Releases
See VERIFYING_PGP_SIGNATURE for more information.
Usage
To create your own Adaptor you create a Python application that uses this package and consists of:
- A console script entrypoint that passes control flow to an instance of this runtime's EntryPoint class;
- A JSON file for configuration options of your Adaptor; and
- An Adaptor class derived from either the CommandAdaptor or Adaptor class.
- CommandAdaptor is ideal for applications where you do not need to initialize the local compute environment by, say, preloading your application, and simply need to run a single commandline for each Task that is run on the compute host. Please see CommandAdaptorExample in this GitHub repository for a simple example.
- Adaptor exposes callbacks for every stage of an Adaptor's lifecycle, and is is suited for Adaptors where you want full control. Please see AdaptorExample in this GitHub repository for a simple example.
You can also find many more examples within the AWS Deadline Cloud Organization on GitHub.
Adaptor Lifecycle
All Adaptors undergo a lifecycle consisting of the following stages:
- start: Occurs once during construction and initialization of the Adaptor. This is the stage where
your Adaptor should perform any expensive initialization actions for the local compute environment; such
as starting and loading an application in the background for use in later stages of the Adaptor's lifecycle.
- Runs the
on_start()
method of Adaptors derived from the Adaptor base class.
- Runs the
- run: May occur one or more times for a single running Adaptor. This is the stage where your Adaptor is
performing the work required of a Task that is being run.
- Run the
on_run()
method of Adaptors derived from the Adaptor base class. - Run the
on_prerun()
thenget_managed_process()
thenon_postrun()
methods of Adaptors derived from the CommandAdaptor base class.
- Run the
- stop: Occurs once as part of shutting down the Adaptor. This stage is the inverse of the start
stage and should undo the actions done in that phase; such as stopping any background processes that are
still running.
- Runs the
on_stop()
method of Adaptors derived from the Adaptor base class.
- Runs the
- cleanup: A final opportunity to cleanup any remaining processes and data left behind by the Adaptor.
- Runs the
on_cleanup()
method of Adaptors derived from the Adaptor base class.
- Runs the
A running Adaptor can also be canceled by sending the Adaptor process a signal (SIGINT/SIGTERM on posix, or
CTRL-C/CTRL-BREAK on Windows). This will call the on_cancel()
method of your Adaptor, if one is defined.
You should ensure that the design of your Adaptor allows this cancelation to interrupt any actions that may
be running, and gracefully exit any running background processes.
Running an Adaptor
The EntryPoint provided by this runtime allows for an Adaptor to be run directly through its entire lifecycle in a single command, or to be run as a background daemon that lets you drive the lifecycle of the Adaptor yourself.
The run
Subcommand
The run
subcommand of an Adaptor will run it through its entire lifecycle (start, then run, then
stop, and finally cleanup), and then exit. This is useful for initial development and testing, and
for running Adaptors created from the CommandAdaptor base class.
To see this in action install the openjd-adaptor-runtime package into your Python environment, and then within your local clone of this repository:
cd test/openjd
python3 -m integ.AdaptorExample run --init-data '{"name": "MyAdaptor"}' --run-data '{"hello": "world"}'
The arguments to the run
subcommand are:
--init-data
is a JSON-encoded dictionary either inline or in a given file (file://<path-to-file>
). This data is decoded and automatically stored in theself.init_data
member of the running Adaptor.--run-data
is, similarly, a JSON-encoded dictionary either inline or in a given file (file://<path-to-file>
). This data is passed as the argument to theon_run()
method of an Adaptor or theget_managed_process()
method of a CommandAdaptor.
The daemon
Subcommand
With the daemon
subcommand, you must transition the Adaptor through its lifecycle yourself by running the
subcommands of the daemon
subcommand in order.
- Start the Adaptor: Initializes the Adaptor as a background daemon subprocess and leaves it running.
This runs the
on_start()
method of your Adaptor-derived Adaptor if the method is available.python -m integ.AdaptorExample daemon start --connection-file ./AdaptorExampleConnection.json --init-data '{"name": "MyAdaptor"}'
--init-data
is as described in therun
subcommand, above.--connection-file
provide a path to a JSON file for the Adaptor to create. This file contains information on how to connect to the daemon subprocess remains running, and you must provide it to all subsequent runs of the Adaptor until you have stopped it.
- Run the Adaptor: Connects to the daemon subprocess that is running the Adaptor and instructs it to perform its run
lifecycle phase. The command remains connected to the daemon subprocess for the entire duration of this run phase,
and forwards all data logged by the Adaptor to stdout or stderr. This step can be repeated multiple times.
python -m integ.AdaptorExample daemon run --connection-file ./AdaptorExampleConnection.json --run-data '{"hello": "world"}'
--run-data
is as described in therun
subcommand, above.--connection-file
is as described in above.
- Stop the Adaptor: Connects to the daemon subprocess that is running the Adaptor and instructs it to transition to the
stop then cleanup lifecycle phases, and then instructs the daemon subprocess to exit when complete. The command
remains connected to the daemon subprocess for the entire duration, and forwards all data logged by the Adaptor to stdout
or stderr.
python -m integ.AdaptorExample daemon stop --connection-file ./AdaptorExampleConnection.json
Security
See CONTRIBUTING for more information.
License
This project is licensed under the Apache-2.0 License.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for openjd_adaptor_runtime-0.8.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 58e00c4a08686821df01c736e0781a3736450865cc2cf4e3799e354d324112d8 |
|
MD5 | 6324a8ef420731a8115a82dfce94ad15 |
|
BLAKE2b-256 | 2ad4975344fb011bb371bd1567c1759eb724761e7fd6acdf3c763b16ad67b6f6 |
Hashes for openjd_adaptor_runtime-0.8.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d091750a2a81a32ef0146b8e69a15fb1e98e5212e38dcb19278a35c64b2053a6 |
|
MD5 | 7a9ee9122e5676b649bfc8edae64bde9 |
|
BLAKE2b-256 | cb8e9e99ebdf6b396f99805e12dcd3f47224b0af1b6d0ea44acef28672aff16c |