mirror of
https://github.com/helm/helm.git
synced 2026-03-23 02:43:05 -04:00
fix(getter): pass settings environment variables
Signed-off-by: Zadkiel AHARONIAN <hello@zadkiel.fr>
(cherry picked from commit 119341dca7)
This commit is contained in:
parent
41a6b364a1
commit
31bd995ce2
7 changed files with 47 additions and 17 deletions
|
|
@ -53,13 +53,13 @@ func remarshalRuntimeConfig[T RuntimeConfig](runtimeData map[string]any) (Runtim
|
|||
return config, nil
|
||||
}
|
||||
|
||||
// parseEnv takes a list of "KEY=value" environment variable strings
|
||||
// ParseEnv takes a list of "KEY=value" environment variable strings
|
||||
// and transforms the result into a map[KEY]=value
|
||||
//
|
||||
// - empty input strings are ignored
|
||||
// - input strings with no value are stored as empty strings
|
||||
// - duplicate keys overwrite earlier values
|
||||
func parseEnv(env []string) map[string]string {
|
||||
func ParseEnv(env []string) map[string]string {
|
||||
result := make(map[string]string, len(env))
|
||||
for _, envVar := range env {
|
||||
parts := strings.SplitN(envVar, "=", 2)
|
||||
|
|
@ -75,7 +75,9 @@ func parseEnv(env []string) map[string]string {
|
|||
return result
|
||||
}
|
||||
|
||||
func formatEnv(env map[string]string) []string {
|
||||
// FormatEnv takes a map[KEY]=value and transforms it into
|
||||
// a list of "KEY=value" environment variable strings
|
||||
func FormatEnv(env map[string]string) []string {
|
||||
result := make([]string, 0, len(env))
|
||||
for key, value := range env {
|
||||
result = append(result, fmt.Sprintf("%s=%s", key, value))
|
||||
|
|
|
|||
|
|
@ -259,7 +259,7 @@ func buildPluginConfig(input *Input, r *RuntimeExtismV1) extism.PluginConfig {
|
|||
mc = mc.WithStderr(input.Stderr)
|
||||
}
|
||||
if len(input.Env) > 0 {
|
||||
env := parseEnv(input.Env)
|
||||
env := ParseEnv(input.Env)
|
||||
for k, v := range env {
|
||||
mc = mc.WithEnv(k, v)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ func (r *SubprocessPluginRuntime) InvokeHook(event string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
env := parseEnv(os.Environ())
|
||||
env := ParseEnv(os.Environ())
|
||||
maps.Insert(env, maps.All(r.EnvVars))
|
||||
env["HELM_PLUGIN_NAME"] = r.metadata.Name
|
||||
env["HELM_PLUGIN_DIR"] = r.pluginDir
|
||||
|
|
@ -150,7 +150,7 @@ func (r *SubprocessPluginRuntime) InvokeHook(event string) error {
|
|||
}
|
||||
|
||||
cmd := exec.Command(main, argv...)
|
||||
cmd.Env = formatEnv(env)
|
||||
cmd.Env = FormatEnv(env)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
|
|
@ -198,9 +198,9 @@ func (r *SubprocessPluginRuntime) runCLI(input *Input) (*Output, error) {
|
|||
|
||||
cmds := r.RuntimeConfig.PlatformCommand
|
||||
|
||||
env := parseEnv(os.Environ())
|
||||
env := ParseEnv(os.Environ())
|
||||
maps.Insert(env, maps.All(r.EnvVars))
|
||||
maps.Insert(env, maps.All(parseEnv(input.Env)))
|
||||
maps.Insert(env, maps.All(ParseEnv(input.Env)))
|
||||
env["HELM_PLUGIN_NAME"] = r.metadata.Name
|
||||
env["HELM_PLUGIN_DIR"] = r.pluginDir
|
||||
|
||||
|
|
@ -210,7 +210,7 @@ func (r *SubprocessPluginRuntime) runCLI(input *Input) (*Output, error) {
|
|||
}
|
||||
|
||||
cmd := exec.Command(command, args...)
|
||||
cmd.Env = formatEnv(env)
|
||||
cmd.Env = FormatEnv(env)
|
||||
|
||||
cmd.Stdin = input.Stdin
|
||||
cmd.Stdout = input.Stdout
|
||||
|
|
@ -231,9 +231,9 @@ func (r *SubprocessPluginRuntime) runPostrenderer(input *Input) (*Output, error)
|
|||
return nil, fmt.Errorf("plugin %q input message does not implement InputMessagePostRendererV1", r.metadata.Name)
|
||||
}
|
||||
|
||||
env := parseEnv(os.Environ())
|
||||
env := ParseEnv(os.Environ())
|
||||
maps.Insert(env, maps.All(r.EnvVars))
|
||||
maps.Insert(env, maps.All(parseEnv(input.Env)))
|
||||
maps.Insert(env, maps.All(ParseEnv(input.Env)))
|
||||
env["HELM_PLUGIN_NAME"] = r.metadata.Name
|
||||
env["HELM_PLUGIN_DIR"] = r.pluginDir
|
||||
|
||||
|
|
@ -261,7 +261,7 @@ func (r *SubprocessPluginRuntime) runPostrenderer(input *Input) (*Output, error)
|
|||
postRendered := &bytes.Buffer{}
|
||||
stderr := &bytes.Buffer{}
|
||||
|
||||
cmd.Env = formatEnv(env)
|
||||
cmd.Env = FormatEnv(env)
|
||||
cmd.Stdout = postRendered
|
||||
cmd.Stderr = stderr
|
||||
|
||||
|
|
|
|||
|
|
@ -56,9 +56,9 @@ func (r *SubprocessPluginRuntime) runGetter(input *Input) (*Output, error) {
|
|||
return nil, fmt.Errorf("no downloader found for protocol %q", msg.Protocol)
|
||||
}
|
||||
|
||||
env := parseEnv(os.Environ())
|
||||
env := ParseEnv(os.Environ())
|
||||
maps.Insert(env, maps.All(r.EnvVars))
|
||||
maps.Insert(env, maps.All(parseEnv(input.Env)))
|
||||
maps.Insert(env, maps.All(ParseEnv(input.Env)))
|
||||
env["HELM_PLUGIN_NAME"] = r.metadata.Name
|
||||
env["HELM_PLUGIN_DIR"] = r.pluginDir
|
||||
env["HELM_PLUGIN_USERNAME"] = msg.Options.Username
|
||||
|
|
@ -83,7 +83,7 @@ func (r *SubprocessPluginRuntime) runGetter(input *Input) (*Output, error) {
|
|||
cmd := exec.Command(
|
||||
pluginCommand,
|
||||
args...)
|
||||
cmd.Env = formatEnv(env)
|
||||
cmd.Env = FormatEnv(env)
|
||||
cmd.Stdout = &buf
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ func TestParseEnv(t *testing.T) {
|
|||
|
||||
for name, tc := range testCases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
result := parseEnv(tc.env)
|
||||
result := ParseEnv(tc.env)
|
||||
assert.Equal(t, tc.expected, result)
|
||||
})
|
||||
}
|
||||
|
|
@ -93,7 +93,7 @@ func TestFormatEnv(t *testing.T) {
|
|||
|
||||
for name, tc := range testCases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
result := formatEnv(tc.env)
|
||||
result := FormatEnv(tc.env)
|
||||
assert.ElementsMatch(t, tc.expected, result)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,12 +38,14 @@ func collectGetterPlugins(settings *cli.EnvSettings) (Providers, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
env := plugin.FormatEnv(settings.EnvVars())
|
||||
pluginConstructorBuilder := func(plg plugin.Plugin) Constructor {
|
||||
return func(option ...Option) (Getter, error) {
|
||||
|
||||
return &getterPlugin{
|
||||
options: append([]Option{}, option...),
|
||||
plg: plg,
|
||||
env: env,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
|
@ -91,6 +93,7 @@ func convertOptions(globalOptions, options []Option) schema.GetterOptionsV1 {
|
|||
type getterPlugin struct {
|
||||
options []Option
|
||||
plg plugin.Plugin
|
||||
env []string
|
||||
}
|
||||
|
||||
func (g *getterPlugin) Get(href string, options ...Option) (*bytes.Buffer, error) {
|
||||
|
|
@ -108,6 +111,7 @@ func (g *getterPlugin) Get(href string, options ...Option) (*bytes.Buffer, error
|
|||
Options: opts,
|
||||
Protocol: u.Scheme,
|
||||
},
|
||||
Env: g.env,
|
||||
// TODO should we pass Stdin, Stdout, and Stderr through Input here to getter plugins?
|
||||
// Stdout: os.Stdout,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -144,3 +144,27 @@ func TestGetterPlugin(t *testing.T) {
|
|||
|
||||
assert.Equal(t, "fake-plugin output", buf.String())
|
||||
}
|
||||
|
||||
func TestCollectGetterPluginsPassesEnv(t *testing.T) {
|
||||
env := cli.New()
|
||||
env.PluginsDirectory = pluginDir
|
||||
env.Debug = true
|
||||
|
||||
providers, err := collectGetterPlugins(env)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, providers, "expected at least one plugin provider")
|
||||
|
||||
getter, err := providers.ByScheme("test")
|
||||
require.NoError(t, err)
|
||||
|
||||
gp, ok := getter.(*getterPlugin)
|
||||
require.True(t, ok, "expected getter to be a *getterPlugin")
|
||||
|
||||
require.NotEmpty(t, gp.env, "expected env to be set on getterPlugin")
|
||||
envMap := plugin.ParseEnv(gp.env)
|
||||
|
||||
assert.Contains(t, envMap, "HELM_DEBUG", "expected HELM_DEBUG in env")
|
||||
assert.Equal(t, "true", envMap["HELM_DEBUG"], "expected HELM_DEBUG to be true")
|
||||
assert.Contains(t, envMap, "HELM_PLUGINS", "expected HELM_PLUGINS in env")
|
||||
assert.Equal(t, pluginDir, envMap["HELM_PLUGINS"], "expected HELM_PLUGINS to match pluginsDirectory")
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue