app/registry/list.go (103 lines of code) (raw):
package registry
import (
"context"
"ddm-admin-console/router"
"ddm-admin-console/service/codebase"
"ddm-admin-console/service/gerrit"
"encoding/json"
"net/http"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
func (a *App) listRegistry(ctx *gin.Context) (response router.Response, retErr error) {
userCtx := router.ContextWithUserAccessToken(ctx)
k8sService, err := a.Services.K8S.ServiceForContext(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to init service for user context")
}
allowedToCreate, err := k8sService.CanI("v2.edp.epam.com", "codebases", "create", "")
if err != nil {
return nil, errors.Wrap(err, "unable to check codebase creation access")
}
cbs, err := a.Services.Codebase.GetAllByType(codebase.RegistryCodebaseType)
if err != nil {
return nil, errors.Wrap(err, "unable to get codebases")
}
if err := LoadRegistryVersions(userCtx, a.Gerrit, cbs); err != nil {
return nil, errors.Wrap(err, "unable to load registry versions")
}
registries, err := a.Services.Perms.FilterCodebases(ctx, cbs, k8sService)
if err != nil {
return nil, errors.Wrap(err, "unable to check codebase permissions")
}
prjs, err := a.Services.Gerrit.GetProjects(context.Background())
if err != nil {
return nil, errors.Wrap(err, "unable to list gerrit projects")
}
prjs = a.filterProjects(prjs, "cluster-mgmt")
gerritBranches := formatGerritProjectBranches(prjs)
responseParams := gin.H{
"registries": registries,
"page": "registry",
"allowedToCreate": allowedToCreate,
"timezone": a.Config.Timezone,
"gerritBranches": gerritBranches,
}
templateArgs, templateErr := json.Marshal(responseParams)
if templateErr != nil {
return nil, errors.Wrap(templateErr, "unable to encode template arguments")
}
responseParams["templateArgs"] = string(templateArgs)
return router.MakeHTMLResponse(200, "registry/list.html", responseParams), nil
}
func (a *App) getRegistries(ctx *gin.Context) (rsp router.Response, retErr error) {
userCtx := router.ContextWithUserAccessToken(ctx)
k8sService, err := a.Services.K8S.ServiceForContext(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to init service for user context")
}
if err != nil {
return nil, errors.Wrap(err, "unable to check codebase creation access")
}
cbs, err := a.Services.Codebase.GetAllByType(codebase.RegistryCodebaseType)
if err != nil {
return nil, errors.Wrap(err, "unable to get codebases")
}
if err := LoadRegistryVersions(userCtx, a.Gerrit, cbs); err != nil {
return nil, errors.Wrap(err, "unable to load registry versions")
}
registries, err := a.Services.Perms.FilterCodebases(ctx, cbs, k8sService)
if err != nil {
return nil, errors.Wrap(err, "unable to check codebase permissions")
}
return router.MakeJSONResponse(http.StatusOK, registries), nil
}
func LoadRegistryVersions(ctx context.Context, gerritService gerrit.ServiceInterface, cbs []codebase.Codebase) error {
mrs, err := gerritService.GetMergeRequests(ctx)
if err != nil {
return errors.Wrap(err, "unable to get merge requests")
}
registryMrs := make(map[string][]gerrit.GerritMergeRequest)
for _, v := range mrs {
registryMrs[v.Spec.ProjectName] = append(registryMrs[v.Spec.ProjectName], v)
}
for i, cb := range cbs {
registryVersion := BranchVersion(cb.Spec.DefaultBranch)
if cb.Spec.BranchToCopyInDefaultBranch != "" {
registryVersion = BranchVersion(cb.Spec.BranchToCopyInDefaultBranch)
}
currentRegistryMrs := registryMrs[cb.Name]
for _, mr := range currentRegistryMrs {
if (mr.Labels[MRLabelTarget] == MRTargetRegistryVersionUpdate ||
mr.Labels[MRLabelTarget] == MRTargetClusterUpdate) && mr.Status.Value == gerrit.StatusMerged {
mergedBranchVersion := BranchVersion(mr.Spec.SourceBranch)
if registryVersion.LessThan(mergedBranchVersion) {
registryVersion = mergedBranchVersion
}
}
}
cbs[i].Version = registryVersion
cbs[i].Spec.DefaultBranch = registryVersion.String()
}
return nil
}