Skip to content

Commit 1d763e4

Browse files
authored
fix: improve vault setup experience (#271)
1 parent 1ffb06d commit 1d763e4

File tree

8 files changed

+36
-25
lines changed

8 files changed

+36
-25
lines changed

cmd/internal/flags/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,13 @@ var ParameterValueFlag = &Metadata{
192192
Default: []string{},
193193
}
194194

195+
var VaultSetFlag = &Metadata{
196+
Name: "set",
197+
Shorthand: "s",
198+
Usage: "Set the newly created vault as the current vault",
199+
Default: false,
200+
}
201+
195202
var VaultTypeFlag = &Metadata{
196203
Name: "type",
197204
Shorthand: "t",

cmd/internal/vault.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func registerCreateVaultCmd(ctx *context.Context, vaultCmd *cobra.Command) {
6363

6464
RegisterFlag(ctx, createCmd, *flags.VaultTypeFlag)
6565
RegisterFlag(ctx, createCmd, *flags.VaultPathFlag)
66+
RegisterFlag(ctx, createCmd, *flags.VaultSetFlag)
6667
// AES flags
6768
RegisterFlag(ctx, createCmd, *flags.VaultKeyEnvFlag)
6869
RegisterFlag(ctx, createCmd, *flags.VaultKeyFileFlag)
@@ -80,6 +81,7 @@ func createVaultFunc(ctx *context.Context, cmd *cobra.Command, args []string) {
8081
vaultName := args[0]
8182
vaultType := flags.ValueFor[string](ctx, cmd, *flags.VaultTypeFlag, false)
8283
vaultPath := flags.ValueFor[string](ctx, cmd, *flags.VaultPathFlag, false)
84+
setVault := flags.ValueFor[bool](ctx, cmd, *flags.VaultSetFlag, false)
8385

8486
switch strings.ToLower(vaultType) {
8587
case "aes256":
@@ -106,6 +108,10 @@ func createVaultFunc(ctx *context.Context, cmd *cobra.Command, args []string) {
106108
)
107109

108110
ctx.Config.Vaults[vaultName] = vaultPath
111+
if setVault {
112+
ctx.Config.CurrentVault = &vaultName
113+
logger.Infof("Vault '%s' set as current vault", vaultName)
114+
}
109115
if err := filesystem.WriteConfig(ctx.Config); err != nil {
110116
logger.FatalErr(fmt.Errorf("unable to save user configuration: %w", err))
111117
}

docs/cli/flow_vault_create.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ flow vault create NAME [flags]
1616
--key-file string File path for the vault encryption key. An absolute path is recommended. Only used for AES256 vaults.
1717
-p, --path string Directory that the vault will use to store its data. If not set, the vault will be stored in the flow cache directory.
1818
--recipients string Comma-separated list of recipient keys for the vault. Only used for Age vaults.
19+
-s, --set Set the newly created vault as the current vault
1920
-t, --type string Vault type. Either age or aes256 (default "aes256")
2021
```
2122

docs/guide/first-workflow.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,8 @@ You'll see each step run in sequence. This is your first multi-step workflow!
9191
Real deployments need configuration. Let's add some secrets:
9292

9393
```shell
94-
# Create a vault for this project
95-
flow vault create tutorial-vault
96-
97-
# Set the generated key in the default environment variable
98-
export FLOW_VAULT_KEY="<key-from-output>"
94+
# Create a vault for this project and set the generated key in the default environment variable
95+
export FLOW_VAULT_KEY="$(flow vault create tutorial-vault --set --log-level fatal)"
9996

10097
# Add some deployment secrets
10198
flow secret set server-url "https://my-server.com"

docs/guide/secrets.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Whether you're managing API keys, database passwords, or deployment tokens, the
88
Create your first vault and add a secret:
99

1010
```shell
11-
# Create a vault (generates a key and shows it in output)
12-
flow vault create my-vault
11+
# Create a vault and set it as current (generates a key and shows it in output)
12+
flow vault create my-vault --set
1313

1414
# Set the generated key in the default environment variable
1515
export FLOW_VAULT_KEY="<key-from-output>"
@@ -257,6 +257,8 @@ Switch between vaults for different projects or environments:
257257

258258
```shell
259259
# List all vaults
260+
# Authentication for the created vaults must be resolvable by the environment variable or file you
261+
# specified during vault creation in order to list them.
260262
flow vault list
261263

262264
# Switch to a different vault

internal/io/vault/view.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ func NewVaultView(
6363
) tuikit.View {
6464
v, err := vaultFromName(vaultName)
6565
if err != nil || v == nil {
66-
container.HandleError(fmt.Errorf("failed to load vault: %w", err))
67-
return nil
66+
return views.NewErrorView(err, container.RenderState().Theme)
6867
}
6968
return views.NewEntityView(container.RenderState(), v, types.EntityFormatDocument)
7069
}
@@ -116,17 +115,16 @@ func NewVaultListView(
116115
vaults := &vaultCollection{Vaults: make([]*vaultEntity, 0, len(vaultNames))}
117116
for _, name := range vaultNames {
118117
v, err := vaultFromName(name)
119-
if err != nil {
120-
container.HandleError(fmt.Errorf("failed to load vault %s: %w", name, err))
121-
continue
122-
} else if v == nil {
123-
continue
118+
if err != nil || v == nil {
119+
return views.NewErrorView(
120+
fmt.Errorf("vault '%s' error: %w", name, err),
121+
container.RenderState().Theme,
122+
)
124123
}
125124
vaults.Vaults = append(vaults.Vaults, v)
126125
}
127126
if len(vaults.Vaults) == 0 {
128-
container.HandleError(fmt.Errorf("no vaults found"))
129-
return nil
127+
return views.NewErrorView(fmt.Errorf("no vaults found"), container.RenderState().Theme)
130128
}
131129

132130
selectFunc := func(filterVal string) error {

internal/vault/v2/vault.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ func NewAES256Vault(logger io.Logger, name, storagePath, keyEnv, keyFile, logLev
7575
logger.FatalErr(fmt.Errorf("unable to save vault config: %w", err))
7676
}
7777

78-
logger.PlainTextSuccess(fmt.Sprintf("Vault '%s' with AES256 encryption created successfully", v.ID()))
78+
if logLevel != "fatal" {
79+
logger.PlainTextSuccess(fmt.Sprintf("Vault '%s' with AES256 encryption created successfully", v.ID()))
80+
}
7981
}
8082

8183
func generateAESKey(logger io.Logger, keyEnv, logLevel string) string {
@@ -93,7 +95,8 @@ func generateAESKey(logger io.Logger, keyEnv, logLevel string) string {
9395
)
9496
logger.PlainTextInfo(newKeyMsg)
9597
} else {
96-
logger.PlainTextSuccess(fmt.Sprintf("Encryption key: %s", key))
98+
// just print the key without additional info
99+
logger.Print(key)
97100
}
98101
return key
99102
}
@@ -173,7 +176,7 @@ func ConfigFilePath(vaultName string) string {
173176

174177
func writeKeyToFile(logger io.Logger, key, filePath string) error {
175178
if key == "" {
176-
return fmt.Errorf("no key provided to write to file")
179+
return nil
177180
}
178181
if filePath == "" {
179182
return fmt.Errorf("no file path provided to write key")

tests/secret_cmds_e2e_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,12 @@ var _ = Describe("vault/secrets e2e", Ordered, func() {
3636
It("should return the generated key", func() {
3737
stdOut := ctx.StdOut()
3838
keyEnv := "FLOW_TEST_VAULT_KEY"
39-
Expect(run.Run(ctx.Context, "vault", "create", "test", "--key-env", keyEnv)).To(Succeed())
39+
Expect(run.Run(ctx.Context, "vault", "create", "test", "--key-env", keyEnv, "--log-level", "fatal")).
40+
To(Succeed())
4041
out, err := readFileContent(stdOut)
4142
Expect(err).NotTo(HaveOccurred())
4243

43-
lines := strings.Split(strings.TrimSpace(out), "\n")
44-
Expect(lines).ToNot(BeEmpty())
45-
parts := strings.Split(strings.TrimSpace(lines[0]), ":")
46-
Expect(parts).To(HaveLen(2))
47-
encryptionKey := strings.TrimSpace(parts[1])
44+
encryptionKey := strings.TrimSpace(strings.TrimSpace(out))
4845
Expect(os.Setenv(keyEnv, encryptionKey)).To(Succeed())
4946
})
5047

0 commit comments

Comments
 (0)