You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by ri...@apache.org on 2024/02/28 19:39:26 UTC

(incubator-kie-kogito-serverless-operator) branch main updated: [KOGITO-7754] create Knative eventing resources (#350)

This is an automated email from the ASF dual-hosted git repository.

ricardozanini pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-kogito-serverless-operator.git


The following commit(s) were added to refs/heads/main by this push:
     new 76ef9024 [KOGITO-7754] create Knative eventing resources (#350)
76ef9024 is described below

commit 76ef90247c695ea6973e7887c794b03a1541ac63
Author: richard wang <58...@users.noreply.github.com>
AuthorDate: Wed Feb 28 14:39:22 2024 -0500

    [KOGITO-7754] create Knative eventing resources (#350)
---
 api/v1alpha08/sonataflow_types.go                  |  3 +
 api/v1alpha08/zz_generated.deepcopy.go             |  6 ++
 .../sonataflow-operator.clusterserviceversion.yaml | 33 ++++++++
 bundle/manifests/sonataflow.org_sonataflows.yaml   | 47 +++++++++++
 config/crd/bases/sonataflow.org_sonataflows.yaml   | 47 +++++++++++
 .../sonataflow-operator.clusterserviceversion.yaml |  3 +
 config/rbac/builder_role.yaml                      | 30 +++++++
 controllers/profiles/common/constants/workflows.go |  7 ++
 controllers/profiles/common/ensurer.go             | 75 +++++++++++++----
 controllers/profiles/common/knative.go             | 76 ++++++++++++++++++
 controllers/profiles/common/object_creators.go     | 93 ++++++++++++++++++++++
 .../profiles/common/object_creators_test.go        | 31 ++++++++
 .../profiles/common/properties/application.go      |  8 +-
 .../profiles/common/properties/application_test.go |  7 +-
 .../profiles/common/properties/properties.go       | 49 ++++++++++++
 controllers/profiles/common/reconciler.go          |  5 +-
 controllers/profiles/dev/profile_dev.go            |  1 +
 controllers/profiles/dev/states_dev.go             |  6 ++
 controllers/profiles/prod/deployment_handler.go    |  5 ++
 controllers/profiles/prod/profile_prod.go          |  2 +
 .../workflows.go => workflowdef/services.go}       | 18 ++++-
 main.go                                            |  5 ++
 operator.yaml                                      | 77 ++++++++++++++++++
 ...ataflow.org_v1alpha08_sonataflow_vet_event.yaml | 72 +++++++++++++++++
 test/yaml.go                                       |  5 ++
 25 files changed, 684 insertions(+), 27 deletions(-)

diff --git a/api/v1alpha08/sonataflow_types.go b/api/v1alpha08/sonataflow_types.go
index 04aa5440..ac32fe35 100644
--- a/api/v1alpha08/sonataflow_types.go
+++ b/api/v1alpha08/sonataflow_types.go
@@ -659,6 +659,9 @@ type SonataFlowSpec struct {
 	PodTemplate PodTemplateSpec `json:"podTemplate,omitempty"`
 	// Persistence defines the database persistence configuration for the workflow
 	Persistence *PersistenceOptionsSpec `json:"persistence,omitempty"`
+	// Sink describes the sinkBinding details of this SonataFlow instance.
+	//+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="sink"
+	Sink *duckv1.Destination `json:"sink,omitempty"`
 }
 
 // SonataFlowStatus defines the observed state of SonataFlow
diff --git a/api/v1alpha08/zz_generated.deepcopy.go b/api/v1alpha08/zz_generated.deepcopy.go
index 75e8bf32..fb2db187 100644
--- a/api/v1alpha08/zz_generated.deepcopy.go
+++ b/api/v1alpha08/zz_generated.deepcopy.go
@@ -26,6 +26,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"knative.dev/pkg/apis"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
 )
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
@@ -1174,6 +1175,11 @@ func (in *SonataFlowSpec) DeepCopyInto(out *SonataFlowSpec) {
 		*out = new(PersistenceOptionsSpec)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.Sink != nil {
+		in, out := &in.Sink, &out.Sink
+		*out = new(duckv1.Destination)
+		(*in).DeepCopyInto(*out)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SonataFlowSpec.
diff --git a/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml b/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
index cffce25e..7597683f 100644
--- a/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
+++ b/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
@@ -312,6 +312,9 @@ spec:
           definition. For example, a collection of OpenAPI specification files.
         displayName: resources
         path: resources
+      - description: Sink describes the sinkBinding details of this SonataFlow instance.
+        displayName: sink
+        path: sink
       statusDescriptors:
       - description: Address is used as a part of Addressable interface (status.address.url)
           for knative
@@ -400,6 +403,36 @@ spec:
           - patch
           - update
           - watch
+        - apiGroups:
+          - eventing.knative.dev
+          resources:
+          - triggers
+          - triggers/status
+          - triggers/finalizers
+          verbs:
+          - create
+          - delete
+          - deletecollection
+          - get
+          - list
+          - patch
+          - update
+          - watch
+        - apiGroups:
+          - sources.knative.dev
+          resources:
+          - sinkbindings
+          - sinkbindings/status
+          - sinkbindings/finalizers
+          verbs:
+          - create
+          - delete
+          - deletecollection
+          - get
+          - list
+          - patch
+          - update
+          - watch
         - apiGroups:
           - coordination.k8s.io
           resources:
diff --git a/bundle/manifests/sonataflow.org_sonataflows.yaml b/bundle/manifests/sonataflow.org_sonataflows.yaml
index 76c704fb..6836cd49 100644
--- a/bundle/manifests/sonataflow.org_sonataflows.yaml
+++ b/bundle/manifests/sonataflow.org_sonataflows.yaml
@@ -9346,6 +9346,53 @@ spec:
                       type: object
                     type: array
                 type: object
+              sink:
+                description: Sink describes the sinkBinding details of this SonataFlow
+                  instance.
+                properties:
+                  CACerts:
+                    description: CACerts are Certification Authority (CA) certificates
+                      in PEM format according to https://www.rfc-editor.org/rfc/rfc7468.
+                      If set, these CAs are appended to the set of CAs provided by
+                      the Addressable target, if any.
+                    type: string
+                  ref:
+                    description: Ref points to an Addressable.
+                    properties:
+                      address:
+                        description: Address points to a specific Address Name.
+                        type: string
+                      apiVersion:
+                        description: API version of the referent.
+                        type: string
+                      group:
+                        description: 'Group of the API, without the version of the
+                          group. This can be used as an alternative to the APIVersion,
+                          and then resolved using ResolveGroup. Note: This API is
+                          EXPERIMENTAL and might break anytime. For more details:
+                          https://github.com/knative/eventing/issues/5086'
+                        type: string
+                      kind:
+                        description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                        type: string
+                      name:
+                        description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                        type: string
+                      namespace:
+                        description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
+                          This is optional field, it gets defaulted to the object
+                          holding it if left out.'
+                        type: string
+                    required:
+                    - kind
+                    - name
+                    type: object
+                  uri:
+                    description: URI can be an absolute URL(non-empty scheme and non-empty
+                      host) pointing to the target or a relative URI. Relative URIs
+                      will be resolved using the base URI retrieved from Ref.
+                    type: string
+                type: object
             required:
             - flow
             type: object
diff --git a/config/crd/bases/sonataflow.org_sonataflows.yaml b/config/crd/bases/sonataflow.org_sonataflows.yaml
index e5214329..a9df118f 100644
--- a/config/crd/bases/sonataflow.org_sonataflows.yaml
+++ b/config/crd/bases/sonataflow.org_sonataflows.yaml
@@ -9347,6 +9347,53 @@ spec:
                       type: object
                     type: array
                 type: object
+              sink:
+                description: Sink describes the sinkBinding details of this SonataFlow
+                  instance.
+                properties:
+                  CACerts:
+                    description: CACerts are Certification Authority (CA) certificates
+                      in PEM format according to https://www.rfc-editor.org/rfc/rfc7468.
+                      If set, these CAs are appended to the set of CAs provided by
+                      the Addressable target, if any.
+                    type: string
+                  ref:
+                    description: Ref points to an Addressable.
+                    properties:
+                      address:
+                        description: Address points to a specific Address Name.
+                        type: string
+                      apiVersion:
+                        description: API version of the referent.
+                        type: string
+                      group:
+                        description: 'Group of the API, without the version of the
+                          group. This can be used as an alternative to the APIVersion,
+                          and then resolved using ResolveGroup. Note: This API is
+                          EXPERIMENTAL and might break anytime. For more details:
+                          https://github.com/knative/eventing/issues/5086'
+                        type: string
+                      kind:
+                        description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                        type: string
+                      name:
+                        description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                        type: string
+                      namespace:
+                        description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
+                          This is optional field, it gets defaulted to the object
+                          holding it if left out.'
+                        type: string
+                    required:
+                    - kind
+                    - name
+                    type: object
+                  uri:
+                    description: URI can be an absolute URL(non-empty scheme and non-empty
+                      host) pointing to the target or a relative URI. Relative URIs
+                      will be resolved using the base URI retrieved from Ref.
+                    type: string
+                type: object
             required:
             - flow
             type: object
diff --git a/config/manifests/bases/sonataflow-operator.clusterserviceversion.yaml b/config/manifests/bases/sonataflow-operator.clusterserviceversion.yaml
index 1f65bbed..089ae24b 100644
--- a/config/manifests/bases/sonataflow-operator.clusterserviceversion.yaml
+++ b/config/manifests/bases/sonataflow-operator.clusterserviceversion.yaml
@@ -196,6 +196,9 @@ spec:
           definition. For example, a collection of OpenAPI specification files.
         displayName: resources
         path: resources
+      - description: Sink describes the sinkBinding details of this SonataFlow instance.
+        displayName: sink
+        path: sink
       statusDescriptors:
       - description: Address is used as a part of Addressable interface (status.address.url)
           for knative
diff --git a/config/rbac/builder_role.yaml b/config/rbac/builder_role.yaml
index 9d00da3f..70b2ab54 100644
--- a/config/rbac/builder_role.yaml
+++ b/config/rbac/builder_role.yaml
@@ -57,6 +57,36 @@ rules:
   resources:
     - roles
     - rolebindings
+  verbs:
+    - create
+    - delete
+    - deletecollection
+    - get
+    - list
+    - patch
+    - update
+    - watch
+- apiGroups:
+    - eventing.knative.dev
+  resources:
+    - triggers
+    - triggers/status
+    - triggers/finalizers
+  verbs:
+    - create
+    - delete
+    - deletecollection
+    - get
+    - list
+    - patch
+    - update
+    - watch
+- apiGroups:
+    - sources.knative.dev
+  resources:
+    - sinkbindings
+    - sinkbindings/status
+    - sinkbindings/finalizers
   verbs:
     - create
     - delete
diff --git a/controllers/profiles/common/constants/workflows.go b/controllers/profiles/common/constants/workflows.go
index a64002ad..8087f963 100644
--- a/controllers/profiles/common/constants/workflows.go
+++ b/controllers/profiles/common/constants/workflows.go
@@ -16,4 +16,11 @@ package constants
 
 const (
 	MicroprofileServiceCatalogPropertyPrefix = "org.kie.kogito.addons.discovery."
+	KogitoOutgoingEventsURL                  = "mp.messaging.outgoing.kogito_outgoing_stream.url"
+	KogitoOutgoingEventsConnector            = "mp.messaging.outgoing.kogito_outgoing_stream.connector"
+	KogitoIncomingEventsConnector            = "mp.messaging.incoming.kogito_incoming_stream.connector"
+	KogitoIncomingEventsPath                 = "mp.messaging.incoming.kogito_incoming_stream.path"
+	KnativeHealthEnabled                     = "org.kie.kogito.addons.knative.eventing.health-enabled"
+	KnativeInjectedEnvVar                    = "${K_SINK}"
+	KnativeEventingBrokerDefault             = "default"
 )
diff --git a/controllers/profiles/common/ensurer.go b/controllers/profiles/common/ensurer.go
index 980d5cbf..a1b8c92c 100644
--- a/controllers/profiles/common/ensurer.go
+++ b/controllers/profiles/common/ensurer.go
@@ -32,6 +32,7 @@ import (
 
 var _ ObjectEnsurer = &defaultObjectEnsurer{}
 var _ ObjectEnsurer = &noopObjectEnsurer{}
+var _ ObjectsEnsurer = &defaultObjectsEnsurer{}
 
 type ObjectEnsurer interface {
 	Ensure(ctx context.Context, workflow *operatorapi.SonataFlow, visitors ...MutateVisitor) (client.Object, controllerutil.OperationResult, error)
@@ -77,22 +78,10 @@ func (d *defaultObjectEnsurer) Ensure(ctx context.Context, workflow *operatorapi
 	result := controllerutil.OperationResultNone
 
 	object, err := d.creator(workflow)
-	if err != nil {
-		return nil, result, err
-	}
-	if result, err = controllerutil.CreateOrPatch(ctx, d.c, object,
-		func() error {
-			for _, v := range visitors {
-				if visitorErr := v(object)(); visitorErr != nil {
-					return visitorErr
-				}
-			}
-			return controllerutil.SetControllerReference(workflow, object, d.c.Scheme())
-		}); err != nil {
+	if err != nil || object == nil {
 		return nil, result, err
 	}
-	klog.V(log.I).InfoS("Object operation finalized", "result", result, "kind", object.GetObjectKind().GroupVersionKind().String(), "name", object.GetName(), "namespace", object.GetNamespace())
-	return object, result, nil
+	return ensureObject(ctx, workflow, visitors, result, d.c, object)
 }
 
 // defaultObjectEnsurerWithPlatform is the equivalent of defaultObjectEnsurer for resources that require a reference to the SonataFlowPlatform
@@ -136,3 +125,61 @@ func (d *noopObjectEnsurer) Ensure(ctx context.Context, workflow *operatorapi.So
 	result := controllerutil.OperationResultNone
 	return nil, result, nil
 }
+
+// ObjectsEnsurer is an ensurer to apply multiple objects
+type ObjectsEnsurer interface {
+	Ensure(ctx context.Context, workflow *operatorapi.SonataFlow, visitors ...MutateVisitor) []ObjectEnsurerResult
+}
+
+type ObjectEnsurerResult struct {
+	client.Object
+	Result controllerutil.OperationResult
+	Error  error
+}
+
+func NewObjectsEnsurer(client client.Client, creator ObjectsCreator) ObjectsEnsurer {
+	return &defaultObjectsEnsurer{
+		c:       client,
+		creator: creator,
+	}
+}
+
+type defaultObjectsEnsurer struct {
+	ObjectsEnsurer
+	c       client.Client
+	creator ObjectsCreator
+}
+
+func (d *defaultObjectsEnsurer) Ensure(ctx context.Context, workflow *operatorapi.SonataFlow, visitors ...MutateVisitor) []ObjectEnsurerResult {
+	result := controllerutil.OperationResultNone
+
+	objects, err := d.creator(workflow)
+	if err != nil {
+		return []ObjectEnsurerResult{{nil, result, err}}
+	}
+	var ensureResult []ObjectEnsurerResult
+	for _, object := range objects {
+		ensureObject, c, err := ensureObject(ctx, workflow, visitors, result, d.c, object)
+		ensureResult = append(ensureResult, ObjectEnsurerResult{ensureObject, c, err})
+		if err != nil {
+			return ensureResult
+		}
+	}
+	return ensureResult
+}
+
+func ensureObject(ctx context.Context, workflow *operatorapi.SonataFlow, visitors []MutateVisitor, result controllerutil.OperationResult, c client.Client, object client.Object) (client.Object, controllerutil.OperationResult, error) {
+	if result, err := controllerutil.CreateOrPatch(ctx, c, object,
+		func() error {
+			for _, v := range visitors {
+				if visitorErr := v(object)(); visitorErr != nil {
+					return visitorErr
+				}
+			}
+			return controllerutil.SetControllerReference(workflow, object, c.Scheme())
+		}); err != nil {
+		return nil, result, err
+	}
+	klog.V(log.I).InfoS("Object operation finalized", "result", result, "kind", object.GetObjectKind().GroupVersionKind().String(), "name", object.GetName(), "namespace", object.GetNamespace())
+	return object, result, nil
+}
diff --git a/controllers/profiles/common/knative.go b/controllers/profiles/common/knative.go
new file mode 100644
index 00000000..13f5bc49
--- /dev/null
+++ b/controllers/profiles/common/knative.go
@@ -0,0 +1,76 @@
+// Copyright 2024 Apache Software Foundation (ASF)
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package common
+
+import (
+	"context"
+
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/knative"
+
+	operatorapi "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
+	"github.com/apache/incubator-kie-kogito-serverless-operator/log"
+	"k8s.io/klog/v2"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+var _ KnativeEventingHandler = &knativeObjectManager{}
+
+type knativeObjectManager struct {
+	sinkBinding ObjectEnsurer
+	trigger     ObjectsEnsurer
+	*StateSupport
+}
+
+func NewKnativeEventingHandler(support *StateSupport) KnativeEventingHandler {
+	return &knativeObjectManager{
+		sinkBinding:  NewObjectEnsurer(support.C, SinkBindingCreator),
+		trigger:      NewObjectsEnsurer(support.C, TriggersCreator),
+		StateSupport: support,
+	}
+}
+
+type KnativeEventingHandler interface {
+	Ensure(ctx context.Context, workflow *operatorapi.SonataFlow) ([]client.Object, error)
+}
+
+func (k knativeObjectManager) Ensure(ctx context.Context, workflow *operatorapi.SonataFlow) ([]client.Object, error) {
+	var objs []client.Object
+
+	if workflow.Spec.Flow.Events == nil {
+		// skip if no event is found
+		klog.V(log.I).InfoS("skip knative resource creation as no event is found")
+	} else if workflow.Spec.Sink == nil {
+		klog.V(log.I).InfoS("Spec.Sink is not provided")
+	} else if knativeAvail, err := knative.GetKnativeAvailability(k.Cfg); err != nil || knativeAvail == nil || !knativeAvail.Eventing {
+		klog.V(log.I).InfoS("Knative Eventing is not installed")
+	} else {
+		// create sinkBinding and trigger
+		sinkBinding, _, err := k.sinkBinding.Ensure(ctx, workflow)
+		if err != nil {
+			return objs, err
+		} else if sinkBinding != nil {
+			objs = append(objs, sinkBinding)
+		}
+
+		triggers := k.trigger.Ensure(ctx, workflow)
+		for _, trigger := range triggers {
+			if trigger.Error != nil {
+				return objs, trigger.Error
+			}
+			objs = append(objs, trigger.Object)
+		}
+	}
+	return objs, nil
+}
diff --git a/controllers/profiles/common/object_creators.go b/controllers/profiles/common/object_creators.go
index 7e08366b..4b28e980 100644
--- a/controllers/profiles/common/object_creators.go
+++ b/controllers/profiles/common/object_creators.go
@@ -20,10 +20,21 @@
 package common
 
 import (
+	"fmt"
+	"strings"
+
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/workflowdef"
+
+	cncfmodel "github.com/serverlessworkflow/sdk-go/v2/model"
+
 	"github.com/imdario/mergo"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
+	sourcesv1 "knative.dev/eventing/pkg/apis/sources/v1"
+	duckv1 "knative.dev/pkg/apis/duck/v1"
+	"knative.dev/pkg/tracker"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	operatorapi "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
@@ -45,6 +56,9 @@ type ObjectCreator func(workflow *operatorapi.SonataFlow) (client.Object, error)
 // SonataFlowPlatform
 type ObjectCreatorWithPlatform func(workflow *operatorapi.SonataFlow, platform *operatorapi.SonataFlowPlatform) (client.Object, error)
 
+// ObjectsCreator creates multiple resources
+type ObjectsCreator func(workflow *operatorapi.SonataFlow) ([]client.Object, error)
+
 const (
 	defaultHTTPServicePort = 80
 
@@ -199,6 +213,85 @@ func ServiceCreator(workflow *operatorapi.SonataFlow) (client.Object, error) {
 	return service, nil
 }
 
+// SinkBindingCreator is an ObjectsCreator for SinkBinding.
+// It will create v1.SinkBinding based on events defined in workflow.
+func SinkBindingCreator(workflow *operatorapi.SonataFlow) (client.Object, error) {
+	lbl := workflowproj.GetDefaultLabels(workflow)
+
+	// skip if no produced event is found
+	if workflow.Spec.Sink == nil || !workflowdef.ContainsEventKind(workflow, cncfmodel.EventKindProduced) {
+		return nil, nil
+	}
+
+	sink := workflow.Spec.Sink
+
+	// subject must be deployment to inject K_SINK, service won't work
+	sinkBinding := &sourcesv1.SinkBinding{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      strings.ToLower(fmt.Sprintf("%s-sb", workflow.Name)),
+			Namespace: workflow.Namespace,
+			Labels:    lbl,
+		},
+		Spec: sourcesv1.SinkBindingSpec{
+			SourceSpec: duckv1.SourceSpec{
+				Sink: *sink,
+			},
+			BindingSpec: duckv1.BindingSpec{
+				Subject: tracker.Reference{
+					Name:       workflow.Name,
+					Namespace:  workflow.Namespace,
+					APIVersion: "apps/v1",
+					Kind:       "Deployment",
+				},
+			},
+		},
+	}
+	return sinkBinding, nil
+}
+
+// TriggersCreator is an ObjectsCreator for Triggers.
+// It will create a list of eventingv1.Trigger based on events defined in workflow.
+func TriggersCreator(workflow *operatorapi.SonataFlow) ([]client.Object, error) {
+	var resultObjects []client.Object
+	lbl := workflowproj.GetDefaultLabels(workflow)
+
+	//consumed
+	events := workflow.Spec.Flow.Events
+	for _, event := range events {
+		// filter out produce events
+		if event.Kind == cncfmodel.EventKindProduced {
+			continue
+		}
+
+		// construct eventingv1.Trigger
+		trigger := &eventingv1.Trigger{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      strings.ToLower(fmt.Sprintf("%s-%s-trigger", workflow.Name, event.Name)),
+				Namespace: workflow.Namespace,
+				Labels:    lbl,
+			},
+			Spec: eventingv1.TriggerSpec{
+				Broker: constants.KnativeEventingBrokerDefault,
+				Filter: &eventingv1.TriggerFilter{
+					Attributes: eventingv1.TriggerFilterAttributes{
+						"type": event.Type,
+					},
+				},
+				Subscriber: duckv1.Destination{
+					Ref: &duckv1.KReference{
+						Name:       workflow.Name,
+						Namespace:  workflow.Namespace,
+						APIVersion: "v1",
+						Kind:       "Service",
+					},
+				},
+			},
+		}
+		resultObjects = append(resultObjects, trigger)
+	}
+	return resultObjects, nil
+}
+
 // OpenShiftRouteCreator is an ObjectCreator for a basic Route for a workflow running on OpenShift.
 // It enables the exposition of the service using an OpenShift Route.
 // See: https://github.com/openshift/api/blob/d170fcdc0fa638b664e4f35f2daf753cb4afe36b/route/v1/route.crd.yaml
diff --git a/controllers/profiles/common/object_creators_test.go b/controllers/profiles/common/object_creators_test.go
index beb04369..236aa025 100644
--- a/controllers/profiles/common/object_creators_test.go
+++ b/controllers/profiles/common/object_creators_test.go
@@ -23,6 +23,8 @@ import (
 	"context"
 	"testing"
 
+	sourcesv1 "knative.dev/eventing/pkg/apis/sources/v1"
+
 	"github.com/magiconair/properties"
 	"github.com/stretchr/testify/assert"
 	appsv1 "k8s.io/api/apps/v1"
@@ -176,6 +178,35 @@ func TestMergePodSpec_OverrideContainers(t *testing.T) {
 	assert.Empty(t, flowContainer.Env)
 }
 
+func Test_ensureWorkflowSinkBindingIsCreated(t *testing.T) {
+	workflow := test.GetVetEventSonataFlow(t.Name())
+
+	//On Kubernetes we want the service exposed in Dev with NodePort
+	sinkBinding, _ := SinkBindingCreator(workflow)
+	sinkBinding.SetUID("1")
+	sinkBinding.SetResourceVersion("1")
+
+	reflectSinkBinding := sinkBinding.(*sourcesv1.SinkBinding)
+
+	assert.NotNil(t, reflectSinkBinding)
+	assert.NotNil(t, reflectSinkBinding.Spec)
+	assert.NotEmpty(t, reflectSinkBinding.Spec.Sink)
+	assert.Equal(t, reflectSinkBinding.Spec.Sink.Ref.Kind, "Broker")
+}
+
+func Test_ensureWorkflowTriggersAreCreated(t *testing.T) {
+	workflow := test.GetVetEventSonataFlow(t.Name())
+
+	//On Kubernetes we want the service exposed in Dev with NodePort
+	triggers, _ := TriggersCreator(workflow)
+
+	assert.NotEmpty(t, triggers)
+	assert.Len(t, triggers, 2)
+	for _, trigger := range triggers {
+		assert.Contains(t, []string{"vet-vetappointmentrequestreceived-trigger", "vet-vetappointmentinfo-trigger"}, trigger.GetName())
+	}
+}
+
 func TestMergePodSpec_WithPostgreSQL_and_JDBC_URL_field(t *testing.T) {
 	workflow := test.GetBaseSonataFlow(t.Name())
 	workflow.Spec = v1alpha08.SonataFlowSpec{
diff --git a/controllers/profiles/common/properties/application.go b/controllers/profiles/common/properties/application.go
index 41489140..9b592608 100644
--- a/controllers/profiles/common/properties/application.go
+++ b/controllers/profiles/common/properties/application.go
@@ -40,9 +40,6 @@ import (
 var (
 	immutableApplicationProperties = fmt.Sprintf("quarkus.http.port=%d\n"+
 		"quarkus.http.host=0.0.0.0\n"+
-		// We disable the Knative health checks to not block the pod to run if Knative objects are not available
-		// See: https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/eventing/consume-produce-events-with-knative-eventing.html#ref-knative-eventing-add-on-source-configuration
-		"org.kie.kogito.addons.knative.eventing.health-enabled=false\n"+
 		"quarkus.devservices.enabled=false\n"+
 		"quarkus.kogito.devservices.enabled=false\n", constants.DefaultHTTPWorkflowPortInt)
 	_ AppPropertyHandler = &appPropertyHandler{}
@@ -160,6 +157,11 @@ func NewAppPropertyHandler(workflow *operatorapi.SonataFlow, platform *operatora
 			return nil, err
 		}
 		props.Merge(p)
+		p, err = generateKnativeEventingWorkflowProperties(workflow)
+		if err != nil {
+			return nil, err
+		}
+		props.Merge(p)
 		props.Sort()
 	}
 	handler.defaultMutableProperties = props
diff --git a/controllers/profiles/common/properties/application_test.go b/controllers/profiles/common/properties/application_test.go
index e686aaac..7133db17 100644
--- a/controllers/profiles/common/properties/application_test.go
+++ b/controllers/profiles/common/properties/application_test.go
@@ -124,13 +124,12 @@ func Test_appPropertyHandler_WithUserPropertiesWithNoUserOverrides(t *testing.T)
 	assert.NoError(t, err)
 	generatedProps, propsErr := properties.LoadString(props.WithUserProperties(userProperties).Build())
 	assert.NoError(t, propsErr)
-	assert.Equal(t, 7, len(generatedProps.Keys()))
+	assert.Equal(t, 6, len(generatedProps.Keys()))
 	assert.NotContains(t, "property1", generatedProps.Keys())
 	assert.NotContains(t, "property2", generatedProps.Keys())
 	assert.Equal(t, "http://greeting.default", generatedProps.GetString("kogito.service.url", ""))
 	assert.Equal(t, "8080", generatedProps.GetString("quarkus.http.port", ""))
 	assert.Equal(t, "0.0.0.0", generatedProps.GetString("quarkus.http.host", ""))
-	assert.Equal(t, "false", generatedProps.GetString("org.kie.kogito.addons.knative.eventing.health-enabled", ""))
 	assert.Equal(t, "false", generatedProps.GetString("quarkus.devservices.enabled", ""))
 	assert.Equal(t, "false", generatedProps.GetString("quarkus.kogito.devservices.enabled", ""))
 	assert.Equal(t, "false", generatedProps.GetString(constants.KogitoUserTasksEventsEnabled, ""))
@@ -157,7 +156,7 @@ func Test_appPropertyHandler_WithUserPropertiesWithServiceDiscovery(t *testing.T
 		Build())
 	generatedProps.DisableExpansion = true
 	assert.NoError(t, propsErr)
-	assert.Equal(t, 21, len(generatedProps.Keys()))
+	assert.Equal(t, 20, len(generatedProps.Keys()))
 	assert.NotContains(t, "property1", generatedProps.Keys())
 	assert.NotContains(t, "property2", generatedProps.Keys())
 	assertHasProperty(t, generatedProps, "service1", myService1Address)
@@ -181,7 +180,6 @@ func Test_appPropertyHandler_WithUserPropertiesWithServiceDiscovery(t *testing.T
 	assertHasProperty(t, generatedProps, "kogito.service.url", fmt.Sprintf("http://greeting.%s", defaultNamespace))
 	assertHasProperty(t, generatedProps, "quarkus.http.port", "8080")
 	assertHasProperty(t, generatedProps, "quarkus.http.host", "0.0.0.0")
-	assertHasProperty(t, generatedProps, "org.kie.kogito.addons.knative.eventing.health-enabled", "false")
 	assertHasProperty(t, generatedProps, "quarkus.devservices.enabled", "false")
 	assertHasProperty(t, generatedProps, "quarkus.kogito.devservices.enabled", "false")
 	assertHasProperty(t, generatedProps, constants.KogitoUserTasksEventsEnabled, "false")
@@ -276,7 +274,6 @@ func Test_appPropertyHandler_WithServicesWithUserOverrides(t *testing.T) {
 	assert.Equal(t, "http://"+platform.Name+"-"+constants.JobServiceName+"."+platform.Namespace+"/v2/jobs/events", generatedProps.GetString(constants.JobServiceRequestEventsURL, ""))
 	assert.Equal(t, "", generatedProps.GetString(constants.JobServiceStatusChangeEvents, ""))
 	assert.Equal(t, "", generatedProps.GetString(constants.JobServiceStatusChangeEventsURL, ""))
-	assert.Equal(t, "http://"+platform.Name+"-"+constants.JobServiceName+"."+platform.Namespace, generatedProps.GetString(constants.KogitoJobServiceURL, ""))
 
 	// disabling job service bypasses config of outgoing events url
 	platform.Spec.Services.JobService.Enabled = nil
diff --git a/controllers/profiles/common/properties/properties.go b/controllers/profiles/common/properties/properties.go
new file mode 100644
index 00000000..ec4c3b09
--- /dev/null
+++ b/controllers/profiles/common/properties/properties.go
@@ -0,0 +1,49 @@
+// Copyright 2024 Apache Software Foundation (ASF)
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package properties
+
+import (
+	operatorapi "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/profiles/common/constants"
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/workflowdef"
+	"github.com/magiconair/properties"
+	cncfmodel "github.com/serverlessworkflow/sdk-go/v2/model"
+)
+
+// GenerateKnativeEventingWorkflowProperties returns the set of application properties required for the workflow to produce or consume
+// Knative Events.
+// Never nil.
+func generateKnativeEventingWorkflowProperties(workflow *operatorapi.SonataFlow) (*properties.Properties, error) {
+	props := properties.NewProperties()
+	if workflow == nil || workflow.Spec.Sink == nil {
+		props.Set(constants.KnativeHealthEnabled, "false")
+		return props, nil
+	}
+	// verify ${K_SINK}
+	props.Set(constants.KnativeHealthEnabled, "true")
+	if workflowdef.ContainsEventKind(workflow, cncfmodel.EventKindProduced) {
+		props.Set(constants.KogitoOutgoingEventsConnector, constants.QuarkusHTTP)
+		props.Set(constants.KogitoOutgoingEventsURL, constants.KnativeInjectedEnvVar)
+	}
+	if workflowdef.ContainsEventKind(workflow, cncfmodel.EventKindConsumed) {
+		props.Set(constants.KogitoIncomingEventsConnector, constants.QuarkusHTTP)
+		var path = "/"
+		if workflow.Spec.Sink.URI != nil {
+			path = workflow.Spec.Sink.URI.Path
+		}
+		props.Set(constants.KogitoIncomingEventsPath, path)
+	}
+	return props, nil
+}
diff --git a/controllers/profiles/common/reconciler.go b/controllers/profiles/common/reconciler.go
index da29a10a..b2800005 100644
--- a/controllers/profiles/common/reconciler.go
+++ b/controllers/profiles/common/reconciler.go
@@ -23,6 +23,8 @@ import (
 	"context"
 	"fmt"
 
+	"k8s.io/client-go/rest"
+
 	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/discovery"
 
 	"k8s.io/client-go/tools/record"
@@ -39,12 +41,13 @@ import (
 // StateSupport is the shared structure with common accessors used throughout the whole reconciliation profiles
 type StateSupport struct {
 	C        client.Client
+	Cfg      *rest.Config
 	Catalog  discovery.ServiceCatalog
 	Recorder record.EventRecorder
 }
 
 // PerformStatusUpdate updates the SonataFlow Status conditions
-func (s StateSupport) PerformStatusUpdate(ctx context.Context, workflow *operatorapi.SonataFlow) (bool, error) {
+func (s *StateSupport) PerformStatusUpdate(ctx context.Context, workflow *operatorapi.SonataFlow) (bool, error) {
 	var err error
 	workflow.Status.ObservedGeneration = workflow.Generation
 	if err = s.C.Status().Update(ctx, workflow); err != nil {
diff --git a/controllers/profiles/dev/profile_dev.go b/controllers/profiles/dev/profile_dev.go
index 14dc188c..0bd5a397 100644
--- a/controllers/profiles/dev/profile_dev.go
+++ b/controllers/profiles/dev/profile_dev.go
@@ -46,6 +46,7 @@ func (d developmentProfile) GetProfile() metadata.ProfileType {
 func NewProfileReconciler(client client.Client, cfg *rest.Config, recorder record.EventRecorder) profiles.ProfileReconciler {
 	support := &common.StateSupport{
 		C:        client,
+		Cfg:      cfg,
 		Catalog:  discovery.NewServiceCatalogForConfig(client, cfg),
 		Recorder: recorder,
 	}
diff --git a/controllers/profiles/dev/states_dev.go b/controllers/profiles/dev/states_dev.go
index e186a358..17bd5a80 100644
--- a/controllers/profiles/dev/states_dev.go
+++ b/controllers/profiles/dev/states_dev.go
@@ -117,6 +117,12 @@ func (e *ensureRunningWorkflowState) Do(ctx context.Context, workflow *operatora
 	}
 	objs = append(objs, route)
 
+	if knativeObjs, err := common.NewKnativeEventingHandler(e.StateSupport).Ensure(ctx, workflow); err != nil {
+		return ctrl.Result{RequeueAfter: constants.RequeueAfterFailure}, objs, err
+	} else {
+		objs = append(objs, knativeObjs...)
+	}
+
 	// First time reconciling this object, mark as wait for deployment
 	if workflow.Status.GetTopLevelCondition().IsUnknown() {
 		klog.V(log.I).InfoS("Workflow is in WaitingForDeployment Condition")
diff --git a/controllers/profiles/prod/deployment_handler.go b/controllers/profiles/prod/deployment_handler.go
index 4581f2cc..af999e5a 100644
--- a/controllers/profiles/prod/deployment_handler.go
+++ b/controllers/profiles/prod/deployment_handler.go
@@ -83,7 +83,12 @@ func (d *deploymentReconciler) reconcileWithBuiltImage(ctx context.Context, work
 		return reconcile.Result{}, nil, err
 	}
 
+	knativeObjs, err := common.NewKnativeEventingHandler(d.StateSupport).Ensure(ctx, workflow)
+	if err != nil {
+		return ctrl.Result{RequeueAfter: constants.RequeueAfterFailure}, nil, err
+	}
 	objs := []client.Object{deployment, service, managedPropsCM}
+	objs = append(objs, knativeObjs...)
 
 	if deploymentOp == controllerutil.OperationResultCreated {
 		workflow.Status.Manager().MarkFalse(api.RunningConditionType, api.WaitingForDeploymentReason, "")
diff --git a/controllers/profiles/prod/profile_prod.go b/controllers/profiles/prod/profile_prod.go
index 33932d23..b3353268 100644
--- a/controllers/profiles/prod/profile_prod.go
+++ b/controllers/profiles/prod/profile_prod.go
@@ -72,6 +72,7 @@ func newObjectEnsurers(support *common.StateSupport) *objectEnsurers {
 func NewProfileReconciler(client client.Client, cfg *rest.Config, recorder record.EventRecorder) profiles.ProfileReconciler {
 	support := &common.StateSupport{
 		C:        client,
+		Cfg:      cfg,
 		Catalog:  discovery.NewServiceCatalogForConfig(client, cfg),
 		Recorder: recorder,
 	}
@@ -93,6 +94,7 @@ func NewProfileReconciler(client client.Client, cfg *rest.Config, recorder recor
 func NewProfileForOpsReconciler(client client.Client, cfg *rest.Config, recorder record.EventRecorder) profiles.ProfileReconciler {
 	support := &common.StateSupport{
 		C:        client,
+		Cfg:      cfg,
 		Catalog:  discovery.NewServiceCatalogForConfig(client, cfg),
 		Recorder: recorder,
 	}
diff --git a/controllers/profiles/common/constants/workflows.go b/controllers/workflowdef/services.go
similarity index 55%
copy from controllers/profiles/common/constants/workflows.go
copy to controllers/workflowdef/services.go
index a64002ad..03db8ef0 100644
--- a/controllers/profiles/common/constants/workflows.go
+++ b/controllers/workflowdef/services.go
@@ -1,4 +1,4 @@
-// Copyright 2023 Apache Software Foundation (ASF)
+// Copyright 2024 Apache Software Foundation (ASF)
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,8 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package constants
+package workflowdef
 
-const (
-	MicroprofileServiceCatalogPropertyPrefix = "org.kie.kogito.addons.discovery."
+import (
+	operatorapi "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
+	cncfmodel "github.com/serverlessworkflow/sdk-go/v2/model"
 )
+
+func ContainsEventKind(workflow *operatorapi.SonataFlow, eventKind cncfmodel.EventKind) bool {
+	for _, event := range workflow.Spec.Flow.Events {
+		if event.Kind == eventKind {
+			return true
+		}
+	}
+	return false
+}
diff --git a/main.go b/main.go
index a1040f7b..240a1d2f 100644
--- a/main.go
+++ b/main.go
@@ -23,6 +23,9 @@ import (
 	"flag"
 	"os"
 
+	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
+	sourcesv1 "knative.dev/eventing/pkg/apis/sources/v1"
+
 	"k8s.io/klog/v2/klogr"
 
 	"k8s.io/klog/v2"
@@ -54,6 +57,8 @@ var (
 func init() {
 	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
 	utilruntime.Must(operatorapi.AddToScheme(scheme))
+	utilruntime.Must(sourcesv1.AddToScheme(scheme))
+	utilruntime.Must(eventingv1.AddToScheme(scheme))
 	//+kubebuilder:scaffold:scheme
 }
 
diff --git a/operator.yaml b/operator.yaml
index a4693bd6..fb73c101 100644
--- a/operator.yaml
+++ b/operator.yaml
@@ -26173,6 +26173,53 @@ spec:
                       type: object
                     type: array
                 type: object
+              sink:
+                description: Sink describes the sinkBinding details of this SonataFlow
+                  instance.
+                properties:
+                  CACerts:
+                    description: CACerts are Certification Authority (CA) certificates
+                      in PEM format according to https://www.rfc-editor.org/rfc/rfc7468.
+                      If set, these CAs are appended to the set of CAs provided by
+                      the Addressable target, if any.
+                    type: string
+                  ref:
+                    description: Ref points to an Addressable.
+                    properties:
+                      address:
+                        description: Address points to a specific Address Name.
+                        type: string
+                      apiVersion:
+                        description: API version of the referent.
+                        type: string
+                      group:
+                        description: 'Group of the API, without the version of the
+                          group. This can be used as an alternative to the APIVersion,
+                          and then resolved using ResolveGroup. Note: This API is
+                          EXPERIMENTAL and might break anytime. For more details:
+                          https://github.com/knative/eventing/issues/5086'
+                        type: string
+                      kind:
+                        description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                        type: string
+                      name:
+                        description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                        type: string
+                      namespace:
+                        description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
+                          This is optional field, it gets defaulted to the object
+                          holding it if left out.'
+                        type: string
+                    required:
+                    - kind
+                    - name
+                    type: object
+                  uri:
+                    description: URI can be an absolute URL(non-empty scheme and non-empty
+                      host) pointing to the target or a relative URI. Relative URIs
+                      will be resolved using the base URI retrieved from Ref.
+                    type: string
+                type: object
             required:
             - flow
             type: object
@@ -26354,6 +26401,36 @@ rules:
   - patch
   - update
   - watch
+- apiGroups:
+  - eventing.knative.dev
+  resources:
+  - triggers
+  - triggers/status
+  - triggers/finalizers
+  verbs:
+  - create
+  - delete
+  - deletecollection
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - sources.knative.dev
+  resources:
+  - sinkbindings
+  - sinkbindings/status
+  - sinkbindings/finalizers
+  verbs:
+  - create
+  - delete
+  - deletecollection
+  - get
+  - list
+  - patch
+  - update
+  - watch
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
diff --git a/test/testdata/sonataflow.org_v1alpha08_sonataflow_vet_event.yaml b/test/testdata/sonataflow.org_v1alpha08_sonataflow_vet_event.yaml
new file mode 100644
index 00000000..05e3a5b4
--- /dev/null
+++ b/test/testdata/sonataflow.org_v1alpha08_sonataflow_vet_event.yaml
@@ -0,0 +1,72 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlow
+metadata:
+  name: vet
+  annotations:
+    sonataflow.org/description: Vet service call via events
+    sonataflow.org/version: 0.0.1
+spec:
+  sink:
+    ref:
+      name: default
+      namespace: default
+      apiVersion: eventing.knative.dev/v1
+      kind: Broker
+  flow:
+    events:
+      - name: MakeVetAppointment
+        source: VetServiceSource
+        type: events.vet.appointments
+        kind: produced
+      - name: VetAppointmentInfo
+        source: VetServiceSource
+        type: events.vet.appointments
+      - name: VetAppointmentRequestReceived
+        source: checkAccountInfo
+        type: events.vet.appointments.request
+    functions:
+      - name: StoreNewPatientInfo
+        operation: specs/services.yaml#checkAccountInfo
+    states:
+      - name: AppointmentRequestReceived
+        type: event
+        onEvents:
+          - eventRefs:
+              - VetAppointmentRequestReceived
+            actions:
+              - name: checkAccount
+                functionRef:
+                  refName: checkAccountInfo
+                  arguments:
+                    account: "${ .accountId }"
+        transition: MakeVetAppointmentState
+      - name: MakeVetAppointmentState
+        type: callback
+        action:
+          name: MakeAppointmentAction
+          eventRef:
+            triggerEventRef: MakeVetAppointment
+            data: "${ .patientInfo }"
+        eventRef: VetAppointmentInfo
+        timeouts:
+          stateExecTimeout: PT15M
+        eventDataFilter:
+          toStateData: .test
+        end: true
diff --git a/test/yaml.go b/test/yaml.go
index 5638e53a..8c3692a6 100644
--- a/test/yaml.go
+++ b/test/yaml.go
@@ -44,6 +44,7 @@ const (
 	SonataFlowGreetingsWithDataInputSchemaCR  = "sonataflow.org_v1alpha08_sonataflow_greetings_datainput.yaml"
 	SonataFlowGreetingsWithStaticResourcesCR  = "sonataflow.org_v1alpha08_sonataflow-metainf.yaml"
 	SonataFlowSimpleOpsYamlCR                 = "sonataflow.org_v1alpha08_sonataflow-simpleops.yaml"
+	SonataFlowVetWithEventCR                  = "sonataflow.org_v1alpha08_sonataflow_vet_event.yaml"
 	SonataFlowGreetingsDataInputSchemaConfig  = "v1_configmap_greetings_datainput.yaml"
 	SonataFlowGreetingsStaticFilesConfig      = "v1_configmap_greetings_staticfiles.yaml"
 	sonataFlowPlatformYamlCR                  = "sonataflow.org_v1alpha08_sonataflowplatform.yaml"
@@ -202,6 +203,10 @@ func GetBaseSonataFlow(namespace string, options ...*func(*operatorapi.SonataFlo
 	return NewSonataFlow(sonataFlowSampleYamlCR, namespace)
 }
 
+func GetVetEventSonataFlow(namespace string) *operatorapi.SonataFlow {
+	return GetSonataFlow(SonataFlowVetWithEventCR, namespace)
+}
+
 func GetBaseSonataFlowWithDevProfile(namespace string) *operatorapi.SonataFlow {
 	return NewSonataFlow(sonataFlowSampleYamlCR, namespace, SetDevProfile)
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org