Skip to content

Commit

Permalink
feat: upgrade v2 and refactor rollback
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxu04 committed Feb 17, 2023
1 parent b25f657 commit d008bf8
Show file tree
Hide file tree
Showing 22 changed files with 1,777 additions and 619 deletions.
2 changes: 2 additions & 0 deletions core/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/horizoncd/horizon/pkg/config/server"
"github.com/horizoncd/horizon/pkg/config/session"
"github.com/horizoncd/horizon/pkg/config/tekton"
"github.com/horizoncd/horizon/pkg/config/template"
"github.com/horizoncd/horizon/pkg/config/templaterepo"
"github.com/horizoncd/horizon/pkg/config/token"
"github.com/horizoncd/horizon/pkg/config/webhook"
Expand Down Expand Up @@ -45,6 +46,7 @@ type Config struct {
EventHandlerConfig eventhandler.Config `yaml:"eventHandler"`
CodeGitRepos []*git.Repo `yaml:"gitRepos"`
TokenConfig token.Config `yaml:"tokenConfig"`
TemplateUpgradeMapper template.UpgradeMapper `yaml:"templateUpgradeMapper"`
}

func LoadConfig(configFilePath string) (*Config, error) {
Expand Down
129 changes: 67 additions & 62 deletions core/controller/cluster/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
registryfty "github.com/horizoncd/horizon/pkg/cluster/registry/factory"
"github.com/horizoncd/horizon/pkg/cluster/tekton/factory"
"github.com/horizoncd/horizon/pkg/config/grafana"
"github.com/horizoncd/horizon/pkg/config/template"
"github.com/horizoncd/horizon/pkg/config/token"
envmanager "github.com/horizoncd/horizon/pkg/environment/manager"
"github.com/horizoncd/horizon/pkg/environment/service"
Expand Down Expand Up @@ -103,76 +104,80 @@ type Controller interface {
GetClusterBuildStatus(ctx context.Context, clusterID uint) (*BuildStatusResponse, error)
GetResourceTree(ctx context.Context, clusterID uint) (*GetResourceTreeResponse, error)
GetStep(ctx context.Context, clusterID uint) (resp *GetStepResponse, err error)
// Upgrade is used internally to upgrade the cluster version
Upgrade(ctx context.Context, clusterID uint) error
}

type controller struct {
clusterMgr clustermanager.Manager
clusterGitRepo gitrepo.ClusterGitRepo
applicationGitRepo appgitrepo.ApplicationGitRepo
commitGetter code.GitGetter
cd cd.CD
applicationMgr appmanager.Manager
autoFreeSvc *service.AutoFreeSVC
applicationSvc applicationservice.Service
templateReleaseMgr trmanager.Manager
templateSchemaGetter templateschema.Getter
outputGetter output.Getter
envMgr envmanager.Manager
envRegionMgr environmentregionmapper.Manager
regionMgr regionmanager.Manager
groupSvc groupsvc.Service
pipelinerunMgr prmanager.Manager
pipelineMgr pipelinemanager.Manager
tektonFty factory.Factory
registryFty registryfty.Factory
userManager usermanager.Manager
userSvc usersvc.Service
memberManager member.Manager
groupManager groupmanager.Manager
schemaTagManager templateschematagmanager.Manager
tagMgr tagmanager.Manager
grafanaService grafanaservice.Service
grafanaConfig grafana.Config
buildSchema *build.Schema
eventMgr eventmanager.Manager
tokenSvc tokenservice.Service
tokenConfig token.Config
clusterMgr clustermanager.Manager
clusterGitRepo gitrepo.ClusterGitRepo
applicationGitRepo appgitrepo.ApplicationGitRepo
commitGetter code.GitGetter
cd cd.CD
applicationMgr appmanager.Manager
autoFreeSvc *service.AutoFreeSVC
applicationSvc applicationservice.Service
templateReleaseMgr trmanager.Manager
templateSchemaGetter templateschema.Getter
outputGetter output.Getter
envMgr envmanager.Manager
envRegionMgr environmentregionmapper.Manager
regionMgr regionmanager.Manager
groupSvc groupsvc.Service
pipelinerunMgr prmanager.Manager
pipelineMgr pipelinemanager.Manager
tektonFty factory.Factory
registryFty registryfty.Factory
userManager usermanager.Manager
userSvc usersvc.Service
memberManager member.Manager
groupManager groupmanager.Manager
schemaTagManager templateschematagmanager.Manager
tagMgr tagmanager.Manager
grafanaService grafanaservice.Service
grafanaConfig grafana.Config
buildSchema *build.Schema
eventMgr eventmanager.Manager
tokenSvc tokenservice.Service
tokenConfig token.Config
templateUpgradeMapper template.UpgradeMapper
}

var _ Controller = (*controller)(nil)

func NewController(config *config.Config, param *param.Param) Controller {
return &controller{
clusterMgr: param.ClusterMgr,
clusterGitRepo: param.ClusterGitRepo,
applicationGitRepo: param.ApplicationGitRepo,
commitGetter: param.GitGetter,
cd: param.Cd,
applicationMgr: param.ApplicationManager,
applicationSvc: param.ApplicationSvc,
templateReleaseMgr: param.TemplateReleaseManager,
templateSchemaGetter: param.TemplateSchemaGetter,
autoFreeSvc: param.AutoFreeSvc,
outputGetter: param.OutputGetter,
envMgr: param.EnvMgr,
envRegionMgr: param.EnvRegionMgr,
regionMgr: param.RegionMgr,
groupSvc: param.GroupSvc,
pipelinerunMgr: param.PipelinerunMgr,
pipelineMgr: param.PipelineMgr,
tektonFty: param.TektonFty,
registryFty: registryfty.Fty,
userManager: param.UserManager,
userSvc: param.UserSvc,
memberManager: param.MemberManager,
groupManager: param.GroupManager,
schemaTagManager: param.ClusterSchemaTagMgr,
tagMgr: param.TagManager,
grafanaService: param.GrafanaService,
grafanaConfig: config.GrafanaConfig,
buildSchema: param.BuildSchema,
eventMgr: param.EventManager,
tokenSvc: param.TokenSvc,
tokenConfig: config.TokenConfig,
clusterMgr: param.ClusterMgr,
clusterGitRepo: param.ClusterGitRepo,
applicationGitRepo: param.ApplicationGitRepo,
commitGetter: param.GitGetter,
cd: param.Cd,
applicationMgr: param.ApplicationManager,
applicationSvc: param.ApplicationSvc,
templateReleaseMgr: param.TemplateReleaseManager,
templateSchemaGetter: param.TemplateSchemaGetter,
autoFreeSvc: param.AutoFreeSvc,
outputGetter: param.OutputGetter,
envMgr: param.EnvMgr,
envRegionMgr: param.EnvRegionMgr,
regionMgr: param.RegionMgr,
groupSvc: param.GroupSvc,
pipelinerunMgr: param.PipelinerunMgr,
pipelineMgr: param.PipelineMgr,
tektonFty: param.TektonFty,
registryFty: registryfty.Fty,
userManager: param.UserManager,
userSvc: param.UserSvc,
memberManager: param.MemberManager,
groupManager: param.GroupManager,
schemaTagManager: param.ClusterSchemaTagMgr,
tagMgr: param.TagManager,
grafanaService: param.GrafanaService,
grafanaConfig: config.GrafanaConfig,
buildSchema: param.BuildSchema,
eventMgr: param.EventManager,
tokenSvc: param.TokenSvc,
tokenConfig: config.TokenConfig,
templateUpgradeMapper: config.TemplateUpgradeMapper,
}
}
3 changes: 2 additions & 1 deletion core/controller/cluster/controller_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ func (c *controller) InternalDeploy(ctx context.Context, clusterID uint,
}

// 5. merge branch from gitops to master and update status
masterRevision, err := c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name, pr.ID)
masterRevision, err := c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name,
gitrepo.GitOpsBranch, c.clusterGitRepo.DefaultBranch(), &pr.ID)
if err != nil {
return nil, perror.WithMessage(err, op)
}
Expand Down
4 changes: 3 additions & 1 deletion core/controller/cluster/controller_internal_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
herrors "github.com/horizoncd/horizon/core/errors"
userauth "github.com/horizoncd/horizon/pkg/authentication/user"
"github.com/horizoncd/horizon/pkg/cluster/cd"
"github.com/horizoncd/horizon/pkg/cluster/gitrepo"
perror "github.com/horizoncd/horizon/pkg/errors"
eventmodels "github.com/horizoncd/horizon/pkg/event/models"
prmodels "github.com/horizoncd/horizon/pkg/pipelinerun/models"
Expand Down Expand Up @@ -94,7 +95,8 @@ func (c *controller) InternalDeployV2(ctx context.Context, clusterID uint,
}

