app/cluster/admins.go (79 lines of code) (raw):

package cluster import ( "ddm-admin-console/app/registry" "ddm-admin-console/router" "encoding/json" "net/http" "github.com/gin-gonic/gin" "github.com/pkg/errors" ) const ( MRTypeClusterAdmins = "cluster-admins" MRTypeClusterCIDR = "cluster-cidr" MRTypeClusterKeycloakDNS = "cluster-keycloak-dns" MRTargetClusterUpdate = "cluster-update" MRTargetClusterBackupSchedule = "cluster-backup-schedule" ValuesAdminsKey = "administrators" MRTypeDemoRegistryName = "demo-registry-name" ) type Admin struct { Username string `json:"username" yaml:"username"` Email string `json:"email" yaml:"email"` FirstName string `json:"firstName" yaml:"firstName"` LastName string `json:"lastName" yaml:"lastName"` TmpPassword string `json:"tmpPassword" yaml:"-"` PasswordVaultSecret string `yaml:"passwordVaultSecret" json:"-"` PasswordVaultSecretKey string `yaml:"passwordVaultSecretKey" json:"-"` } func (a *App) updateAdminsView(ctx *gin.Context) (router.Response, error) { if err := a.updateAdmins(ctx); err != nil { return nil, errors.Wrap(err, "unable to update admins") } return router.MakeRedirectResponse(http.StatusFound, "/admin/cluster/management"), nil } func (a *App) updateAdmins(ctx *gin.Context) error { adminsValue := ctx.PostForm("admins") var admins []Admin if err := json.Unmarshal([]byte(adminsValue), &admins); err != nil { return errors.Wrap(err, "unable to decode admins from request") } if err := a.setAdminsVaultPassword(admins); err != nil { return errors.Wrap(err, "unable to create admins secrets") } values, err := registry.GetValuesFromGit(a.Config.CodebaseName, registry.MasterBranch, a.Gerrit) if err != nil { return errors.Wrap(err, "unable to decode values yaml") } values.OriginalYaml[ValuesAdminsKey] = admins if err := a.createValuesMergeRequestCtx(ctx, MRTypeClusterAdmins, "update cluster admins", values.OriginalYaml); err != nil { return errors.Wrap(err, "unable to create admins merge request") } return nil } func (a *App) setAdminsVaultPassword(admins []Admin) error { for i, admin := range admins { //TODO: add separate folder for admins vaultPath := a.vaultPlatformPathKey(admin.Email) admins[i].PasswordVaultSecret = vaultPath //TODO: user registry.CreateVaultSecrets if _, err := a.Services.Vault.Write( vaultPath, map[string]interface{}{ a.Config.VaultClusterAdminsPasswordKey: admin.TmpPassword, }); err != nil { return errors.Wrap(err, "unable to write to vault") } admins[i].PasswordVaultSecretKey = a.VaultClusterAdminsPasswordKey admins[i].Username = admins[i].Email } return nil } func (a *App) getAdminsJSON(values *registry.Values) (string, error) { adminsInterface, ok := values.OriginalYaml[ValuesAdminsKey] if !ok { return "[]", nil } bts, err := json.Marshal(adminsInterface) if err != nil { return "", errors.Wrap(err, "unable to json encode admins") } return string(bts), nil }