diff --git a/pkg/secret/secret.go b/pkg/secret/secret.go index 1dead68a..095fa534 100644 --- a/pkg/secret/secret.go +++ b/pkg/secret/secret.go @@ -8,6 +8,7 @@ import ( "regexp" "strconv" "strings" + "sync" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" @@ -119,23 +120,32 @@ func ParseSecretEnvVarValue(secret string) (secretValue, error) { func GenerateSecrets(secretEnvVars map[string]string, appName, server string) (map[string]string, error) { secrets := make(map[string]string) + var mutex sync.Mutex + var wg sync.WaitGroup ch := make(chan error, len(secretEnvVars)) for secretEnvVar := range secretEnvVars { + wg.Add(1) + go func(s string) { + defer wg.Done() + secretName := ParseSecretEnvVarName(s) secretValue, err := ParseSecretEnvVarValue(secretEnvVars[s]) if err != nil { ch <- err return } + secretRemoteName := fmt.Sprintf("%s_%s_%s", appName, secretName, secretValue.Version) logrus.Debugf("attempting to generate and store %s on %s", secretRemoteName, server) + if secretValue.Length > 0 { passwords, err := GeneratePasswords(1, uint(secretValue.Length)) if err != nil { ch <- err return } + if err := client.StoreSecret(secretRemoteName, passwords[0], server); err != nil { if strings.Contains(err.Error(), "AlreadyExists") { logrus.Warnf("%s already exists, moving on...", secretRemoteName) @@ -145,6 +155,9 @@ func GenerateSecrets(secretEnvVars map[string]string, appName, server string) (m } return } + + mutex.Lock() + defer mutex.Unlock() secrets[secretName] = passwords[0] } else { passphrases, err := GeneratePassphrases(1) @@ -152,6 +165,7 @@ func GenerateSecrets(secretEnvVars map[string]string, appName, server string) (m ch <- err return } + if err := client.StoreSecret(secretRemoteName, passphrases[0], server); err != nil { if strings.Contains(err.Error(), "AlreadyExists") { logrus.Warnf("%s already exists, moving on...", secretRemoteName) @@ -161,12 +175,17 @@ func GenerateSecrets(secretEnvVars map[string]string, appName, server string) (m } return } + + mutex.Lock() + defer mutex.Unlock() secrets[secretName] = passphrases[0] } ch <- nil }(secretEnvVar) } + wg.Wait() + for range secretEnvVars { err := <-ch if err != nil {