arpx 0.5.0

Small-scale process orchestration
Documentation
# Writing a profile

Arpx runtimes are configured via profiles. Profiles are written using the [YAML spec](https://yaml.org/spec/).

A profile is composed of three items: `jobs`, `processes`, and `log_monitors`. A profile must contain at least one process and one job (to execute that process) to be valid.

## Jobs

The `jobs` key in an Arpx profile is a mapping of string values. For each entry in the `jobs` mapping, the key is the job's name and the value is the job itself, written in the dedicated arpx_job scripting language.

### arpx_job scripting language

The arpx_job scripting language seeks to express Arpx runtime jobs as succinctly as possible and enable users to easily construct and execute jobs from available processes and log monitors.

The arpx_job scripting language can be broken down into 5 concepts:

- **Processes** (`my_process`, `my_other_process`)
  - Any process defined in the current profile can be referenced by name from within arpx_job. For example, if a process named `foo` is defined under `processes`, it can be invoked within a job using its name, "foo". A semicolon must terminate the process declaration. (`foo;`, not `foo`)
- **Concurrency** (`[]`)
  - Multiple processes can be executed in parallel by enclosing their declarations with square brackets. Each process must be terminated with a semicolon. (`[ foo; bar; baz ]`)
- **Contingency** (`?:`)
  - Actions can be executed when a process succeeds or fails using [ternary syntax]https://en.wikipedia.org/wiki/%3F:. `?` denotes an "onsucceed" branch and `:` denotes an "onfail" branch. When contingency is used, the terminating semicolon goes at the end of the entire declaration. (`foo ? bar : baz;`)
- **Actions** (`my_process`, `my_other_process` + `arpx_exit`, `arpx_exit_error`)
  - "Actions" is a supercategory which includes all processes defined in the current profile as well as special system actions `arpx_exit` and `arpx_exit_error`. `arpx_exit` exits the entire Arpx runtime with a successful status. `arpx_exit_error` exits the entire Arpx runtime with a failing status.
- **Log monitors** (`@my_log_monitor`)
  - Any log monitor defined in the current profile can be referenced by name from within arpx_job and applied to a given process declaration by placing it _after the terminating semicolon_. For example, if a log monitor named `qux` is defined under `log_monitors`, it can be applied to a process declaration like so: `foo ? bar : baz; @qux`. Log monitor declarations are always placed after the terminating semicolon.

Each job defined below demonstrates one or more of the concepts described above.

```yaml
jobs:
  sequence: |
    process1;
    process2;
    
  concurrent: |
    [
      process1;
      process2;
    ]
    
  sequence_and_concurrent: |
    process1;
    process2;
    [
      process1;
      process2;
    ]
    
  contingent: process1 ? process2 : process3;
  
  contingent_onsucceed: process1 ? process2;
  
  contingent_onfail: process1 : process2;
  
  with_log_monitors: |
    process1; @monitor1
    process2 ? process3; @monitor2
    
  concurrent_with_log_monitors: |
    [
      process1; @monitor1
      process2 ? process3; @monitor2
    ]
```

To learn more, check out the [`arpx_job_parser` repo](https://github.com/jaredgorski/arpx_job_parser).

## Processes

The `processes` key in an Arpx profile is a mapping of process configuration objects. For each entry in the `processes` mapping, the key is the process's name and the value is the process configuration object.

```yaml
processes:
  example_process:
    command: echo "Hello, World!"             # (required) Command to execute.
    cwd: /directory/in/which/to/run/command   # (optional) Path to directory in which `command` should execute. Defaults to `.`.
    onsucceed: some_action_name               # (optional) Default onsucceed action. Can be overridden in job script. Defaults to none.
    onfail: some_action_name                  # (optional) Default onfail action. Can be overridden in job script. Defaults to none.
```

## Log monitors

The `log_monitors` key in an Arpx profile is a mapping of log monitor configuration objects. For each entry in the `log_monitors` mapping, the key is the log monitor's name and the value is the log monitor configuration object.

```yaml
log_monitors:
  example_log_monitor:
    test: '[[ "$ARPX_BUFFER" =~ "Hello" ]]'   # (required) Test script to execute on each buffer update.
    ontrigger: some_action_name               # (optional) Default ontrigger action. Can be overridden in job script. Defaults to none.
    buffer_size: 1                            # (optional) Size of rolling buffer. Defaults to 20.
```