app/cluster/merge_request.go (110 lines of code) (raw):
package cluster
import (
"context"
"ddm-admin-console/app/registry"
"ddm-admin-console/router"
"ddm-admin-console/service/gerrit"
"fmt"
"sort"
"time"
"github.com/gin-gonic/gin"
"gopkg.in/yaml.v3"
"github.com/pkg/errors"
)
type ExtendedMergeRequests struct {
gerrit.GerritMergeRequest
}
type valuesMrConfig struct {
name string
authorName string
authorEmail string
commitMessage string
targetBranch string
targetLabel string
values string
}
func (v valuesMrConfig) TargetBranch() string {
if v.targetBranch == "" {
return "master"
}
return v.targetBranch
}
func (e ExtendedMergeRequests) RequestName() string {
return e.Name
}
func (e ExtendedMergeRequests) StatusValue() string {
if e.Labels[registry.MRLabelAction] == registry.MRLabelActionBranchMerge &&
(e.Spec.SourceBranch == "" || e.Status.Value == "sourceBranch or changesConfigMap must be specified") {
return "in progress"
}
if e.Status.Value == "" {
return "-"
}
return e.Status.Value
}
func (e ExtendedMergeRequests) Action() string {
if e.Labels[registry.MRLabelTarget] == MRTypeClusterAdmins {
return "Оновлення адміністраторів платформи"
}
if e.Labels[registry.MRLabelTarget] == MRTypeClusterCIDR {
return "Обмеження доступу"
}
if e.Labels[registry.MRLabelTarget] == MRTypeClusterKeycloakDNS {
return "Редагування DNS Keycloak"
}
sourceBranch := e.Spec.SourceBranch
if sourceBranch == "" {
sourceBranch = e.Labels[registry.MRLabelSourceBranch]
}
if e.Labels[registry.MRLabelTarget] == registry.MRTargetClusterUpdate {
return fmt.Sprintf("Оновлення платформи до %s", sourceBranch)
}
return "-"
}
func (a *App) ClusterGetMergeRequests(userCtx context.Context) ([]ExtendedMergeRequests, error) {
mrs, err := a.Services.Gerrit.GetMergeRequestByProject(userCtx, a.CodebaseName)
if err != nil {
return nil, errors.Wrap(err, "unable to list gerrit merge requests")
}
sort.Sort(gerrit.SortByCreationDesc(mrs))
emrs := make([]ExtendedMergeRequests, 0, len(mrs))
for _, mr := range mrs {
emrs = append(emrs, ExtendedMergeRequests{GerritMergeRequest: mr})
}
return emrs, nil
}
func (a *App) createValuesMergeRequestCtx(ctx *gin.Context, target, commitMessage string, values map[string]interface{}) error {
valuesValue, err := yaml.Marshal(values)
if err != nil {
return errors.Wrap(err, "unable to encode new values")
}
if err := a.createValuesMergeRequest(router.ContextWithUserAccessToken(ctx), &valuesMrConfig{
name: fmt.Sprintf("mr-%s-%d", a.Config.CodebaseName, time.Now().Unix()),
values: string(valuesValue),
targetLabel: target,
commitMessage: commitMessage,
authorName: ctx.GetString(router.UserNameSessionKey),
authorEmail: ctx.GetString(router.UserEmailSessionKey),
}); err != nil {
return errors.Wrap(err, "unable to create MR")
}
return nil
}
func (a *App) createValuesMergeRequest(ctx context.Context, cnf *valuesMrConfig) error {
if err := a.Services.Gerrit.CreateMergeRequestWithContents(ctx, &gerrit.MergeRequest{
ProjectName: a.Config.CodebaseName,
Name: cnf.name,
AuthorEmail: cnf.authorEmail,
AuthorName: cnf.authorName,
CommitMessage: cnf.commitMessage,
TargetBranch: cnf.TargetBranch(),
Labels: map[string]string{
registry.MRLabelTarget: cnf.targetLabel,
},
}, map[string]string{
registry.ValuesLocation: cnf.values,
}); err != nil {
return errors.Wrap(err, "unable to create MR with new values")
}
return nil
}