diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 4f82a84fc..68f99fb3d 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -764,335 +764,335 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "b9f613b2c218444c9bdcc6c714b5c66876d6dab6" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing/fuzzer", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing/roundtrip", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation/path", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/announced", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1alpha1", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/unstructured", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/proxy", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/uuid", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "346ff7efcc02737717f04ae671f6c04dec29361e" + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, { "ImportPath": "k8s.io/client-go/discovery", @@ -1102,10 +1102,6 @@ "ImportPath": "k8s.io/client-go/discovery/fake", "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, - { - "ImportPath": "k8s.io/client-go/informers", - "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" - }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" @@ -1250,10 +1246,6 @@ "ImportPath": "k8s.io/client-go/kubernetes", "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, - { - "ImportPath": "k8s.io/client-go/kubernetes/fake", - "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" - }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" @@ -1566,10 +1558,6 @@ "ImportPath": "k8s.io/client-go/tools/cache", "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" }, - { - "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" - }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" @@ -1633,6 +1621,70 @@ { "ImportPath": "k8s.io/kube-openapi/pkg/util", "Rev": "868f2f29720b192240e18284659231b440f9cda5" + }, + { + "ImportPath": "k8s.io/client-go/discovery", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/informers", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/fake", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/scheme", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/listers/core/v1", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/rest", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/testing", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/tools/cache", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/tools/clientcmd", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/util/cert", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" + }, + { + "ImportPath": "k8s.io/client-go/util/flowcontrol", + "Rev": "1b4523e9643c07d2512caa0d2f7e5b86ec7985af" } ] } diff --git a/pkg/server/BUILD b/pkg/server/BUILD index f0e3ac3d4..353862cfc 100644 --- a/pkg/server/BUILD +++ b/pkg/server/BUILD @@ -77,6 +77,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", diff --git a/pkg/server/config.go b/pkg/server/config.go index ebf621636..e1c81c7d4 100644 --- a/pkg/server/config.go +++ b/pkg/server/config.go @@ -460,6 +460,7 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G openAPIConfig: c.OpenAPIConfig, postStartHooks: map[string]postStartHookEntry{}, + preShutdownHooks: map[string]preShutdownHookEntry{}, disabledPostStartHooks: c.DisabledPostStartHooks, healthzChecks: c.HealthzChecks, @@ -473,8 +474,12 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G s.postStartHooks[k] = v } + for k, v := range delegationTarget.PreShutdownHooks() { + s.preShutdownHooks[k] = v + } + genericApiServerHookName := "generic-apiserver-start-informers" - if c.SharedInformerFactory != nil && !s.isHookRegistered(genericApiServerHookName) { + if c.SharedInformerFactory != nil && !s.isPostStartHookRegistered(genericApiServerHookName) { err := s.AddPostStartHook(genericApiServerHookName, func(context PostStartHookContext) error { c.SharedInformerFactory.Start(context.StopCh) return nil diff --git a/pkg/server/genericapiserver.go b/pkg/server/genericapiserver.go index ad24415bc..1927f7a8a 100644 --- a/pkg/server/genericapiserver.go +++ b/pkg/server/genericapiserver.go @@ -134,6 +134,10 @@ type GenericAPIServer struct { postStartHooksCalled bool disabledPostStartHooks sets.String + preShutdownHookLock sync.Mutex + preShutdownHooks map[string]preShutdownHookEntry + preShutdownHooksCalled bool + // healthz checks healthzLock sync.Mutex healthzChecks []healthz.HealthzChecker @@ -163,6 +167,9 @@ type DelegationTarget interface { // PostStartHooks returns the post-start hooks that need to be combined PostStartHooks() map[string]postStartHookEntry + // PreShutdownHooks returns the pre-stop hooks that need to be combined + PreShutdownHooks() map[string]preShutdownHookEntry + // HealthzChecks returns the healthz checks that need to be combined HealthzChecks() []healthz.HealthzChecker @@ -180,6 +187,9 @@ func (s *GenericAPIServer) UnprotectedHandler() http.Handler { func (s *GenericAPIServer) PostStartHooks() map[string]postStartHookEntry { return s.postStartHooks } +func (s *GenericAPIServer) PreShutdownHooks() map[string]preShutdownHookEntry { + return s.preShutdownHooks +} func (s *GenericAPIServer) HealthzChecks() []healthz.HealthzChecker { return s.healthzChecks } @@ -205,6 +215,9 @@ func (s emptyDelegate) UnprotectedHandler() http.Handler { func (s emptyDelegate) PostStartHooks() map[string]postStartHookEntry { return map[string]postStartHookEntry{} } +func (s emptyDelegate) PreShutdownHooks() map[string]preShutdownHookEntry { + return map[string]preShutdownHookEntry{} +} func (s emptyDelegate) HealthzChecks() []healthz.HealthzChecker { return []healthz.HealthzChecker{} } @@ -264,7 +277,7 @@ func (s preparedGenericAPIServer) Run(stopCh <-chan struct{}) error { s.GenericAPIServer.AuditBackend.Shutdown() } - return nil + return s.RunPreShutdownHooks() } // NonBlockingRun spawns the secure http server. An error is diff --git a/pkg/server/hooks.go b/pkg/server/hooks.go index a190f5622..ccf8ee17a 100644 --- a/pkg/server/hooks.go +++ b/pkg/server/hooks.go @@ -23,6 +23,7 @@ import ( "github.com/golang/glog" + utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apiserver/pkg/server/healthz" restclient "k8s.io/client-go/rest" @@ -39,6 +40,9 @@ import ( // until it becomes easier to use. type PostStartHookFunc func(context PostStartHookContext) error +// PreShutdownHookFunc is a function that can be added to the shutdown logic. +type PreShutdownHookFunc func() error + // PostStartHookContext provides information about this API server to a PostStartHookFunc type PostStartHookContext struct { // LoopbackClientConfig is a config for a privileged loopback connection to the API server @@ -59,6 +63,10 @@ type postStartHookEntry struct { done chan struct{} } +type preShutdownHookEntry struct { + hook PreShutdownHookFunc +} + // AddPostStartHook allows you to add a PostStartHook. func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc) error { if len(name) == 0 { @@ -97,6 +105,37 @@ func (s *GenericAPIServer) AddPostStartHookOrDie(name string, hook PostStartHook } } +// AddPreShutdownHook allows you to add a PreShutdownHook. +func (s *GenericAPIServer) AddPreShutdownHook(name string, hook PreShutdownHookFunc) error { + if len(name) == 0 { + return fmt.Errorf("missing name") + } + if hook == nil { + return nil + } + + s.preShutdownHookLock.Lock() + defer s.preShutdownHookLock.Unlock() + + if s.preShutdownHooksCalled { + return fmt.Errorf("unable to add %q because PreShutdownHooks have already been called", name) + } + if _, exists := s.preShutdownHooks[name]; exists { + return fmt.Errorf("unable to add %q because it is already registered", name) + } + + s.preShutdownHooks[name] = preShutdownHookEntry{hook: hook} + + return nil +} + +// AddPreShutdownHookOrDie allows you to add a PostStartHook, but dies on failure +func (s *GenericAPIServer) AddPreShutdownHookOrDie(name string, hook PreShutdownHookFunc) { + if err := s.AddPreShutdownHook(name, hook); err != nil { + glog.Fatalf("Error registering PreShutdownHook %q: %v", name, err) + } +} + // RunPostStartHooks runs the PostStartHooks for the server func (s *GenericAPIServer) RunPostStartHooks(stopCh <-chan struct{}) { s.postStartHookLock.Lock() @@ -113,8 +152,24 @@ func (s *GenericAPIServer) RunPostStartHooks(stopCh <-chan struct{}) { } } -// isHookRegistered checks whether a given hook is registered -func (s *GenericAPIServer) isHookRegistered(name string) bool { +// RunPreShutdownHooks runs the PreShutdownHooks for the server +func (s *GenericAPIServer) RunPreShutdownHooks() error { + var errorList []error + + s.preShutdownHookLock.Lock() + defer s.preShutdownHookLock.Unlock() + s.preShutdownHooksCalled = true + + for hookName, hookEntry := range s.preShutdownHooks { + if err := runPreShutdownHook(hookName, hookEntry); err != nil { + errorList = append(errorList, err) + } + } + return utilerrors.NewAggregate(errorList) +} + +// isPostStartHookRegistered checks whether a given PostStartHook is registered +func (s *GenericAPIServer) isPostStartHookRegistered(name string) bool { s.postStartHookLock.Lock() defer s.postStartHookLock.Unlock() _, exists := s.postStartHooks[name] @@ -135,6 +190,19 @@ func runPostStartHook(name string, entry postStartHookEntry, context PostStartHo close(entry.done) } +func runPreShutdownHook(name string, entry preShutdownHookEntry) error { + var err error + func() { + // don't let the hook *accidentally* panic and kill the server + defer utilruntime.HandleCrash() + err = entry.hook() + }() + if err != nil { + return fmt.Errorf("PreShutdownHook %q failed: %v", name, err) + } + return nil +} + // postStartHookHealthz implements a healthz check for poststarthooks. It will return a "hookNotFinished" // error until the poststarthook is finished. type postStartHookHealthz struct {