// 5. merge branch from gitops to master and update status
masterRevision, err := c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name, pr.ID)
masterRevision, err := c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name,
gitrepo.GitOpsBranch, c.clusterGitRepo.DefaultBranch(), &pr.ID)
if err != nil {
return nil, perror.WithMessage(err, op)
}
Expand Down
62 changes: 51 additions & 11 deletions core/controller/cluster/controller_operation.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
herrors "github.com/horizoncd/horizon/core/errors"
amodels "github.com/horizoncd/horizon/pkg/application/models"
"github.com/horizoncd/horizon/pkg/cluster/cd"
"github.com/horizoncd/horizon/pkg/cluster/gitrepo"
cmodels "github.com/horizoncd/horizon/pkg/cluster/models"
perror "github.com/horizoncd/horizon/pkg/errors"
eventmodels "github.com/horizoncd/horizon/pkg/event/models"
Expand Down Expand Up @@ -144,7 +145,8 @@ func (c *controller) Deploy(ctx context.Context, clusterID uint,
// freed cluster is allowed to deploy without diff
commit = configCommit.Master
} else {
commit, err = c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name, prCreated.ID)
commit, err = c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name,
gitrepo.GitOpsBranch, c.clusterGitRepo.DefaultBranch(), &prCreated.ID)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -229,7 +231,7 @@ func (c *controller) Rollback(ctx context.Context,
if pipelinerun.Action == prmodels.ActionRestart || pipelinerun.Status != string(prmodels.StatusOK) ||
pipelinerun.ConfigCommit == "" {
return nil, perror.Wrapf(herrors.ErrParamInvalid,
"the pipelinerun with id: %v can not be rollbacked", r.PipelinerunID)
"the pipelinerun with id: %v can not be rolled back", r.PipelinerunID)
}

