Skip to content

brigadecore/brigade-cloudevents-gateway

Repository files navigation

Brigade CloudEvents Gateway

build codecov Go Report Card slack

The Brigade CloudEvents Gateway receives webhooks from any CloudEvents 1.0 event producer and emits them into Brigade's event bus.


After installation, follow the documentation for any CloudEvents 1.0 event producer to send CloudEvents to this gateway. Do not forget to utilize one of the bearer tokens you created during the installation process for authentication.

Subscribe any number of Brigade projects to the events emitted by this component -- all of which have a value of brigade.sh/cloudevents in their source field and a value of cloudevent in their type field.

⚠️  Because CloudEvents and Brigade events both utilize source and type fields, this gateway adds the values of the CloudEvent's original source and type fields to the native Brigade event as qualifiers with the keys source and type, respectively. The original CloudEvent, in its entirety, is added to the the native Brigade event's payload field.

In the example project definition below, we subscribe to events from this gateway (identified by source: brigade.sh/cloudevents and type: cloudevent) that originated from an "upstream" CloudEvent producer that labeled its events with source example/uri and type example.type:

apiVersion: brigade.sh/v2
kind: Project
metadata:
  id: cloudevents-demo
description: A project that demonstrates integration with CloudEvents
spec:
  eventSubscriptions:
  - source: brigade.sh/cloudevents
    types:
    - cloudevent
    qualifiers:
      source: example/uri
      type: example.type
  workerTemplate:
    defaultConfigFiles:
      brigade.js: |-
        const { events } = require("@brigadecore/brigadier");

        events.on("brigade.sh/cloudevents", "cloudevent", () => {
          console.log("Received an event from the brigade.sh/cloudevents gateway!");
        });

        events.process();

Assuming this file were named project.yaml, you can create the project like so:

$ brig project create --file project.yaml

Try it Out

You can use the following curl command to send a simulated CloudEvent to the gateway. This event is subscribed to by the example project in the previous section.

$ curl -i -k -X POST \
    -H "ce-specversion: 1.0" \
    -H "ce-id: 1234-1234-1234" \
    -H "ce-source: example/uri" \
    -H "ce-type: example.type" \
    -H "Authorization: Bearer <a token from ~/brigade-cloudevents-gateway-values.yaml>" \
    https://<public IP or host name here>/events

⚠️  Note that the CloudEvent we simulated above utilizes binary content mode. In this mode, all the CloudEvent metadata is included in HTTP request headers, making this the most convenient sort of CloudEvent to simulate using curl as a client. The gateway also supports the more common structured content mode wherein CloudEvent metadata is found within the payload itself.

If the gateway accepts the request, output will look like this:

HTTP/1.1 200 OK
Date: Tue, 03 Aug 2021 19:13:37 GMT
Content-Length: 0

To confirm that the gateway emitted a corresponding Brigade event into Brigade's event bus, list the events for the cloudevents-demo project:

$ brig event list --project cloudevents-demo

If this all works out, you should be equally successful wiring CloudEvents from any CloudEvents 1.0 producer into your Brigade instance.

Full coverage of brig commands is beyond the scope of this documentation, but at this point, additional brig commands can be applied to monitor the event's status and view logs produced in the course of handling the event.

Contributing

The Brigade project accepts contributions via GitHub pull requests. The Contributing document outlines the process to help get your contribution accepted.

Support & Feedback

We have a slack channel! Kubernetes/#brigade Feel free to join for any support questions or feedback, we are happy to help. To report an issue or to request a feature open an issue here

Code of Conduct

Participation in the Brigade project is governed by the CNCF Code of Conduct.