app/cluster/key.go (123 lines of code) (raw):

package cluster import ( "ddm-admin-console/app/registry" "ddm-admin-console/router" "fmt" "net/http" "strings" "time" "github.com/go-playground/validator/v10" "github.com/gin-gonic/gin" "github.com/pkg/errors" ) type clusterKey struct { Scenario string SignKeyIssuer string `form:"sign-key-issuer" binding:"required_if=KeyDeviceType file Scenario key-required"` SignKeyPwd string `form:"sign-key-pwd" binding:"required_if=KeyDeviceType file Scenario key-required"` KeyDeviceType string `form:"key-device-type"` RemoteType string `form:"remote-type" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteKeyPassword string `form:"remote-key-pwd" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteCAName string `form:"remote-ca-name" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteCAHost string `form:"remote-ca-host" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteCAPort string `form:"remote-ca-port" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteSerialNumber string `form:"remote-serial-number" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteKeyPort string `form:"remote-key-port" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteKeyHost string `form:"remote-key-host" binding:"required_if=KeyDeviceType hardware Scenario key-required"` RemoteKeyMask string `form:"remote-key-mask" binding:"required_if=KeyDeviceType hardware Scenario key-required"` INIConfig string `form:"remote-ini-config" binding:"required_if=KeyDeviceType hardware Scenario key-required"` AllowedKeysSerial []string `form:"allowed-keys-serial[]" binding:"required_if=Scenario key-required"` AllowedKeysIssuer []string `form:"allowed-keys-issuer[]" binding:"required_if=Scenario key-required"` KeyDataChanged string `form:"key-data-changed"` KeyVerificationChanged string `form:"key-verification-changed"` } type keyManagement struct { r *clusterKey vaultSecretPath string } func (k keyManagement) VaultSecretPath() string { return k.vaultSecretPath } func (k keyManagement) KeyDeviceType() string { return k.r.KeyDeviceType } func (k keyManagement) AllowedKeysIssuer() []string { return k.r.AllowedKeysIssuer } func (k keyManagement) AllowedKeysSerial() []string { return k.r.AllowedKeysSerial } func (k keyManagement) SignKeyIssuer() string { return k.r.SignKeyIssuer } func (k keyManagement) SignKeyPwd() string { return k.r.SignKeyPwd } func (k keyManagement) RemoteType() string { return k.r.RemoteType } func (k keyManagement) RemoteSerialNumber() string { return k.r.RemoteSerialNumber } func (k keyManagement) RemoteKeyPort() string { return k.r.RemoteKeyPort } func (k keyManagement) RemoteKeyHost() string { return k.r.RemoteKeyHost } func (k keyManagement) RemoteKeyPassword() string { return k.r.RemoteKeyPassword } func (k keyManagement) INIConfig() string { return k.r.INIConfig } func (k keyManagement) KeyDataChanged() bool { return k.r.KeyDataChanged == "on" } func (k keyManagement) KeyVerificationChanged() bool { return k.r.KeyVerificationChanged == "on" } func (a *App) vaultPlatformPathKey(key string) string { return fmt.Sprintf("%s/%s", strings.ReplaceAll(a.VaultClusterPathTemplate, "{engine}", a.Config.VaultKVEngineName), key) } func (a *App) updateKeyView(ctx *gin.Context) (router.Response, error) { if err := a.updateKey(ctx); err != nil { return nil, errors.Wrap(err, "unable to update keys") } return router.MakeRedirectResponse(http.StatusFound, "/admin/cluster/management"), nil } func (a *App) updateKey(ctx *gin.Context) error { ck := clusterKey{} if err := ctx.ShouldBind(&ck); err != nil { _, ok := err.(validator.ValidationErrors) if !ok { return errors.Wrap(err, "unable to parse registry form") } return err } values, err := registry.GetValuesFromGit(a.Config.CodebaseName, registry.MasterBranch, a.Gerrit) if err != nil { return errors.Wrap(err, "unable to get values from git") } vaultSecretData := make(map[string]map[string]interface{}) vaultPath := a.vaultPlatformPathKey(fmt.Sprintf("%s-%s", registry.KeyManagementVaultPath, time.Now().Format("20060201T150405Z"))) repoFiles := make(map[string]string) if _, err := registry.PrepareRegistryKeys(keyManagement{r: &ck, vaultSecretPath: vaultPath}, ctx.Request, vaultSecretData, values.OriginalYaml, repoFiles); err != nil { return errors.Wrap(err, "unable to create registry keys") } if err := registry.CacheRepoFiles(a.TempFolder, a.ClusterRepo, repoFiles, a.appCache); err != nil { return fmt.Errorf("unable to cache repo files") } if len(values.OriginalYaml) > 0 || len(repoFiles) > 0 { if err := registry.CreateEditMergeRequest(ctx, a.Config.CodebaseName, values.OriginalYaml, a.Gerrit, []string{}); err != nil { return errors.Wrap(err, "unable to create edit merge request") } } if len(vaultSecretData) > 0 { if err := registry.CreateVaultSecrets(a.Vault, vaultSecretData, false); err != nil { return errors.Wrap(err, "unable to create vault secrets") } } return nil }