The pycompose command makes it possible to deploy compositions from the command line.
The pycompose command is intended as a minimal complement to the OpenWhisk CLI. The OpenWhisk CLI already has the capability to configure, invoke, and delete compositions (since these are just OpenWhisk actions) but lacks the capability to create composition actions. The compose command bridges this gap. It makes it possible to deploy compositions as part of the development cycle or in shell scripts. It is not a replacement for the OpenWhisk CLI however as it does not duplicate existing OpenWhisk CLI capabilities. Moreover, for a much richer developer experience, we recommend using Shell.
pycompose
Usage: compose composition.[py|json] command [flags] Commands: --json output the json representation for the composition (default command) --deploy NAME deploy the composition with name NAME --encode output the conductor action code for the composition Flags: --lower [VERSION] lower to primitive combinators or specific composer version --apihost HOST API HOST -u, --auth KEY authorization KEY -i, --insecure bypass certificate checking
The pycompose command requires either a Python file that evaluates to a composition (for example demo.py) or a JSON file that encodes a composition (for example demo.json). The JSON format is documented in FORMAT.md.
The pycompose command has three modes of operation:
--json option is specified, the command returns the composition encoded as a JSON dictionary.--deploy option is specified, the command deploys the composition given the desired name for the composition.--encode option is specified, the command returns the Python code for the conductor action for the composition.By default, the compose command evaluates the composition code and outputs the resulting JSON dictionary:
pycompose demo.py
{ "type": "if", "test": { "type": "action", "name": "/_/authenticate", "action": { "exec": { "kind": "nodejs:default", "code": "const main = function ({ password }) { return { value: password === 'abc123' } }" } } }, "consequent": { "type": "action", "name": "/_/success", "action": { "exec": { "kind": "nodejs:default", "code": "const main = function () { return { message: 'success' } }" } } }, "alternate": { "type": "action", "name": "/_/failure", "action": { "exec": { "kind": "nodejs:default", "code": "const main = function () { return { message: 'failure' } }" } } } }
The evaluation context includes the composer object implicitly. In other words, there is no need to import the composer module explicitly in the composition code.
The --deploy option makes it possible to deploy a composition (Javascript or JSON) given the desired name for the composition:
compose demo.js --deploy demo
ok: created actions /_/authenticate,/_/success,/_/failure,/_/demo
Or:
compose demo.py > demo.json compose demo.json --deploy demo
ok: created actions /_/authenticate,/_/success,/_/failure,/_/demo
The pycompose command synthesizes and deploys a conductor action that implements the composition with the given name. It also deploys the composed actions for which definitions are provided as part of the composition.
The pycompose command outputs the list of deployed actions or an error result. If an error occurs during deployment, the state of the various actions is unknown.
The pycompose command deletes the deployed actions before recreating them if necessary. As a result, default parameters, limits, and annotations on preexisting actions are lost.
Like the OpenWhisk CLI, the compose command supports the following flags for specifying the OpenWhisk deployment to use:
--apihost HOST API HOST -u, --auth KEY authorization KEY -i, --insecure bypass certificate checking
If the --apihost flag is absent, the environment variable __OW_API_HOST is used in its place. If neither is available, the compose command extracts the APIHOST key from the whisk property file for the current user.
If the --auth flag is absent, the environment variable __OW_API_KEY is used in its place. If neither is available, the compose command extracts the AUTH key from the whisk property file for the current user.
The default path for the whisk property file is $HOME/.wskprops. It can be altered by setting the WSK_CONFIG_FILE environment variable.
The pycompose command returns the code of the conductor action for the composition (Python or JSON) when invoked with the --encode option. For instance, the conductor action code for the demo.py composition is demo-conductor.py:
pycompose demo.py --encode > demo-conductor.py
This code may be deployed using the OpenWhisk CLI:
wsk action create demo demo-conductor.py --kind python:3 -a conductor true
ok: created action demo
The conductor action code does not include definitions for nested actions or compositions.
If the --lower VERSION option is specified, the pycompose command uses the set of combinators of the specified revision of the composer module. More recently introduced combinators (if any) are translated into combinators of the older set.
If the --lower option is specified without a version number, the pycompose command uses only primitive combinators.
These options may be combined with any of the pycompose commands.