From 1b85969dc0ba6a4bd01d632c6cc903b2c9b37486 Mon Sep 17 00:00:00 2001 From: vikramdevtron Date: Thu, 20 Apr 2023 17:13:04 +0530 Subject: [PATCH 1/4] ignore pipeline overrides in strategies in not provided --- pkg/pipeline/PipelineBuilder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go index 09dc9a2008..6daa1303e7 100644 --- a/pkg/pipeline/PipelineBuilder.go +++ b/pkg/pipeline/PipelineBuilder.go @@ -2488,8 +2488,8 @@ type Recreate struct { } type Rolling struct { - MaxSurge string `json:"maxSurge"` - MaxUnavailable int `json:"maxUnavailable"` + MaxSurge string `json:"maxSurge,omitempty"` + MaxUnavailable int `json:"maxUnavailable,omitempty"` } func (impl PipelineBuilderImpl) createCdPipeline(ctx context.Context, app *app2.App, pipeline *bean.CDPipelineConfigObject, userId int32) (pipelineRes int, err error) { From 196a9ce4a680922d82b7bd1db9b686d685ade240 Mon Sep 17 00:00:00 2001 From: vikramdevtron Date: Thu, 20 Apr 2023 21:10:38 +0530 Subject: [PATCH 2/4] pipeline strategies dynamic handling --- .../repository/ChartRefRepository.go | 1 + pkg/pipeline/PipelineBuilder.go | 122 +++--------------- ...32_alter_global_strategy_metadata.down.sql | 1 + .../132_alter_global_strategy_metadata.up.sql | 6 + 4 files changed, 25 insertions(+), 105 deletions(-) create mode 100644 scripts/sql/132_alter_global_strategy_metadata.down.sql create mode 100644 scripts/sql/132_alter_global_strategy_metadata.up.sql diff --git a/pkg/chartRepo/repository/ChartRefRepository.go b/pkg/chartRepo/repository/ChartRefRepository.go index a28efa064b..13b7f426e6 100644 --- a/pkg/chartRepo/repository/ChartRefRepository.go +++ b/pkg/chartRepo/repository/ChartRefRepository.go @@ -156,6 +156,7 @@ type GlobalStrategyMetadata struct { tableName struct{} `sql:"global_strategy_metadata" pg:",discard_unknown_columns"` Id int `sql:"id,pk"` Name DeploymentStrategy `sql:"name"` + Key string `sql:"key"` Description string `sql:"description"` Deleted bool `sql:"deleted,notnull"` sql.AuditLog diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go index 6daa1303e7..d37bd08a15 100644 --- a/pkg/pipeline/PipelineBuilder.go +++ b/pkg/pipeline/PipelineBuilder.go @@ -2447,49 +2447,7 @@ type DeploymentType struct { } type Deployment struct { - Strategy Strategy `json:"strategy"` -} - -type Strategy struct { - BlueGreen *BlueGreen `json:"blueGreen,omitempty"` - Rolling *Rolling `json:"rolling,omitempty"` - Canary *Canary `json:"canary,omitempty"` - Recreate *Recreate `json:"recreate,omitempty"` -} - -type BlueGreen struct { - AutoPromotionSeconds int `json:"autoPromotionSeconds"` - ScaleDownDelaySeconds int `json:"scaleDownDelaySeconds"` - PreviewReplicaCount int `json:"previewReplicaCount"` - AutoPromotionEnabled bool `json:"autoPromotionEnabled"` -} - -type Canary struct { - MaxSurge string `json:"maxSurge,omitempty"` - MaxUnavailable int `json:"maxUnavailable,omitempty"` - Steps []CanaryStep `json:"steps,omitempty"` -} - -type CanaryStep struct { - // SetWeight sets what percentage of the newRS should receive - SetWeight *int32 `json:"setWeight,omitempty"` - // Pause freezes the rollout by setting spec.Paused to true. - // A Rollout will resume when spec.Paused is reset to false. - // +optional - Pause *RolloutPause `json:"pause,omitempty"` -} - -type RolloutPause struct { - // Duration the amount of time to wait before moving to the next step. - // +optional - Duration *int32 `json:"duration,omitempty"` -} -type Recreate struct { -} - -type Rolling struct { - MaxSurge string `json:"maxSurge,omitempty"` - MaxUnavailable int `json:"maxUnavailable,omitempty"` + Strategy map[string]interface{} `json:"strategy"` } func (impl PipelineBuilderImpl) createCdPipeline(ctx context.Context, app *app2.App, pipeline *bean.CDPipelineConfigObject, userId int32) (pipelineRes int, err error) { @@ -2749,71 +2707,25 @@ func (impl PipelineBuilderImpl) updateCdPipeline(ctx context.Context, pipeline * return nil } -func (impl PipelineBuilderImpl) filterDeploymentTemplate(deploymentTemplate chartRepoRepository.DeploymentStrategy, pipelineOverride string) (string, error) { - var deploymentType DeploymentType - err := json.Unmarshal([]byte(pipelineOverride), &deploymentType) +func (impl PipelineBuilderImpl) filterDeploymentTemplate(strategyKey string, pipelineStrategiesJson string) (string, error) { + var pipelineStrategies DeploymentType + err := json.Unmarshal([]byte(pipelineStrategiesJson), &pipelineStrategies) if err != nil { impl.logger.Errorw("err", err) return "", err } - if chartRepoRepository.DEPLOYMENT_STRATEGY_BLUE_GREEN == deploymentTemplate { - newDeploymentType := DeploymentType{ - Deployment: Deployment{ - Strategy: Strategy{ - BlueGreen: deploymentType.Deployment.Strategy.BlueGreen, - }, - }, - } - pipelineOverrideBytes, err := json.Marshal(newDeploymentType) - if err != nil { - impl.logger.Errorw("err", err) - return "", err - } - pipelineOverride = string(pipelineOverrideBytes) - } else if chartRepoRepository.DEPLOYMENT_STRATEGY_ROLLING == deploymentTemplate { - newDeploymentType := DeploymentType{ - Deployment: Deployment{ - Strategy: Strategy{ - Rolling: deploymentType.Deployment.Strategy.Rolling, - }, - }, - } - pipelineOverrideBytes, err := json.Marshal(newDeploymentType) - if err != nil { - impl.logger.Errorw("err", err) - return "", err - } - pipelineOverride = string(pipelineOverrideBytes) - } else if chartRepoRepository.DEPLOYMENT_STRATEGY_CANARY == deploymentTemplate { - newDeploymentType := DeploymentType{ - Deployment: Deployment{ - Strategy: Strategy{ - Canary: deploymentType.Deployment.Strategy.Canary, - }, - }, - } - pipelineOverrideBytes, err := json.Marshal(newDeploymentType) - if err != nil { - impl.logger.Errorw("err", err) - return "", err - } - pipelineOverride = string(pipelineOverrideBytes) - } else if chartRepoRepository.DEPLOYMENT_STRATEGY_RECREATE == deploymentTemplate { - newDeploymentType := DeploymentType{ - Deployment: Deployment{ - Strategy: Strategy{ - Recreate: deploymentType.Deployment.Strategy.Recreate, - }, - }, - } - pipelineOverrideBytes, err := json.Marshal(newDeploymentType) - if err != nil { - impl.logger.Errorw("err", err) - return "", err - } - pipelineOverride = string(pipelineOverrideBytes) + pipelineStrategy := DeploymentType{ + Deployment: Deployment{ + Strategy: pipelineStrategies.Deployment.Strategy[strategyKey].(map[string]interface{}), + }, + } + pipelineOverrideBytes, err := json.Marshal(pipelineStrategy) + if err != nil { + impl.logger.Errorw("error while marshal strategies", "err", err) + return "", err } - return pipelineOverride, nil + pipelineStrategyJson := string(pipelineOverrideBytes) + return pipelineStrategyJson, nil } func (impl PipelineBuilderImpl) GetTriggerViewCdPipelinesForApp(appId int) (cdPipelines *bean.CdPipelines, err error) { @@ -3378,13 +3290,13 @@ func (impl PipelineBuilderImpl) FetchCDPipelineStrategy(appId int) (PipelineStra } pipelineOverride := chart.PipelineOverride for _, globalStrategy := range globalStrategies { - config, err := impl.filterDeploymentTemplate(globalStrategy.Name, pipelineOverride) + pipelineStrategyJson, err := impl.filterDeploymentTemplate(globalStrategy.Key, pipelineOverride) if err != nil { return pipelineStrategiesResponse, err } pipelineStrategy := PipelineStrategy{ DeploymentTemplate: globalStrategy.Name, - Config: []byte(config), + Config: []byte(pipelineStrategyJson), } if globalStrategy.Name == chartRepoRepository.DEPLOYMENT_STRATEGY_ROLLING { pipelineStrategy.Default = true diff --git a/scripts/sql/132_alter_global_strategy_metadata.down.sql b/scripts/sql/132_alter_global_strategy_metadata.down.sql new file mode 100644 index 0000000000..26432d0989 --- /dev/null +++ b/scripts/sql/132_alter_global_strategy_metadata.down.sql @@ -0,0 +1 @@ +ALTER TABLE "public"."global_strategy_metadata" DROP COLUMN "key"; \ No newline at end of file diff --git a/scripts/sql/132_alter_global_strategy_metadata.up.sql b/scripts/sql/132_alter_global_strategy_metadata.up.sql new file mode 100644 index 0000000000..ba311ca37d --- /dev/null +++ b/scripts/sql/132_alter_global_strategy_metadata.up.sql @@ -0,0 +1,6 @@ +ALTER TABLE "public"."global_strategy_metadata" ADD COLUMN "key" varchar(250); +COMMENT ON COLUMN "public"."global_strategy_metadata"."key" IS 'strategy json key'; +UPDATE "public"."global_strategy_metadata" SET "key" = 'recreate' WHERE "name" = 'RECREATE'; +UPDATE "public"."global_strategy_metadata" SET "key" = 'canary' WHERE "name" = 'CANARY'; +UPDATE "public"."global_strategy_metadata" SET "key" = 'rolling' WHERE "name" = 'ROLLING'; +UPDATE "public"."global_strategy_metadata" SET "key" = 'blueGreen' WHERE "name" = 'BLUE-GREEN'; \ No newline at end of file From 7afa3fac10da8710115184bfbd78287db544ddda Mon Sep 17 00:00:00 2001 From: vikramdevtron Date: Fri, 21 Apr 2023 12:46:16 +0530 Subject: [PATCH 3/4] deployment strategies fetch issue fix --- pkg/pipeline/PipelineBuilder.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go index d37bd08a15..8a692c1ba7 100644 --- a/pkg/pipeline/PipelineBuilder.go +++ b/pkg/pipeline/PipelineBuilder.go @@ -2711,12 +2711,17 @@ func (impl PipelineBuilderImpl) filterDeploymentTemplate(strategyKey string, pip var pipelineStrategies DeploymentType err := json.Unmarshal([]byte(pipelineStrategiesJson), &pipelineStrategies) if err != nil { - impl.logger.Errorw("err", err) + impl.logger.Errorw("error while unmarshal strategies", "err", err) return "", err } + if pipelineStrategies.Deployment.Strategy[strategyKey] == nil { + return "", fmt.Errorf("no deployment strategy found for %s", strategyKey) + } + strategy := make(map[string]interface{}) + strategy[strategyKey] = pipelineStrategies.Deployment.Strategy[strategyKey].(map[string]interface{}) pipelineStrategy := DeploymentType{ Deployment: Deployment{ - Strategy: pipelineStrategies.Deployment.Strategy[strategyKey].(map[string]interface{}), + Strategy: strategy, }, } pipelineOverrideBytes, err := json.Marshal(pipelineStrategy) From bf47a45a15e0bcc6f99f0a9eac1a86fdb0499f5a Mon Sep 17 00:00:00 2001 From: vikramdevtron Date: Fri, 21 Apr 2023 19:23:56 +0530 Subject: [PATCH 4/4] added default strategy fix for deployment strategy --- .../repository/ChartRefRepository.go | 21 +++++++++++++++++-- pkg/pipeline/PipelineBuilder.go | 12 ++++------- ...32_alter_global_strategy_metadata.down.sql | 3 ++- .../132_alter_global_strategy_metadata.up.sql | 5 ++++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/pkg/chartRepo/repository/ChartRefRepository.go b/pkg/chartRepo/repository/ChartRefRepository.go index 13b7f426e6..5920899e78 100644 --- a/pkg/chartRepo/repository/ChartRefRepository.go +++ b/pkg/chartRepo/repository/ChartRefRepository.go @@ -196,13 +196,16 @@ func (impl *GlobalStrategyMetadataRepositoryImpl) GetByChartRefId(chartRefId int type GlobalStrategyMetadataChartRefMapping struct { tableName struct{} `sql:"global_strategy_metadata_chart_ref_mapping" pg:",discard_unknown_columns"` Id int `sql:"id,pk"` - GlobalStrategyMetadataId string `sql:"global_strategy_metadata_id"` - ChartRefId string `sql:"chart_ref_id"` + GlobalStrategyMetadataId int `sql:"global_strategy_metadata_id"` + ChartRefId int `sql:"chart_ref_id"` Active bool `sql:"active,notnull"` + Default bool `sql:"default,notnull"` + GlobalStrategyMetadata *GlobalStrategyMetadata sql.AuditLog } type GlobalStrategyMetadataChartRefMappingRepository interface { + GetByChartRefId(chartRefId int) ([]*GlobalStrategyMetadataChartRefMapping, error) } type GlobalStrategyMetadataChartRefMappingRepositoryImpl struct { dbConnection *pg.DB @@ -216,3 +219,17 @@ func NewGlobalStrategyMetadataChartRefMappingRepositoryImpl(dbConnection *pg.DB, logger: logger, } } + +func (impl *GlobalStrategyMetadataChartRefMappingRepositoryImpl) GetByChartRefId(chartRefId int) ([]*GlobalStrategyMetadataChartRefMapping, error) { + var globalStrategies []*GlobalStrategyMetadataChartRefMapping + err := impl.dbConnection.Model(&globalStrategies). + Column("global_strategy_metadata_chart_ref_mapping.*", "GlobalStrategyMetadata"). + Where("global_strategy_metadata_chart_ref_mapping.chart_ref_id = ?", chartRefId). + Where("global_strategy_metadata_chart_ref_mapping.active = ?", true). + Select() + if err != nil { + impl.logger.Errorw("error in getting global strategies metadata mapping by chartRefId", "err", err, "chartRefId", chartRefId) + return nil, err + } + return globalStrategies, err +} diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go index 8a692c1ba7..f290f5edbd 100644 --- a/pkg/pipeline/PipelineBuilder.go +++ b/pkg/pipeline/PipelineBuilder.go @@ -3285,7 +3285,7 @@ func (impl PipelineBuilderImpl) FetchCDPipelineStrategy(appId int) (PipelineStra } //get global strategy for this chart - globalStrategies, err := impl.globalStrategyMetadataRepository.GetByChartRefId(chart.ChartRefId) + globalStrategies, err := impl.globalStrategyMetadataChartRefMappingRepository.GetByChartRefId(chart.ChartRefId) if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("error in getting global strategies", "err", err) return pipelineStrategiesResponse, err @@ -3295,19 +3295,15 @@ func (impl PipelineBuilderImpl) FetchCDPipelineStrategy(appId int) (PipelineStra } pipelineOverride := chart.PipelineOverride for _, globalStrategy := range globalStrategies { - pipelineStrategyJson, err := impl.filterDeploymentTemplate(globalStrategy.Key, pipelineOverride) + pipelineStrategyJson, err := impl.filterDeploymentTemplate(globalStrategy.GlobalStrategyMetadata.Key, pipelineOverride) if err != nil { return pipelineStrategiesResponse, err } pipelineStrategy := PipelineStrategy{ - DeploymentTemplate: globalStrategy.Name, + DeploymentTemplate: globalStrategy.GlobalStrategyMetadata.Name, Config: []byte(pipelineStrategyJson), } - if globalStrategy.Name == chartRepoRepository.DEPLOYMENT_STRATEGY_ROLLING { - pipelineStrategy.Default = true - } else { - pipelineStrategy.Default = false - } + pipelineStrategy.Default = globalStrategy.Default pipelineStrategiesResponse.PipelineStrategy = append(pipelineStrategiesResponse.PipelineStrategy, pipelineStrategy) } return pipelineStrategiesResponse, nil diff --git a/scripts/sql/132_alter_global_strategy_metadata.down.sql b/scripts/sql/132_alter_global_strategy_metadata.down.sql index 26432d0989..3510c7651f 100644 --- a/scripts/sql/132_alter_global_strategy_metadata.down.sql +++ b/scripts/sql/132_alter_global_strategy_metadata.down.sql @@ -1 +1,2 @@ -ALTER TABLE "public"."global_strategy_metadata" DROP COLUMN "key"; \ No newline at end of file +ALTER TABLE "public"."global_strategy_metadata" DROP COLUMN "key"; +ALTER TABLE "public"."global_strategy_metadata_chart_ref_mapping" DROP COLUMN "default"; \ No newline at end of file diff --git a/scripts/sql/132_alter_global_strategy_metadata.up.sql b/scripts/sql/132_alter_global_strategy_metadata.up.sql index ba311ca37d..902c1e093d 100644 --- a/scripts/sql/132_alter_global_strategy_metadata.up.sql +++ b/scripts/sql/132_alter_global_strategy_metadata.up.sql @@ -3,4 +3,7 @@ COMMENT ON COLUMN "public"."global_strategy_metadata"."key" IS 'strategy json ke UPDATE "public"."global_strategy_metadata" SET "key" = 'recreate' WHERE "name" = 'RECREATE'; UPDATE "public"."global_strategy_metadata" SET "key" = 'canary' WHERE "name" = 'CANARY'; UPDATE "public"."global_strategy_metadata" SET "key" = 'rolling' WHERE "name" = 'ROLLING'; -UPDATE "public"."global_strategy_metadata" SET "key" = 'blueGreen' WHERE "name" = 'BLUE-GREEN'; \ No newline at end of file +UPDATE "public"."global_strategy_metadata" SET "key" = 'blueGreen' WHERE "name" = 'BLUE-GREEN'; + +ALTER TABLE "public"."global_strategy_metadata_chart_ref_mapping" ADD COLUMN "default" bool DEFAULT 'false'; +UPDATE global_strategy_metadata_chart_ref_mapping set "default"=true WHERE global_strategy_metadata_id=(SELECT id from global_strategy_metadata WHERE name like 'ROLLING');