SQL Action
SQL action makes a SQL query on the provided database.
delete-check-statuses.yamlapiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
  name: count-event-queue
spec:
  'on':
    component:
      - event: error
        filter: component.cost_per_minute > 0.50
        labels:
          type: database
  description: Count the number of events in event queue
  components:
    - types:
        - Database
  actions:
    - name: Get the total event count
      sql:
        connection: connection://incident-commander
        driver: postgres
        query: SELECT COUNT(*) FROM event_queue
    # - name: Notify event count
    #   http:
    #     url: https://incidents.flanksource.com
    #     body: |
    #       {
    #         "count": {{.result}}
    #       }
| Field | Description | Scheme | Required | Templatable | 
|---|---|---|---|---|
connection | Connection identifier. | string | ||
url | URL is the database connection url. | string | ||
query | Query is the sql query to run. It can also be templated | Template | true | true | 
driver | Driver is the name of the underlying database to connect to. Example: postgres, mysql, ... | string | true | 
| Field | Description | Scheme | 
|---|---|---|
name* | Step Name  | string  | 
sql | SQL Action  | |
delay | A delay before running the action e.g.   | 
  | 
filter | Conditionally run an action  | CEL with Playbook Context  | 
runsOn | Which runner (agent) to run the action on  | |
templatesOn | Where templating (and secret management) of actions should occur  | 
  | 
timeout | Timeout on this action.  | 
SQL
| Field | Description | Scheme | 
|---|---|---|
driver* | Database driver  | 
  | 
query* | SQL query to run against the database  | string  | 
connection | Connection path  e.g.   | |
url | Database connection URL  | url  | 
You must specify
connectionorurlbut not both
Output
| Field | Description | Scheme | 
|---|---|---|
count | Number of rows returned  | int  | 
rows | List of rows with column name as keys and column data as values  | []map[string]any  | 
Templating
CEL Expressions
The following variables can be used within the CEL expressions of filter, if, delays and parameters.default:
| Field | Description | Schema | 
|---|---|---|
config | Config passed to the playbook | ConfigItem | 
component | Component passed to the playbook | Component | 
check | Canary Check passed to the playbook | Check | 
playbook | Playbook passed to the playbook | Playbook | 
run | Current run | Run | 
params | User provided parameters to the playbook | map[string]any | 
request | Webhook request | Webhook Request | 
env | Environment variables defined on the playbook | map[string]any | 
user.name | Name of the user who invoked the action | string | 
user.email | Email of the user who invoked the action | string | 
agent.id | ID of the agent the resource belongs to. | string | 
agent.name | Name of the agent the resource belongs to. | string | 
Conditionally Running Actions
Playbook actions can be selectively executed based on CEL expressions. These expressions must either return
- a boolean value (
trueindicating run the action & skip the action otherwise) - or a special function among the ones listed below
 
| Function | Description | 
|---|---|
always() | run no matter what; even if the playbook is cancelled/fails | 
failure() | run if any of the previous actions failed | 
skip() | skip running this action | 
success() | run only if all previous actions succeeded (default) | 
timeout() | run only if any of the previous actions timed out | 
delete-kubernetes-pod.yaml---
apiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
  name: notify-send-with-filter
spec:
  parameters:
    - name: message
      label: The message for notification
      default: '{{.config.name}}'
  configs:
    - types: 
        - Kubernetes::Pod
  actions:
    - name: Send notification
      exec:
        script: notify-send "{{.config.name}} was created"
    - name: Bad script
      exec:
        script: deltaforce
    - name: Send all success notification
      if: success() # this filter practically skips this action as the second action above always fails
      exec:
        script: notify-send "Everything went successfully"
    - name: Send notification regardless
      if: always()
      exec:
        script: notify-send "a Pod config was created"
Defaulting Parameters
delete-kubernetes-pod.yamlapiVersion:
  mission-control.flanksource.com/v1
  kind: Playbook
  metadata:
    name: edit
  spec:
    title: 'Edit Kustomize Resource'
    icon: flux
    parameters:
    - default: 'chore: update $(.config.type)/$(.config.name)'
      name: commit_message
Go Templating
When templating actions with Go Templates, the context variables are available as fields of the template's context object . eg .config, .user.email
Templating Actions
delete-kubernetes-pod.yamlapiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
  name: scale-deployment
spec:
  description: Scale Deployment
  configs:
    - types:
        - Kubernetes::Deployment
  parameters:
    - name: replicas
      label: The new desired number of replicas.
  actions:
    - name: kubectl scale
      exec:
        script: |
          kubectl scale --replicas={{.params.replicas}} \
            --namespace={{.config.tags.namespace}} \
            deployment {{.config.name}}
Functions
| Function | Description | Return | 
|---|---|---|
getLastAction() | Returns the result of the action that just run | Action Specific | 
getAction({action}) | Return the result of a specific action | Action Specific | 
Reusing Action Results
action-results.yamlapiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
  name: use-previous-action-result
spec:
  description: Creates a file with the content of the config
  configs:
    - types:
        - Kubernetes::Pod
  actions:
    - name: Fetch all changes
      sql:
        query: SELECT id FROM config_changes WHERE config_id = '{{.config.id}}'
        driver: postgres
        connection: connection://postgres/local
    - name: Send notification
      if: 'last_result().count > 0'
      notification:
        title: 'Changes summary for {{.config.name}}'
        connection: connection://slack/flanksource
        message: |
          {{$rows:=index last_result "count"}}
          Found {{$rows}} changes