From bc16de0b58d64b90c465cdc6a7e61594bec086d1 Mon Sep 17 00:00:00 2001 From: Eric Chiang Date: Sun, 23 Oct 2016 07:58:28 -0700 Subject: [PATCH 1/2] storage/kubernetes: don't guess the kubeconfig location and change test env Using the default KUBECONFIG environment variable to indicate that the Kubernetes tests should be run lead to cases where developers accidentally ran the tests. This has now been changed to "DEX_KUBECONFIG" and documentation hsa been added detailing how to run these tests. Additionally, no other storage reads environment variables for its normal configuration (outside of tests) so the Kubernetes storage no longer does. Overall, be less surprising. --- ...g-db-tests.md => dev-integration-tests.md} | 24 ++++++++++++----- glide.lock | 6 ++--- glide.yaml | 3 --- storage/kubernetes/storage.go | 26 +++++-------------- storage/kubernetes/storage_test.go | 10 ++++--- 5 files changed, 34 insertions(+), 35 deletions(-) rename Documentation/{dev-running-db-tests.md => dev-integration-tests.md} (60%) diff --git a/Documentation/dev-running-db-tests.md b/Documentation/dev-integration-tests.md similarity index 60% rename from Documentation/dev-running-db-tests.md rename to Documentation/dev-integration-tests.md index c0eef62b..0445205e 100644 --- a/Documentation/dev-running-db-tests.md +++ b/Documentation/dev-integration-tests.md @@ -1,12 +1,25 @@ -# Running database tests +# Running integration tests + +## Kubernetes + +Kubernetes tests will only run if the `DEX_KUBECONFIG` environment variable is set. + +``` +$ export DEX_KUBECONFIG=~/.kube/config +$ go test -v -i ./storage/kubernetes +$ go test -v ./storage/kubernetes +``` + +Because third party resources creation isn't synchronized it's expected that the tests fail the first time. Fear not, and just run them again. + +## Postgres Running database tests locally require: * A systemd based Linux distro. * A recent version of [rkt](https://github.com/coreos/rkt) installed. -The `standup.sh` script in the SQL directory is used to run databases in -containers with systemd daemonizing the process. +The `standup.sh` script in the SQL directory is used to run databases in containers with systemd daemonizing the process. ``` $ sudo ./storage/sql/standup.sh create postgres @@ -21,11 +34,10 @@ To run tests export the following environment variables: ``` -Exporting the variables will cause the database tests to be run, rather than -skipped. +Exporting the variables will cause the database tests to be run, rather than skipped. ``` -$ # sqlite takes forever to compile, be sure to install test dependencies +$ # sqlite3 takes forever to compile, be sure to install test dependencies $ go test -v -i ./storage/sql $ go test -v ./storage/sql ``` diff --git a/glide.lock b/glide.lock index 6e733476..c743fb33 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 8b7a5f94584ecd144fc3ce94bb0b09f8e96c94b5a8e10d5053bd24bb597367ce -updated: 2016-10-03T23:25:41.280181088-07:00 +hash: a813cbca07393d7cbe35d411cdef588afac7a3bab8a287ffe7b9587516ef5898 +updated: 2016-10-23T20:51:55.313818678-07:00 imports: - name: github.com/cockroachdb/cockroach-go version: 31611c0501c812f437d4861d87d117053967c955 @@ -33,8 +33,6 @@ imports: - oid - name: github.com/mattn/go-sqlite3 version: 3fb7a0e792edd47bf0cf1e919dfc14e2be412e15 -- name: github.com/mitchellh/go-homedir - version: 756f7b183b7ab78acdbbee5c7f392838ed459dda - name: github.com/pquerna/cachecontrol version: c97913dcbd76de40b051a9b4cd827f7eaeb7a868 subpackages: diff --git a/glide.yaml b/glide.yaml index 3b342b44..2616cae7 100644 --- a/glide.yaml +++ b/glide.yaml @@ -74,9 +74,6 @@ import: - proto - protoc-gen-go -- package: github.com/mitchellh/go-homedir - verison: 756f7b183b7ab78acdbbee5c7f392838ed459dda - - package: github.com/kylelemons/godebug subpackages: - diff diff --git a/storage/kubernetes/storage.go b/storage/kubernetes/storage.go index 7a7fb2b4..32424321 100644 --- a/storage/kubernetes/storage.go +++ b/storage/kubernetes/storage.go @@ -5,11 +5,8 @@ import ( "fmt" "log" "net/http" - "os" - "path/filepath" "time" - homedir "github.com/mitchellh/go-homedir" "golang.org/x/net/context" "github.com/coreos/dex/storage" @@ -37,8 +34,7 @@ const ( // Config values for the Kubernetes storage type. type Config struct { InCluster bool `yaml:"inCluster"` - KubeConfigPath string `yaml:"kubeConfigPath"` - GCFrequency int64 `yaml:"gcFrequency"` // seconds + KubeConfigFile string `yaml:"kubeConfigFile"` } // Open returns a storage using Kubernetes third party resource. @@ -52,8 +48,11 @@ func (c *Config) Open() (storage.Storage, error) { // open returns a client with no garbage collection. func (c *Config) open() (*client, error) { - if c.InCluster && (c.KubeConfigPath != "") { - return nil, errors.New("cannot specify both 'inCluster' and 'kubeConfigPath'") + if c.InCluster && (c.KubeConfigFile != "") { + return nil, errors.New("cannot specify both 'inCluster' and 'kubeConfigFile'") + } + if !c.InCluster && (c.KubeConfigFile == "") { + return nil, errors.New("must specify either 'inCluster' or 'kubeConfigFile'") } var ( @@ -65,18 +64,7 @@ func (c *Config) open() (*client, error) { if c.InCluster { cluster, user, namespace, err = inClusterConfig() } else { - kubeConfigPath := c.KubeConfigPath - if kubeConfigPath == "" { - kubeConfigPath = os.Getenv("KUBECONFIG") - } - if kubeConfigPath == "" { - p, err := homedir.Dir() - if err != nil { - return nil, fmt.Errorf("finding homedir: %v", err) - } - kubeConfigPath = filepath.Join(p, ".kube", "config") - } - cluster, user, namespace, err = loadKubeConfig(kubeConfigPath) + cluster, user, namespace, err = loadKubeConfig(c.KubeConfigFile) } if err != nil { return nil, err diff --git a/storage/kubernetes/storage_test.go b/storage/kubernetes/storage_test.go index 0f347730..9132fd0a 100644 --- a/storage/kubernetes/storage_test.go +++ b/storage/kubernetes/storage_test.go @@ -8,15 +8,19 @@ import ( "github.com/coreos/dex/storage/conformance" ) +const testKubeConfigEnv = "DEX_KUBECONFIG" + func TestLoadClient(t *testing.T) { loadClient(t) } func loadClient(t *testing.T) *client { - if os.Getenv("KUBECONFIG") == "" { - t.Skip() + config := Config{ + KubeConfigFile: os.Getenv(testKubeConfigEnv), + } + if config.KubeConfigFile == "" { + t.Skipf("test environment variable %q not set, skipping", testKubeConfigEnv) } - var config Config s, err := config.open() if err != nil { t.Fatal(err) From 191c84813fec0276ff0c9a45a0472f18226bafbb Mon Sep 17 00:00:00 2001 From: Eric Chiang Date: Sun, 23 Oct 2016 20:53:35 -0700 Subject: [PATCH 2/2] vendor: revendor --- .../github.com/mitchellh/go-homedir/LICENSE | 21 --- .../github.com/mitchellh/go-homedir/README.md | 14 -- .../mitchellh/go-homedir/homedir.go | 137 ------------------ .../mitchellh/go-homedir/homedir_test.go | 112 -------------- 4 files changed, 284 deletions(-) delete mode 100644 vendor/github.com/mitchellh/go-homedir/LICENSE delete mode 100644 vendor/github.com/mitchellh/go-homedir/README.md delete mode 100644 vendor/github.com/mitchellh/go-homedir/homedir.go delete mode 100644 vendor/github.com/mitchellh/go-homedir/homedir_test.go diff --git a/vendor/github.com/mitchellh/go-homedir/LICENSE b/vendor/github.com/mitchellh/go-homedir/LICENSE deleted file mode 100644 index f9c841a5..00000000 --- a/vendor/github.com/mitchellh/go-homedir/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Mitchell Hashimoto - -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. diff --git a/vendor/github.com/mitchellh/go-homedir/README.md b/vendor/github.com/mitchellh/go-homedir/README.md deleted file mode 100644 index d70706d5..00000000 --- a/vendor/github.com/mitchellh/go-homedir/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# go-homedir - -This is a Go library for detecting the user's home directory without -the use of cgo, so the library can be used in cross-compilation environments. - -Usage is incredibly simple, just call `homedir.Dir()` to get the home directory -for a user, and `homedir.Expand()` to expand the `~` in a path to the home -directory. - -**Why not just use `os/user`?** The built-in `os/user` package requires -cgo on Darwin systems. This means that any Go code that uses that package -cannot cross compile. But 99% of the time the use for `os/user` is just to -retrieve the home directory, which we can do for the current user without -cgo. This library does that, enabling cross-compilation. diff --git a/vendor/github.com/mitchellh/go-homedir/homedir.go b/vendor/github.com/mitchellh/go-homedir/homedir.go deleted file mode 100644 index 8996b022..00000000 --- a/vendor/github.com/mitchellh/go-homedir/homedir.go +++ /dev/null @@ -1,137 +0,0 @@ -package homedir - -import ( - "bytes" - "errors" - "os" - "os/exec" - "path/filepath" - "runtime" - "strconv" - "strings" - "sync" -) - -// DisableCache will disable caching of the home directory. Caching is enabled -// by default. -var DisableCache bool - -var homedirCache string -var cacheLock sync.RWMutex - -// Dir returns the home directory for the executing user. -// -// This uses an OS-specific method for discovering the home directory. -// An error is returned if a home directory cannot be detected. -func Dir() (string, error) { - if !DisableCache { - cacheLock.RLock() - cached := homedirCache - cacheLock.RUnlock() - if cached != "" { - return cached, nil - } - } - - cacheLock.Lock() - defer cacheLock.Unlock() - - var result string - var err error - if runtime.GOOS == "windows" { - result, err = dirWindows() - } else { - // Unix-like system, so just assume Unix - result, err = dirUnix() - } - - if err != nil { - return "", err - } - homedirCache = result - return result, nil -} - -// Expand expands the path to include the home directory if the path -// is prefixed with `~`. If it isn't prefixed with `~`, the path is -// returned as-is. -func Expand(path string) (string, error) { - if len(path) == 0 { - return path, nil - } - - if path[0] != '~' { - return path, nil - } - - if len(path) > 1 && path[1] != '/' && path[1] != '\\' { - return "", errors.New("cannot expand user-specific home dir") - } - - dir, err := Dir() - if err != nil { - return "", err - } - - return filepath.Join(dir, path[1:]), nil -} - -func dirUnix() (string, error) { - // First prefer the HOME environmental variable - if home := os.Getenv("HOME"); home != "" { - return home, nil - } - - // If that fails, try getent - var stdout bytes.Buffer - cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) - cmd.Stdout = &stdout - if err := cmd.Run(); err != nil { - // If "getent" is missing, ignore it - if err == exec.ErrNotFound { - return "", err - } - } else { - if passwd := strings.TrimSpace(stdout.String()); passwd != "" { - // username:password:uid:gid:gecos:home:shell - passwdParts := strings.SplitN(passwd, ":", 7) - if len(passwdParts) > 5 { - return passwdParts[5], nil - } - } - } - - // If all else fails, try the shell - stdout.Reset() - cmd = exec.Command("sh", "-c", "cd && pwd") - cmd.Stdout = &stdout - if err := cmd.Run(); err != nil { - return "", err - } - - result := strings.TrimSpace(stdout.String()) - if result == "" { - return "", errors.New("blank output when reading home directory") - } - - return result, nil -} - -func dirWindows() (string, error) { - // First prefer the HOME environmental variable - if home := os.Getenv("HOME"); home != "" { - return home, nil - } - - drive := os.Getenv("HOMEDRIVE") - path := os.Getenv("HOMEPATH") - home := drive + path - if drive == "" || path == "" { - home = os.Getenv("USERPROFILE") - } - if home == "" { - return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank") - } - - return home, nil -} diff --git a/vendor/github.com/mitchellh/go-homedir/homedir_test.go b/vendor/github.com/mitchellh/go-homedir/homedir_test.go deleted file mode 100644 index e4054e72..00000000 --- a/vendor/github.com/mitchellh/go-homedir/homedir_test.go +++ /dev/null @@ -1,112 +0,0 @@ -package homedir - -import ( - "os" - "os/user" - "path/filepath" - "testing" -) - -func patchEnv(key, value string) func() { - bck := os.Getenv(key) - deferFunc := func() { - os.Setenv(key, bck) - } - - os.Setenv(key, value) - return deferFunc -} - -func BenchmarkDir(b *testing.B) { - // We do this for any "warmups" - for i := 0; i < 10; i++ { - Dir() - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - Dir() - } -} - -func TestDir(t *testing.T) { - u, err := user.Current() - if err != nil { - t.Fatalf("err: %s", err) - } - - dir, err := Dir() - if err != nil { - t.Fatalf("err: %s", err) - } - - if u.HomeDir != dir { - t.Fatalf("%#v != %#v", u.HomeDir, dir) - } -} - -func TestExpand(t *testing.T) { - u, err := user.Current() - if err != nil { - t.Fatalf("err: %s", err) - } - - cases := []struct { - Input string - Output string - Err bool - }{ - { - "/foo", - "/foo", - false, - }, - - { - "~/foo", - filepath.Join(u.HomeDir, "foo"), - false, - }, - - { - "", - "", - false, - }, - - { - "~", - u.HomeDir, - false, - }, - - { - "~foo/foo", - "", - true, - }, - } - - for _, tc := range cases { - actual, err := Expand(tc.Input) - if (err != nil) != tc.Err { - t.Fatalf("Input: %#v\n\nErr: %s", tc.Input, err) - } - - if actual != tc.Output { - t.Fatalf("Input: %#v\n\nOutput: %#v", tc.Input, actual) - } - } - - DisableCache = true - defer func() { DisableCache = false }() - defer patchEnv("HOME", "/custom/path/")() - expected := filepath.Join("/", "custom", "path", "foo/bar") - actual, err := Expand("~/foo/bar") - - if err != nil { - t.Errorf("No error is expected, got: %v", err) - } else if actual != expected { - t.Errorf("Expected: %v; actual: %v", expected, actual) - } -}