From 6ad813e5fa2c9a94b2237d0e80e51196c76c076f Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Fri, 8 Apr 2022 11:32:42 +0200 Subject: Fix fallback to global config --- client/go/cmd/config.go | 9 +++++++-- client/go/cmd/config_test.go | 15 ++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/client/go/cmd/config.go b/client/go/cmd/config.go index 50d302b1e5d..f274bf7fc33 100644 --- a/client/go/cmd/config.go +++ b/client/go/cmd/config.go @@ -476,10 +476,15 @@ func (c *Config) list() []string { return options } +func (c *Config) isSet(option string) bool { return c.viper.IsSet(option) } + func (c *Config) get(option string) (string, bool) { if c.local != nil { - if value, ok := c.local.get(option); ok { - return value, ok + // when reading from local config, the option must be explicitly set to be considered + if c.local.isSet(option) { + if value, ok := c.local.get(option); ok { + return value, ok + } } } value := c.viper.GetString(option) diff --git a/client/go/cmd/config_test.go b/client/go/cmd/config_test.go index 7059bfa78cc..58e70893619 100644 --- a/client/go/cmd/config_test.go +++ b/client/go/cmd/config_test.go @@ -47,9 +47,11 @@ func TestConfig(t *testing.T) { func TestLocalConfig(t *testing.T) { configHome := t.TempDir() + // Write a few global options assertConfigCommand(t, configHome, "", "config", "set", "instance", "main") + assertConfigCommand(t, configHome, "", "config", "set", "target", "cloud") - // Change directory to an application package and write local configuration + // Change directory to an application package and write local options _, rootDir := mock.ApplicationPackageDir(t, false, false) wd, err := os.Getwd() require.Nil(t, err) @@ -60,17 +62,20 @@ func TestLocalConfig(t *testing.T) { assertConfigCommand(t, configHome, "instance = bar\n", "config", "get", "--instance", "bar", "instance") // flag overrides local config // get --local prints only options set in local config - assertConfigCommand(t, configHome, "", "config", "set", "--local", "target", "hosted") - assertConfigCommand(t, configHome, "instance = foo\ntarget = hosted\n", "config", "get", "--local") + assertConfigCommand(t, configHome, "instance = foo\n", "config", "get", "--local") + + // get reads global option if unset locally + assertConfigCommand(t, configHome, "target = cloud\n", "config", "get", "target") - // only locally set options are written + // Only locally set options are written localConfig, err := os.ReadFile(filepath.Join(rootDir, ".vespa", "config.yaml")) require.Nil(t, err) - assert.Equal(t, "instance: foo\ntarget: hosted\n", string(localConfig)) + assert.Equal(t, "instance: foo\n", string(localConfig)) // Changing back to original directory reads from global config require.Nil(t, os.Chdir(wd)) assertConfigCommand(t, configHome, "instance = main\n", "config", "get", "instance") + assertConfigCommand(t, configHome, "target = cloud\n", "config", "get", "target") } func assertConfigCommand(t *testing.T, configHome, expected string, args ...string) { -- cgit v1.2.3