Link Search Menu Expand Document

Reacting to (“consuming”) Cloud Events

Workflows can be triggered in a number of ways; by default they must be manually triggered, but with the correct configuration a workflow will start each time a cloud event reaches the parent namespace that satisfies the constraints detailed in the workflow definition.

To demonstrate this, let’s modify the ‘main’ workflow from this article, removing the send-email state and replacing it with a state that will generate an event.

  ...

  # Add an 'A' DNS record
  - id: add-dns-record
    type: action
    log: jq(.)
    action:
      workflow: add-dns-record
      input: 
        domain: jq(.domain)
        subdomain: jq(.subdomain)
        address: jq(.address)
    transition: generate-event

  # Send a custom event that will trigger the next workflow
  - id: generate-event
    type: generateEvent
    event:
      type: example.vm.created
      source: exampleWorkflow
      data:
        address: jq(.address)
        host: "jq(.subdomain).jq(.domain)"
        recipient: jq(.recipient)
        domain: jq(.domain)
        subdomain: jq(.subdomain)
        region: jq(.region)

Now that the main workflow will generate a cloud event on completion, we require a workflow that will react to it. This workflow will extract information from the body of the caught event and submit a new record to a ‘FreshService’ service before sending the ‘success’ email to the specified user.

id: consume-new-vm-event

# Start workflow when correct event occurs
start: 
  type: event
  event:
    type: example.vm.created
    filters:
      source: exampleWorkflow

functions:
  - id: query-fresh-service-cmdb
    image: vorteil/request:v10
    type: reusable
    
  - id: send-email
    type: subflow
    workflow: send-email

states:

  # Submit new record to FreshService
  - id: push-instance-2-cmdb
    type: action
    action:
      function: query-fresh-service-cmdb
      input: 
        url: "https://direktiv.freshservice.com/cmdb/items.json"
        method: "POST"
        body: 
          cmdb_config_item: 
            name: jq(."example.vm.created".host)
            ci_type_id: "75000270995"
            level_field_attributes: 
              aws_region_75000270981: jq(."example.vm.created".region)
              availability_zone_75000270981: jq(."example.vm.created".region)
              instance_id_75000270995: jq(."example.vm.created".host)
              public_ip_75000270995: jq(."example.vm.created".address)
              public_dns_75000270995: jq(."example.vm.created".host)
              instance_state_75000270995: "created"
        headers: 
          "Content-Type": "application/json"
          Authorization: "Basic <EXAMPLE_AUTHORISATION>"
    transform: jq(.msg = .return.item.config_item | del(.return))
    transition: send-email

  # Send a 'success' email
  - id: send-email
    log: jq(.)
    type: action
    action:
      function: send-email
      input:
        recipient: jq(."example.vm.created".recipient)
        domain: jq(."example.vm.created".domain)
        subdomain: jq(."example.vm.created".subdomain)
        address: jq(."example.vm.created".address)

**Note: ** The value of the type and source fields defined in the start configuration of this workflow must match the corresponding fields of an incoming cloud event.

After making these changes, trigger the main workflow (create-vm-with-dns). When complete, an instance will be created for the consume-new-vm-event workflow. All of the data provided to the data field of the generated event is accessible to the receiving workflow, as children of the example.vm.created field (the name of the field corresponds to the event type).


Copyright © 2021 Vorteil.io.