소스 검색

Factor determination of current context

Signed-off-by: Christopher Crone <[email protected]>
Christopher Crone 5 년 전
부모
커밋
f6fcd27a09
2개의 변경된 파일89개의 추가작업 그리고 9개의 파일을 삭제
  1. 18 9
      cli/main.go
  2. 71 0
      cli/main_test.go

+ 18 - 9
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)

+ 71 - 0
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)
+}