cluster, err := c.clusterMgr.GetByID(ctx, clusterID)
Expand Down Expand Up @@ -272,7 +274,13 @@ func (c *controller) Rollback(ctx context.Context,
return nil, err
}

// 4. rollback cluster config in git repo and update status
// 4. update restart time in gitops branch
err = c.mergeDefaultBranchIntoGitOps(ctx, application.Name, cluster.Name)
if err != nil {
return nil, err
}

// 5. rollback cluster config in git repo and update status
newConfigCommit, err := c.clusterGitRepo.Rollback(ctx, application.Name, cluster.Name, pipelinerun.ConfigCommit)
if err != nil {
return nil, err
Expand All @@ -282,8 +290,9 @@ func (c *controller) Rollback(ctx context.Context,
return nil, err
}

// 5. merge branch & update config commit and status
masterRevision, err := c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name, prCreated.ID)
// 6. merge branch & update config commit and status
masterRevision, err := c.clusterGitRepo.MergeBranch(ctx, application.Name, cluster.Name,
gitrepo.GitOpsBranch, c.clusterGitRepo.DefaultBranch(), &prCreated.ID)
if err != nil {
return nil, err
}
Expand All @@ -296,7 +305,8 @@ func (c *controller) Rollback(ctx context.Context,
return nil, err
}

