package app import ( "context" "errors" "fmt" "strconv" abraFormatter "coopcloud.tech/abra/cli/formatter" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/client" "coopcloud.tech/abra/config" "coopcloud.tech/abra/secret" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) var allSecrets bool var allSecretsFlag = &cli.BoolFlag{ Name: "all", Value: false, Destination: &allSecrets, Usage: "Generate all secrets", } var appSecretGenerateCommand = &cli.Command{ Name: "generate", Usage: "Generate secrets", Action: func(c *cli.Context) error { 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: "", Subcommands: []*cli.Command{ appSecretGenerateCommand, appSecretInsertCommand, appSecretRmCommand, appSecretLsCommand, }, }