Skip to content

Commit 3f8a211

Browse files
feat: propagate labels such as envName and projectName (#5063)
* new deployment chart version wit hupdated label in image_descriptor_template and changes in ReleaseAttributes obj to support diff labels such as appName, envName etc.. * correcting format of image descriptor tempalte for deployment template v1.20 * correcting template files of 1.20 deployment version * removing new chart after testing * propagate extra labels via leveraging appLabels * refactoring * refactoring * making MergeChildMapToParentMap generic * making MergeChildMapToParentMap generic * making MergeChildMapToParentMap generic with comparable * added comment for better understanding * removed ManagedByK8sLabel after disc with product and devops
1 parent d6e8195 commit 3f8a211

File tree

5 files changed

+63
-12
lines changed

5 files changed

+63
-12
lines changed

pkg/app/AppCrudOperationService.go

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package app
2020
import (
2121
"encoding/json"
2222
"fmt"
23+
bean3 "github.com/devtron-labs/devtron/pkg/deployment/manifest/bean"
2324
"regexp"
2425
"strconv"
2526
"strings"
@@ -48,7 +49,7 @@ type AppCrudOperationService interface {
4849
FindAll() ([]*bean.AppLabelDto, error)
4950
GetAppMetaInfo(appId int, installedAppId int, envId int) (*bean.AppMetaInfoDto, error)
5051
GetHelmAppMetaInfo(appId string) (*bean.AppMetaInfoDto, error)
51-
GetLabelsByAppIdForDeployment(appId int) ([]byte, error)
52+
GetAppLabelsForDeployment(appId int, appName, envName string) ([]byte, error)
5253
GetLabelsByAppId(appId int) (map[string]string, error)
5354
UpdateApp(request *bean.CreateAppDTO) (*bean.CreateAppDTO, error)
5455
UpdateProjectForApps(request *bean.UpdateProjectBulkAppsRequest) (*bean.UpdateProjectBulkAppsRequest, error)
@@ -491,14 +492,13 @@ func (impl AppCrudOperationServiceImpl) GetHelmAppMetaInfo(appId string) (*bean.
491492
return info, nil
492493
}
493494

494-
func (impl AppCrudOperationServiceImpl) GetLabelsByAppIdForDeployment(appId int) ([]byte, error) {
495-
appLabelJson := &bean.AppLabelsJsonForDeployment{}
495+
func (impl AppCrudOperationServiceImpl) getLabelsByAppIdForDeployment(appId int) (map[string]string, error) {
496+
labelsDto := make(map[string]string)
496497
labels, err := impl.appLabelRepository.FindAllByAppId(appId)
497498
if err != nil && err != pg.ErrNoRows {
498499
impl.logger.Errorw("error in getting app labels by appId", "err", err, "appId", appId)
499-
return nil, err
500+
return labelsDto, err
500501
}
501-
labelsDto := make(map[string]string)
502502
for _, label := range labels {
503503
labelKey := strings.TrimSpace(label.Key)
504504
labelValue := strings.TrimSpace(label.Value)
@@ -524,14 +524,47 @@ func (impl AppCrudOperationServiceImpl) GetLabelsByAppIdForDeployment(appId int)
524524

525525
labelsDto[labelKey] = labelValue
526526
}
527-
appLabelJson.Labels = labelsDto
527+
return labelsDto, nil
528+
}
529+
530+
func (impl AppCrudOperationServiceImpl) getExtraAppLabelsToPropagate(appId int, appName, envName string) (map[string]string, error) {
531+
appMetaInfo, err := impl.appRepository.FindAppAndProjectByAppId(appId)
532+
if err != nil {
533+
impl.logger.Errorw("error in finding app and project by appId", "appId", appId, "err", err)
534+
return nil, err
535+
}
536+
return map[string]string{
537+
bean3.AppNameDevtronLabel: appName,
538+
bean3.EnvNameDevtronLabel: envName,
539+
bean3.ProjectNameDevtronLabel: appMetaInfo.Team.Name,
540+
}, nil
541+
}
542+
543+
func (impl AppCrudOperationServiceImpl) GetAppLabelsForDeployment(appId int, appName, envName string) ([]byte, error) {
544+
appLabelJson := &bean.AppLabelsJsonForDeployment{}
545+
appLabelsMapFromDb, err := impl.getLabelsByAppIdForDeployment(appId)
546+
if err != nil {
547+
impl.logger.Errorw("error in getting app labels from db using appId", "appId", appId, "err", err)
548+
return nil, err
549+
}
550+
extraAppLabelsToPropagate, err := impl.getExtraAppLabelsToPropagate(appId, appName, envName)
551+
if err != nil {
552+
impl.logger.Errorw("error in getting extra app labels to propagate", "appName", appName, "envName", envName, "err", err)
553+
return nil, err
554+
}
555+
//when app labels are provided by the user and share the same label key names as those in the extraAppLabelsToPropagate map,
556+
//priority will be given to the user-provided label keys.
557+
mergedAppLabels := MergeChildMapToParentMap(appLabelsMapFromDb, extraAppLabelsToPropagate)
558+
559+
appLabelJson.Labels = mergedAppLabels
528560
appLabelByte, err := json.Marshal(appLabelJson)
529561
if err != nil {
530562
impl.logger.Errorw("error in marshaling appLabels json", "err", err, "appLabelJson", appLabelJson)
531563
return nil, err
532564
}
533565
return appLabelByte, nil
534566
}
567+
535568
func (impl AppCrudOperationServiceImpl) GetLabelsByAppId(appId int) (map[string]string, error) {
536569
labels, err := impl.appLabelRepository.FindAllByAppId(appId)
537570
if err != nil {

pkg/app/AppService.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,8 +1060,8 @@ type ReleaseAttributes struct {
10601060
PipelineName string
10611061
ReleaseVersion string
10621062
DeploymentType string
1063-
App string
1064-
Env string
1063+
App string // App here corresponds to appId
1064+
Env string // Env here corresponds to envId
10651065
AppMetrics *bool
10661066
}
10671067

pkg/app/helper.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package app
2+
3+
// MergeChildMapToParentMap merges child map of generic type map into parent map of generic type
4+
// and returns merged mapping, if parentMap is nil then nil is returned.
5+
func MergeChildMapToParentMap[T comparable, R any](parentMap map[T]R, toMergeMap map[T]R) map[T]R {
6+
if parentMap == nil {
7+
return nil
8+
}
9+
for key, value := range toMergeMap {
10+
if _, ok := parentMap[key]; !ok {
11+
parentMap[key] = value
12+
}
13+
}
14+
return parentMap
15+
}

pkg/deployment/manifest/ManifestCreationService.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"go.opentelemetry.io/otel"
3939
"go.uber.org/zap"
4040
"k8s.io/apimachinery/pkg/runtime/schema"
41+
"net/http"
4142
"strconv"
4243
"strings"
4344
"time"
@@ -226,13 +227,12 @@ func (impl *ManifestCreationServiceImpl) GetValuesOverrideForTrigger(overrideReq
226227
configMapJson = nil
227228
}
228229
_, span = otel.Tracer("orchestrator").Start(ctx, "appCrudOperationService.GetLabelsByAppIdForDeployment")
229-
appLabelJsonByte, err = impl.appCrudOperationService.GetLabelsByAppIdForDeployment(overrideRequest.AppId)
230+
appLabelJsonByte, err = impl.appCrudOperationService.GetAppLabelsForDeployment(overrideRequest.AppId, overrideRequest.AppName, overrideRequest.EnvName)
230231
span.End()
231232
if err != nil {
232233
impl.logger.Errorw("error in fetching app labels for gitOps commit", "err", err)
233234
appLabelJsonByte = nil
234235
}
235-
236236
mergedValues, err := impl.mergeOverrideValues(envOverride, releaseOverrideJson, configMapJson, appLabelJsonByte, strategy)
237237
appName := fmt.Sprintf("%s-%s", overrideRequest.AppName, envOverride.Environment.Name)
238238
mergedValues = impl.autoscalingCheckBeforeTrigger(ctx, appName, envOverride.Namespace, mergedValues, overrideRequest)
@@ -676,7 +676,6 @@ func (impl *ManifestCreationServiceImpl) getReleaseOverride(envOverride *chartCo
676676
if digestPolicyConfigurations.UseDigestForTrigger() {
677677
imageTag[imageTagLen-1] = fmt.Sprintf("%s@%s", imageTag[imageTagLen-1], artifact.ImageDigest)
678678
}
679-
680679
releaseAttribute := app.ReleaseAttributes{
681680
Name: imageName,
682681
Tag: imageTag[imageTagLen-1],
@@ -687,9 +686,10 @@ func (impl *ManifestCreationServiceImpl) getReleaseOverride(envOverride *chartCo
687686
Env: envId,
688687
AppMetrics: appMetrics,
689688
}
689+
690690
override, err := util4.Tprintf(envOverride.Chart.ImageDescriptorTemplate, releaseAttribute)
691691
if err != nil {
692-
return "", &util.ApiError{InternalMessage: "unable to render ImageDescriptorTemplate"}
692+
return "", &util.ApiError{HttpStatusCode: http.StatusUnprocessableEntity, InternalMessage: "unable to render ImageDescriptorTemplate"}
693693
}
694694
if overrideRequest.AdditionalOverride != nil {
695695
userOverride, err := overrideRequest.AdditionalOverride.MarshalJSON()

pkg/deployment/manifest/bean/bean.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ const (
1212
HorizontalPodAutoscaler = "HorizontalPodAutoscaler"
1313
Enabled = "enabled"
1414
ReplicaCount = "replicaCount"
15+
AppNameDevtronLabel = "api.devtron.ai/appName"
16+
EnvNameDevtronLabel = "api.devtron.ai/envName"
17+
ProjectNameDevtronLabel = "api.devtron.ai/project"
1518
)
1619

1720
type ConfigMapAndSecretJsonV2 struct {

0 commit comments

Comments
 (0)