Skip to content

[envsec] Fix devbox.json field and handle envsec errors #1482

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/devconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ type Config struct {
Env map[string]string `json:"env,omitempty"`

// Only allows "envsec" for now
FromEnv string `json:"from_env,omitempty"`
EnvFrom string `json:"env_from,omitempty"`

// Shell configures the devbox shell environment.
Shell *shellConfig `json:"shell,omitempty"`
Expand Down
6 changes: 3 additions & 3 deletions internal/devconfig/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ func (c *Config) ComputedEnv(projectDir string) (map[string]string, error) {
env := map[string]string{}
var err error
if featureflag.Envsec.Enabled() {
if c.FromEnv == "envsec" {
if c.EnvFrom == "envsec" {
env, err = envsec.Env(projectDir)
if err != nil {
return nil, err
}
} else if c.FromEnv != "" {
return nil, usererr.New("unknown from_env value: %s", c.FromEnv)
} else if c.EnvFrom != "" {
return nil, usererr.New("unknown from_env value: %s", c.EnvFrom)
}
}
for k, v := range c.Env {
Expand Down
37 changes: 28 additions & 9 deletions internal/integrations/envsec/envsec.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package envsec

import (
"bytes"
"encoding/json"
"os/exec"

Expand All @@ -15,7 +16,7 @@ func Env(projectDir string) (map[string]string, error) {
return nil, err
}

if err := ensureEnvsecInitialized(); err != nil {
if err := ensureEnvsecInitialized(projectDir); err != nil {
return nil, err
}

Expand All @@ -29,30 +30,38 @@ func ensureEnvsecInstalled() error {
return nil
}

func ensureEnvsecInitialized() error {
cmd := exec.Command("envsec", "init")
// TODO handle user not logged in
// envsec init is currently broken in that it exits with 0 even if the user is not logged in
return cmd.Run()
func ensureEnvsecInitialized(projectDir string) error {
cmd := exec.Command("envsec", "init", "--json-errors")
cmd.Dir = projectDir
var bufErr bytes.Buffer
cmd.Stderr = &bufErr

if err := cmd.Run(); err != nil {
return handleError(&bufErr, err)
}
return nil
}

func envsecList(projectDir string) (map[string]string, error) {
cmd := exec.Command(
"envsec", "ls", "--show",
"--format", "json",
"--environment", "dev")
"--environment", "dev",
"--json-errors")
cmd.Dir = projectDir
var bufErr bytes.Buffer
cmd.Stderr = &bufErr
out, err := cmd.Output()
if err != nil {
return nil, errors.WithStack(err)
return nil, handleError(&bufErr, err)
}
var values []struct {
Name string `json:"name"`
Value string `json:"value"`
}

if err := json.Unmarshal(out, &values); err != nil {
return nil, errors.Wrap(err, "failed to parse envsec output")
return nil, errors.Wrapf(err, "failed to parse envsec output: %s", out)
}

m := map[string]string{}
Expand All @@ -61,3 +70,13 @@ func envsecList(projectDir string) (map[string]string, error) {
}
return m, nil
}

func handleError(stderr *bytes.Buffer, err error) error {
var errResponse struct {
Error string `json:"error"`
}
if err := json.Unmarshal(stderr.Bytes(), &errResponse); err == nil {
return usererr.New(errResponse.Error)
}
return errors.WithStack(err)
}