Skip to content

Commit 896218b

Browse files
committed
Merge branch 'main' into fix-argocd-rbac-kubelink
2 parents 0a7eb78 + cfc412f commit 896218b

File tree

7 files changed

+266
-77
lines changed

7 files changed

+266
-77
lines changed

api/restHandler/CoreAppRestHandler.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,7 +1763,7 @@ func (handler CoreAppRestHandlerImpl) createEnvDeploymentTemplate(appId int, use
17631763
}
17641764

17651765
// if chart not found for chart_ref then create
1766-
_, err = handler.chartRepo.FindChartByAppIdAndRefId(appId, chartRefId)
1766+
chartEntry, err := handler.chartRepo.FindChartByAppIdAndRefId(appId, chartRefId)
17671767
if err != nil {
17681768
if pg.ErrNoRows == err {
17691769
templateRequest := chart.TemplateRequest{
@@ -1785,9 +1785,15 @@ func (handler CoreAppRestHandlerImpl) createEnvDeploymentTemplate(appId int, use
17851785
}
17861786

17871787
// create if required
1788-
_, err = handler.propertiesConfigService.CreateEnvironmentProperties(appId, envConfigProperties)
1788+
appMetrics := false
1789+
if envConfigProperties.AppMetrics != nil {
1790+
appMetrics = *envConfigProperties.AppMetrics
1791+
}
1792+
chartEntry.GlobalOverride = string(envConfigProperties.EnvOverrideValues)
1793+
_, err = handler.propertiesConfigService.CreateIfRequired(chartEntry, envId, userId, envConfigProperties.ManualReviewed, models.CHARTSTATUS_SUCCESS,
1794+
true, appMetrics, envConfigProperties.Namespace, envConfigProperties.IsBasicViewLocked, envConfigProperties.CurrentViewEditor, nil)
17891795
if err != nil {
1790-
handler.logger.Errorw("service err, CreateEnvironmentProperties", "err", err, "appId", appId, "envId", envId, "chartRefId", chartRefId)
1796+
handler.logger.Errorw("service err, CreateIfRequired", "err", err, "appId", appId, "envId", envId, "chartRefId", chartRefId)
17911797
return err
17921798
}
17931799

@@ -2089,7 +2095,6 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r
20892095
//rbac ends
20902096

20912097
handler.logger.Infow("creating app workflow created ", "createAppRequest", createAppRequest)
2092-
var errResp *multierror.Error
20932098
var statusCode int
20942099

20952100
//creating workflow starts
@@ -2100,7 +2105,7 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r
21002105
}
21012106
err, statusCode = handler.createWorkflows(ctx, createAppRequest.AppId, userId, createAppRequest.AppWorkflows, token, app.AppName)
21022107
if err != nil {
2103-
common.WriteJsonResp(w, errResp, nil, statusCode)
2108+
common.WriteJsonResp(w, err, nil, statusCode)
21042109
return
21052110
}
21062111
}
@@ -2110,7 +2115,7 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r
21102115
if createAppRequest.EnvironmentOverrides != nil && len(createAppRequest.EnvironmentOverrides) > 0 {
21112116
err, statusCode = handler.createEnvOverrides(ctx, createAppRequest.AppId, userId, createAppRequest.EnvironmentOverrides, token)
21122117
if err != nil {
2113-
common.WriteJsonResp(w, errResp, nil, statusCode)
2118+
common.WriteJsonResp(w, err, nil, statusCode)
21142119
return
21152120
}
21162121
}

pkg/app/AppService.go

Lines changed: 118 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3246,6 +3246,72 @@ func (impl *AppServiceImpl) UpdateCdWorkflowRunnerByACDObject(app *v1alpha1.Appl
32463246
return nil
32473247
}
32483248

3249+
const kedaAutoscaling = "kedaAutoscaling"
3250+
const HorizontalPodAutoscaler = "HorizontalPodAutoscaler"
3251+
const fullnameOverride = "fullnameOverride"
3252+
const nameOverride = "nameOverride"
3253+
const enabled = "enabled"
3254+
const replicaCount = "replicaCount"
3255+
3256+
func (impl *AppServiceImpl) getAutoScalingReplicaCount(templateMap map[string]interface{}, appName string) *util2.HpaResourceRequest {
3257+
hasOverride := false
3258+
if _, ok := templateMap[fullnameOverride]; ok {
3259+
appNameOverride := templateMap[fullnameOverride].(string)
3260+
if len(appNameOverride) > 0 {
3261+
appName = appNameOverride
3262+
hasOverride = true
3263+
}
3264+
}
3265+
if !hasOverride {
3266+
if _, ok := templateMap[nameOverride]; ok {
3267+
nameOverride := templateMap[nameOverride].(string)
3268+
if len(nameOverride) > 0 {
3269+
appName = fmt.Sprintf("%s-%s", appName, nameOverride)
3270+
}
3271+
}
3272+
}
3273+
hpaResourceRequest := &util2.HpaResourceRequest{}
3274+
hpaResourceRequest.Version = ""
3275+
hpaResourceRequest.Group = autoscaling.ServiceName
3276+
hpaResourceRequest.Kind = HorizontalPodAutoscaler
3277+
impl.logger.Infow("getAutoScalingReplicaCount", "hpaResourceRequest", hpaResourceRequest)
3278+
if _, ok := templateMap[kedaAutoscaling]; ok {
3279+
as := templateMap[kedaAutoscaling]
3280+
asd := as.(map[string]interface{})
3281+
if _, ok := asd[enabled]; ok {
3282+
impl.logger.Infow("getAutoScalingReplicaCount", "hpaResourceRequest", hpaResourceRequest)
3283+
enable := asd[enabled].(bool)
3284+
if enable {
3285+
hpaResourceRequest.IsEnable = enable
3286+
hpaResourceRequest.ReqReplicaCount = templateMap[replicaCount].(float64)
3287+
hpaResourceRequest.ReqMaxReplicas = asd["maxReplicaCount"].(float64)
3288+
hpaResourceRequest.ReqMinReplicas = asd["minReplicaCount"].(float64)
3289+
hpaResourceRequest.ResourceName = fmt.Sprintf("%s-%s-%s", "keda-hpa", appName, "keda")
3290+
impl.logger.Infow("getAutoScalingReplicaCount", "hpaResourceRequest", hpaResourceRequest)
3291+
return hpaResourceRequest
3292+
}
3293+
}
3294+
}
3295+
3296+
if _, ok := templateMap[autoscaling.ServiceName]; ok {
3297+
as := templateMap[autoscaling.ServiceName]
3298+
asd := as.(map[string]interface{})
3299+
if _, ok := asd[enabled]; ok {
3300+
enable := asd[enabled].(bool)
3301+
if enable {
3302+
hpaResourceRequest.IsEnable = asd[enabled].(bool)
3303+
hpaResourceRequest.ReqReplicaCount = templateMap[replicaCount].(float64)
3304+
hpaResourceRequest.ReqMaxReplicas = asd["MaxReplicas"].(float64)
3305+
hpaResourceRequest.ReqMinReplicas = asd["MinReplicas"].(float64)
3306+
hpaResourceRequest.ResourceName = fmt.Sprintf("%s-%s", appName, "hpa")
3307+
return hpaResourceRequest
3308+
}
3309+
}
3310+
}
3311+
return hpaResourceRequest
3312+
3313+
}
3314+
32493315
func (impl *AppServiceImpl) autoscalingCheckBeforeTrigger(ctx context.Context, appName string, namespace string, merged []byte, overrideRequest *bean.ValuesOverrideRequest) []byte {
32503316
//pipeline := overrideRequest.Pipeline
32513317
var appId = overrideRequest.AppId
@@ -3258,77 +3324,66 @@ func (impl *AppServiceImpl) autoscalingCheckBeforeTrigger(ctx context.Context, a
32583324
if err != nil {
32593325
return merged
32603326
}
3261-
if _, ok := templateMap[autoscaling.ServiceName]; ok {
3262-
as := templateMap[autoscaling.ServiceName]
3263-
asd := as.(map[string]interface{})
3264-
isEnable := false
3265-
if _, ok := asd["enabled"]; ok {
3266-
isEnable = asd["enabled"].(bool)
3267-
}
3268-
if isEnable {
3269-
reqReplicaCount := templateMap["replicaCount"].(float64)
3270-
reqMaxReplicas := asd["MaxReplicas"].(float64)
3271-
reqMinReplicas := asd["MinReplicas"].(float64)
3272-
version := ""
3273-
group := autoscaling.ServiceName
3274-
kind := "HorizontalPodAutoscaler"
3275-
resourceName := fmt.Sprintf("%s-%s", appName, "hpa")
3276-
resourceManifest := make(map[string]interface{})
3277-
if IsAcdApp(appDeploymentType) {
3278-
query := &application2.ApplicationResourceRequest{
3279-
Name: &appName,
3280-
Version: &version,
3281-
Group: &group,
3282-
Kind: &kind,
3283-
ResourceName: &resourceName,
3284-
Namespace: &namespace,
3285-
}
3286-
recv, err := impl.acdClient.GetResource(ctx, query)
3287-
impl.logger.Debugw("resource manifest get replica count", "response", recv)
3288-
if err != nil {
3289-
impl.logger.Errorw("ACD Get Resource API Failed", "err", err)
3290-
middleware.AcdGetResourceCounter.WithLabelValues(strconv.Itoa(appId), namespace, appName).Inc()
3291-
return merged
3292-
}
3293-
if recv != nil && len(*recv.Manifest) > 0 {
3294-
err := json.Unmarshal([]byte(*recv.Manifest), &resourceManifest)
3295-
if err != nil {
3296-
impl.logger.Errorw("unmarshal failed for hpa check", "err", err)
3297-
return merged
3298-
}
3299-
}
3300-
} else {
3301-
version = "v2beta2"
3302-
k8sResource, err := impl.k8sApplicationService.GetResource(ctx, &k8s.ResourceRequestBean{ClusterId: clusterId,
3303-
K8sRequest: &application3.K8sRequestBean{ResourceIdentifier: application3.ResourceIdentifier{Name: resourceName,
3304-
Namespace: namespace, GroupVersionKind: schema.GroupVersionKind{Group: group, Kind: kind, Version: version}}}})
3305-
if err != nil {
3306-
impl.logger.Errorw("error occurred while fetching resource for app", "resourceName", resourceName, "err", err)
3307-
return merged
3308-
}
3309-
resourceManifest = k8sResource.Manifest.Object
3310-
}
3311-
if len(resourceManifest) > 0 {
3312-
statusMap := resourceManifest["status"].(map[string]interface{})
3313-
currentReplicaVal := statusMap["currentReplicas"]
3314-
currentReplicaCount, err := util2.ParseFloatNumber(currentReplicaVal)
3315-
if err != nil {
3316-
impl.logger.Errorw("error occurred while parsing replica count", "currentReplicas", currentReplicaVal, "err", err)
3317-
return merged
3318-
}
33193327

3320-
reqReplicaCount = impl.fetchRequiredReplicaCount(currentReplicaCount, reqMaxReplicas, reqMinReplicas)
3321-
templateMap["replicaCount"] = reqReplicaCount
3322-
merged, err = json.Marshal(&templateMap)
3328+
hpaResourceRequest := impl.getAutoScalingReplicaCount(templateMap, appName)
3329+
impl.logger.Debugw("autoscalingCheckBeforeTrigger", "hpaResourceRequest", hpaResourceRequest)
3330+
if hpaResourceRequest.IsEnable {
3331+
resourceManifest := make(map[string]interface{})
3332+
if IsAcdApp(appDeploymentType) {
3333+
query := &application2.ApplicationResourceRequest{
3334+
Name: &appName,
3335+
Version: &hpaResourceRequest.Version,
3336+
Group: &hpaResourceRequest.Group,
3337+
Kind: &hpaResourceRequest.Kind,
3338+
ResourceName: &hpaResourceRequest.ResourceName,
3339+
Namespace: &namespace,
3340+
}
3341+
recv, err := impl.acdClient.GetResource(ctx, query)
3342+
impl.logger.Debugw("resource manifest get replica count", "response", recv)
3343+
if err != nil {
3344+
impl.logger.Errorw("ACD Get Resource API Failed", "err", err)
3345+
middleware.AcdGetResourceCounter.WithLabelValues(strconv.Itoa(appId), namespace, appName).Inc()
3346+
return merged
3347+
}
3348+
if recv != nil && len(*recv.Manifest) > 0 {
3349+
err := json.Unmarshal([]byte(*recv.Manifest), &resourceManifest)
33233350
if err != nil {
3324-
impl.logger.Errorw("marshaling failed for hpa check", "err", err)
3351+
impl.logger.Errorw("unmarshal failed for hpa check", "err", err)
33253352
return merged
33263353
}
33273354
}
33283355
} else {
3329-
impl.logger.Errorw("autoscaling is not enabled", "pipelineId", pipelineId)
3356+
version := "v2beta2"
3357+
k8sResource, err := impl.k8sApplicationService.GetResource(ctx, &k8s.ResourceRequestBean{ClusterId: clusterId,
3358+
K8sRequest: &application3.K8sRequestBean{ResourceIdentifier: application3.ResourceIdentifier{Name: hpaResourceRequest.ResourceName,
3359+
Namespace: namespace, GroupVersionKind: schema.GroupVersionKind{Group: hpaResourceRequest.Group, Kind: hpaResourceRequest.Kind, Version: version}}}})
3360+
if err != nil {
3361+
impl.logger.Errorw("error occurred while fetching resource for app", "resourceName", hpaResourceRequest.ResourceName, "err", err)
3362+
return merged
3363+
}
3364+
resourceManifest = k8sResource.Manifest.Object
3365+
}
3366+
if len(resourceManifest) > 0 {
3367+
statusMap := resourceManifest["status"].(map[string]interface{})
3368+
currentReplicaVal := statusMap["currentReplicas"]
3369+
currentReplicaCount, err := util2.ParseFloatNumber(currentReplicaVal)
3370+
if err != nil {
3371+
impl.logger.Errorw("error occurred while parsing replica count", "currentReplicas", currentReplicaVal, "err", err)
3372+
return merged
3373+
}
3374+
3375+
reqReplicaCount := impl.fetchRequiredReplicaCount(currentReplicaCount, hpaResourceRequest.ReqMaxReplicas, hpaResourceRequest.ReqMinReplicas)
3376+
templateMap["replicaCount"] = reqReplicaCount
3377+
merged, err = json.Marshal(&templateMap)
3378+
if err != nil {
3379+
impl.logger.Errorw("marshaling failed for hpa check", "err", err)
3380+
return merged
3381+
}
33303382
}
3383+
} else {
3384+
impl.logger.Errorw("autoscaling is not enabled", "pipelineId", pipelineId)
33313385
}
3386+
33323387
//check for custom chart support
33333388
if autoscalingEnabledPath, ok := templateMap[bean2.CustomAutoScalingEnabledPathKey]; ok {
33343389
if deploymentType == models.DEPLOYMENTTYPE_STOP {

pkg/pipeline/WorkflowUtils.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,19 @@ func AddTemplatesForGlobalSecretsInWorkflowTemplate(globalCmCsConfigs []*bean.Gl
215215
})
216216
cmIndex++
217217
} else if config.ConfigType == repository.CS_TYPE_CONFIG {
218-
secretJson, err := GetSecretJson(ConfigMapSecretDto{Name: config.Name, Data: config.Data, OwnerRef: ArgoWorkflowOwnerRef})
218+
219+
// special handling for secret data since GetSecretJson expects encoded values in data map
220+
encodedSecretData, err := bean.ConvertToEncodedForm(config.Data)
221+
if err != nil {
222+
return err
223+
}
224+
var encodedSecretDataMap = make(map[string]string)
225+
err = json.Unmarshal(encodedSecretData, &encodedSecretDataMap)
226+
if err != nil {
227+
return err
228+
}
229+
230+
secretJson, err := GetSecretJson(ConfigMapSecretDto{Name: config.Name, Data: encodedSecretDataMap, OwnerRef: ArgoWorkflowOwnerRef})
219231
if err != nil {
220232
return err
221233
}

pkg/pipeline/bean/GlobalCMCSDto.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,35 @@ type GlobalCMCSDto struct {
2020
}
2121

2222
func (dto GlobalCMCSDto) ConvertToConfigSecretMap() (bean.ConfigSecretMap, error) {
23-
var jsonRawMsg []byte
24-
var err error
23+
2524
configSecretMap := bean.ConfigSecretMap{}
2625
configSecretMap.Name = dto.Name
2726
configSecretMap.Type = dto.Type
2827
configSecretMap.MountPath = dto.MountPath
2928

29+
var jsonRawMsg []byte
30+
var err error
3031
// adding handling to get base64 encoded value in map value in case of secrets
3132
if dto.ConfigType == repository.CS_TYPE_CONFIG {
32-
var csDataMap = make(map[string][]byte)
33-
for key, value := range dto.Data {
34-
csDataMap[key] = []byte(value)
35-
}
36-
jsonRawMsg, err = json.Marshal(csDataMap)
33+
jsonRawMsg, err = ConvertToEncodedForm(dto.Data)
3734

3835
} else {
3936
jsonRawMsg, err = json.Marshal(dto.Data)
4037
}
38+
4139
if err != nil {
4240
return configSecretMap, err
4341
}
4442
configSecretMap.Data = jsonRawMsg
4543
return configSecretMap, nil
4644
}
45+
46+
// ConvertToEncodedForm Function to encode the values in the input map values
47+
func ConvertToEncodedForm(data map[string]string) ([]byte, error) {
48+
var csDataMap = make(map[string][]byte)
49+
for key, value := range data {
50+
csDataMap[key] = []byte(value)
51+
}
52+
jsonRawMsg, err := json.Marshal(csDataMap)
53+
return jsonRawMsg, err
54+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
DROP TABLE IF EXISTS devtron_resource_searchable_key CASCADE;
2+
DROP SEQUENCE IF EXISTS id_seq_devtron_resource_searchable_key CASCADE;
3+
4+
5+
DROP TABLE IF EXISTS global_policy_history;
6+
DROP SEQUENCE IF EXISTS id_seq_global_policy_history;
7+
8+
DROP TABLE IF EXISTS global_policy_searchable_field;
9+
DROP SEQUENCE IF EXISTS id_seq_global_policy_searchable_field;
10+
11+
DROP TABLE IF EXISTS global_policy CASCADE;
12+
DROP SEQUENCE IF EXISTS id_seq_global_policy CASCADE;
13+

0 commit comments

Comments
 (0)