feat: finally implement app new command
This commit is contained in:
parent
932803453e
commit
42968fb8e1
|
@ -113,7 +113,9 @@ on your $PATH.
|
|||
logrus.Fatal(fmt.Errorf("'%s' cannot be longer than 45 characters", sanitisedAppName))
|
||||
}
|
||||
|
||||
config.CopyAppEnvSample(appType, AppName, Server)
|
||||
if err := config.CopyAppEnvSample(appType, AppName, Server); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
secrets := make(map[string]string)
|
||||
if Secrets {
|
||||
|
@ -123,7 +125,7 @@ on your $PATH.
|
|||
logrus.Fatal(err)
|
||||
}
|
||||
secretEnvVars := secret.ReadSecretEnvVars(appEnv)
|
||||
secrets, err = secret.GenerateSecrets(secretEnvVars, Server)
|
||||
secrets, err = secret.GenerateSecrets(secretEnvVars, sanitisedAppName, Server)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
|
|
@ -1,5 +1,25 @@
|
|||
package client
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/docker/docker/api/types/swarm"
|
||||
)
|
||||
|
||||
func StoreSecret(secretName, secretValue, server string) error {
|
||||
cl, err := NewClientWithContext(server)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
ann := swarm.Annotations{Name: secretName}
|
||||
spec := swarm.SecretSpec{Annotations: ann, Data: []byte(secretValue)}
|
||||
|
||||
// We don't bother with the secret IDs for now
|
||||
if _, err := cl.SecretCreate(ctx, spec); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -208,6 +208,10 @@ func CopyAppEnvSample(appType, appName, server string) error {
|
|||
}
|
||||
|
||||
appEnvPath := path.Join(ABRA_DIR, "servers", server, fmt.Sprintf("%s.env", appName))
|
||||
if _, err := os.Stat(appEnvPath); err == nil {
|
||||
return fmt.Errorf("%s already exists?", appEnvPath)
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(appEnvPath, envSample, 0755)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -80,39 +80,55 @@ func ParseSecretEnvVarValue(secretValue string) (SecretValue, error) {
|
|||
if err != nil {
|
||||
return SecretValue{}, err
|
||||
}
|
||||
return SecretValue{Version: values[0], Length: length}, nil
|
||||
version := strings.ReplaceAll(values[0], " ", "")
|
||||
return SecretValue{Version: version, Length: length}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func GenerateSecrets(secretEnvVars map[string]string, server string) (map[string]string, error) {
|
||||
func GenerateSecrets(secretEnvVars map[string]string, appName, server string) (map[string]string, error) {
|
||||
secrets := make(map[string]string)
|
||||
|
||||
ch := make(chan error, len(secretEnvVars))
|
||||
for secretEnvVar := range secretEnvVars {
|
||||
secretName := ParseSecretEnvVarName(secretEnvVar)
|
||||
secretValue, err := ParseSecretEnvVarValue(secretEnvVars[secretEnvVar])
|
||||
go func(s string) {
|
||||
secretName := ParseSecretEnvVarName(s)
|
||||
secretValue, err := ParseSecretEnvVarValue(secretEnvVars[s])
|
||||
if err != nil {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
secretRemoteName := fmt.Sprintf("%s_%s_%s", appName, secretName, secretValue.Version)
|
||||
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 {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
secrets[secretName] = passwords[0]
|
||||
} else {
|
||||
passphrases, err := GeneratePassphrases(1)
|
||||
if err != nil {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
if err := client.StoreSecret(secretRemoteName, passphrases[0], server); err != nil {
|
||||
ch <- err
|
||||
}
|
||||
secrets[secretName] = passphrases[0]
|
||||
}
|
||||
ch <- nil
|
||||
}(secretEnvVar)
|
||||
}
|
||||
|
||||
for range secretEnvVars {
|
||||
err := <-ch
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if secretValue.Length > 0 {
|
||||
passwords, err := GeneratePasswords(1, uint(secretValue.Length))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
secrets[secretName] = passwords[0]
|
||||
if err := client.StoreSecret(secretName, passwords[0], server); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
passphrases, err := GeneratePassphrases(1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
secrets[secretName] = passphrases[0]
|
||||
if err := client.StoreSecret(secretName, passphrases[0], server); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return secrets, nil
|
||||
|
|
Loading…
Reference in New Issue