forked from coop-cloud/abra
parent
89b5f12fb1
commit
15651822f1
2
TODO.md
2
TODO.md
|
@ -30,7 +30,7 @@
|
||||||
- [ ] `generate` (WIP: decentral1se)
|
- [ ] `generate` (WIP: decentral1se)
|
||||||
- [ ] `insert` (WIP: decentral1se)
|
- [ ] `insert` (WIP: decentral1se)
|
||||||
- [ ] `rm` (WIP: decentral1se)
|
- [ ] `rm` (WIP: decentral1se)
|
||||||
- [ ] `ls` (WIP: decentral1se)
|
- [x] `ls`
|
||||||
- [x] `undeploy`
|
- [x] `undeploy`
|
||||||
- [ ] `volume`
|
- [ ] `volume`
|
||||||
- [ ] `ls` (WIP: knoflook)
|
- [ ] `ls` (WIP: knoflook)
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
abraFormatter "coopcloud.tech/abra/cli/formatter"
|
||||||
"coopcloud.tech/abra/cli/internal"
|
"coopcloud.tech/abra/cli/internal"
|
||||||
|
"coopcloud.tech/abra/client"
|
||||||
|
"coopcloud.tech/abra/config"
|
||||||
"coopcloud.tech/abra/secret"
|
"coopcloud.tech/abra/secret"
|
||||||
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/docker/docker/api/types/filters"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
@ -17,17 +25,102 @@ var allSecretsFlag = &cli.BoolFlag{
|
||||||
Usage: "Generate all secrets",
|
Usage: "Generate all secrets",
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Replicating what the bash abra does might be hard
|
var appSecretGenerateCommand = &cli.Command{
|
||||||
// with the mix of subcommands and flags
|
Name: "generate",
|
||||||
var appSecretCommand = &cli.Command{
|
Usage: "Generate secrets",
|
||||||
Name: "secret",
|
|
||||||
Flags: []cli.Flag{allSecretsFlag, internal.PassFlag},
|
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
password, err := secret.GeneratePassphrases(1)
|
|
||||||
if err != nil {
|
|
||||||
logrus.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Println(password)
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var appSecretInsertCommand = &cli.Command{
|
||||||
|
Name: "insert",
|
||||||
|
Usage: "Insert secret",
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var appSecretRmCommand = &cli.Command{
|
||||||
|
Name: "remove",
|
||||||
|
Usage: "Remove a secret",
|
||||||
|
Aliases: []string{"rm"},
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var appSecretLsCommand = &cli.Command{
|
||||||
|
Name: "list",
|
||||||
|
Usage: "List all secrets",
|
||||||
|
Aliases: []string{"ls"},
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
appName := c.Args().First()
|
||||||
|
if appName == "" {
|
||||||
|
internal.ShowSubcommandHelpAndError(c, errors.New("no app name provided"))
|
||||||
|
}
|
||||||
|
appFiles, err := config.LoadAppFiles("")
|
||||||
|
if err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
appEnv, err := config.GetApp(appFiles, appName)
|
||||||
|
if err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
secrets := secret.ReadSecretEnvVars(appEnv.Env)
|
||||||
|
|
||||||
|
tableCol := []string{"Name", "Version", "Generated Name", "Created On Server"}
|
||||||
|
table := abraFormatter.CreateTable(tableCol)
|
||||||
|
|
||||||
|
host := appFiles[appName].Server
|
||||||
|
ctx := context.Background()
|
||||||
|
cl, err := client.NewClientWithContext(host)
|
||||||
|
if err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
filters := filters.NewArgs()
|
||||||
|
filters.Add("name", appEnv.StackName())
|
||||||
|
secretList, err := cl.SecretList(ctx, types.SecretListOptions{Filters: filters})
|
||||||
|
if err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteSecretNames := make(map[string]bool)
|
||||||
|
for _, cont := range secretList {
|
||||||
|
remoteSecretNames[cont.Spec.Annotations.Name] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for sec := range secrets {
|
||||||
|
createdRemote := false
|
||||||
|
secretName := secret.ParseSecretEnvVarName(sec)
|
||||||
|
secVal, err := secret.ParseSecretEnvVarValue(secrets[sec])
|
||||||
|
if err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
secretRemoteName := fmt.Sprintf("%s_%s_%s", appEnv.StackName(), secretName, secVal.Version)
|
||||||
|
if _, ok := remoteSecretNames[secretRemoteName]; ok {
|
||||||
|
createdRemote = true
|
||||||
|
}
|
||||||
|
tableRow := []string{secretName, secVal.Version, secretRemoteName, strconv.FormatBool(createdRemote)}
|
||||||
|
table.Append(tableRow)
|
||||||
|
}
|
||||||
|
|
||||||
|
table.Render()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var appSecretCommand = &cli.Command{
|
||||||
|
Name: "secret",
|
||||||
|
Usage: "Manage app secrets",
|
||||||
|
ArgsUsage: "<command>",
|
||||||
|
Subcommands: []*cli.Command{
|
||||||
|
appSecretGenerateCommand,
|
||||||
|
appSecretInsertCommand,
|
||||||
|
appSecretRmCommand,
|
||||||
|
appSecretLsCommand,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue