diff --git a/cli/main.go b/cli/main.go index bf9e9bdee..bb943b06b 100644 --- a/cli/main.go +++ b/cli/main.go @@ -136,16 +136,10 @@ func main() { if opts.Config == "" { fatal(errors.New("config path cannot be empty")) } - config, err := cliconfig.LoadFile(opts.Config) + + currentContext, err := determineCurrentContext(opts.Context, opts.Config) if err != nil { - fatal(errors.Wrap(err, "unable to find configuration file")) - } - currentContext := opts.Context - if currentContext == "" { - currentContext = config.CurrentContext - } - if currentContext == "" { - currentContext = "default" + fatal(errors.New("unable to determine current context")) } s, err := store.New(store.WithRoot(opts.Config)) @@ -200,6 +194,21 @@ func execMoby(ctx context.Context) { } } +func determineCurrentContext(flag string, configDir string) (string, error) { + res := flag + if res == "" { + config, err := cliconfig.LoadFile(configDir) + if err != nil { + return "", err + } + res = config.CurrentContext + } + if res == "" { + res = "default" + } + return res, nil +} + func fatal(err error) { fmt.Fprint(os.Stderr, err) os.Exit(1) diff --git a/cli/main_test.go b/cli/main_test.go new file mode 100644 index 000000000..a8a6c9f7d --- /dev/null +++ b/cli/main_test.go @@ -0,0 +1,71 @@ +/* + Copyright (c) 2020 Docker Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH + THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/docker/api/cli/config" +) + +var contextSetConfig = []byte(`{ + "currentContext": "some-context" +}`) + +func TestDetermineCurrentContext(t *testing.T) { + d, err := ioutil.TempDir("", "") + defer os.RemoveAll(d) + require.NoError(t, err) + err = ioutil.WriteFile(filepath.Join(d, config.ConfigFileName), contextSetConfig, 0644) + require.NoError(t, err) + + // If nothing set, fallback to default + c, err := determineCurrentContext("", "") + require.NoError(t, err) + require.Equal(t, "default", c) + + // If context flag set, use that + c, err = determineCurrentContext("other-context", "") + require.NoError(t, err) + require.Equal(t, "other-context", c) + + // If no context flag, use config + c, err = determineCurrentContext("", d) + require.NoError(t, err) + require.Equal(t, "some-context", c) + + // Ensure context flag overrides config + c, err = determineCurrentContext("other-context", d) + require.NoError(t, err) + require.Equal(t, "other-context", c) +}