From db7221c1d95b35ba39f11e63ee823395728cd953 Mon Sep 17 00:00:00 2001 From: astarik Date: Fri, 17 Jul 2026 18:33:57 +0200 Subject: [PATCH] fix: pass full environment to terraform, not only PATH --- .../provisioner/terraform/cmd_default.go | 6 +-- pkg/cluster/provisioner/terraform/cmd_env.go | 42 +++++++++++++++ .../provisioner/terraform/cmd_env_test.go | 51 +++++++++++++++++++ .../provisioner/terraform/cmd_linux.go | 6 +-- 4 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 pkg/cluster/provisioner/terraform/cmd_env.go create mode 100644 pkg/cluster/provisioner/terraform/cmd_env_test.go diff --git a/pkg/cluster/provisioner/terraform/cmd_default.go b/pkg/cluster/provisioner/terraform/cmd_default.go index 59a3333d..96762c2c 100644 --- a/pkg/cluster/provisioner/terraform/cmd_default.go +++ b/pkg/cluster/provisioner/terraform/cmd_default.go @@ -5,7 +5,6 @@ package terraform import ( "fmt" - "os" "os/exec" "github.com/MusicDin/kubitect/pkg/ui" @@ -28,10 +27,7 @@ func (t *terraform) runCmd(action string, args []string, showOutput bool) (int, cmd.Stdout = ui.Streams().Out().File() } - cmd.Env = []string{fmt.Sprintf("PATH=%s", os.Getenv("PATH"))} - if ui.Debug() { - cmd.Env = append(cmd.Env, "TF_LOG=INFO") - } + cmd.Env = terraformCmdEnv(ui.Debug()) err := cmd.Run() exitCode := cmd.ProcessState.ExitCode() diff --git a/pkg/cluster/provisioner/terraform/cmd_env.go b/pkg/cluster/provisioner/terraform/cmd_env.go new file mode 100644 index 00000000..7115ffee --- /dev/null +++ b/pkg/cluster/provisioner/terraform/cmd_env.go @@ -0,0 +1,42 @@ +package terraform + +import ( + "fmt" + "os" +) + +func terraformCmdEnv(debug bool) []string { + envMap := make(map[string]string) + + for _, env := range os.Environ() { + key, value, ok := splitEnvVar(env) + if !ok { + continue + } + + envMap[key] = value + } + + envMap["PATH"] = os.Getenv("PATH") + + if debug { + envMap["TF_LOG"] = "INFO" + } + + env := make([]string, 0, len(envMap)) + for key, value := range envMap { + env = append(env, fmt.Sprintf("%s=%s", key, value)) + } + + return env +} + +func splitEnvVar(env string) (string, string, bool) { + for i := 0; i < len(env); i++ { + if env[i] == '=' { + return env[:i], env[i+1:], true + } + } + + return "", "", false +} diff --git a/pkg/cluster/provisioner/terraform/cmd_env_test.go b/pkg/cluster/provisioner/terraform/cmd_env_test.go new file mode 100644 index 00000000..59edcaa3 --- /dev/null +++ b/pkg/cluster/provisioner/terraform/cmd_env_test.go @@ -0,0 +1,51 @@ +package terraform + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTerraformCmdEnv_PreservesHomeAndAddsTFLog(t *testing.T) { + oldHome := os.Getenv("HOME") + oldPath := os.Getenv("PATH") + defer func() { + require.NoError(t, os.Setenv("HOME", oldHome)) + require.NoError(t, os.Setenv("PATH", oldPath)) + }() + + require.NoError(t, os.Setenv("HOME", "/tmp/test-home")) + require.NoError(t, os.Setenv("PATH", "/tmp/test-bin")) + + env := terraformCmdEnv(true) + envMap := envSliceToMap(env) + + assert.Equal(t, "/tmp/test-home", envMap["HOME"]) + assert.Equal(t, "/tmp/test-bin", envMap["PATH"]) + assert.Equal(t, "INFO", envMap["TF_LOG"]) +} + +func TestTerraformCmdEnv_OmitsTFLogWhenDebugDisabled(t *testing.T) { + env := terraformCmdEnv(false) + envMap := envSliceToMap(env) + + _, ok := envMap["TF_LOG"] + assert.False(t, ok) +} + +func envSliceToMap(env []string) map[string]string { + result := make(map[string]string, len(env)) + + for _, item := range env { + key, value, ok := splitEnvVar(item) + if !ok { + continue + } + + result[key] = value + } + + return result +} diff --git a/pkg/cluster/provisioner/terraform/cmd_linux.go b/pkg/cluster/provisioner/terraform/cmd_linux.go index 6f85992e..a4bf9213 100644 --- a/pkg/cluster/provisioner/terraform/cmd_linux.go +++ b/pkg/cluster/provisioner/terraform/cmd_linux.go @@ -2,7 +2,6 @@ package terraform import ( "fmt" - "os" "os/exec" "syscall" @@ -30,10 +29,7 @@ func (t *terraform) runCmd(action string, args []string, showOutput bool) (int, cmd.Stdout = ui.Streams().Out().File() } - cmd.Env = []string{fmt.Sprintf("PATH=%s", os.Getenv("PATH"))} - if ui.Debug() { - cmd.Env = append(cmd.Env, "TF_LOG=INFO") - } + cmd.Env = terraformCmdEnv(ui.Debug()) err := cmd.Run() exitCode := cmd.ProcessState.ExitCode()