Skip to content

Commit 9f2b788

Browse files
authored
[envsec] Add (hidden) envsec init command (#1678)
## Summary TSIA ## How was it tested? `devbox envsec init`
1 parent 209c839 commit 9f2b788

File tree

6 files changed

+121
-4
lines changed

6 files changed

+121
-4
lines changed

devbox.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
],
2727
"code": "code .",
2828
"lint": "golangci-lint run --timeout 5m && scripts/gofumpt.sh",
29+
"fmt": "scripts/gofumpt.sh",
2930
"test": "go test -race -cover ./...",
3031
"update-examples": "devbox run build && go run testscripts/testrunner/updater/main.go"
3132
}

internal/boxcli/envsec.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2023 Jetpack Technologies Inc and contributors. All rights reserved.
2+
// Use of this source code is governed by the license in the LICENSE file.
3+
4+
package boxcli
5+
6+
import (
7+
"github.com/pkg/errors"
8+
"github.com/spf13/cobra"
9+
"go.jetpack.io/devbox"
10+
"go.jetpack.io/devbox/internal/impl/devopt"
11+
"go.jetpack.io/devbox/internal/integrations/envsec"
12+
)
13+
14+
type envsecInitCmdFlags struct {
15+
config configFlags
16+
}
17+
18+
func envsecCmd() *cobra.Command {
19+
cmd := &cobra.Command{
20+
Use: "envsec",
21+
Short: "envsec commands",
22+
}
23+
cmd.AddCommand(envsecInitCmd())
24+
cmd.Hidden = true
25+
return cmd
26+
}
27+
28+
func envsecInitCmd() *cobra.Command {
29+
flags := envsecInitCmdFlags{}
30+
cmd := &cobra.Command{
31+
Use: "init",
32+
Short: "initialize envsec integration",
33+
Args: cobra.ExactArgs(0),
34+
RunE: func(cmd *cobra.Command, args []string) error {
35+
return envsecInitFunc(cmd, flags)
36+
},
37+
}
38+
39+
flags.config.register(cmd)
40+
41+
return cmd
42+
}
43+
44+
func envsecInitFunc(cmd *cobra.Command, flags envsecInitCmdFlags) error {
45+
box, err := devbox.Open(&devopt.Opts{
46+
Dir: flags.config.path,
47+
Stderr: cmd.ErrOrStderr(),
48+
})
49+
if err != nil {
50+
return errors.WithStack(err)
51+
}
52+
if err := envsec.EnsureInitialized(
53+
cmd.Context(), box.ProjectDir()); err == nil {
54+
return nil
55+
}
56+
box.Config().SetStringField("EnvFrom", "envsec")
57+
return box.Config().SaveTo(box.ProjectDir())
58+
}

internal/boxcli/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func RootCmd() *cobra.Command {
6161
command.AddCommand(authCmd())
6262
}
6363
command.AddCommand(createCmd())
64+
command.AddCommand(envsecCmd())
6465
command.AddCommand(generateCmd())
6566
command.AddCommand(globalCmd())
6667
command.AddCommand(infoCmd())

internal/devconfig/env.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package devconfig
22

33
import (
44
"context"
5-
"fmt"
65
"os"
76

87
"go.jetpack.io/devbox/internal/boxcli/usererr"
98
"go.jetpack.io/devbox/internal/integrations/envsec"
9+
"go.jetpack.io/devbox/internal/ux"
1010
)
1111

1212
func (c *Config) ComputedEnv(
@@ -18,7 +18,8 @@ func (c *Config) ComputedEnv(
1818
if c.IsEnvsecEnabled() {
1919
env, err = envsec.Env(ctx, projectDir)
2020
if err != nil {
21-
fmt.Fprintf(os.Stderr, "Error reading secrets from envsec: %s\n\n", err)
21+
ux.Fwarning(os.Stderr, "Error reading secrets from envsec: %s\n\n", err)
22+
env = map[string]string{}
2223
}
2324
} else if c.EnvFrom != "" {
2425
return nil, usererr.New("unknown from_env value: %s", c.EnvFrom)

internal/devconfig/field.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package devconfig
2+
3+
import (
4+
"reflect"
5+
"strings"
6+
7+
"github.com/tailscale/hujson"
8+
)
9+
10+
func (c *Config) SetStringField(fieldName, val string) {
11+
valueOfStruct := reflect.ValueOf(c).Elem()
12+
13+
field := valueOfStruct.FieldByName(fieldName)
14+
field.SetString(val)
15+
16+
c.ast.setStringField(c.jsonNameOfField(fieldName), val)
17+
}
18+
19+
func (c *Config) jsonNameOfField(fieldName string) string {
20+
valueOfStruct := reflect.ValueOf(c).Elem()
21+
22+
var name string
23+
for i := 0; i < valueOfStruct.NumField(); i++ {
24+
field := valueOfStruct.Type().Field(i)
25+
if field.Name != fieldName {
26+
continue
27+
}
28+
29+
name = field.Name
30+
jsonTag := field.Tag.Get("json")
31+
parts := strings.Split(jsonTag, ",")
32+
if len(parts) > 0 && parts[0] != "" && parts[0] != "-" {
33+
name = parts[0]
34+
}
35+
36+
break
37+
}
38+
return name
39+
}
40+
41+
func (c *configAST) setStringField(key, val string) {
42+
rootObject := c.root.Value.(*hujson.Object)
43+
i := c.memberIndex(rootObject, key)
44+
if i == -1 {
45+
rootObject.Members = append(rootObject.Members, hujson.ObjectMember{
46+
Name: hujson.Value{Value: hujson.String(key)},
47+
Value: hujson.Value{Value: hujson.String(val)},
48+
})
49+
} else if val != "" {
50+
rootObject.Members[i].Value = hujson.Value{Value: hujson.String(val)}
51+
} else {
52+
rootObject.Members = append(rootObject.Members[:i], rootObject.Members[i+1:]...)
53+
}
54+
55+
c.root.Format()
56+
}

internal/integrations/envsec/envsec.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func Env(ctx context.Context, projectDir string) (map[string]string, error) {
2525
return envCache, nil
2626
}
2727

28-
if err := ensureInitialized(ctx, projectDir); err != nil {
28+
if err := EnsureInitialized(ctx, projectDir); err != nil {
2929
return nil, err
3030
}
3131

@@ -58,7 +58,7 @@ func EnsureInstalled(ctx context.Context) (string, error) {
5858
return binPathCache, nil
5959
}
6060

61-
func ensureInitialized(ctx context.Context, projectDir string) error {
61+
func EnsureInitialized(ctx context.Context, projectDir string) error {
6262
binPath, err := EnsureInstalled(ctx)
6363
if err != nil {
6464
return err

0 commit comments

Comments
 (0)