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 e799c349 Propagate workflow labels to the its K8s resources (#413)
e799c349 is described below

commit e799c349405b267bacc0ecee99fa31b85f654148
Author: Moti Asayag <[email protected]>
AuthorDate: Wed Mar 13 20:04:59 2024 +0200

    Propagate workflow labels to the its K8s resources (#413)
---
 controllers/builder/openshiftbuilder.go            |  4 +--
 controllers/profiles/common/object_creators.go     |  8 +++---
 .../profiles/common/object_creators_test.go        |  4 +++
 controllers/profiles/dev/object_creators_dev.go    |  1 -
 .../profiles/dev/object_creators_dev_test.go       |  3 +++
 controllers/profiles/prod/profile_prod_test.go     |  6 +++++
 controllers/workflowdef/configmap.go               |  3 +++
 ...ataflow.org_v1alpha08_sonataflow-simpleops.yaml |  3 +++
 .../sonataflow.org_v1alpha08_sonataflow.yaml       |  2 ++
 utils/openshift/route.go                           |  2 +-
 workflowproj/operator.go                           | 30 +++++++++++++++-------
 workflowproj/workflowproj.go                       |  2 +-
 workflowproj/workflowproj_test.go                  |  2 ++
 13 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/controllers/builder/openshiftbuilder.go 
b/controllers/builder/openshiftbuilder.go
index 79ada8fe..55c1fc2d 100644
--- a/controllers/builder/openshiftbuilder.go
+++ b/controllers/builder/openshiftbuilder.go
@@ -117,8 +117,8 @@ func (o *openshiftBuilderManager) Schedule(build 
*operatorapi.SonataFlowBuild) e
        if err = o.addExternalResources(bc, workflow); err != nil {
                return err
        }
-       workflowproj.SetDefaultLabels(workflow, is)
-       workflowproj.SetDefaultLabels(workflow, bc)
+       workflowproj.SetMergedLabels(workflow, is)
+       workflowproj.SetMergedLabels(workflow, bc)
        if err = controllerutil.SetControllerReference(build, bc, 
o.buildManagerContext.client.Scheme()); err != nil {
                return err
        }
diff --git a/controllers/profiles/common/object_creators.go 
b/controllers/profiles/common/object_creators.go
index 4b28e980..61ea65db 100644
--- a/controllers/profiles/common/object_creators.go
+++ b/controllers/profiles/common/object_creators.go
@@ -75,7 +75,7 @@ const (
 // DeploymentCreator is an objectCreator for a base Kubernetes Deployments for 
profiles that need to deploy the workflow on a vanilla deployment.
 // It serves as a basis for a basic Quarkus Java application, expected to 
listen on http 8080.
 func DeploymentCreator(workflow *operatorapi.SonataFlow, plf 
*operatorapi.SonataFlowPlatform) (client.Object, error) {
-       lbl := workflowproj.GetDefaultLabels(workflow)
+       lbl := workflowproj.GetMergedLabels(workflow)
 
        deployment := &appsv1.Deployment{
                ObjectMeta: metav1.ObjectMeta{
@@ -192,7 +192,7 @@ func defaultContainer(workflow *operatorapi.SonataFlow, plf 
*operatorapi.SonataF
 // ServiceCreator is an objectCreator for a basic Service aiming a vanilla 
Kubernetes Deployment.
 // It maps the default HTTP port (80) to the target Java application webserver 
on port 8080.
 func ServiceCreator(workflow *operatorapi.SonataFlow) (client.Object, error) {
-       lbl := workflowproj.GetDefaultLabels(workflow)
+       lbl := workflowproj.GetMergedLabels(workflow)
 
        service := &corev1.Service{
                ObjectMeta: metav1.ObjectMeta{
@@ -216,7 +216,7 @@ func ServiceCreator(workflow *operatorapi.SonataFlow) 
(client.Object, error) {
 // 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)
+       lbl := workflowproj.GetMergedLabels(workflow)
 
        // skip if no produced event is found
        if workflow.Spec.Sink == nil || 
!workflowdef.ContainsEventKind(workflow, cncfmodel.EventKindProduced) {
@@ -253,7 +253,7 @@ func SinkBindingCreator(workflow *operatorapi.SonataFlow) 
(client.Object, error)
 // 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)
+       lbl := workflowproj.GetMergedLabels(workflow)
 
        //consumed
        events := workflow.Spec.Flow.Events
diff --git a/controllers/profiles/common/object_creators_test.go 
b/controllers/profiles/common/object_creators_test.go
index 236aa025..7a35bd48 100644
--- a/controllers/profiles/common/object_creators_test.go
+++ b/controllers/profiles/common/object_creators_test.go
@@ -192,6 +192,8 @@ func Test_ensureWorkflowSinkBindingIsCreated(t *testing.T) {
        assert.NotNil(t, reflectSinkBinding.Spec)
        assert.NotEmpty(t, reflectSinkBinding.Spec.Sink)
        assert.Equal(t, reflectSinkBinding.Spec.Sink.Ref.Kind, "Broker")
+       assert.NotNil(t, reflectSinkBinding.GetLabels())
+       assert.Equal(t, reflectSinkBinding.ObjectMeta.Labels, 
map[string]string{"app": "vet", "sonataflow.org/workflow-app": "vet"})
 }
 
 func Test_ensureWorkflowTriggersAreCreated(t *testing.T) {
@@ -204,6 +206,8 @@ func Test_ensureWorkflowTriggersAreCreated(t *testing.T) {
        assert.Len(t, triggers, 2)
        for _, trigger := range triggers {
                assert.Contains(t, 
[]string{"vet-vetappointmentrequestreceived-trigger", 
"vet-vetappointmentinfo-trigger"}, trigger.GetName())
+               assert.NotNil(t, trigger.GetLabels())
+               assert.Equal(t, trigger.GetLabels(), map[string]string{"app": 
"vet", "sonataflow.org/workflow-app": "vet"})
        }
 }
 
diff --git a/controllers/profiles/dev/object_creators_dev.go 
b/controllers/profiles/dev/object_creators_dev.go
index 63b7b8fe..0d947c0f 100644
--- a/controllers/profiles/dev/object_creators_dev.go
+++ b/controllers/profiles/dev/object_creators_dev.go
@@ -80,7 +80,6 @@ func workflowDefConfigMapCreator(workflow 
*operatorapi.SonataFlow) (client.Objec
        if err != nil {
                return nil, err
        }
-       workflowproj.SetDefaultLabels(workflow, configMap)
        return configMap, nil
 }
 
diff --git a/controllers/profiles/dev/object_creators_dev_test.go 
b/controllers/profiles/dev/object_creators_dev_test.go
index 8209940a..25fdc8ee 100644
--- a/controllers/profiles/dev/object_creators_dev_test.go
+++ b/controllers/profiles/dev/object_creators_dev_test.go
@@ -41,4 +41,7 @@ func Test_ensureWorkflowDevServiceIsExposed(t *testing.T) {
        assert.NotNil(t, reflectService.Spec.Type)
        assert.NotEmpty(t, reflectService.Spec.Type)
        assert.Equal(t, reflectService.Spec.Type, v1.ServiceTypeNodePort)
+       assert.NotNil(t, reflectService.ObjectMeta)
+       assert.NotNil(t, reflectService.ObjectMeta.Labels)
+       assert.Equal(t, reflectService.ObjectMeta.Labels, 
map[string]string{"test": "test", "app": "greeting", 
"sonataflow.org/workflow-app": "greeting"})
 }
diff --git a/controllers/profiles/prod/profile_prod_test.go 
b/controllers/profiles/prod/profile_prod_test.go
index 5ca93a97..89a2adba 100644
--- a/controllers/profiles/prod/profile_prod_test.go
+++ b/controllers/profiles/prod/profile_prod_test.go
@@ -72,6 +72,9 @@ func Test_Reconciler_ProdOps(t *testing.T) {
        assert.Len(t, deployment.Spec.Template.Spec.Containers, 1)
        assert.Len(t, deployment.Spec.Template.Spec.InitContainers, 1)
        assert.Len(t, deployment.Spec.Template.Spec.Containers[0].VolumeMounts, 
1)
+       assert.NotNil(t, deployment.ObjectMeta)
+       assert.NotNil(t, deployment.ObjectMeta.Labels)
+       assert.Equal(t, deployment.ObjectMeta.Labels, map[string]string{"test": 
"test", "app": "simple", "sonataflow.org/workflow-app": "simple"})
 }
 
 func Test_Reconciler_ProdCustomPod(t *testing.T) {
@@ -100,6 +103,9 @@ func Test_Reconciler_ProdCustomPod(t *testing.T) {
        assert.Len(t, deployment.Spec.Template.Spec.Containers, 1)
        assert.Len(t, deployment.Spec.Template.Spec.InitContainers, 1)
        assert.Len(t, deployment.Spec.Template.Spec.Containers[0].VolumeMounts, 
1)
+       assert.NotNil(t, deployment.ObjectMeta)
+       assert.NotNil(t, deployment.ObjectMeta.Labels)
+       assert.Equal(t, deployment.ObjectMeta.Labels, map[string]string{"test": 
"test", "app": "greeting", "sonataflow.org/workflow-app": "greeting"})
 }
 
 func Test_reconcilerProdBuildConditions(t *testing.T) {
diff --git a/controllers/workflowdef/configmap.go 
b/controllers/workflowdef/configmap.go
index af914063..69839832 100644
--- a/controllers/workflowdef/configmap.go
+++ b/controllers/workflowdef/configmap.go
@@ -23,6 +23,8 @@ import (
        "context"
        "path"
 
+       
"github.com/apache/incubator-kie-kogito-serverless-operator/workflowproj"
+
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/types"
@@ -47,6 +49,7 @@ func CreateNewConfigMap(workflow *operatorapi.SonataFlow) 
(*corev1.ConfigMap, er
                ObjectMeta: metav1.ObjectMeta{
                        Name:      workflow.Name,
                        Namespace: workflow.Namespace,
+                       Labels:    workflowproj.GetMergedLabels(workflow),
                },
                Data: map[string]string{GetWorkflowDefFileName(workflow): 
string(workflowDef)},
        }, nil
diff --git a/test/testdata/sonataflow.org_v1alpha08_sonataflow-simpleops.yaml 
b/test/testdata/sonataflow.org_v1alpha08_sonataflow-simpleops.yaml
index c9b4a986..d55f427f 100644
--- a/test/testdata/sonataflow.org_v1alpha08_sonataflow-simpleops.yaml
+++ b/test/testdata/sonataflow.org_v1alpha08_sonataflow-simpleops.yaml
@@ -19,6 +19,9 @@ metadata:
   annotations:
     sonataflow.org/description: Simple example on k8s!
     sonataflow.org/version: 0.0.1
+  labels:
+    test: test
+    app: not-simple
 spec:
   podTemplate:
     container:
diff --git a/test/testdata/sonataflow.org_v1alpha08_sonataflow.yaml 
b/test/testdata/sonataflow.org_v1alpha08_sonataflow.yaml
index 4aa82104..0616efd1 100644
--- a/test/testdata/sonataflow.org_v1alpha08_sonataflow.yaml
+++ b/test/testdata/sonataflow.org_v1alpha08_sonataflow.yaml
@@ -22,6 +22,8 @@ metadata:
   annotations:
     sonataflow.org/description: Greeting example on k8s!
     sonataflow.org/version: 0.0.1
+  labels:
+    test: test
 spec:
   flow:
     start: ChooseOnLanguage
diff --git a/utils/openshift/route.go b/utils/openshift/route.go
index 0ad87a5e..d678d371 100644
--- a/utils/openshift/route.go
+++ b/utils/openshift/route.go
@@ -33,6 +33,7 @@ func RouteForWorkflow(workflow *operatorapi.SonataFlow) 
(*v1.Route, error) {
                ObjectMeta: metav1.ObjectMeta{
                        Name:      workflow.Name,
                        Namespace: workflow.Namespace,
+                       Labels:    workflowproj.GetMergedLabels(workflow),
                },
                Spec: v1.RouteSpec{
                        To: v1.RouteTargetReference{
@@ -44,6 +45,5 @@ func RouteForWorkflow(workflow *operatorapi.SonataFlow) 
(*v1.Route, error) {
                        },
                },
        }
-       workflowproj.SetDefaultLabels(workflow, route)
        return route, nil
 }
diff --git a/workflowproj/operator.go b/workflowproj/operator.go
index de6615d5..0ab6c302 100644
--- a/workflowproj/operator.go
+++ b/workflowproj/operator.go
@@ -82,14 +82,7 @@ func GetManagedPropertiesFileName(workflow 
*operatorapi.SonataFlow) string {
        return fmt.Sprintf("application-%s.properties", profile)
 }
 
-// SetDefaultLabels adds the default workflow application labels to the given 
object.
-// Overrides the defined labels.
-func SetDefaultLabels(workflow *operatorapi.SonataFlow, object metav1.Object) {
-       object.SetLabels(GetDefaultLabels(workflow))
-}
-
 // GetDefaultLabels gets the default labels based on the given workflow.
-// You can use SetDefaultLabels that essentially does the same thing, if you 
don't need the labels explicitly.
 func GetDefaultLabels(workflow *operatorapi.SonataFlow) map[string]string {
        return map[string]string{
                LabelApp:      workflow.Name,
@@ -97,13 +90,32 @@ func GetDefaultLabels(workflow *operatorapi.SonataFlow) 
map[string]string {
        }
 }
 
+// SetMergedLabels adds the merged labels to the given object.
+func SetMergedLabels(workflow *operatorapi.SonataFlow, object metav1.Object) {
+       object.SetLabels(GetMergedLabels(workflow))
+}
+
+// GetMergedLabels gets labels based on the given workflow, includes their own 
labels, merged with the default ones.
+func GetMergedLabels(workflow *operatorapi.SonataFlow) map[string]string {
+       mergedLabels := make(map[string]string)
+       if labels := workflow.GetLabels(); labels != nil {
+               for k, v := range labels {
+                       mergedLabels[k] = v
+               }
+       }
+       for k, v := range GetDefaultLabels(workflow) {
+               mergedLabels[k] = v
+       }
+       return mergedLabels
+}
+
 // CreateNewUserPropsConfigMap creates a new empty ConfigMap object to hold 
the user application properties of the workflow.
 func CreateNewUserPropsConfigMap(workflow *operatorapi.SonataFlow) 
*corev1.ConfigMap {
        return &corev1.ConfigMap{
                ObjectMeta: metav1.ObjectMeta{
                        Name:      
GetWorkflowUserPropertiesConfigMapName(workflow),
                        Namespace: workflow.Namespace,
-                       Labels:    GetDefaultLabels(workflow),
+                       Labels:    GetMergedLabels(workflow),
                },
                Data: map[string]string{ApplicationPropertiesFileName: ""},
        }
@@ -115,7 +127,7 @@ func CreateNewManagedPropsConfigMap(workflow 
*operatorapi.SonataFlow, properties
                ObjectMeta: metav1.ObjectMeta{
                        Name:      
GetWorkflowManagedPropertiesConfigMapName(workflow),
                        Namespace: workflow.Namespace,
-                       Labels:    GetDefaultLabels(workflow),
+                       Labels:    GetMergedLabels(workflow),
                },
                Data: map[string]string{GetManagedPropertiesFileName(workflow): 
properties},
        }
diff --git a/workflowproj/workflowproj.go b/workflowproj/workflowproj.go
index 79359e4b..bd8653d2 100644
--- a/workflowproj/workflowproj.go
+++ b/workflowproj/workflowproj.go
@@ -234,7 +234,7 @@ func (w *workflowProjectHandler) parseRawWorkflow() error {
                profile = w.profile
        }
        SetWorkflowProfile(w.project.Workflow, profile)
-       SetDefaultLabels(w.project.Workflow, w.project.Workflow)
+       SetMergedLabels(w.project.Workflow, w.project.Workflow)
        if err = SetTypeToObject(w.project.Workflow, w.scheme); err != nil {
                return err
        }
diff --git a/workflowproj/workflowproj_test.go 
b/workflowproj/workflowproj_test.go
index 1c04c602..647710e2 100644
--- a/workflowproj/workflowproj_test.go
+++ b/workflowproj/workflowproj_test.go
@@ -77,6 +77,8 @@ func Test_Handler_WorkflowMinimalAndPropsAndSpec(t 
*testing.T) {
                AsObjects()
        assert.NoError(t, err)
        assert.NotNil(t, proj.Workflow)
+       assert.NotNil(t, proj.Workflow.ObjectMeta)
+       assert.Equal(t, proj.Workflow.ObjectMeta.Labels, 
map[string]string{"app": "hello", "sonataflow.org/workflow-app": "hello"})
        assert.NotNil(t, proj.Properties)
        assert.NotEmpty(t, proj.Resources)
        assert.Equal(t, "hello", proj.Workflow.Name)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to