app/cluster/edit.go (142 lines of code) (raw):
package cluster
import (
"context"
"encoding/json"
"fmt"
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
"gopkg.in/yaml.v3"
"ddm-admin-console/app/registry"
"ddm-admin-console/router"
)
type BackupConfig struct {
StorageLocation string `form:"storage-location" binding:"required"`
StorageType string `form:"storage-type" binding:"required"`
StorageCredentialsKey string `form:"storage-credentials-key" binding:"required"`
StorageCredentialsSecret string `form:"storage-credentials-secret" binding:"required"`
}
func (a *App) editGet(ctx *gin.Context) (router.Response, error) {
userCtx := router.ContextWithUserAccessToken(ctx)
mrExists, err := registry.ProjectHasOpenMR(ctx, a.ClusterRepo, a.Gerrit)
if err != nil {
return nil, errors.Wrap(err, "unable to check project MR exists")
}
if mrExists {
return router.MakeHTMLResponse(200, "registry/edit-mr-exists.html", gin.H{
"page": "cluster",
}), nil
}
k8sService, err := a.Services.K8S.ServiceForContext(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to init service for user context")
}
cbService, err := a.Services.Codebase.ServiceForContext(userCtx)
if err != nil {
return nil, errors.Wrap(err, "unable to init cb service for user")
}
canUpdateCluster, err := k8sService.CanI("v2.edp.epam.com", "codebases", "update", a.Config.CodebaseName)
if err != nil {
return nil, errors.Wrap(err, "unable to check access to cluster codebase")
}
if !canUpdateCluster {
return nil, errors.Wrap(err, "access denied")
}
cb, err := cbService.Get(a.Config.CodebaseName)
if err != nil {
return nil, errors.Wrap(err, "unable to get registry")
}
hasUpdate, branches, _, err := registry.HasUpdate(userCtx, a.Services.Gerrit, cb, registry.MRTargetClusterUpdate)
if err != nil {
return nil, errors.Wrap(err, "unable to check for updates")
}
hwINITemplateContent, err := registry.GetINITemplateContent(a.Config.HardwareINITemplatePath)
if err != nil {
return nil, errors.Wrap(err, "unable to get ini template data")
}
values, err := a.getValuesDict(ctx)
if err != nil {
return nil, errors.Wrap(err, "unable to load values")
}
valuesJs, err := json.Marshal(values)
if err != nil {
return nil, fmt.Errorf("unable to encode values to json, %w", err)
}
dnsManual, err := registry.GetManualURL(ctx, a.EDPComponent, a.DDMManualEDPComponent, a.RegistryDNSManualPath)
if err != nil {
return nil, fmt.Errorf("unable to get manual, %w", err)
}
rspParams := gin.H{
"dnsManual": dnsManual,
"page": "cluster",
"updateBranches": branches,
"hasUpdate": hasUpdate,
"values": string(valuesJs),
}
for _, f := range a.editDataLoaders() {
if err := f(ctx, values, rspParams); err != nil {
return nil, errors.Wrap(err, "unable to load edit data")
}
}
templateArgs, err := json.Marshal(rspParams)
if err != nil {
return nil, errors.Wrap(err, "unable to encode template arguments")
}
return router.MakeHTMLResponse(200, "cluster/edit.html", gin.H{
"page": "cluster",
"templateArgs": string(templateArgs),
"hwINITemplateContent": hwINITemplateContent,
}), nil
}
func (a *App) editDataLoaders() []func(context.Context, *Values, gin.H) error {
return []func(context.Context, *Values, gin.H) error{
a.loadAdminsConfig,
a.loadCIDRConfig,
a.loadBackupScheduleConfig,
a.loadKeycloakDefaultHostname,
a.loadDocumentation,
}
}
func (a *App) editPost(ctx *gin.Context) (router.Response, error) {
return router.MakeRedirectResponse(http.StatusFound, "/admin/cluster/management"), nil
}
func (a *App) getValuesDict(ctx context.Context) (*Values, error) {
vals, err := a.Gerrit.GetFileContents(ctx, a.Config.CodebaseName, "master", registry.ValuesLocation)
if err != nil {
return nil, errors.Wrap(err, "unable to get admin values yaml")
}
var (
valuesDict map[string]interface{}
values *Values
valuesBts = []byte(vals)
)
if err := yaml.Unmarshal(valuesBts, &valuesDict); err != nil {
return nil, errors.Wrap(err, "unable to decode values")
}
if err := yaml.Unmarshal(valuesBts, &values); err != nil {
return nil, errors.Wrap(err, "unable to decode values")
}
values.OriginalYaml = valuesDict
return values, nil
}
func (a *App) loadAdminsConfig(_ context.Context, values *Values, rspParams gin.H) error {
bts, err := json.Marshal(values.Admins)
if err != nil {
return errors.Wrap(err, "unable to json encode admins")
}
rspParams["admins"] = string(bts)
return nil
}
func (a *App) loadCIDRConfig(_ context.Context, values *Values, rspParams gin.H) error {
if values.Global.WhiteListIP.AdminRoutes != "" {
cidrConfig, err := json.Marshal(map[string]interface{}{
"admin": strings.Split(values.Global.WhiteListIP.AdminRoutes, " "),
})
if err != nil {
return errors.Wrap(err, "unable to encode cidr to JSON")
}
rspParams["cidrConfig"] = string(cidrConfig)
}
return nil
}