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]