app/registry/update.go (115 lines of code) (raw):
package registry
import (
"context"
"ddm-admin-console/service/codebase"
"encoding/json"
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"github.com/pkg/errors"
"ddm-admin-console/router"
"ddm-admin-console/service/gerrit"
)
const (
MRTargetRegistryVersionUpdate = "registry-version-update"
MRTargetClusterUpdate = "cluster-update"
)
type updateRequest struct {
Branch string `form:"branch" binding:"required"`
}
func (a *App) registryUpdateView(ctx *gin.Context) (router.Response, error) {
registryName := ctx.Param("name")
userCtx := router.ContextWithUserAccessToken(ctx)
cbService, err := a.Services.Codebase.ServiceForContext(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to init service for user context")
}
reg, err := cbService.Get(registryName)
if err != nil {
return nil, errors.Wrap(err, "unable to get registry")
}
hasUpdate, branches, _, err := HasUpdate(userCtx, a.Services.Gerrit, reg, MRTargetRegistryVersionUpdate)
if err != nil {
return nil, errors.Wrap(err, "unable to check for updates")
}
templateArgs, err := json.Marshal(gin.H{
"updateBranches": branches,
"registry": reg,
})
if err != nil {
return nil, errors.Wrap(err, "unable to encode template arguments")
}
return router.MakeHTMLResponse(200, "registry/update.html", gin.H{
"page": "registry",
"hasUpdate": hasUpdate,
"templateArgs": string(templateArgs),
}), nil
}
func (a *App) registryUpdate(ctx *gin.Context) (router.Response, error) {
userCtx := router.ContextWithUserAccessToken(ctx)
cbService, err := a.Services.Codebase.ServiceForContext(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to init service for user context")
}
registryName := ctx.Param("name")
cb, err := cbService.Get(registryName)
if err != nil {
return nil, errors.Wrap(err, "unable to get registry")
}
r := registry{
Name: registryName,
RegistryGitBranch: cb.Spec.DefaultBranch,
Scenario: ScenarioKeyNotRequired,
}
var ur updateRequest
if err := ctx.ShouldBind(&ur); err != nil {
validationErrors, ok := err.(validator.ValidationErrors)
if !ok {
return nil, errors.Wrap(err, "unable to parse registry form")
}
return router.MakeHTMLResponse(200, "registry/edit.html",
gin.H{"page": "registry", "errorsMap": validationErrors, "registry": r, "model": r}), nil
}
if err := a.createMergeRequest(cb, ur.Branch, userCtx, ctx); err != nil {
return nil, errors.Wrap(err, "unable to create merge request")
}
if a.EnableBranchProvisioners {
prov := branchProvisioner(ur.Branch)
cb.Spec.JobProvisioning = &prov
if err := a.Services.Codebase.Update(ctx, cb); err != nil {
return nil, errors.Wrap(err, "unable to update codebase provisioner")
}
if err := a.Services.Jenkins.CreateJobBuildRun(ctx, fmt.Sprintf("ru-create-release-%d", time.Now().Unix()),
fmt.Sprintf("%s/job/Create-release-%s/", r.Name, r.Name), map[string]string{
"RELEASE_NAME": cb.Spec.DefaultBranch,
}); err != nil {
return nil, errors.Wrap(err, "unable to trigger jenkins job build run")
}
}
return router.MakeRedirectResponse(http.StatusFound,
fmt.Sprintf("/admin/registry/view/%s", r.Name)), nil
}
func (a *App) createMergeRequest(cb *codebase.Codebase, updateBranch string, userContext context.Context, ginContext *gin.Context) error {
prj, err := a.Services.Gerrit.GetProject(userContext, cb.Name)
if err != nil {
return errors.Wrap(err, "unable to get registry gerrit project")
}
if err := a.Services.Gerrit.CreateMergeRequest(userContext, &gerrit.MergeRequest{
CommitMessage: fmt.Sprintf("Update registry to %s", updateBranch),
//SourceBranch: updateBranch,
ProjectName: prj.Spec.Name,
Name: fmt.Sprintf("%s-update-%d", cb.Name, time.Now().Unix()),
AuthorName: ginContext.GetString(router.UserNameSessionKey),
AuthorEmail: ginContext.GetString(router.UserEmailSessionKey),
Labels: map[string]string{
MRLabelTarget: MRTargetRegistryVersionUpdate,
MRLabelAction: MRLabelActionBranchMerge,
MRLabelSourceBranch: updateBranch,
MRLabelTargetBranch: cb.Spec.DefaultBranch,
},
//AdditionalArguments: []string{"-X", "ours"},
}); err != nil {
return errors.Wrap(err, "unable to create update merge request")
}
return nil
}