From 36f3d6754e46b3edea129d06ffecc7d01c5ab6fc Mon Sep 17 00:00:00 2001 From: Andrea Frittoli Date: Thu, 13 Oct 2022 16:26:56 +0100 Subject: [PATCH] Document how to adopt and adapt CDEvents Document a series of scenarios about adopting CDEvents producer and consumer side. Describe how to adapt CDEvents with customData and how to contribute new fields and events to the community. Document declarative vs. imperative events and the subscriber model. Fixes: #66 Fixes: #42 Signed-off-by: Andrea Frittoli --- images/adapter.svg | 3 + images/cdevents.drawio | 1 + images/consumer-adapter.svg | 3 + images/multiple-produced.svg | 3 + images/multiple-received.svg | 3 + images/original-adapter.svg | 3 + images/watcher-producer.svg | 3 + primer.md | 236 ++++++++++++++++++++++++++++++++--- 8 files changed, 235 insertions(+), 20 deletions(-) create mode 100644 images/adapter.svg create mode 100644 images/cdevents.drawio create mode 100644 images/consumer-adapter.svg create mode 100644 images/multiple-produced.svg create mode 100644 images/multiple-received.svg create mode 100644 images/original-adapter.svg create mode 100644 images/watcher-producer.svg diff --git a/images/adapter.svg b/images/adapter.svg new file mode 100644 index 00000000..1a592254 --- /dev/null +++ b/images/adapter.svg @@ -0,0 +1,3 @@ + + +
Tool
Tool
Event
Event
Adapter
Adapter
Message Broker
Message Broker
Consumer
Consumer
Consumer
Consumer
Subscription
Subscription
Subscription
Subscription
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/cdevents.drawio b/images/cdevents.drawio new file mode 100644 index 00000000..019e696c --- /dev/null +++ b/images/cdevents.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/images/consumer-adapter.svg b/images/consumer-adapter.svg new file mode 100644 index 00000000..a375dcb5 --- /dev/null +++ b/images/consumer-adapter.svg @@ -0,0 +1,3 @@ + + +
Tool
Tool
Message Broker
Message Broker
Consumer
Consumer
Consumer
Consumer
Subscription
Subscription
Subscription
Subscription
Adapter
Adapter
Subscription
Subscription
Adapter
Adapter
Consumer
Consumer
Invoke
API
Invoke...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/multiple-produced.svg b/images/multiple-produced.svg new file mode 100644 index 00000000..55f5d59e --- /dev/null +++ b/images/multiple-produced.svg @@ -0,0 +1,3 @@ + + +
Tool
Tool
Event
Event
Message Broker
Message Broker
Consumer
Consumer
Consumer
Consumer
Subscription
Subscription
Subscription
Subscription
Consumer
Consumer
Subscription
Subscription
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/multiple-received.svg b/images/multiple-received.svg new file mode 100644 index 00000000..444dea0d --- /dev/null +++ b/images/multiple-received.svg @@ -0,0 +1,3 @@ + + +
Tool
Tool
Message Broker
Message Broker
Consumer
Consumer
Subscription
Subscription
Subscription
Subscription
Tool
Tool
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/original-adapter.svg b/images/original-adapter.svg new file mode 100644 index 00000000..7aff6d30 --- /dev/null +++ b/images/original-adapter.svg @@ -0,0 +1,3 @@ + + +
Tool
Tool
Event
Event
Watcher / Adapter
Watcher / Ada...
Message Broker
Message Broker
Consumer
Consumer
Consumer
Consumer
Subscription
Subscription
Subscription
Subscription
Subscription
Subscription
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/watcher-producer.svg b/images/watcher-producer.svg new file mode 100644 index 00000000..939ce582 --- /dev/null +++ b/images/watcher-producer.svg @@ -0,0 +1,3 @@ + + +
Tool
Tool
Watch
Watch
Watcher / Producer
Watcher / Produc...
Message Broker
Message Broker
Consumer
Consumer
Consumer
Consumer
Subscription
Subscription
Subscription
Subscription
Text is not SVG - cannot display
\ No newline at end of file diff --git a/primer.md b/primer.md index 75dbf25d..0d01f65b 100644 --- a/primer.md +++ b/primer.md @@ -24,16 +24,34 @@ document is updated accordingly to reflect the design decisions behind the chang - [History](#history) - [Design reflections](#design-reflections) - - [How does CDEvents enable tools to communicate in an interoperable - way?](#how-does-cdevents-enable-tools-to-communicate-in-an-interoperable-way) + - [How does CDEvents enable tools to communicate in an interoperable way?](#how-does-cdevents-enable-tools-to-communicate-in-an-interoperable-way) - [Why use events?](#why-use-events) - - [Why not point-to-point - communication?](#why-not-point-to-point-communication) + - [Why not point-to-point communication?](#why-not-point-to-point-communication) + - [Declarative vs. imperative events](#declarative-vs-imperative-events) - [Relations to CloudEvents](#relations-to-cloudevents) +- [Versioning](#versioning) + - [Versioning of CDEvents](#versioning-of-cdevents) + - [Versioning of the CDEvents specification](#versioning-of-the-cdevents-specification) + - [Development of a new version](#development-of-a-new-version) +- [Extending CDEvents](#extending-cdevents) + - [Adding new data to CDEvents](#adding-new-data-to-cdevents) + - [Adding new event types](#adding-new-event-types) +- [Adopting CDEvents](#adopting-cdevents) + - [Producer-side architectures](#producer-side-architectures) + - [External event producer](#external-event-producer) + - [External event adapter](#external-event-adapter) + - [Multiple event formats](#multiple-event-formats) + - [Consumer-side architectures](#consumer-side-architectures) + - [Multiple event formats through adapter](#multiple-event-formats-through-adapter) + - [Consumer side adapters](#consumer-side-adapters) + - [Multiple received](#multiple-received) - [Acknowledgments](#acknowledgments) - [Use Cases](#use-cases) - [Design Decisions](#design-decisions) - [Keys, Values and Types](#keys-values-and-types) + - [Simplified data model](#simplified-data-model) + - [Artifacts](#artifacts) +- [Whitepaper](#whitepaper) ## History @@ -89,17 +107,23 @@ create a system that will: * Create a coupled architecture - using point-to-point communication creates a tightly intertwined architecture difficult to expand and monitor. -### Simplified data model +### Declarative vs. imperative events -In the initial version of CDEvents we tackled a simple scenario in which -each artifact is built from a single repository and each service is deployed -from a single artifact. +With imperative events we intend events that are sent with the intent to trigger +a specific reaction, like "start a pipeline" or "deploy an application". +Imperative events create coupling between producer and consumer, and typically +require some form of acknowledgement to be send back by the consumer of the +original event back to the producer. -This data model is somewhat limited, but is has allowed us to put more focus -on the overall structure of the protocol in the first release. +CDEvents are declarative events. With "declarative" we intend that the event +producer sends information about an occurrence, but it does not now how this +event will be used on the receiving side. -We plan to extend the data model to support more complex scenarios in upcoming -releases. +A behavior similar to that of imperative events can be achieved by moving part +of the business logic to an adapter that listens for specific declarative events +and decides based on a set of policy to trigger actions in a downstream system, +similarly to what is described in the [receiving +adapters](#consumer-side-adapters) scenario. ## Relations to CloudEvents @@ -189,15 +213,162 @@ Once a specification is ready for release, its number if updated, the event vers are finalized (`-draft` is removed), schemas are updated and a git tag is created for this last commit. -### Artifacts +## Extending CDEvents -The specification has chosen for v0.1.0 to adopt [package-urls][purl] (or purls) -as the format for any artifact identifier included in the spec. Purls provide a -consistent format for artifact identifiers across different package types. +The CDEvents specification is designed to evolve over time, to accommodate the +need of CDEvents users and cover a growing number of use cases. +In all cases we prefer backward compatible changes, which could be new fields in +existing events or new event types. +[Versioning](#versioning) of messages is used for producers to validate messages +before they are sent, and for consumer to know how to parse them. -CDEvents wishes for a format that can be used to reference to an artifact, or -package, that is independent from the hosting storage, which is a property which -purls satisfy for several artifact types. +### Adding new data to CDEvents + +If the data model of a CDEvent is not sufficient, events producers may choose to +pass extra data through the `customData` field. Using `customData` can be an +effective interim step, as it's easy to implement and can be used to help the +migration process from existing events to CDEvents. + +In most cases though `customData` should not be considered as a permanent +solution, since consumers don't know how to process this extra data, unless they +implement producer specific logic and sacrifice part of the interoperability +benefit of using CDEvents. + +Adding a new field to existing an existing CDEvent type is a backward compatible +change. Aspects to consider when proposing a new field are: + +- is the field generally useful to the CD community? Data that is unique to a + single platform is likely to be rejected +- what are the use cases where this field will be used? +- what is the format for the new field? Please be as specific as possible +- what is the name of the new field? Check the [SIG interoperability + vocabulary][sig-interop-vocabulariy] if a standard name exists. If not + consider proposing the new field name for the vocabulary as well. + +### Adding new event types + +If a new event type is needed, it's good practice to contribute the new type +into the CDEvents specification. Custom events can be used, but they should not +use the "dev.cdevents" namespace for their type. + +Custom events are not interoperable, so existing CDEvents consumers won't be +able to handle them. Introducing a custom event is simple enough on the producer +side but it doesn't scale well with the number of consumers. + +Adding a new event to an existing CDEvents bucket is a backward compatible +change. Aspects to consider when proposing a new event type are: + +- is the event generally useful to the CD community? Events that are very + specific to a single platform are likely to be rejected. If the event + represents a functionality that is currently only implemented in one platform, + but nonetheless generally useful, it can still be introduced in CDEvents +- what are the use cases where this event will be used? +- what are the sources of these events? +- if the event includes a new kind of subject, what is the data model of the + subject? What is the format of its ID? Please be as specific as possible +- what is the name of the new type? Check the [SIG interoperability + vocabulary][sig-interop-vocabulariy] if a standard name exists. If not + consider proposing the new field name for the vocabulary as well. + +## Adopting CDEvents + +When adopting CDEvents, producers and consumers alike may adopt different +strategies to support existing event producers and consumers that want to +consider existing messaging systems, formats and event producers and consumers +that are in place. +CDEvents is a new specifications, but neither CloudEvents not events in general +are a new idea, and several tools may already be using events or webhooks with a +tool specific data model. + +Below we consider a set of common scenarios and how CDEvents may be +incrementally introduced in an existing system. + +### Producer-side architectures + +In the first three scenarios, CDEvents are introduced in the producer side, +either directly in the tool or through some external component. + +#### External event producer + +If a tool does not produce events, it may be possible to use an external +component to "watch" a tool output (for instance logs) and produce CDEvents. + +If the output does not contain all information required for the events, this +limitation can be worked-around by adding the missing data in the tool output. + +This solution may be brittle, because the tool output may not be a stable +interface for the tool, and it may change over time without notice. + +![watcher-producer](images/watcher-producer.svg) + +This is approach is certainly valid to build a proof-of-concept or experiment +with events in an existing environment. + +If the output of the tool is structured and part of the tool API, this may also +be adopted as a permanent solution, to keep separation of concerns between the +tool itself and the process of generating events. + +#### External event adapter + +If a tool does produce events, it may be possible to use an external adapter +component to convert the existing events into CDEvents. + +![adapter](images/adapter.svg) + +Similar to the [previous case](#external-event-producer), incoming events may be +missing data required by CDEvents. If the events come from a tool that we do not +control, we cannot alter the content of the events, so we may request the tool +maintainers to either add the extra data or, like in the next scenario, start +producing CDEvents natively. + +#### Multiple event formats + +A tool may start producing CDEvents natively. If the tool previously produced +events, some consumers may expect the pre-existing event format. This can be +solved on the producer side by sending both format of events in parallel. + +In some cases it may be possible to use a single broker for both event types, +for instance if both formats are CloudEvents based. + +![multiple-produced](images/multiple-produced.svg) + +### Consumer-side architectures + +Typically it won't be possible for all existing event consumers to switch to +CDEvents at the same time. The following scenarios show how an incremental +approach can be used to migrate consumers through CDEvents gradually. + +#### Multiple event formats through adapter + +In a variation of the previous two producer scenarios, the tool produces only +one format of events, which is sent to the broker. The adapter subscribes to +the events, converts them and publishes them back to the broker. Consumer may +then subscribe to the type of events that they prefer. + +![original-adapter](images/original-adapter.svg) + +With this architecture, the adapter may even be able to convert messages from +different tools, instead of just one. + +#### Consumer side adapters + +In this scenario, the tool and some consumers use CDEvents. New consumers are +added that do not understand CDEvents, or that do not support events in general. +An adapter can be used to convert a CDEvent into the consumer specific format or +to extract data from a CDEvent and use it to invoke an API for the receiving +side. + +![consumer-adapter](images/consumer-adapter.svg) + +#### Multiple received + +In this scenario, a new tool is added that produces CDEvents. An existing +consumer wants to benefit from existing events as well as the events from the +new tool. + +![multiple-received](images/multiple-received.svg) + +A single consumer may receive events from heterogenous sources. ## Acknowledgments @@ -245,6 +416,28 @@ Keys and ENUM values are always written in [lowerCamelCase](https://en.wikipedia.org/wiki/Camel_case) for readability purposes. +### Simplified data model + +In the initial version of CDEvents we tackled a simple scenario in which +each artifact is built from a single repository and each service is deployed +from a single artifact. + +This data model is somewhat limited, but is has allowed us to put more focus +on the overall structure of the protocol in the first release. + +We plan to extend the data model to support more complex scenarios in upcoming +releases. + +### Artifacts + +The specification has chosen for v0.1.0 to adopt [package-urls][purl] (or purls) +as the format for any artifact identifier included in the spec. Purls provide a +consistent format for artifact identifiers across different package types. + +CDEvents wishes for a format that can be used to reference to an artifact, or +package, that is independent from the hosting storage, which is a property which +purls satisfy for several artifact types. + ## Whitepaper The [CDEvents whitepaper](./CDEvents_Whitepaper.pdf) has been originally @@ -259,4 +452,7 @@ created and its mission. [whitepaper]: https://cd.foundation/blog/2022/06/07/cdevents-publishes-first-whitepaper/ [ce-design-goals]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/primer.md#design-goals [ce-partitioning]: https://github.com/cloudevents/spec/blob/v1.0.1/extensions/partitioning.md -[purl]: https://github.com/package-url/purl-spec/blob/master/PURL-SPECIFICATION.rst \ No newline at end of file +[purl]: + https://github.com/package-url/purl-spec/blob/master/PURL-SPECIFICATION.rst +[sig-interop-vocabulariy]: + https://github.com/cdfoundation/sig-interoperability/blob/main/docs/vocabulary.md