From 13ea9dbc4b10413e7d75a2ef77f1e01b0243d207 Mon Sep 17 00:00:00 2001 From: abrennan Date: Fri, 18 Sep 2020 11:09:21 -0500 Subject: [PATCH] Updating eventing workflows for GA --- _topic_map.yml | 42 ++++++------- cli_reference/kn-cli-tools.adoc | 2 +- images/serverless-event-broker-workflow.png | Bin 0 -> 39446 bytes images/serverless-event-channel-workflow.png | Bin 0 -> 37301 bytes modules/apiserversource-kn-delete.adoc | 2 +- modules/apiserversource-kn.adoc | 2 +- modules/apiserversource-yaml-delete.adoc | 2 +- modules/apiserversource-yaml.adoc | 2 +- modules/delete-kn-trigger.adoc | 12 ++++ modules/kn-trigger-describe.adoc | 4 +- modules/kn-trigger-list.adoc | 6 +- modules/kn-trigger-update.adoc | 30 ++++++++- .../serverless-create-inmemorychannel.adoc | 31 ++++++++++ modules/serverless-create-kn-trigger.adoc | 29 +++++++++ modules/serverless-creating-broker-admin.adoc | 2 +- modules/serverless-creating-broker.adoc | 2 +- .../serverless-creating-subscriptions.adoc | 19 ++---- modules/serverless-deleting-broker-admin.adoc | 2 +- modules/serverless-inmemorychannel.adoc | 58 ++++++++---------- modules/serverless-pingsource-kn.adoc | 2 +- modules/serverless-pingsource-yaml.adoc | 2 +- .../serverless-service-ac-event-sources.adoc | 2 +- modules/serverless-sinkbinding-kn.adoc | 2 +- modules/serverless-sinkbinding-yaml.adoc | 2 +- .../serverless-event-architecture.adoc | 5 +- .../event_sources/knative-event-sources.adoc | 2 +- .../images | 0 .../modules | 0 .../event_workflows/serverless-channels.adoc | 34 ++++++++++ .../serverless-create-kn-trigger.adoc | 27 ++++++++ .../serverless-sinkbinding.adoc | 0 .../serverless-using-brokers.adoc | 56 +++++++++++++++++ .../installing-knative-eventing.adoc | 3 +- .../knative_eventing/serverless-channels.adoc | 19 ------ .../serverless-subscriptions.adoc | 11 ---- .../serverless-using-brokers.adoc | 24 -------- serverless/serverless-getting-started.adoc | 1 - 37 files changed, 286 insertions(+), 153 deletions(-) create mode 100644 images/serverless-event-broker-workflow.png create mode 100644 images/serverless-event-channel-workflow.png create mode 100644 modules/delete-kn-trigger.adoc create mode 100644 modules/serverless-create-inmemorychannel.adoc create mode 100644 modules/serverless-create-kn-trigger.adoc rename serverless/{knative_eventing => event_workflows}/images (100%) rename serverless/{knative_eventing => event_workflows}/modules (100%) create mode 100644 serverless/event_workflows/serverless-channels.adoc create mode 100644 serverless/event_workflows/serverless-create-kn-trigger.adoc rename serverless/{knative_eventing => event_workflows}/serverless-sinkbinding.adoc (100%) create mode 100644 serverless/event_workflows/serverless-using-brokers.adoc delete mode 100644 serverless/knative_eventing/serverless-channels.adoc delete mode 100644 serverless/knative_eventing/serverless-subscriptions.adoc delete mode 100644 serverless/knative_eventing/serverless-using-brokers.adoc diff --git a/_topic_map.yml b/_topic_map.yml index 6c787bdfdb..ce8a297809 100644 --- a/_topic_map.yml +++ b/_topic_map.yml @@ -2372,20 +2372,6 @@ Name: Serverless applications Dir: serverless Distros: openshift-enterprise,openshift-webscale Topics: -# Release notes -- Name: Release Notes - File: serverless-release-notes -# Support -- Name: Support - File: serverless-support -# Architecture -- Name: Architecture - Dir: architecture - Topics: - - Name: Knative Serving - File: serverless-serving-architecture - - Name: Knative Eventing - File: serverless-event-architecture # Intro / getting started - Name: Getting started File: serverless-getting-started @@ -2407,6 +2393,14 @@ Topics: File: removing-openshift-serverless - Name: Installing the Knative CLI File: installing-kn +# Architecture +- Name: Architecture + Dir: architecture + Topics: + - Name: Knative Serving + File: serverless-serving-architecture + - Name: Knative Eventing + File: serverless-event-architecture # Apps - Name: Creating and managing serverless applications File: serving-creating-managing-apps @@ -2430,21 +2424,15 @@ Topics: - Name: Splitting traffic between revisions File: splitting-traffic-between-revisions # Knative Eventing -- Name: Knative Eventing - Dir: knative_eventing +- Name: Event workflows + Dir: event_workflows Topics: # Brokers - - Name: Using brokers as an event delivery mechanism + - Name: Event delivery workflows using brokers and triggers File: serverless-using-brokers # Channels - - Name: Using channels + - Name: Event delivery workflows using channels File: serverless-channels -# Subscriptions - - Name: Using subscriptions to send events from a channel to a sink - File: serverless-subscriptions -# Triggers - - Name: Using triggers - File: serverless-kn-trigger # Sinkbinding - Name: Using SinkBinding File: serverless-sinkbinding @@ -2479,3 +2467,9 @@ Topics: Topics: - Name: Using NVIDIA GPU resources with serverless applications File: gpu-resources +# Release notes +- Name: Release Notes + File: serverless-release-notes +# Support +- Name: Support + File: serverless-support diff --git a/cli_reference/kn-cli-tools.adoc b/cli_reference/kn-cli-tools.adoc index 3636276d7a..394f623260 100644 --- a/cli_reference/kn-cli-tools.adoc +++ b/cli_reference/kn-cli-tools.adoc @@ -28,7 +28,7 @@ Key features of `kn` include: ==== Knative Eventing is currently available as a Technology Preview feature of {ServerlessProductName}. ==== -* Create xref:../serverless/knative_eventing/serverless-sinkbinding.adoc#serverless-sinkbinding[sink binding] to connect existing Kubernetes applications and Knative services. +* Create xref:../serverless/event_workflows/serverless-sinkbinding.adoc#serverless-sinkbinding[sink binding] to connect existing Kubernetes applications and Knative services. * Extend `kn` with flexible plugin architecture, similar to `kubectl`. // * Easily integrate {ServerlessProductName} with OpenShift Pipelines by using `kn` in an OpenShift Pipelines task // TODO: Add integrations later when we have docs about this. diff --git a/images/serverless-event-broker-workflow.png b/images/serverless-event-broker-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..aea669722c38d96a621dfd82d19346a6b015a75c GIT binary patch literal 39446 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 +---- diff --git a/modules/kn-trigger-describe.adoc b/modules/kn-trigger-describe.adoc index 734f35ba97..205ca20d04 100644 --- a/modules/kn-trigger-describe.adoc +++ b/modules/kn-trigger-describe.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-kn-trigger.adoc +// * serverless/event_workflows/serverless-kn-trigger.adoc [id="kn-trigger-describe_{context}"] = Describing a trigger using `kn` @@ -19,8 +19,6 @@ $ kn trigger describe + .Example output -+ - [source,terminal] ---- Name: ping diff --git a/modules/kn-trigger-list.adoc b/modules/kn-trigger-list.adoc index ac74059804..4c1d70bb06 100644 --- a/modules/kn-trigger-list.adoc +++ b/modules/kn-trigger-list.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-kn-trigger.adoc +// * serverless/event_workflows/serverless-kn-trigger.adoc [id="kn-trigger-list_{context}"] = Listing triggers using `kn` @@ -18,8 +18,6 @@ $ kn trigger list + .Example output: -+ - [source,terminal] ---- NAME BROKER SINK AGE CONDITIONS READY REASON @@ -38,3 +36,5 @@ ping default svc:edisplay 32s 5 OK / 5 True ---- $ kn trigger list -o json ---- + +//example output? diff --git a/modules/kn-trigger-update.adoc b/modules/kn-trigger-update.adoc index e5f5e501d5..7951eb712a 100644 --- a/modules/kn-trigger-update.adoc +++ b/modules/kn-trigger-update.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-kn-trigger.adoc +// * serverless/event_workflows/serverless-kn-trigger.adoc [id="kn-trigger-update_{context}"] = Updating a trigger using `kn` @@ -9,21 +9,49 @@ You can use the `kn trigger update` command with certain flags to update attribu .Example +<<<<<<< HEAD . Update a trigger to filter exact event attributes that match incoming events, such as `type=knative.dev.event`: +======= +* To update a trigger, enter the following command: ++ + +[source,terminal] +---- +$ kn trigger update --filter --sink [flags] +---- + ++ +You can update a trigger to filter exact event attributes that match incoming events, such as `type=knative.dev.event`. For example: ++ + +>>>>>>> Updating eventing workflows for GA [source,terminal] ---- $ kn trigger update --filter type=knative.dev.event ---- +<<<<<<< HEAD . Remove the filter attribute with key `type`: +======= ++ +You can also remove a filter attribute from a trigger. +For example, you can remove the filter attribute with key `type`: ++ +>>>>>>> Updating eventing workflows for GA [source,terminal] ---- $ kn trigger update --filter type- ---- +<<<<<<< HEAD . Update the sink of a trigger to use a service named `event-display`: +======= ++ +The following example shows how to update the sink of a trigger to `svc:new-service`: ++ +>>>>>>> Updating eventing workflows for GA [source,terminal] ---- diff --git a/modules/serverless-create-inmemorychannel.adoc b/modules/serverless-create-inmemorychannel.adoc new file mode 100644 index 0000000000..a447f24e12 --- /dev/null +++ b/modules/serverless-create-inmemorychannel.adoc @@ -0,0 +1,31 @@ +// Module included in the following assemblies: +// +// * serverless/event_workflows/serverless-channels.adoc + +[id="serverless-create-inmemorychannel_{context}"] += Creating a development channel + +.Procedure + +You can create a channel using the cluster default configuration by completing the following procedure. + +. Create a `Channel` object. +.. Create a YAML file and copy the following sample code into it: ++ + +[source,yaml] +---- +apiVersion: messaging.knative.dev/v1 +kind: Channel +metadata: + name: example-channel + namespace: default +---- + +.. Apply the YAML file by entering: ++ + +[source,terminal] +---- +$ oc apply -f +---- diff --git a/modules/serverless-create-kn-trigger.adoc b/modules/serverless-create-kn-trigger.adoc new file mode 100644 index 0000000000..5ab8b813d6 --- /dev/null +++ b/modules/serverless-create-kn-trigger.adoc @@ -0,0 +1,29 @@ +[id="serverless-create-kn-trigger_{context}"] += Creating a trigger using `kn` + +The Knative CLI provides a set of `kn trigger` commands that can be used to create and manage triggers. + +.Procedure + +* Create a trigger: ++ + +[source,terminal] +---- +$ kn trigger create --broker --filter --sink +---- + ++ +Alternatively, you can create a trigger and simultaneously create the `default` broker using broker injection: ++ + +[source,terminal] +---- +$ kn trigger create --inject-broker --filter --sink +---- + ++ +By default, triggers forward all events sent to a broker to sinks that are subscribed to that broker. ++ +Using the `--filter` attribute for triggers allows you to filter events from a broker, so that subscribers will only receive a subset of events based on your defined criteria. ++ diff --git a/modules/serverless-creating-broker-admin.adoc b/modules/serverless-creating-broker-admin.adoc index 8e90882a88..3767c56961 100644 --- a/modules/serverless-creating-broker-admin.adoc +++ b/modules/serverless-creating-broker-admin.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-using-brokers.adoc +// * serverless/event_workflows/serverless-using-brokers.adoc [id="serverless-creating-broker-admin_{context}"] = Creating a broker as a cluster administrator using namespace annotation diff --git a/modules/serverless-creating-broker.adoc b/modules/serverless-creating-broker.adoc index 1005ab8634..ce6a7be1bf 100644 --- a/modules/serverless-creating-broker.adoc +++ b/modules/serverless-creating-broker.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-using-brokers.adoc +// * serverless/event_workflows/serverless-using-brokers.adoc [id="serverless-creating-broker_{context}"] = Creating a broker as a developer diff --git a/modules/serverless-creating-subscriptions.adoc b/modules/serverless-creating-subscriptions.adoc index e2aa97d943..a22723231d 100644 --- a/modules/serverless-creating-subscriptions.adoc +++ b/modules/serverless-creating-subscriptions.adoc @@ -1,27 +1,16 @@ // Module included in the following assemblies: // // -// * serverless/knative_eventing/serverless-subscriptions.adoc +// * serverless/event_workflows/serverless-channels.adoc [id="serverless-creating-subscriptions_{context}"] = Creating a subscription -You can create a subscription to connect a service or other event sink to a channel. - -[IMPORTANT] -==== -Knative Eventing is a Technology Preview feature. The InMemoryChannel type is provided for development use only, and should not be used in a production environment. -==== - -.Prerequisites - -* You must have a current installation of xref:../../serverless/installing_serverless/installing-openshift-serverless.adoc#serverless-install-web-console_installing-openshift-serverless[{ServerlessProductName}], including Knative Serving and Eventing, in your {product-title} cluster. This can be installed by a cluster administrator. -* If you do not have an existing sink that you wish to use, create a Service to use as a sink by following the documentation on xref:../../serverless/serving-creating-managing-apps.adoc#serving-creating-managing-apps[Creating and managing serverless applications]. -* You must have a channel to connect your subscription to. See xref:../../serverless/knative_eventing/serverless-channels.adoc#serverless-channels[Using channels with Knative Eventing]. +You can create a `Subscription` object to connect a channel to a sink. In the following procedure, the example sink is a Knative service named `error-handler`. .Procedure -. Create a Subscription object to connect a channel to a service, by creating a YAML file containing the following: +. Create a YAML file and copy the following sample code into it: + [source,yaml] @@ -55,7 +44,7 @@ spec: <3> Configuration settings for event delivery. This tells the subscription what happens to events that cannot be delivered to the subscriber. When this is configured, events that failed to be consumed are sent to the `deadLetterSink`. The event is dropped, no re-delivery of the event is attempted, and an error is logged in the system. The `deadLetterSink` value must be a link:https://pkg.go.dev/knative.dev/pkg/apis/duck/v1?tab=doc#Destination[Destination]. <4> Configuration settings for the subscriber. This is the event sink that events are delivered to from the channel. -. Apply the YAML file by entering: +. Apply the YAML file: + [source,terminal] diff --git a/modules/serverless-deleting-broker-admin.adoc b/modules/serverless-deleting-broker-admin.adoc index d404002df2..c01a3deaed 100644 --- a/modules/serverless-deleting-broker-admin.adoc +++ b/modules/serverless-deleting-broker-admin.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-using-brokers.adoc +// * serverless/event_workflows/serverless-using-brokers.adoc [id="serverless-deleting-broker-admin_{context}"] = Deleting a broker that was created by a cluster administrator using namespace annotation diff --git a/modules/serverless-inmemorychannel.adoc b/modules/serverless-inmemorychannel.adoc index 129dc7db23..2a338d4d3c 100644 --- a/modules/serverless-inmemorychannel.adoc +++ b/modules/serverless-inmemorychannel.adoc @@ -1,51 +1,36 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-channels.adoc +// * serverless/event_workflows/serverless-channels.adoc [id="serverless-inmemorychannel_{context}"] -= Using the default InMemoryChannel configuration += Using the default development channel configuration -InMemoryChannels are for development use only, and should not be used in a production environment. - -The following are limitations of InMemoryChannel type channels: - -* No event persistence is available. If a Pod goes down, events on that Pod are lost. -* InMemoryChannel type channels do not implement event ordering, so two events that are received in the channel at the same time can be delivered to a subscriber in any order. -* If a subscriber rejects an event, there are no re-delivery attempts. Instead, the rejected event is sent to a `deadLetterSink` if this sink exists, or is otherwise dropped. For more information about configuring event delivery and `deadLetterSink` settings for a channel, see xref:../../serverless/knative_eventing/serverless-subscriptions.adoc#serverless-subscriptions[Using subscriptions to send events from a channel to a sink]. - -When you install Knative Eventing, the following custom resource definition (CRD) is created automatically: +When you install Knative Eventing, the following `default-ch-webhook` config map is created automatically in the `knative-eventing` namespace: [source,yaml] ---- apiVersion: v1 kind: ConfigMap metadata: + name: default-ch-webhook namespace: knative-eventing - name: config-br-default-channel data: - channelTemplateSpec: | - apiVersion: messaging.knative.dev/v1 - kind: InMemoryChannel + default-ch-config: | + clusterDefault: + apiVersion: messaging.knative.dev/v1 + kind: InMemoryChannel + namespaceDefaults: + some-namespace: + apiVersion: messaging.knative.dev/v1 + kind: InMemoryChannel ---- -.Creating a channel using the cluster default configuration +This config map can specify either a cluster-wide default channel implementation, or a namespace-specific default channel implementation. +Configuring a namespace-specific default overrides any cluster-wide settings. -* Create a generic Channel custom object. -+ - -[source,yaml] ----- -apiVersion: messaging.knative.dev/v1 -kind: Channel -metadata: - name: example-channel - namespace: default ----- - -+ -When the Channel object is created, a mutating admission webhook adds a set of `spec.channelTemplate` properties for the Channel object based on the default channel implementation. -+ +After you create a `Channel` object, a mutating admission webhook adds a set of `spec.channelTemplate` properties for the `Channel` object based on the default channel implementation. +.Example `Channel` object with `spec.channelTemplate` properties [source,yaml] ---- apiVersion: messaging.knative.dev/v1 @@ -59,10 +44,15 @@ spec: kind: InMemoryChannel ---- -The channel controller then creates the backing channel instance based on that `spec.channelTemplate` configuration. The `spec.channelTemplate` properties cannot be changed after creation, because they are set by the default channel mechanism rather than by the user. +The channel controller then creates the backing channel instance based on the `spec.channelTemplate` configuration. -When this mechanism is used, two objects are created: a generic channel, and an InMemoryChannel type channel. +[NOTE] +==== +The `spec.channelTemplate` properties cannot be changed after creation, because they are set by the default channel mechanism rather than by the user. +==== -The generic channel acts as a proxy that copies its subscriptions to the InMemoryChannel, and sets its status to reflect the status of the backing InMemoryChannel type channel. +When this mechanism is used, two objects are created: a generic channel, and an `InMemoryChannel` channel. + +The generic channel acts as a proxy that copies its subscriptions to the `InMemoryChannel` channel, and sets its status to reflect the status of the backing `InMemoryChannel` channel. Because the channel in this example is created in the default namespace, the channel uses the cluster default, which is InMemoryChannel. diff --git a/modules/serverless-pingsource-kn.adoc b/modules/serverless-pingsource-kn.adoc index 931f70b8e4..d674580a92 100644 --- a/modules/serverless-pingsource-kn.adoc +++ b/modules/serverless-pingsource-kn.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-pingsource.adoc +// * serverless/event_workflows/serverless-pingsource.adoc [id="serverless-pingsource-kn_{context}"] = Using a PingSource with the `kn` CLI diff --git a/modules/serverless-pingsource-yaml.adoc b/modules/serverless-pingsource-yaml.adoc index fd890e6945..4e7e57c8d0 100644 --- a/modules/serverless-pingsource-yaml.adoc +++ b/modules/serverless-pingsource-yaml.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// * serverless/knative_eventing/serverless-pingsource.adoc +// * serverless/event_workflows/serverless-pingsource.adoc [id="serverless-pingsource-yaml_{context}"] = Using a PingSource with YAML diff --git a/modules/serverless-service-ac-event-sources.adoc b/modules/serverless-service-ac-event-sources.adoc index 1cbcadd2f3..ddad894d64 100644 --- a/modules/serverless-service-ac-event-sources.adoc +++ b/modules/serverless-service-ac-event-sources.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// serverless/knative_eventing/serverless-listing-event-sources.adoc +// serverless/event_workflows/serverless-listing-event-sources.adoc [id="serverless-service-ac-event-sources_context"] = Creating a service account, role, and binding for event sources diff --git a/modules/serverless-sinkbinding-kn.adoc b/modules/serverless-sinkbinding-kn.adoc index 4079e69859..e98c9f14cb 100644 --- a/modules/serverless-sinkbinding-kn.adoc +++ b/modules/serverless-sinkbinding-kn.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// serverless/knative_eventing/serverless-sinkbinding.adoc +// serverless/event_workflows/serverless-sinkbinding.adoc [id="serverless-sinkbinding-kn_{context}"] = Using SinkBinding with the Knative CLI (`kn`) diff --git a/modules/serverless-sinkbinding-yaml.adoc b/modules/serverless-sinkbinding-yaml.adoc index 0547aed2e5..73f6fe9bc5 100644 --- a/modules/serverless-sinkbinding-yaml.adoc +++ b/modules/serverless-sinkbinding-yaml.adoc @@ -1,6 +1,6 @@ // Module included in the following assemblies: // -// serverless/knative_eventing/serverless-sinkbinding.adoc +// serverless/event_workflows/serverless-sinkbinding.adoc [id="serverless-sinkbinding-yaml_{context}"] = Using SinkBinding with the YAML method diff --git a/serverless/architecture/serverless-event-architecture.adoc b/serverless/architecture/serverless-event-architecture.adoc index af489df6d0..b42cb00d2a 100644 --- a/serverless/architecture/serverless-event-architecture.adoc +++ b/serverless/architecture/serverless-event-architecture.adoc @@ -14,9 +14,8 @@ These events conform to the link:https://cloudevents.io[CloudEvents specificatio You can propagate an event from an xref:../event_sources/knative-event-sources.adoc#knative-event-sources[event source] to multiple event sinks by using: -* xref:../knative_eventing/serverless-channels.adoc#serverless-channels[channels] and subscriptions, or -* xref:../knative_eventing/serverless-using-brokers.adoc#serverless-using-brokers[brokers] and xref:../knative_eventing/serverless-kn-trigger.adoc#serverless-kn-trigger[triggers]. -// TODO: Add subscription docs +* xref:../event_workflows/serverless-channels.adoc#serverless-channels[channels] and subscriptions, or +* xref:../event_workflows/serverless-using-brokers.adoc#serverless-using-brokers[brokers] and triggers. Events are buffered if the destination sink is unavailable. // For more information about creating an Event delivery system, see diff --git a/serverless/event_sources/knative-event-sources.adoc b/serverless/event_sources/knative-event-sources.adoc index cf1611dca1..a9eb9117ab 100644 --- a/serverless/event_sources/knative-event-sources.adoc +++ b/serverless/event_sources/knative-event-sources.adoc @@ -12,7 +12,7 @@ Currently, {ServerlessProductName} supports the following event source types: ApiServerSource:: Connects a sink to the Kubernetes API server. PingSource:: Periodically sends ping events with a constant payload. It can be used as a timer. -xref:../../serverless/knative_eventing/serverless-sinkbinding.adoc#serverless-sinkbinding[SinkBinding] is also supported, which allows you to connect core Kubernetes resources such as Deployment, Job, or StatefulSet with a sink. +xref:../../serverless/event_workflows/serverless-sinkbinding.adoc#serverless-sinkbinding[SinkBinding] is also supported, which allows you to connect core Kubernetes resources such as Deployment, Job, or StatefulSet with a sink. You can create and manage Knative event sources using the **Developer** perspective in the {product-title} web console, the `kn` CLI, or by applying YAML files. diff --git a/serverless/knative_eventing/images b/serverless/event_workflows/images similarity index 100% rename from serverless/knative_eventing/images rename to serverless/event_workflows/images diff --git a/serverless/knative_eventing/modules b/serverless/event_workflows/modules similarity index 100% rename from serverless/knative_eventing/modules rename to serverless/event_workflows/modules diff --git a/serverless/event_workflows/serverless-channels.adoc b/serverless/event_workflows/serverless-channels.adoc new file mode 100644 index 0000000000..841ee768de --- /dev/null +++ b/serverless/event_workflows/serverless-channels.adoc @@ -0,0 +1,34 @@ +include::modules/serverless-document-attributes.adoc[] +[id="serverless-channels"] += Event delivery workflows using channels +include::modules/common-attributes.adoc[] +:context: serverless-channels + +toc::[] + +Events can be sent from a source to a sink by using channels and subscriptions for event delivery. + +image::serverless-event-channel-workflow.png[Channel workflow overview] +// just sources or do we need to talk about other event producers? + +Channels are custom resources that define a single event-forwarding and persistence layer. + +After events have been sent to a channel, these events can be sent to multiple Knative services, or other sinks, by using a subscription. + +The default configuration for channel instances is defined in the `default-ch-webhook` ConfigMap. +Developers can create their own channels directly by instantiating a supported `Channel` object. + +[id="serverless-channels-supported-types"] +== Supported channel types + +Currently, {ServerlessProductName} only supports `InMemoryChannel` kind channels for development use, as part of the Knative Eventing Technology Preview. + +The following are limitations of InMemoryChannel type channels: + +* No event persistence is available. If a Pod goes down, events on that Pod are lost. +* InMemoryChannel type channels do not implement event ordering, so two events that are received in the channel at the same time can be delivered to a subscriber in any order. +* If a subscriber rejects an event, there are no re-delivery attempts. Instead, the rejected event is sent to a `deadLetterSink` if this sink exists, or is otherwise dropped. + +include::modules/serverless-inmemorychannel.adoc[leveloffset=+2] +include::modules/serverless-create-inmemorychannel.adoc[leveloffset=+1] +include::modules/serverless-creating-subscriptions.adoc[leveloffset=+1] diff --git a/serverless/event_workflows/serverless-create-kn-trigger.adoc b/serverless/event_workflows/serverless-create-kn-trigger.adoc new file mode 100644 index 0000000000..1ee9f7d0f1 --- /dev/null +++ b/serverless/event_workflows/serverless-create-kn-trigger.adoc @@ -0,0 +1,27 @@ +[id="serverless-create-kn-trigger_{context}"] += Creating a trigger using `kn` + +All events that are sent to a broker will be sent to all of the subscribers of that broker by default. + +Using triggers allows you to filter events from a broker, so that subscribers will only receive a subset of events based on your defined criteria. + +The Knative CLI provides a set of `kn trigger` commands that can be used to create and manage triggers. + +.Procedure + +* Create a trigger: ++ + +[source,terminal] +---- +$ kn trigger create --broker --filter --sink +---- + ++ +Alternatively, you can create a trigger and simultaneously create the `default` broker using broker injection: ++ + +[source,terminal] +---- +$ kn trigger create --inject-broker --filter --sink +---- diff --git a/serverless/knative_eventing/serverless-sinkbinding.adoc b/serverless/event_workflows/serverless-sinkbinding.adoc similarity index 100% rename from serverless/knative_eventing/serverless-sinkbinding.adoc rename to serverless/event_workflows/serverless-sinkbinding.adoc diff --git a/serverless/event_workflows/serverless-using-brokers.adoc b/serverless/event_workflows/serverless-using-brokers.adoc new file mode 100644 index 0000000000..37a5d86a30 --- /dev/null +++ b/serverless/event_workflows/serverless-using-brokers.adoc @@ -0,0 +1,56 @@ +[id="serverless-using-brokers"] += Event delivery workflows using brokers and triggers +include::modules/common-attributes.adoc[] +include::modules/serverless-document-attributes.adoc[] +:context: serverless-using-brokers + +toc::[] + +Events are sent from an event source to your broker as an HTTP POST request. +After events have entered the broker they can be filtered by event attributes, and sent as an HTTP POST request to an event sink by using triggers. + +image::serverless-event-broker-workflow.png[Broker workflow overview] + +You can create the `default` broker by using the `knative-eventing-injection` annotation. + +[NOTE] +==== +Although both developers and cluster administrators can add the `knative-eventing-injection` annotation, only cluster administrators can remove brokers created using this annotation. +==== + +include::modules/serverless-creating-broker.adoc[leveloffset=+1] +include::modules/serverless-creating-broker-admin.adoc[leveloffset=+1] +include::modules/serverless-deleting-broker-admin.adoc[leveloffset=+2] + +[id="serverless-using-brokers-triggers"] +== Using triggers + +You can create triggers using YAML, as shown in the following example: + +.Example trigger YAML +[source,yaml] +---- +apiVersion: eventing.knative.dev/v1alpha1 +kind: Trigger +metadata: + name: trigger-example <1> +spec: + broker: default <2> + subscriber: + ref: + apiVersion: serving.knative.dev/v1 + kind: Service + name: my-service <3> +---- + +<1> The name of the trigger. +<2> The name of the broker where events will be filtered from. If the broker is not specified, the trigger will revert to using the `default` broker. +<3> The name of the service that will consumer filtered events. + +However, the Knative CLI (`kn`) provides the following commands to simplify creating and managing triggers. + +include::modules/serverless-create-kn-trigger.adoc[leveloffset=+2] +include::modules/kn-trigger-list.adoc[leveloffset=+2] +include::modules/kn-trigger-describe.adoc[leveloffset=+2] +include::modules/kn-trigger-update.adoc[leveloffset=+2] +include::modules/delete-kn-trigger.adoc[leveloffset=+2] diff --git a/serverless/installing_serverless/installing-knative-eventing.adoc b/serverless/installing_serverless/installing-knative-eventing.adoc index 1d30f1f62f..fdd146e570 100644 --- a/serverless/installing_serverless/installing-knative-eventing.adoc +++ b/serverless/installing_serverless/installing-knative-eventing.adoc @@ -18,6 +18,7 @@ This guide provides information about installing Knative Eventing using the defa include::modules/serverless-create-eventing-namespace.adoc[leveloffset=+1] +[id="installing-knative-eventing-prerequisites"] == Prerequisites * An {product-title} account with cluster administrator access * Installed {ServerlessOperatorName} @@ -26,7 +27,7 @@ include::modules/serverless-create-eventing-namespace.adoc[leveloffset=+1] include::modules/serverless-install-eventing-web-console.adoc[leveloffset=+1] include::modules/serverless-install-eventing-yaml.adoc[leveloffset=+1] +[id="installing-knative-eventing-next-steps"] == Next steps -* For services and serving functionality on {ServerlessProductName}, you can install the Knative Serving component. See the documentation on xref:../installing_serverless/installing-knative-serving.adoc#installing-knative-serving[Installing Knative Serving]. * Install the Knative CLI to use `kn` commands with Knative Eventing. For example, `kn source` commands. See the documentation on xref:../installing_serverless/installing-kn#installing-kn[Installing the Knative CLI (`kn`)]. diff --git a/serverless/knative_eventing/serverless-channels.adoc b/serverless/knative_eventing/serverless-channels.adoc deleted file mode 100644 index 32dd754bdd..0000000000 --- a/serverless/knative_eventing/serverless-channels.adoc +++ /dev/null @@ -1,19 +0,0 @@ -include::modules/serverless-document-attributes.adoc[] -[id="serverless-channels"] -= Using channels -include::modules/common-attributes.adoc[] -:context: serverless-channels - -toc::[] - -It is possible to sink events from an event source to a Knative Eventing channel. -Channels are custom resources (CRs) that define a single event-forwarding and persistence layer. -After events have been sent to a channel, these events can be sent to multiple Knative services by using a subscription. - -The default configuration for channel instances is defined in the `default-ch-webhook` ConfigMap. However, developers can still create their own channels directly by instantiating a supported channel object. - -== Supported channel types - -Currently, {ServerlessProductName} only supports the use of InMemoryChannel type channels as part of the Knative Eventing Technology Preview. - -include::modules/serverless-inmemorychannel.adoc[leveloffset=+1] diff --git a/serverless/knative_eventing/serverless-subscriptions.adoc b/serverless/knative_eventing/serverless-subscriptions.adoc deleted file mode 100644 index e4a1133d0a..0000000000 --- a/serverless/knative_eventing/serverless-subscriptions.adoc +++ /dev/null @@ -1,11 +0,0 @@ -include::modules/serverless-document-attributes.adoc[] -[id="serverless-subscriptions"] -= Using subscriptions to send events from a channel to a sink -:context: serverless-subscriptions -include::modules/common-attributes.adoc[] - -toc::[] - -Subscriptions deliver events to event sinks from a Channel. - -include::modules/serverless-creating-subscriptions.adoc[leveloffset=+1] diff --git a/serverless/knative_eventing/serverless-using-brokers.adoc b/serverless/knative_eventing/serverless-using-brokers.adoc deleted file mode 100644 index fb7b947462..0000000000 --- a/serverless/knative_eventing/serverless-using-brokers.adoc +++ /dev/null @@ -1,24 +0,0 @@ -[id="serverless-using-brokers"] -= Using brokers as an event delivery mechanism -include::modules/common-attributes.adoc[] -include::modules/serverless-document-attributes.adoc[] -:context: serverless-using-brokers - -toc::[] - -You can use an xref:../../serverless/event_sources/knative-event-sources.adoc#knative-event-sources[event source] or a xref:../../serverless/knative_eventing/serverless-sinkbinding.adoc#serverless-sinkbinding[SinkBinding], the `default` broker, and a trigger together to decouple applications that produce events from the destination configuration. - -Events are sent from an event source to the broker as an HTTP POST request. -After events have entered the broker, they can be filtered and sent to an event sink by using triggers. -You can use a trigger to consume events from a broker based on event attributes. Your application will receive events as an HTTP POST request. - -You can create the `default` broker by using the `knative-eventing-injection` annotation. - -[NOTE] -==== -Although both developers and cluster administrators can add the `knative-eventing-injection` annotation, only cluster administrators can remove brokers created using this annotation. -==== - -include::modules/serverless-creating-broker.adoc[leveloffset=+1] -include::modules/serverless-creating-broker-admin.adoc[leveloffset=+1] -include::modules/serverless-deleting-broker-admin.adoc[leveloffset=+1] diff --git a/serverless/serverless-getting-started.adoc b/serverless/serverless-getting-started.adoc index 4b12ccd035..7d4ff55783 100644 --- a/serverless/serverless-getting-started.adoc +++ b/serverless/serverless-getting-started.adoc @@ -30,4 +30,3 @@ include::modules/technology-preview.adoc[leveloffset=+2] * Install the xref:../serverless/installing_serverless/installing-openshift-serverless.adoc#installing-openshift-serverless[{ServerlessOperatorName}] on your {product-title} cluster to get started. * View the xref:../serverless/serverless-release-notes.adoc#serverless-release-notes[{ServerlessProductName} release notes]. -* Create an application by following the documentation on xref:../serverless/serving-creating-managing-apps.adoc#serving-creating-managing-apps[Creating and managing serverless applications].