Note

The documentation you're currently reading is for version 1.4.0. Click here to view documentation for the latest stable version.

Notifications

If you read through the What is ChatOps? section, you are familiar with notifications. Even without ChatOps, notifications can be used to post messages to external systems like Chat clients, send emails etc. Notifications require an action that is registered with st2 (For example, slack pack contains a post_message action.) and a notification rule to go with it. Notifications are implemented as triggers and rules and actions. A special core.st2.notifytrigger is emitted by the system on completion of every action and a rule to match the trigger to a notify action results in notifications being sent out.

How to setup a notification for a simple action?

This is the easiest case. You can do this by specifying a notify section in the YAML metadata while registering the action. For example:

---
description: Action that executes an arbitrary Linux command on the localhost.
enabled: true
entry_point: ''
name: local-notify
notify:
  on-complete:
    routes:
    - slack
    message: '"@channel: Action succeeded."'
parameters:
  cmd:
    description: Arbitrary Linux command to be executed on the remote host(s).
    required: true
    type: string
  sudo:
    immutable: true
runner_type: "local-shell-cmd"

Above is the same action as a local-shell-cmd action but with notify. As you can see, there is a notify section with on-complete section. You can also specify on-success and on-failure sections with different messages. These subsections are all optional but at least one is required for any meaningful notification. For the sake of clarity, an on-success case is presented below.

notify:
   on-complete:
     routes:
     - slack
     message: '"@channel: Action succeeded."'
   on-success:
     routes:
     - slack
     message: '"@channel: Woohoo!"'

When the notification triggers are sent out, the message is supplied along with a data field containing the results of the execution. The rule can use these two fields - message and data - and send it out as part of the action.

How to write a rule for notification?

The rule to tie a st2 registered notify action resembles the notify rule you are familiar with when you setup chatops. An example is below:

---
name: "notify_slack"
pack: "examples"
description: "Sample rule firing on action completion."
enabled: true

trigger:
  type: "core.st2.generic.notifytrigger"
  parameters: {}
criteria:
  trigger.channel:
    pattern: "slack"
    type: "equals"
action:
  ref: "slack.post_message"
  parameters:
    message: "{{trigger.message}}"

As you can see, this rule is setup for notification route slack. The action section shows that slack.post_message is the one what would be kicked off. We are skipping the data part of the trigger for brevity. If you had a slack action that also consumed some data as JSON string, you could pass data: "{{data}}" as a parameter.

Jinja templating in message and data

As of release 1.2, Jinja templating is supported for both message and data. The Jinja contexts available for use are parameters of action and runner ({{action_parameters.cmd}}), keys in execution results ({{action_results.stdout}}, {{action_results.stderr}} for example), anything in action context ({{action_context.user}}) and anything in key-value store ({{system.foo}}). Some examples are shown below:

on-success:
  routes:
    - slack
  message: '"@channel: Woohoo!". Action run by user {{action_context.user}} succeeded.'

on-success:
  routes:
    - email
  message: '"@channel: Woohoo!". Action run by user {{action_context.user}} succeeded.'
  data:
    cmd: "{{action_parameters.cmd}}"
    stdout: "{{action_results.stdout}}"

How do I setup notifications in an action chain?

The procedure here is the same if you want the same notify for all tasks in the chain. Register an action metadata with a notify section. For example:

---
# Action definition metadata
name: "echochain"
description: "Simple Action Chain workflow"

# `runner_type` has value `action-chain` to identify that action is an ActionChain.
runner_type: "action-chain"

# `entry_point` path to the ActionChain definition file, relative to the pack's action directory.
entry_point: "chains/echochain.yaml"

enabled: true

# Notify section for all tasks in the chain
notify:
  on-complete:
    message: "\"@channel: Action succeeded.\""
    routes:
      - "slack"

This is mostly useless because you want to control the message in each of the tasks. See the section below.

How do I setup different notifications for different tasks in the chain?

The notify subsection is the same format as seen in examples above. Place the subsection in action chain tasks. If there is notify section for the action metadata, and a notify section in the task, the task section will override the default. The relevant section of chain action with task notify is shown below:

-
  name: "make_reqmnts"
  ref: "core.remote"
  parameters:
    cmd: "cd {{repo_target}} && make requirements"
    hosts: "{{build_server}}"
    timeout: 300
  notify:
    on-failure:
      routes:
        - slack
      message: "Pytests failed on installing requirements."
  on-success: "make_lint"
-
  name: "make_lint"
  ref: "core.remote"
  parameters:
    cmd: "cd {{repo_target}} && make .lint"  # .flake8 and .pylint
    hosts: "{{build_server}}"
    timeout: 180
  on-success: "make_tests"

How do I setup notifications for Mistral?

The method for global notifications for the workflow is the same as action chain. You have a notify section in the action meta when registering. See an example. Unfortunately, notifications per task are not supported in Mistral as a first class citizen yet. This will be added in later releases.

How do I skip notifications for tasks in workflow or chain?

This is implemented as a runner parameter skip_notify. If your chain or workflow contains multiple tasks and you want some tasks to be “muted”, you can do so by specifying skip_notify and call out tasks in the action meta. For example,

---
name: mistral-basic-two-tasks-with-notifications
pack: examples
description: Run mistral workflow with two tasks.
runner_type: mistral-v2
entry_point: workflows/mistral-basic-two-tasks-with-notifications.yaml
enabled: true
parameters:
  skip_notify:
    default:
      - "task2"
  context:
    default: {}
    immutable: true
    type: object
  task:
    default: null
    immutable: true
    type: string
  workflow:
    default: null
    immutable: true
    type: string
notify:
  on-complete:
    message: "\"@channel: Action succeeded.\""
    routes:
      - "slack"

In the above example, notifications for “task2” will not be sent out. This feature is particularly useful in combination with ChatOps where you don’t want want noisy tasks to pollute the Chat client.

ChatOps and notifications

If you enabled ChatOps, you get all the the things wired for you. You don’t have to edit action metadata etc. You can still use skip_notify to skip notifications for certain tasks in a chain or workflow. If you specified a notify section in metadata or in tasks, those notification routes will override ChatOps. Therefore, you might not see notifications in chat client. See issue for example.