if err := c.updateTagsFromFile(ctx, application, cluster); err != nil {
// 7. update tags and template in db
if err := c.updateTagsAndTemplateFromFile(ctx, application, cluster); err != nil {
return nil, err
}

Expand Down Expand Up @@ -669,19 +679,31 @@ func (c *controller) updatePRStatus(ctx context.Context, action string, prID uin
return nil
}

func (c *controller) updateTagsFromFile(ctx context.Context,
func (c *controller) updateTagsAndTemplateFromFile(ctx context.Context,
application *amodels.Application, cluster *cmodels.Cluster) error {
files, err := c.clusterGitRepo.GetClusterValueFiles(ctx, application.Name, cluster.Name)
if err != nil {
return err
}

templateFromFile, err := c.clusterGitRepo.GetClusterTemplate(ctx, application.Name, cluster.Name)
if err != nil {
return err
}
release, err := c.templateReleaseMgr.GetByTemplateNameAndRelease(ctx,
templateFromFile.Name, templateFromFile.Release)
if err != nil {
return err
}

// update template
_, err = c.clusterMgr.UpdateTemplateByID(ctx, cluster.ID, release.TemplateName, release.Name)
if err != nil {
return err
}

for _, file := range files {
if file.FileName == common.GitopsFileTags {
release, err := c.templateReleaseMgr.GetByTemplateNameAndRelease(ctx, cluster.Template, cluster.TemplateRelease)
if err != nil {
return err
}
midMap := file.Content[release.ChartName].(map[string]interface{})
tagsMap := midMap[common.GitopsKeyTags].(map[string]interface{})
tags := make([]*tmodels.Tag, 0, len(tagsMap))
Expand All @@ -702,3 +724,21 @@ func (c *controller) updateTagsFromFile(ctx context.Context,
}
return nil
}

func (c *controller) mergeDefaultBranchIntoGitOps(ctx context.Context, application, cluster string) error {
gitOpsBranch := gitrepo.GitOpsBranch
defaultBranch := c.clusterGitRepo.DefaultBranch()
diff, err := c.clusterGitRepo.CompareConfig(ctx, application, cluster,
&gitOpsBranch, &defaultBranch)
if err != nil {
return err
}
if diff != "" {
_, err = c.clusterGitRepo.MergeBranch(ctx, application,
cluster, defaultBranch, gitOpsBranch, nil)
if err != nil {
return err
}
}
return nil
}
66 changes: 66 additions & 0 deletions core/controller/cluster/controller_operation_v2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package cluster

import (
"context"

herror "github.com/horizoncd/horizon/core/errors"
"github.com/horizoncd/horizon/pkg/cluster/gitrepo"
perror "github.com/horizoncd/horizon/pkg/errors"
"github.com/horizoncd/horizon/pkg/util/wlog"
)

func (c *controller) Upgrade(ctx context.Context, clusterID uint) error {
const op = "cluster controller: upgrade to v2"
defer wlog.Start(ctx, op).StopPrint()

// 1. validate infos
cluster, err := c.clusterMgr.GetByID(ctx, clusterID)
if err != nil {
return err
}
application, err := c.applicationMgr.GetByID(ctx, cluster.ApplicationID)
if err != nil {
return err
}
templateFromFile, err := c.clusterGitRepo.GetClusterTemplate(ctx, application.Name, cluster.Name)
if err != nil {
return err
}

// 2. match target templateFromFile
targetTemplate, ok := c.templateUpgradeMapper[templateFromFile.Name]
if !ok {
return perror.Wrapf(herror.ErrParamInvalid,
"cluster template %s does not support upgrade", templateFromFile.Name)
}
targetRelease, err := c.templateReleaseMgr.GetByTemplateNameAndRelease(ctx,
targetTemplate.Name, targetTemplate.Release)
if err != nil {
return err
}

// 3. merge default branch into gitops branch if restarts occur
err = c.mergeDefaultBranchIntoGitOps(ctx, application.Name, cluster.Name)
if err != nil {
return err
}

// 4. upgrade git repo files to v2
_, err = c.clusterGitRepo.UpgradeCluster(ctx, &gitrepo.UpgradeValuesParam{
Application: application.Name,
Cluster: cluster.Name,
Template: templateFromFile,
TargetRelease: targetRelease,
BuildConfig: &targetTemplate.BuildConfig,
})
if err != nil {
return err
}

// 5. update template in db
_, err = c.clusterMgr.UpdateTemplateByID(ctx, clusterID, targetRelease.TemplateName, targetRelease.Name)
if err != nil {
return err
}
return nil
}
Loading

0 comments on commit d008bf8

Please sign in to comment.