blob: 7821c36aefd4d106b084ee7e051ec52c13f431b1 [file] [log] [blame]
/*
* 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.
*/
package workflowproj
import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"github.com/apache/incubator-kie-kogito-serverless-operator/api/metadata"
operatorapi "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
)
const (
workflowConfigMapNameSuffix = "-props"
// ApplicationPropertiesFileName is the default application properties file name
ApplicationPropertiesFileName = "application.properties"
// LabelApp key to use among object selectors, "app" is used among k8s applications to group objects in some UI consoles
LabelApp = "app"
// LabelService key to use among object selectors
LabelService = metadata.Domain + "/service"
// LabelWorkflow specialized label managed by the controller
LabelWorkflow = metadata.Domain + "/workflow-app"
)
// SetTypeToObject sets the Kind and ApiVersion to a given object since the default constructor won't do it.
// See: https://github.com/kubernetes/client-go/issues/308#issuecomment-700099260
func SetTypeToObject(obj runtime.Object, s *runtime.Scheme) error {
gvks, _, err := s.ObjectKinds(obj)
if err != nil {
return err
}
for _, gvk := range gvks {
if len(gvk.Kind) == 0 {
continue
}
if len(gvk.Version) == 0 || gvk.Version == runtime.APIVersionInternal {
continue
}
obj.GetObjectKind().SetGroupVersionKind(gvk)
break
}
return nil
}
// GetWorkflowPropertiesConfigMapName gets the default ConfigMap name that holds the application property for the given workflow
func GetWorkflowPropertiesConfigMapName(workflow *operatorapi.SonataFlow) string {
return workflow.Name + workflowConfigMapNameSuffix
}
// 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,
LabelWorkflow: workflow.Name,
}
}
// CreateNewAppPropsConfigMap creates a new ConfigMap object to hold the workflow application properties.
func CreateNewAppPropsConfigMap(workflow *operatorapi.SonataFlow, properties string) *corev1.ConfigMap {
return &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: GetWorkflowPropertiesConfigMapName(workflow),
Namespace: workflow.Namespace,
Labels: GetDefaultLabels(workflow),
},
Data: map[string]string{ApplicationPropertiesFileName: properties},
}
}
// SetWorkflowProfile adds the profile annotation to the workflow
func SetWorkflowProfile(workflow *operatorapi.SonataFlow, profile metadata.ProfileType) {
if workflow.Annotations == nil {
workflow.Annotations = map[string]string{}
}
workflow.Annotations[metadata.Profile] = string(profile)
}