From c0cabc5d08dc3afaf5c837f278d4a8787111e58c Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 19 Apr 2017 15:32:04 -0700 Subject: [PATCH] ref(glide): use k8s.io/client-go --- boot.go | 19 ++- glide.lock | 208 +++++++++++++++++++++---- glide.yaml | 76 +++++----- pkg/cleaner/cleaner.go | 21 +-- pkg/cleaner/cleaner_test.go | 8 +- pkg/gitreceive/build.go | 37 ++--- pkg/gitreceive/k8s_util.go | 89 +++++------ pkg/gitreceive/k8s_util_test.go | 78 ++++------ pkg/gitreceive/registry.go | 17 ++- pkg/gitreceive/registry_test.go | 211 +++++++------------------- pkg/gitreceive/run.go | 19 ++- pkg/healthsrv/healthz_handler_test.go | 8 +- pkg/healthsrv/namespace_lister.go | 12 +- pkg/healthsrv/readiness_handler.go | 4 +- pkg/k8s/namespace.go | 18 --- pkg/k8s/pull_policy.go | 36 ----- pkg/k8s/secrets.go | 57 ------- 17 files changed, 422 insertions(+), 496 deletions(-) delete mode 100644 pkg/k8s/namespace.go delete mode 100644 pkg/k8s/pull_policy.go delete mode 100644 pkg/k8s/secrets.go diff --git a/boot.go b/boot.go index 4c73e20..14ba0c0 100644 --- a/boot.go +++ b/boot.go @@ -21,7 +21,9 @@ import ( _ "github.com/docker/distribution/registry/storage/driver/s3-aws" _ "github.com/docker/distribution/registry/storage/driver/swift" "github.com/kelseyhightower/envconfig" - kcl "k8s.io/kubernetes/pkg/client/unversioned" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" ) const ( @@ -74,22 +76,29 @@ func main() { os.Exit(1) } - kubeClient, err := kcl.NewInCluster() + // creates the in-cluster config + config, err := rest.InClusterConfig() if err != nil { - log.Printf("Error getting kubernetes client [%s]", err) + log.Printf("Error getting kubernetes in-cluster config (%s)", err) + os.Exit(1) + } + // creates the clientset + clientset, err := kubernetes.NewForConfig(config) + if err != nil { + log.Printf("Error getting kubernetes client (%s)", err) os.Exit(1) } log.Printf("Starting health check server on port %d", cnf.HealthSrvPort) healthSrvCh := make(chan error) go func() { - if err := healthsrv.Start(cnf, kubeClient.Namespaces(), storageDriver, circ); err != nil { + if err := healthsrv.Start(cnf, clientset.CoreV1.Namespaces().List(metav1.ListOptions{}), storageDriver, circ); err != nil { healthSrvCh <- err } }() log.Printf("Starting deleted app cleaner") cleanerErrCh := make(chan error) go func() { - if err := cleaner.Run(gitHomeDir, kubeClient.Namespaces(), fs, cnf.CleanerPollSleepDuration(), storageDriver); err != nil { + if err := cleaner.Run(gitHomeDir, clientset.CoreV1.Namespaces().List(metav1.ListOptions{}), fs, cnf.CleanerPollSleepDuration(), storageDriver); err != nil { cleanerErrCh <- err } }() diff --git a/glide.lock b/glide.lock index b426ee0..574a154 100644 --- a/glide.lock +++ b/glide.lock @@ -1,10 +1,8 @@ -hash: d85b2efb6ab99d7c4d431a95b64116345596b1e371c19c2f55b2be73fff9bcbf -updated: 2017-02-14T09:23:17.687476614-07:00 +hash: 73eda6d113e669da0d3717af794ae7e2dddc00a7c407afa82737aa1291b82041 +updated: 2017-04-19T15:14:07.566541597-07:00 imports: - name: bitbucket.org/ww/goautoneg version: 75cd24fc2f2c2a2088577d12123ddee5f54e0675 -- name: github.com/arschles/assert - version: 6882f85ccdc7c1822b146d1a6b0c2c48f91b5140 - name: github.com/aws/aws-sdk-go version: 49c3892b61af1d4996292a3025f36e4dfa25eaee subpackages: @@ -31,7 +29,6 @@ imports: - private/protocol/xml/xmlutil - private/signer/v4 - private/waiter - - service/cloudfront/sign - service/ecr - service/s3 - name: github.com/Azure/azure-sdk-for-go @@ -45,29 +42,28 @@ imports: - name: github.com/blang/semver version: 31b736133b98f26d5e078ec9eb591666edfd091f - name: github.com/codegangsta/cli - version: a65b733b303f0055f8d324d805f393cd3e7a7904 + version: 8ba6f23b6e36d03666a14bd9421f5e3efcb59aca - name: github.com/davecgh/go-spew - version: 3e6e67c4dcea3ac2f25fd4731abc0e1deaf36216 + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d subpackages: - spew - name: github.com/deis/controller-sdk-go - version: 27bab7c5535de202635877fa7600d5158b91a757 + version: 9520b6c460202f376856d042ac4864ee951cdf3a subpackages: - api - hooks - pkg/time - name: github.com/deis/pkg - version: 00e55bded444eea7fadff398f93152e962a0c338 + version: 28bd07fbcbec5aaaaeda05d362d8ff81f55f4f6c subpackages: - log - prettyprint - - time - name: github.com/docker/distribution - version: 0afef00d5764404d70f86076f364551657d51de6 - repo: https://github.com/deis/distribution - vcs: git + version: cd27f179f2c10c5d300e6d09025b538c475b0d51 subpackages: - context + - digest + - reference - registry/client/transport - registry/storage/driver - registry/storage/driver/azure @@ -92,7 +88,7 @@ imports: - name: github.com/docker/go-units version: 0bbddae09c5a5419a8c6dcdd7ff90da3d450393b - name: github.com/emicklei/go-restful - version: 777bb3f19bcafe2575ffb2a3e46af92509ae9594 + version: 09691a3b6378b740595c1002f40c34dd5f218a22 subpackages: - log - swagger @@ -100,6 +96,19 @@ imports: version: 73d445a93680fa1a78ae23a5839bad48f32ba1ee - name: github.com/go-ini/ini version: afbd495e5aaea13597b5e14fe514ddeaa4d76fc3 +- name: github.com/go-openapi/jsonpointer + version: 46af16f9f7b149af66e5d1bd010e3574dc06de98 +- name: github.com/go-openapi/jsonreference + version: 13c6e3589ad90f49bd3e3bbe2c2cb3d7a4142272 +- name: github.com/go-openapi/spec + version: 6aced65f8501fe1217321abf0749d354824ba2ff +- name: github.com/go-openapi/swag + version: 1d0bd113de87027671077d3c71eb3ac5d7dbba72 +- name: github.com/gogo/protobuf + version: c0656edd0d9eab7c66d1eb0c568f9039345796f7 + subpackages: + - proto + - sortkeys - name: github.com/golang/glog version: 44145f04b68cf362d9c4df2182967c2275eaefed - name: github.com/golang/protobuf @@ -128,7 +137,7 @@ imports: - validate - version - name: github.com/google/gofuzz - version: bbcb9da2d746f8bdbd6a936686a0a6067ada0ec5 + version: 44d81051d367757e1c7c6a5a86423ece9afcf63c - name: github.com/gorilla/context version: 14f550f51af52180c2eefed15e5fd18d63c0a64a - name: github.com/gorilla/mux @@ -140,7 +149,13 @@ imports: - name: github.com/juju/ratelimit version: 77ed1c8a01217656d2080ad51981f6e99adaa177 - name: github.com/kelseyhightower/envconfig - version: 9aca109c9aec4633fced9717c4a09ecab3d33111 + version: 8bf4bbfc795e2c7c8a5ea47b707453ed019e2ad4 +- name: github.com/mailru/easyjson + version: d5b7844b561a7bc640052f1b935f7b800330d7e0 + subpackages: + - buffer + - jlexer + - jwriter - name: github.com/matttproud/golang_protobuf_extensions version: fc2b8d3a73c4867e51861bbdd5ae3c1f0869dd6a subpackages: @@ -185,11 +200,9 @@ imports: subpackages: - formatters/logstash - name: github.com/spf13/pflag - version: 8e7dc108ab3a1ab6ce6d922bbaff5657b88e8e49 - repo: https://github.com/spf13/pflag - vcs: git + version: 5644820622454e71517561946e3d94b9f9db6842 - name: github.com/ugorji/go - version: f4485b318aadd133842532f841dc205a8e339d74 + version: ded73eae5db7e7a0ef6f55aace87a2873c5d2b74 subpackages: - codec - name: golang.org/x/crypto @@ -230,9 +243,7 @@ imports: - unicode/norm - width - name: google.golang.org/api - version: fceeaa645c4015c833842e6ed6052b2dda667079 - repo: https://code.googlesource.com/google-api-go-client - vcs: git + version: 9bf6e6e569ff057f75d9604a46c52928f17d2b54 subpackages: - gensupport - googleapi @@ -268,8 +279,151 @@ imports: - naming - peer - transport +- name: gopkg.in/inf.v0 + version: 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4 - name: gopkg.in/yaml.v2 - version: eca94c41d994ae2215d455ce578ae6e2dc6ee516 + version: bef53efd0c76e49e6de55ead051f886bea7e9420 +- name: k8s.io/apimachinery + version: 9c89140a45325f83409e90359888133478207c7a + subpackages: + - pkg/api/errors + - pkg/api/meta + - pkg/api/resource + - pkg/apimachinery + - pkg/apimachinery/announced + - pkg/apimachinery/registered + - pkg/apis/meta/v1 + - pkg/apis/meta/v1/unstructured + - pkg/conversion + - pkg/conversion/queryparams + - pkg/fields + - pkg/labels + - pkg/openapi + - pkg/runtime + - pkg/runtime/schema + - pkg/runtime/serializer + - pkg/runtime/serializer/json + - pkg/runtime/serializer/protobuf + - pkg/runtime/serializer/recognizer + - pkg/runtime/serializer/streaming + - pkg/runtime/serializer/versioning + - pkg/selection + - pkg/types + - pkg/util/errors + - pkg/util/framer + - pkg/util/intstr + - pkg/util/json + - pkg/util/net + - pkg/util/rand + - pkg/util/runtime + - pkg/util/sets + - pkg/util/validation + - pkg/util/validation/field + - pkg/util/wait + - pkg/util/yaml + - pkg/version + - pkg/watch + - third_party/forked/golang/reflect +- name: k8s.io/client-go + version: 69f0a81e21e046e59fb102cddff3e138d7a327f5 + subpackages: + - discovery + - discovery/fake + - kubernetes + - kubernetes/fake + - kubernetes/scheme + - kubernetes/typed/apps/v1beta1 + - kubernetes/typed/apps/v1beta1/fake + - kubernetes/typed/authentication/v1 + - kubernetes/typed/authentication/v1/fake + - kubernetes/typed/authentication/v1beta1 + - kubernetes/typed/authentication/v1beta1/fake + - kubernetes/typed/authorization/v1 + - kubernetes/typed/authorization/v1/fake + - kubernetes/typed/authorization/v1beta1 + - kubernetes/typed/authorization/v1beta1/fake + - kubernetes/typed/autoscaling/v1 + - kubernetes/typed/autoscaling/v1/fake + - kubernetes/typed/autoscaling/v2alpha1 + - kubernetes/typed/autoscaling/v2alpha1/fake + - kubernetes/typed/batch/v1 + - kubernetes/typed/batch/v1/fake + - kubernetes/typed/batch/v2alpha1 + - kubernetes/typed/batch/v2alpha1/fake + - kubernetes/typed/certificates/v1beta1 + - kubernetes/typed/certificates/v1beta1/fake + - kubernetes/typed/core/v1 + - kubernetes/typed/core/v1/fake + - kubernetes/typed/extensions/v1beta1 + - kubernetes/typed/extensions/v1beta1/fake + - kubernetes/typed/policy/v1beta1 + - kubernetes/typed/policy/v1beta1/fake + - kubernetes/typed/rbac/v1alpha1 + - kubernetes/typed/rbac/v1alpha1/fake + - kubernetes/typed/rbac/v1beta1 + - kubernetes/typed/rbac/v1beta1/fake + - kubernetes/typed/settings/v1alpha1 + - kubernetes/typed/settings/v1alpha1/fake + - kubernetes/typed/storage/v1 + - kubernetes/typed/storage/v1/fake + - kubernetes/typed/storage/v1beta1 + - kubernetes/typed/storage/v1beta1/fake + - pkg/api + - pkg/api/install + - pkg/api/v1 + - pkg/api/v1/ref + - pkg/apis/apps + - pkg/apis/apps/install + - pkg/apis/apps/v1beta1 + - pkg/apis/authentication + - pkg/apis/authentication/install + - pkg/apis/authentication/v1 + - pkg/apis/authentication/v1beta1 + - pkg/apis/authorization + - pkg/apis/authorization/install + - pkg/apis/authorization/v1 + - pkg/apis/authorization/v1beta1 + - pkg/apis/autoscaling + - pkg/apis/autoscaling/install + - pkg/apis/autoscaling/v1 + - pkg/apis/autoscaling/v2alpha1 + - pkg/apis/batch + - pkg/apis/batch/install + - pkg/apis/batch/v1 + - pkg/apis/batch/v2alpha1 + - pkg/apis/certificates + - pkg/apis/certificates/install + - pkg/apis/certificates/v1beta1 + - pkg/apis/extensions + - pkg/apis/extensions/install + - pkg/apis/extensions/v1beta1 + - pkg/apis/policy + - pkg/apis/policy/install + - pkg/apis/policy/v1beta1 + - pkg/apis/rbac + - pkg/apis/rbac/install + - pkg/apis/rbac/v1alpha1 + - pkg/apis/rbac/v1beta1 + - pkg/apis/settings + - pkg/apis/settings/install + - pkg/apis/settings/v1alpha1 + - pkg/apis/storage + - pkg/apis/storage/install + - pkg/apis/storage/v1 + - pkg/apis/storage/v1beta1 + - pkg/util + - pkg/util/parsers + - pkg/version + - rest + - rest/watch + - testing + - tools/clientcmd/api + - tools/metrics + - transport + - util/cert + - util/clock + - util/flowcontrol + - util/integer - name: k8s.io/kubernetes version: 3eed1e3be6848b877ff80a93da3785d9034d0a4f subpackages: @@ -346,7 +500,9 @@ imports: - pkg/watch/json - third_party/forked/reflect - name: speter.net/go/exp/math/dec/inf - version: 46a40649338836f5d25521ce343379da79ef2184 + version: 42ca6cd68aa922bc3f32f1e056e61b65945d9ad7 repo: https://github.com/belua/inf vcs: git -testImports: [] +testImports: +- name: github.com/arschles/assert + version: bb58b908265b5931732079df03f2818bf2167ba0 diff --git a/glide.yaml b/glide.yaml index 35cf791..01d8546 100644 --- a/glide.yaml +++ b/glide.yaml @@ -1,45 +1,47 @@ package: github.com/deis/builder -ignore: -- appengine -- appengine/memcache -- appengine/datastore -- appengine/user import: +- package: github.com/aws/aws-sdk-go + subpackages: + - aws + - aws/awserr + - aws/credentials + - aws/credentials/ec2rolecreds + - aws/ec2metadata + - aws/session + - service/ecr +- package: github.com/codegangsta/cli +- package: github.com/deis/controller-sdk-go + subpackages: + - api + - hooks +- package: github.com/deis/pkg + subpackages: + - log +- package: github.com/docker/distribution + subpackages: + - context + - registry/storage/driver + - registry/storage/driver/azure + - registry/storage/driver/factory + - registry/storage/driver/gcs + - registry/storage/driver/s3-aws + - registry/storage/driver/swift - package: github.com/kelseyhightower/envconfig -- package: github.com/gorilla/mux - version: e444e69cbd2e2e3e0749a2f3c717cec491552bbf +- package: github.com/pborman/uuid - package: golang.org/x/crypto version: 453249f01cfeb54c3d549ddb75ff152ca243f9d8 - subpackages: - - ssh - package: gopkg.in/yaml.v2 - version: eca94c41d994ae2215d455ce578ae6e2dc6ee516 -- package: github.com/pborman/uuid -- package: github.com/deis/pkg - version: 00e55bded444eea7fadff398f93152e962a0c338 +- package: k8s.io/apimachinery subpackages: - - time - - log -- package: github.com/codegangsta/cli - version: a65b733b303f0055f8d324d805f393cd3e7a7904 -- package: k8s.io/kubernetes - version: 1.2.4 + - pkg/api/errors + - pkg/apis/meta/v1 + - pkg/fields + - pkg/labels + - pkg/util/wait +- package: k8s.io/client-go + subpackages: + - kubernetes + - pkg/api/v1 + - rest +testImport: - package: github.com/arschles/assert - version: 6882f85ccdc7c1822b146d1a6b0c2c48f91b5140 -- package: github.com/docker/distribution - repo: https://github.com/deis/distribution - version: 0afef00d5764404d70f86076f364551657d51de6 - vcs: git -- package: speter.net/go/exp/math/dec/inf - repo: https://github.com/belua/inf - vcs: git -- package: google.golang.org/api - version: fceeaa645c4015c833842e6ed6052b2dda667079 - repo: https://code.googlesource.com/google-api-go-client - vcs: git -- package: github.com/spf13/pflag - version: 8e7dc108ab3a1ab6ce6d922bbaff5657b88e8e49 - repo: https://github.com/spf13/pflag - vcs: git -- package: github.com/deis/controller-sdk-go - version: 27bab7c5535de202635877fa7600d5158b91a757 diff --git a/pkg/cleaner/cleaner.go b/pkg/cleaner/cleaner.go index f00251d..938d11b 100644 --- a/pkg/cleaner/cleaner.go +++ b/pkg/cleaner/cleaner.go @@ -10,15 +10,18 @@ import ( "strings" "time" + "github.com/docker/distribution/context" + storagedriver "github.com/docker/distribution/registry/storage/driver" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/pkg/api/v1" + "k8s.io/client-go/rest" + "github.com/deis/builder/pkg/gitreceive" - "github.com/deis/builder/pkg/k8s" "github.com/deis/builder/pkg/sys" "github.com/deis/pkg/log" - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" ) const ( @@ -46,7 +49,7 @@ func localDirs(gitHome string, filter func(string) bool) ([]string, error) { } // getDiff gets the directories that are not in namespaceList -func getDiff(namespaceList []api.Namespace, dirs []string) []string { +func getDiff(namespaceList []*v1.Namespace, dirs []string) []string { var ret []string // create a set of lowercase namespace names @@ -121,9 +124,9 @@ func deleteFromObjectStore(app string, storageDriver storagedriver.StorageDriver // Run starts the deleted app cleaner. Every pollSleepDuration, it compares the result of nsLister.List with the directories in the top level of gitHome on the local file system. // On any error, it uses log messages to output a human readable description of what happened. -func Run(gitHome string, nsLister k8s.NamespaceLister, fs sys.FS, pollSleepDuration time.Duration, storageDriver storagedriver.StorageDriver) error { +func Run(gitHome string, nsLister v1.NamespaceLister, fs sys.FS, pollSleepDuration time.Duration, storageDriver storagedriver.StorageDriver) error { for { - nsList, err := nsLister.List(api.ListOptions{LabelSelector: labels.Everything(), FieldSelector: fields.Everything()}) + nsList, err := nsLister.List(metav1.ListOptions{LabelSelector: labels.Everything(), FieldSelector: fields.Everything()}) if err != nil { log.Err("Cleaner error listing namespaces (%s)", err) continue diff --git a/pkg/cleaner/cleaner_test.go b/pkg/cleaner/cleaner_test.go index bbe663c..7b95f61 100644 --- a/pkg/cleaner/cleaner_test.go +++ b/pkg/cleaner/cleaner_test.go @@ -7,13 +7,13 @@ import ( "testing" "github.com/arschles/assert" - "k8s.io/kubernetes/pkg/api" + v1 "k8s.io/client-go/pkg/api/v1" ) func TestGetDiff(t *testing.T) { - nsList := []api.Namespace{ - {ObjectMeta: api.ObjectMeta{Name: "app1"}}, - {ObjectMeta: api.ObjectMeta{Name: "app2"}}, + nsList := []v1.Namespace{ + {ObjectMeta: v1.ObjectMeta{Name: "app1"}}, + {ObjectMeta: v1.ObjectMeta{Name: "app2"}}, } dirList := []string{"app1", "app3"} diff := getDiff(nsList, dirList) diff --git a/pkg/gitreceive/build.go b/pkg/gitreceive/build.go index 53865a7..ead9ffb 100644 --- a/pkg/gitreceive/build.go +++ b/pkg/gitreceive/build.go @@ -11,19 +11,20 @@ import ( "path/filepath" "strings" - "github.com/deis/builder/pkg/controller" - "github.com/deis/builder/pkg/git" - "github.com/deis/builder/pkg/k8s" - "github.com/deis/builder/pkg/storage" - "github.com/deis/builder/pkg/sys" deisAPI "github.com/deis/controller-sdk-go/api" "github.com/deis/controller-sdk-go/hooks" "github.com/deis/pkg/log" "github.com/docker/distribution/context" storagedriver "github.com/docker/distribution/registry/storage/driver" "gopkg.in/yaml.v2" - "k8s.io/kubernetes/pkg/api" - client "k8s.io/kubernetes/pkg/client/unversioned" + "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/pkg/api/v1" + + "github.com/deis/builder/pkg/controller" + "github.com/deis/builder/pkg/git" + "github.com/deis/builder/pkg/k8s" + "github.com/deis/builder/pkg/storage" + "github.com/deis/builder/pkg/sys" ) // repoCmd returns exec.Command(first, others...) with its current working directory repoDir @@ -48,22 +49,12 @@ func run(cmd *exec.Cmd) error { func build( conf *Config, storageDriver storagedriver.StorageDriver, - kubeClient *client.Client, + kubeClient *kubernetes.Clientset, fs sys.FS, env sys.Env, builderKey, rawGitSha string) error { - dockerBuilderImagePullPolicy, err := k8s.PullPolicyFromString(conf.DockerBuilderImagePullPolicy) - if err != nil { - return err - } - - slugBuilderImagePullPolicy, err := k8s.PullPolicyFromString(conf.SlugBuilderImagePullPolicy) - if err != nil { - return err - } - repo := conf.Repository gitSha, err := git.NewSha(rawGitSha) if err != nil { @@ -156,7 +147,7 @@ func build( return fmt.Errorf("uploading %s to %s (%v)", absAppTgz, slugBuilderInfo.TarKey(), err) } - var pod *api.Pod + var pod *v1.Pod var buildPodName string image := appName @@ -192,7 +183,7 @@ func build( conf.RegistryHost, conf.RegistryPort, registryEnv, - dockerBuilderImagePullPolicy, + v1.PullPolicy(conf.DockerBuilderImagePullPolicy), builderPodNodeSelector, ) } else { @@ -224,7 +215,7 @@ func build( buildPackURL, conf.StorageType, conf.SlugBuilderImage, - slugBuilderImagePullPolicy, + v1.PullPolicy(conf.SlugBuilderImagePullPolicy), builderPodNodeSelector, ) } @@ -255,9 +246,9 @@ func build( } req := kubeClient.Get().Namespace(newPod.Namespace).Name(newPod.Name).Resource("pods").SubResource("log").VersionedParams( - &api.PodLogOptions{ + &v1.PodLogOptions{ Follow: true, - }, api.ParameterCodec) + }, v1.ParameterCodec) rc, err := req.Stream() if err != nil { diff --git a/pkg/gitreceive/k8s_util.go b/pkg/gitreceive/k8s_util.go index 8263081..5689482 100644 --- a/pkg/gitreceive/k8s_util.go +++ b/pkg/gitreceive/k8s_util.go @@ -5,13 +5,14 @@ import ( "fmt" "time" - "github.com/deis/builder/pkg/k8s" "github.com/pborman/uuid" - "k8s.io/kubernetes/pkg/api" - apierrors "k8s.io/kubernetes/pkg/api/errors" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/util/wait" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/pkg/api/v1" + + "github.com/deis/builder/pkg/k8s" ) const ( @@ -64,9 +65,9 @@ func dockerBuilderPod( registryHost, registryPort string, registryEnv map[string]string, - pullPolicy api.PullPolicy, + pullPolicy v1.PullPolicy, nodeSelector map[string]string, -) *api.Pod { +) *v1.Pod { pod := buildPod(debug, name, namespace, pullPolicy, nodeSelector, env) @@ -98,15 +99,15 @@ func dockerBuilderPod( addEnvToPod(pod, key, value) } - pod.Spec.Containers[0].VolumeMounts = append(pod.Spec.Containers[0].VolumeMounts, api.VolumeMount{ + pod.Spec.Containers[0].VolumeMounts = append(pod.Spec.Containers[0].VolumeMounts, v1.VolumeMount{ Name: dockerSocketName, MountPath: dockerSocketPath, }) - pod.Spec.Volumes = append(pod.Spec.Volumes, api.Volume{ + pod.Spec.Volumes = append(pod.Spec.Volumes, v1.Volume{ Name: dockerSocketName, - VolumeSource: api.VolumeSource{ - HostPath: &api.HostPathVolumeSource{ + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ Path: dockerSocketPath, }, }, @@ -127,22 +128,22 @@ func slugbuilderPod( buildpackURL, storageType, image string, - pullPolicy api.PullPolicy, + pullPolicy v1.PullPolicy, nodeSelector map[string]string, -) *api.Pod { +) *v1.Pod { pod := buildPod(debug, name, namespace, pullPolicy, nodeSelector, nil) - pod.Spec.Volumes = append(pod.Spec.Volumes, api.Volume{ + pod.Spec.Volumes = append(pod.Spec.Volumes, v1.Volume{ Name: envSecretName, - VolumeSource: api.VolumeSource{ - Secret: &api.SecretVolumeSource{ + VolumeSource: v1.VolumeSource{ + Secret: &v1.SecretVolumeSource{ SecretName: envSecretName, }, }, }) - pod.Spec.Containers[0].VolumeMounts = append(pod.Spec.Containers[0].VolumeMounts, api.VolumeMount{ + pod.Spec.Containers[0].VolumeMounts = append(pod.Spec.Containers[0].VolumeMounts, v1.VolumeMount{ Name: envSecretName, MountPath: envRoot, ReadOnly: true, @@ -172,21 +173,21 @@ func buildPod( debug bool, name, namespace string, - pullPolicy api.PullPolicy, + pullPolicy v1.PullPolicy, nodeSelector map[string]string, - env map[string]interface{}) api.Pod { + env map[string]interface{}) v1.Pod { - pod := api.Pod{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyNever, - Containers: []api.Container{ + pod := v1.Pod{ + Spec: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyNever, + Containers: []v1.Container{ { ImagePullPolicy: pullPolicy, }, }, - Volumes: []api.Volume{}, + Volumes: []v1.Volume{}, }, - ObjectMeta: api.ObjectMeta{ + ObjectMeta: v1.ObjectMeta{ Name: name, Namespace: namespace, Labels: map[string]string{ @@ -195,16 +196,16 @@ func buildPod( }, } - pod.Spec.Volumes = append(pod.Spec.Volumes, api.Volume{ + pod.Spec.Volumes = append(pod.Spec.Volumes, v1.Volume{ Name: objectStore, - VolumeSource: api.VolumeSource{ - Secret: &api.SecretVolumeSource{ + VolumeSource: v1.VolumeSource{ + Secret: &v1.SecretVolumeSource{ SecretName: objectStore, }, }, }) - pod.Spec.Containers[0].VolumeMounts = []api.VolumeMount{ + pod.Spec.Containers[0].VolumeMounts = []v1.VolumeMount{ { Name: objectStore, MountPath: objectStorePath, @@ -214,7 +215,7 @@ func buildPod( if len(pod.Spec.Containers) > 0 { for k, v := range env { - pod.Spec.Containers[0].Env = append(pod.Spec.Containers[0].Env, api.EnvVar{ + pod.Spec.Containers[0].Env = append(pod.Spec.Containers[0].Env, v1.EnvVar{ Name: k, Value: fmt.Sprintf("%v", v), }) @@ -232,9 +233,9 @@ func buildPod( return pod } -func addEnvToPod(pod api.Pod, key, value string) { +func addEnvToPod(pod v1.Pod, key, value string) { if len(pod.Spec.Containers) > 0 { - pod.Spec.Containers[0].Env = append(pod.Spec.Containers[0].Env, api.EnvVar{ + pod.Spec.Containers[0].Env = append(pod.Spec.Containers[0].Env, v1.EnvVar{ Name: key, Value: value, }) @@ -243,14 +244,14 @@ func addEnvToPod(pod api.Pod, key, value string) { // waitForPod waits for a pod in state running, succeeded or failed func waitForPod(pw *k8s.PodWatcher, ns, podName string, ticker, interval, timeout time.Duration) error { - condition := func(pod *api.Pod) (bool, error) { - if pod.Status.Phase == api.PodRunning { + condition := func(pod *v1.Pod) (bool, error) { + if pod.Status.Phase == v1.PodRunning { return true, nil } - if pod.Status.Phase == api.PodSucceeded { + if pod.Status.Phase == v1.PodSucceeded { return true, nil } - if pod.Status.Phase == api.PodFailed { + if pod.Status.Phase == v1.PodFailed { return true, fmt.Errorf("Giving up; pod went into failed status: \n[%s]:%s", pod.Status.Reason, pod.Status.Message) } return false, nil @@ -265,11 +266,11 @@ func waitForPod(pw *k8s.PodWatcher, ns, podName string, ticker, interval, timeou // waitForPodEnd waits for a pod in state succeeded or failed func waitForPodEnd(pw *k8s.PodWatcher, ns, podName string, interval, timeout time.Duration) error { - condition := func(pod *api.Pod) (bool, error) { - if pod.Status.Phase == api.PodSucceeded { + condition := func(pod *v1.Pod) (bool, error) { + if pod.Status.Phase == v1.PodSucceeded { return true, nil } - if pod.Status.Phase == api.PodFailed { + if pod.Status.Phase == v1.PodFailed { return true, nil } return false, nil @@ -279,7 +280,7 @@ func waitForPodEnd(pw *k8s.PodWatcher, ns, podName string, interval, timeout tim } // waitForPodCondition waits for a pod in state defined by a condition (func) -func waitForPodCondition(pw *k8s.PodWatcher, ns, podName string, condition func(pod *api.Pod) (bool, error), +func waitForPodCondition(pw *k8s.PodWatcher, ns, podName string, condition func(pod *v1.Pod) (bool, error), interval, timeout time.Duration) error { return wait.PollImmediate(interval, timeout, func() (bool, error) { pods, err := pw.Store.List(labels.Set{"heritage": podName}.AsSelector()) @@ -316,10 +317,10 @@ func progress(msg string, interval time.Duration) chan bool { return quit } -func createAppEnvConfigSecret(secretsClient client.SecretsInterface, secretName string, env map[string]interface{}) error { - newSecret := new(api.Secret) +func createAppEnvConfigSecret(secretsClient v1.SecretInterface, secretName string, env map[string]interface{}) error { + newSecret := new(v1.Secret) newSecret.Name = secretName - newSecret.Type = api.SecretTypeOpaque + newSecret.Type = v1.SecretTypeOpaque newSecret.Data = make(map[string][]byte) for k, v := range env { newSecret.Data[k] = []byte(fmt.Sprintf("%v", v)) diff --git a/pkg/gitreceive/k8s_util_test.go b/pkg/gitreceive/k8s_util_test.go index 2129b7f..90164af 100644 --- a/pkg/gitreceive/k8s_util_test.go +++ b/pkg/gitreceive/k8s_util_test.go @@ -7,9 +7,9 @@ import ( "testing" "github.com/arschles/assert" - "github.com/deis/builder/pkg/k8s" - "k8s.io/kubernetes/pkg/api" - apierrors "k8s.io/kubernetes/pkg/api/errors" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + v1 "k8s.io/client-go/pkg/api/v1" ) func TestDockerBuilderPodName(t *testing.T) { @@ -53,7 +53,7 @@ type slugBuildCase struct { gitShortHash string buildPack string slugBuilderImage string - slugBuilderImagePullPolicy api.PullPolicy + slugBuilderImagePullPolicy v1.PullPolicy storageType string builderPodNodeSelector map[string]string } @@ -67,7 +67,7 @@ type dockerBuildCase struct { gitShortHash string imgName string dockerBuilderImage string - dockerBuilderImagePullPolicy api.PullPolicy + dockerBuilderImagePullPolicy v1.PullPolicy storageType string builderPodNodeSelector map[string]string } @@ -81,7 +81,7 @@ func TestBuildPod(t *testing.T) { buildArgsEnv["DEIS_DOCKER_BUILD_ARGS_ENABLED"] = "1" buildArgsEnv["KEY"] = "VALUE" envSecretName := "test-build-env" - var pod *api.Pod + var pod *v1.Pod emptyNodeSelector := make(map[string]string) @@ -93,14 +93,14 @@ func TestBuildPod(t *testing.T) { nodeSelector2["network"] = "fast" slugBuilds := []slugBuildCase{ - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", envSecretName, "tar", "put-url", "", "deadbeef", "", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "customimage", api.PullAlways, "", nil}, - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "customimage", api.PullIfNotPresent, "", nodeSelector1}, - {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "customimage", api.PullNever, "", nodeSelector2}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", envSecretName, "tar", "put-url", "", "deadbeef", "", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "customimage", v1.PullAlways, "", nil}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "customimage", v1.PullIfNotPresent, "", nodeSelector1}, + {true, "test", "default", envSecretName, "tar", "put-url", "cache-url", "deadbeef", "buildpack", "customimage", v1.PullNever, "", nodeSelector2}, } for _, build := range slugBuilds { @@ -161,14 +161,14 @@ func TestBuildPod(t *testing.T) { } dockerBuilds := []dockerBuildCase{ - {true, "test", "default", emptyEnv, "tar", "deadbeef", "", "", api.PullAlways, "", nodeSelector1}, - {true, "test", "default", env, "tar", "deadbeef", "", "", api.PullAlways, "", nodeSelector2}, - {true, "test", "default", emptyEnv, "tar", "deadbeef", "img", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", env, "tar", "deadbeef", "img", "", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", env, "tar", "deadbeef", "img", "customimage", api.PullAlways, "", emptyNodeSelector}, - {true, "test", "default", env, "tar", "deadbeef", "img", "customimage", api.PullIfNotPresent, "", emptyNodeSelector}, - {true, "test", "default", env, "tar", "deadbeef", "img", "customimage", api.PullNever, "", nil}, - {true, "test", "default", buildArgsEnv, "tar", "deadbeef", "img", "customimage", api.PullIfNotPresent, "", emptyNodeSelector}, + {true, "test", "default", emptyEnv, "tar", "deadbeef", "", "", v1.PullAlways, "", nodeSelector1}, + {true, "test", "default", env, "tar", "deadbeef", "", "", v1.PullAlways, "", nodeSelector2}, + {true, "test", "default", emptyEnv, "tar", "deadbeef", "img", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", env, "tar", "deadbeef", "img", "", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", env, "tar", "deadbeef", "img", "customimage", v1.PullAlways, "", emptyNodeSelector}, + {true, "test", "default", env, "tar", "deadbeef", "img", "customimage", v1.PullIfNotPresent, "", emptyNodeSelector}, + {true, "test", "default", env, "tar", "deadbeef", "img", "customimage", v1.PullNever, "", nil}, + {true, "test", "default", buildArgsEnv, "tar", "deadbeef", "img", "customimage", v1.PullIfNotPresent, "", emptyNodeSelector}, } regEnv := map[string]string{"REG_LOC": "on-cluster"} for _, build := range dockerBuilds { @@ -222,7 +222,7 @@ func TestBuildPod(t *testing.T) { } } -func checkForEnv(t *testing.T, pod *api.Pod, key, expVal string) { +func checkForEnv(t *testing.T, pod *v1.Pod, key, expVal string) { val, err := envValueFromKey(pod, key) if err != nil { t.Errorf("%v", err) @@ -232,7 +232,7 @@ func checkForEnv(t *testing.T, pod *api.Pod, key, expVal string) { } } -func envValueFromKey(pod *api.Pod, key string) (string, error) { +func envValueFromKey(pod *v1.Pod, key string) (string, error) { for _, env := range pod.Spec.Containers[0].Env { if env.Name == key { return env.Value, nil @@ -244,35 +244,13 @@ func envValueFromKey(pod *api.Pod, key string) (string, error) { func TestCreateAppEnvConfigSecretErr(t *testing.T) { expectedErr := errors.New("get secret error") - secretsClient := &k8s.FakeSecret{ - FnCreate: func(*api.Secret) (*api.Secret, error) { - return &api.Secret{}, expectedErr - }, - } - err := createAppEnvConfigSecret(secretsClient, "test", nil) + clientset := fake.NewSimpleClientset() + err := createAppEnvConfigSecret(clientset.Secrets(""), "test", nil) assert.Err(t, err, expectedErr) } func TestCreateAppEnvConfigSecretSuccess(t *testing.T) { - secretsClient := &k8s.FakeSecret{ - FnCreate: func(*api.Secret) (*api.Secret, error) { - return &api.Secret{}, nil - }, - } - err := createAppEnvConfigSecret(secretsClient, "test", nil) - assert.NoErr(t, err) -} - -func TestCreateAppEnvConfigSecretAlreadyExists(t *testing.T) { - alreadyExistErr := apierrors.NewAlreadyExists(api.Resource("tests"), "1") - secretsClient := &k8s.FakeSecret{ - FnCreate: func(*api.Secret) (*api.Secret, error) { - return &api.Secret{}, alreadyExistErr - }, - FnUpdate: func(*api.Secret) (*api.Secret, error) { - return &api.Secret{}, nil - }, - } - err := createAppEnvConfigSecret(secretsClient, "test", nil) + clientset := fake.NewSimpleClientset() + err := createAppEnvConfigSecret(clientset.Secrets(""), "test", nil) assert.NoErr(t, err) } diff --git a/pkg/gitreceive/registry.go b/pkg/gitreceive/registry.go index 648cec4..60d4f58 100644 --- a/pkg/gitreceive/registry.go +++ b/pkg/gitreceive/registry.go @@ -6,16 +6,17 @@ import ( "errors" "strings" + "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/pkg/api/v1" + "github.com/deis/builder/pkg/storage" - "k8s.io/kubernetes/pkg/api" - client "k8s.io/kubernetes/pkg/client/unversioned" ) const ( registrySecret = "registry-secret" ) -func getDetailsFromRegistrySecret(secretGetter client.SecretsInterface, secret string) (map[string]string, error) { +func getDetailsFromRegistrySecret(secretGetter v1.SecretInterface, secret string) (map[string]string, error) { regSecret, err := secretGetter.Get(secret) if err != nil { return nil, err @@ -27,12 +28,12 @@ func getDetailsFromRegistrySecret(secretGetter client.SecretsInterface, secret s return regDetails, nil } -func getDetailsFromDockerConfigSecret(secretGetter client.SecretsInterface, secret string) (map[string]string, error) { +func getDetailsFromDockerConfigSecret(secretGetter v1.SecretInterface, secret string) (map[string]string, error) { configSecret, err := secretGetter.Get(secret) if err != nil { return nil, err } - dockerConfigJSONBytes := configSecret.Data[api.DockerConfigJsonKey] + dockerConfigJSONBytes := configSecret.Data[v1.DockerConfigJsonKey] var secretData map[string]interface{} if err = json.Unmarshal(dockerConfigJSONBytes, &secretData); err != nil { return nil, err @@ -62,9 +63,9 @@ func getDetailsFromDockerConfigSecret(secretGetter client.SecretsInterface, secr return regDetails, nil } -func getRegistryDetails(kubeClient client.SecretsNamespacer, image *string, registryLocation, namespace, registrySecretPrefix string) (map[string]string, error) { - registryConfigSecretInterface := kubeClient.Secrets(*image) - privateRegistrySecretInterface := kubeClient.Secrets(namespace) +func getRegistryDetails(kubeClient kubernetes.Clientset, image *string, registryLocation, namespace, registrySecretPrefix string) (map[string]string, error) { + registryConfigSecretInterface := kubeClient.CoreV1.Secrets(*image) + privateRegistrySecretInterface := kubeClient.CoreV1.Secrets(namespace) registryEnv := make(map[string]string) var regSecretData map[string]string var err error diff --git a/pkg/gitreceive/registry_test.go b/pkg/gitreceive/registry_test.go index 883d761..bb306b7 100644 --- a/pkg/gitreceive/registry_test.go +++ b/pkg/gitreceive/registry_test.go @@ -6,9 +6,8 @@ import ( "testing" "github.com/arschles/assert" - "github.com/deis/builder/pkg/k8s" - "k8s.io/kubernetes/pkg/api" - client "k8s.io/kubernetes/pkg/client/unversioned" + "k8s.io/client-go/kubernetes/fake" + v1 "k8s.io/client-go/pkg/api/v1" ) const ( @@ -18,50 +17,32 @@ const ( func TestGetDetailsFromRegistrySecretErr(t *testing.T) { expectedErr := errors.New("get secret error") - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &api.Secret{}, expectedErr - }, - } - _, err := getDetailsFromRegistrySecret(getter, testSecret) + clientset := fake.NewSimpleClientset(&v1.Secret{}) + _, err := getDetailsFromRegistrySecret(clientset.CoreV1.Secrets(""), testSecret) assert.Err(t, err, expectedErr) } func TestGetDetailsFromRegistrySecretSuccess(t *testing.T) { data := map[string][]byte{"test": []byte("test")} expectedData := map[string]string{"test": "test"} - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil - }, - } - secretData, err := getDetailsFromRegistrySecret(getter, testSecret) + clientset := fake.NewSimpleClientset(&v1.Secret{Data: data}) + secretData, err := getDetailsFromRegistrySecret(clientset.CoreV1.Secrets(""), testSecret) assert.NoErr(t, err) assert.Equal(t, secretData, expectedData, "secret data") } func TestGetDetailsFromDockerConfigSecretErr(t *testing.T) { expectedErr := errors.New("get secret error") - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &api.Secret{}, expectedErr - }, - } - _, err := getDetailsFromDockerConfigSecret(getter, testSecret) + clientset := fake.NewSimpleClientset(&v1.Secret{}) + _, err := getDetailsFromDockerConfigSecret(clientset.CoreV1.Secrets(""), testSecret) assert.Err(t, expectedErr, err) } func TestGetDetailsFromDockerConfigSecretJsonErr(t *testing.T) { expectedErr := errors.New("invalid character 'o' in literal null (expecting 'u')") - data := map[string][]byte{api.DockerConfigJsonKey: []byte("not a json")} - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil - }, - } - _, err := getDetailsFromDockerConfigSecret(getter, testSecret) + data := map[string][]byte{v1.DockerConfigJsonKey: []byte("not a json")} + clientset := fake.NewSimpleClientset(&v1.Secret{Data: data}) + _, err := getDetailsFromDockerConfigSecret(clientset.CoreV1.Secrets(""), testSecret) assert.Equal(t, expectedErr.Error(), err.Error(), "error") } @@ -78,14 +59,9 @@ func TestGetDetailsFromDockerConfigSecretTokenerr(t *testing.T) { } `) data := make(map[string][]byte) - data[api.DockerConfigJsonKey] = auth - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil - }, - } - _, err := getDetailsFromDockerConfigSecret(getter, testSecret) + data[v1.DockerConfigJsonKey] = auth + clientset := fake.NewSimpleClientset(&v1.Secret{Data: data}) + _, err := getDetailsFromDockerConfigSecret(clientset.CoreV1.Secrets(""), testSecret) assert.Err(t, expectedErr, err) } @@ -103,34 +79,18 @@ func TestGetDetailsFromDockerConfigSecretSuccess(t *testing.T) { `) expectedData := map[string]string{"DEIS_REGISTRY_USERNAME": "testuser", "DEIS_REGISTRY_PASSWORD": "testpassword", "DEIS_REGISTRY_HOSTNAME": "https://test.io"} data := make(map[string][]byte) - data[api.DockerConfigJsonKey] = auth - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil - }, - } - regData, err := getDetailsFromDockerConfigSecret(getter, testSecret) + data[v1.DockerConfigJsonKey] = auth + clientset := fake.NewSimpleClientset(&v1.Secret{Data: data}) + regData, err := getDetailsFromDockerConfigSecret(clientset.CoreV1.Secrets(""), testSecret) assert.NoErr(t, err) assert.Equal(t, expectedData, regData, "registry details") - } func TestGetRegistryDetailsOffclusterErr(t *testing.T) { expectedErr := errors.New("get secret error") - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &api.Secret{}, expectedErr - }, - } - - kubeClient := &k8s.FakeSecretsNamespacer{ - Fn: func(string) client.SecretsInterface { - return getter - }, - } + clientset := fake.NewSimpleClientset(&v1.Secret{}) image := "test-image" - _, err := getRegistryDetails(kubeClient, &image, "off-cluster", deisNamespace, "private-registry") + _, err := getRegistryDetails(clientset, &image, "off-cluster", deisNamespace, "private-registry") assert.Err(t, err, expectedErr) } @@ -138,20 +98,9 @@ func TestGetRegistryDetailsOffclusterSuccess(t *testing.T) { data := map[string][]byte{"organization": []byte("kmala"), "hostname": []byte("quay.io")} expectedData := map[string]string{"DEIS_REGISTRY_HOSTNAME": "quay.io", "DEIS_REGISTRY_ORGANIZATION": "kmala"} expectedImage := "quay.io/kmala/test-image" - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil - }, - } - - kubeClient := &k8s.FakeSecretsNamespacer{ - Fn: func(string) client.SecretsInterface { - return getter - }, - } + clientset := fake.NewSimpleClientset(&v1.Secret{Data: data}) image := "test-image" - regDetails, err := getRegistryDetails(kubeClient, &image, "off-cluster", deisNamespace, "private-registry") + regDetails, err := getRegistryDetails(clientset, &image, "off-cluster", deisNamespace, "private-registry") assert.NoErr(t, err) assert.Equal(t, expectedData, regDetails, "registry details") assert.Equal(t, expectedImage, image, "image") @@ -170,41 +119,28 @@ func TestGetRegistryDetailsGCRSuccess(t *testing.T) { } `) configData := make(map[string][]byte) - configData[api.DockerConfigJsonKey] = auth - configSecret := api.Secret{Data: configData} - configGetter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &configSecret, nil - }, - } - + configData[v1.DockerConfigJsonKey] = auth srvAccount := []byte(` { "project_id": "deis-test" } `) data := map[string][]byte{"key.json": srvAccount} - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil + clientset := fake.NewSimpleClientset( + &v1.Secret{ + Data: configData, }, - } - - kubeClient := &k8s.FakeSecretsNamespacer{ - Fn: func(namespace string) client.SecretsInterface { - if namespace == "deis" { - return getter - } - return configGetter + &v1.Secret{ + ObjectMeta: {Namespace: "deis"}, + Data: data, }, - } + ) expectedData := map[string]string{"DEIS_REGISTRY_USERNAME": "testuser", "DEIS_REGISTRY_PASSWORD": "testpassword", "DEIS_REGISTRY_HOSTNAME": "https://test.io", "DEIS_REGISTRY_GCS_PROJ_ID": "deis-test"} expectedImage := "test.io/deis-test/test-image" image := "test-image" - regDetails, err := getRegistryDetails(kubeClient, &image, "gcr", deisNamespace, "private-registry") + regDetails, err := getRegistryDetails(clientset, &image, "gcr", deisNamespace, "private-registry") assert.NoErr(t, err) assert.Equal(t, expectedData, regDetails, "registry details") @@ -213,30 +149,13 @@ func TestGetRegistryDetailsGCRSuccess(t *testing.T) { func TestGetRegistryDetailsGCRConfigErr(t *testing.T) { expectedErr := errors.New("get secret error") - configGetter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &api.Secret{}, expectedErr + clientset := fake.NewSimpleClientset( + &v1.Secret{ + ObjectMeta: {Namespace: "deis"}, }, - } - - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &api.Secret{}, nil - }, - } - - kubeClient := &k8s.FakeSecretsNamespacer{ - Fn: func(namespace string) client.SecretsInterface { - if namespace == "deis" { - return getter - } - return configGetter - }, - } - + ) image := "test-image" - _, err := getRegistryDetails(kubeClient, &image, "gcr", deisNamespace, "private-registry") - + _, err := getRegistryDetails(clientset, &image, "gcr", deisNamespace, "private-registry") assert.Err(t, err, expectedErr) } @@ -254,31 +173,16 @@ func TestGetRegistryDetailsGCRSecretErr(t *testing.T) { } `) configData := make(map[string][]byte) - configData[api.DockerConfigJsonKey] = auth - configSecret := api.Secret{Data: configData} - configGetter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &configSecret, nil + configData[v1.DockerConfigJsonKey] = auth + clientset := fake.NewSimpleClientset( + &v1.Secret{ + ObjectMeta: {Namespace: "deis"}, + Data: configData, }, - } - - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &api.Secret{}, expectedErr - }, - } - - kubeClient := &k8s.FakeSecretsNamespacer{ - Fn: func(namespace string) client.SecretsInterface { - if namespace == "deis" { - return getter - } - return configGetter - }, - } + ) image := "test-image" - _, err := getRegistryDetails(kubeClient, &image, "gcr", deisNamespace, "private-registry") + _, err := getRegistryDetails(clientset, &image, "gcr", deisNamespace, "private-registry") assert.Err(t, err, expectedErr) } @@ -297,33 +201,20 @@ func TestGetRegistryDetailsGCRJsonErr(t *testing.T) { } `) configData := make(map[string][]byte) - configData[api.DockerConfigJsonKey] = auth - configSecret := api.Secret{Data: configData} - configGetter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &configSecret, nil - }, - } - + configData[v1.DockerConfigJsonKey] = auth data := map[string][]byte{"key.json": []byte("test")} - secret := api.Secret{Data: data} - getter := &k8s.FakeSecret{ - FnGet: func(string) (*api.Secret, error) { - return &secret, nil + clientset := fake.NewSimpleClientset( + &v1.Secret{ + Data: configData, }, - } - - kubeClient := &k8s.FakeSecretsNamespacer{ - Fn: func(namespace string) client.SecretsInterface { - if namespace == "deis" { - return getter - } - return configGetter + &v1.Secret{ + ObjectMeta: {Namespace: "deis"}, + Data: data, }, - } + ) image := "test-image" - _, err := getRegistryDetails(kubeClient, &image, "gcr", deisNamespace, "private-registry") + _, err := getRegistryDetails(clientset, &image, "gcr", deisNamespace, "private-registry") assert.Equal(t, expectedErr.Error(), err.Error(), "error") } diff --git a/pkg/gitreceive/run.go b/pkg/gitreceive/run.go index e1233d0..13a89f3 100644 --- a/pkg/gitreceive/run.go +++ b/pkg/gitreceive/run.go @@ -6,12 +6,13 @@ import ( "os" "strings" - builderconf "github.com/deis/builder/pkg/conf" - "github.com/deis/builder/pkg/sys" "github.com/deis/pkg/log" storagedriver "github.com/docker/distribution/registry/storage/driver" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" - client "k8s.io/kubernetes/pkg/client/unversioned" + builderconf "github.com/deis/builder/pkg/conf" + "github.com/deis/builder/pkg/sys" ) func readLine(line string) (string, string, string, error) { @@ -32,9 +33,15 @@ func Run(conf *Config, fs sys.FS, env sys.Env, storageDriver storagedriver.Stora return err } - kubeClient, err := client.NewInCluster() + // creates the in-cluster config + config, err := rest.InClusterConfig() + if err != nil { + return fmt.Errorf("Error getting kubernetes in-cluster config (%s)", err) + } + // creates the clientset + clientset, err := kubernetes.NewForConfig(config) if err != nil { - return fmt.Errorf("couldn't reach the api server (%s)", err) + return fmt.Errorf("Error getting kubernetes client (%s)", err) } scanner := bufio.NewScanner(os.Stdin) @@ -50,7 +57,7 @@ func Run(conf *Config, fs sys.FS, env sys.Env, storageDriver storagedriver.Stora // if we're processing a receive-pack on an existing repo, run a build if strings.HasPrefix(conf.SSHOriginalCommand, "git-receive-pack") { - if err := build(conf, storageDriver, kubeClient, fs, env, builderKey, newRev); err != nil { + if err := build(conf, storageDriver, clientset, fs, env, builderKey, newRev); err != nil { return err } } diff --git a/pkg/healthsrv/healthz_handler_test.go b/pkg/healthsrv/healthz_handler_test.go index 67ad056..63ed2fb 100644 --- a/pkg/healthsrv/healthz_handler_test.go +++ b/pkg/healthsrv/healthz_handler_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "k8s.io/kubernetes/pkg/api" + v1 "k8s.io/client-go/pkg/api/v1" "github.com/docker/distribution/context" @@ -51,15 +51,15 @@ func (e failureGetClient) Get(url string) (*http.Response, error) { type emptyNamespaceLister struct{} -func (n emptyNamespaceLister) List(opts api.ListOptions) (*api.NamespaceList, error) { - return &api.NamespaceList{}, nil +func (n emptyNamespaceLister) List(opts v1.ListOptions) (*v1.NamespaceList, error) { + return &v1.NamespaceList{}, nil } type errNamespaceLister struct { err error } -func (e errNamespaceLister) List(opts api.ListOptions) (*api.NamespaceList, error) { +func (e errNamespaceLister) List(opts v1.ListOptions) (*v1.NamespaceList, error) { return nil, e.err } diff --git a/pkg/healthsrv/namespace_lister.go b/pkg/healthsrv/namespace_lister.go index 64c8364..4c3306f 100644 --- a/pkg/healthsrv/namespace_lister.go +++ b/pkg/healthsrv/namespace_lister.go @@ -1,17 +1,15 @@ package healthsrv import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" + v1 "k8s.io/client-go/pkg/api/v1" ) -// NamespaceLister is an (*k8s.io/kubernetes/pkg/client/unversioned).Client compatible interface +// NamespaceLister is an (*k8s.io/client-go/pkg/api/v1).NamespaceLister compatible interface // that provides just the ListBuckets cross-section of functionality. It can also be implemented // for unit tests. type NamespaceLister interface { // List lists all namespaces that are selected by the given label and field selectors. - List(opts api.ListOptions) (*api.NamespaceList, error) + List(opts v1.ListOptions) (*v1.NamespaceList, error) } // listNamespaces calls nl.List(...) and sends the results back on the various given channels. @@ -20,8 +18,8 @@ type NamespaceLister interface { // On success, it passes the namespace list on succCh, and on failure, it passes the error on // errCh. At most one of {succCh, errCh} will be sent on. If stopCh is closed, no pending or // future sends will occur. -func listNamespaces(nl NamespaceLister, succCh chan<- *api.NamespaceList, errCh chan<- error, stopCh <-chan struct{}) { - nsList, err := nl.List(api.ListOptions{LabelSelector: labels.Everything(), FieldSelector: fields.Everything()}) +func listNamespaces(nl NamespaceLister, succCh chan<- *v1.NamespaceList, errCh chan<- error, stopCh <-chan struct{}) { + nsList, err := nl.List(v1.ListOptions{}) if err != nil { select { case errCh <- err: diff --git a/pkg/healthsrv/readiness_handler.go b/pkg/healthsrv/readiness_handler.go index 1077780..150b106 100644 --- a/pkg/healthsrv/readiness_handler.go +++ b/pkg/healthsrv/readiness_handler.go @@ -6,7 +6,7 @@ import ( "time" deis "github.com/deis/controller-sdk-go" - "k8s.io/kubernetes/pkg/api" + v1 "k8s.io/client-go/pkg/api/v1" ) func readinessHandler(client *deis.Client, nsLister NamespaceLister) http.Handler { @@ -14,7 +14,7 @@ func readinessHandler(client *deis.Client, nsLister NamespaceLister) http.Handle stopCh := make(chan struct{}) numChecks := 0 - namespaceListerCh := make(chan *api.NamespaceList) + namespaceListerCh := make(chan *v1.NamespaceList) namespaceListerErrCh := make(chan error) go listNamespaces(nsLister, namespaceListerCh, namespaceListerErrCh, stopCh) numChecks++ diff --git a/pkg/k8s/namespace.go b/pkg/k8s/namespace.go deleted file mode 100644 index 69528d1..0000000 --- a/pkg/k8s/namespace.go +++ /dev/null @@ -1,18 +0,0 @@ -package k8s - -import ( - "k8s.io/kubernetes/pkg/api" -) - -// NamespaceLister is a (k8s.io/kubernetes/pkg/client/unversioned).NamespaceInterface compatible -// interface which only has the List function. It's used in places that only need List to make -// them easier to test and more easily swappable with other implementations -// (should the need arise). -// -// Example usage: -// -// var nsl NamespaceLister -// nsl = kubeClient.Namespaces() -type NamespaceLister interface { - List(opts api.ListOptions) (*api.NamespaceList, error) -} diff --git a/pkg/k8s/pull_policy.go b/pkg/k8s/pull_policy.go deleted file mode 100644 index 7b24953..0000000 --- a/pkg/k8s/pull_policy.go +++ /dev/null @@ -1,36 +0,0 @@ -package k8s - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/api" -) - -var ( - emptyPullPolicy = api.PullPolicy("") - // ValidPullPolicies is the set of pull policies that this package considers valid - ValidPullPolicies = map[api.PullPolicy]struct{}{ - api.PullAlways: {}, - api.PullIfNotPresent: {}, - api.PullNever: {}, - } -) - -// ErrInvalidPullPolicy is the error returned when trying to convert an unknown string to an api.PullPolicy -type ErrInvalidPullPolicy struct { - str string -} - -// Error is the error interface implementation -func (e ErrInvalidPullPolicy) Error() string { - return fmt.Sprintf("%s is an invalid pull policy", e.str) -} - -// PullPolicyFromString converts a string into an api.PullPolicy. returns an error if the string does not match a pull policy in ValidPullPolicies() -func PullPolicyFromString(ppStr string) (api.PullPolicy, error) { - candidatePP := api.PullPolicy(ppStr) - if _, ok := ValidPullPolicies[candidatePP]; !ok { - return emptyPullPolicy, ErrInvalidPullPolicy{str: ppStr} - } - return candidatePP, nil -} diff --git a/pkg/k8s/secrets.go b/pkg/k8s/secrets.go deleted file mode 100644 index dc51d04..0000000 --- a/pkg/k8s/secrets.go +++ /dev/null @@ -1,57 +0,0 @@ -package k8s - -import ( - "k8s.io/kubernetes/pkg/api" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeSecret is a mock function that can be swapped in for -// (k8s.io/kubernetes/pkg/client/unversioned).SecretsInterface, -// so you can unit test your code. -type FakeSecret struct { - FnGet func(string) (*api.Secret, error) - FnCreate func(*api.Secret) (*api.Secret, error) - FnUpdate func(*api.Secret) (*api.Secret, error) -} - -// Get is the interface definition. -func (f *FakeSecret) Get(name string) (*api.Secret, error) { - return f.FnGet(name) -} - -// Delete is the interface definition. -func (f *FakeSecret) Delete(name string) error { - return nil -} - -// Create is the interface definition. -func (f *FakeSecret) Create(secret *api.Secret) (*api.Secret, error) { - return f.FnCreate(secret) -} - -// Update is the interface definition. -func (f *FakeSecret) Update(secret *api.Secret) (*api.Secret, error) { - return f.FnUpdate(secret) -} - -// List is the interface definition. -func (f *FakeSecret) List(opts api.ListOptions) (*api.SecretList, error) { - return &api.SecretList{}, nil -} - -// Watch is the interface definition. -func (f *FakeSecret) Watch(opts api.ListOptions) (watch.Interface, error) { - return nil, nil -} - -// FakeSecretsNamespacer is a mock function that can be swapped in for an -// (k8s.io/kubernetes/pkg/client/unversioned).SecretsNamespacer, so you can unit test you code -type FakeSecretsNamespacer struct { - Fn func(string) client.SecretsInterface -} - -// Secrets is the interface definition. -func (f *FakeSecretsNamespacer) Secrets(namespace string) client.SecretsInterface { - return f.Fn(namespace) -}