diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index cee92e565..1d3895bf1 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -856,339 +856,339 @@ }, { "ImportPath": "k8s.io/api/admission/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "709473a40abc909fa18be410859b249f5244a9f7" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation/path", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/uuid", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/waitgroup", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "a3892fa156841bf4b296e41cbc1b184e8e8a2670" + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, { "ImportPath": "k8s.io/client-go/discovery", @@ -1198,10 +1198,6 @@ "ImportPath": "k8s.io/client-go/discovery/fake", "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, - { - "ImportPath": "k8s.io/client-go/informers", - "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" - }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" @@ -1374,10 +1370,6 @@ "ImportPath": "k8s.io/client-go/kubernetes", "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, - { - "ImportPath": "k8s.io/client-go/kubernetes/fake", - "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" - }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" @@ -1766,10 +1758,6 @@ "ImportPath": "k8s.io/client-go/tools/cache", "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" }, - { - "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" - }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" @@ -1846,6 +1834,78 @@ "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", "Rev": "0cf8f7e6ed1d2e3d47d02e3b6e559369af24d803" }, + { + "ImportPath": "k8s.io/client-go/discovery", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/informers", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/fake", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/scheme", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/listers/core/v1", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/rest", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/testing", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/tools/cache", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/tools/clientcmd", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/tools/clientcmd/api", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/util/cert", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, + { + "ImportPath": "k8s.io/client-go/util/flowcontrol", + "Rev": "9d3220af77d7087b57f18da12d768e542a5e46e6" + }, { "ImportPath": "k8s.io/utils/pointer", "Rev": "66066c83e385e385ccc3c964b44fd7dcd413d0ed" diff --git a/pkg/authorization/authorizerfactory/delegating.go b/pkg/authorization/authorizerfactory/delegating.go index 25b5aa989..c75c0a755 100644 --- a/pkg/authorization/authorizerfactory/delegating.go +++ b/pkg/authorization/authorizerfactory/delegating.go @@ -20,9 +20,8 @@ import ( "time" "k8s.io/apiserver/pkg/authorization/authorizer" - authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1" - "k8s.io/apiserver/plugin/pkg/authorizer/webhook" + authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1" ) // DelegatingAuthorizerConfig is the minimal configuration needed to create an authenticator diff --git a/pkg/authorization/path/doc.go b/pkg/authorization/path/doc.go new file mode 100644 index 000000000..743d945b4 --- /dev/null +++ b/pkg/authorization/path/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package path contains an authorizer that allows certain paths and path prefixes. +package path diff --git a/pkg/authorization/path/path.go b/pkg/authorization/path/path.go new file mode 100644 index 000000000..03f524b38 --- /dev/null +++ b/pkg/authorization/path/path.go @@ -0,0 +1,67 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package path + +import ( + "fmt" + "strings" + + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apiserver/pkg/authorization/authorizer" +) + +// NewAuthorizer returns an authorizer which accepts a given set of paths. +// Each path is either a fully matching path or it ends in * in case a prefix match is done. A leading / is optional. +func NewAuthorizer(alwaysAllowPaths []string) (authorizer.Authorizer, error) { + var prefixes []string + paths := sets.NewString() + for _, p := range alwaysAllowPaths { + p = strings.TrimPrefix(p, "/") + if len(p) == 0 { + // matches "/" + paths.Insert(p) + continue + } + if strings.ContainsRune(p[:len(p)-1], '*') { + return nil, fmt.Errorf("only trailing * allowed in %q", p) + } + if strings.HasSuffix(p, "*") { + prefixes = append(prefixes, p[:len(p)-1]) + } else { + paths.Insert(p) + } + } + + return authorizer.AuthorizerFunc(func(a authorizer.Attributes) (authorizer.Decision, string, error) { + if a.IsResourceRequest() { + return authorizer.DecisionNoOpinion, "", nil + } + + pth := strings.TrimPrefix(a.GetPath(), "/") + if paths.Has(pth) { + return authorizer.DecisionAllow, "", nil + } + + for _, prefix := range prefixes { + if strings.HasPrefix(pth, prefix) { + return authorizer.DecisionAllow, "", nil + } + } + + return authorizer.DecisionNoOpinion, "", nil + }), nil +} diff --git a/pkg/authorization/path/path_test.go b/pkg/authorization/path/path_test.go new file mode 100644 index 000000000..be48c52bc --- /dev/null +++ b/pkg/authorization/path/path_test.go @@ -0,0 +1,77 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package path + +import ( + "testing" + + "k8s.io/apiserver/pkg/authorization/authorizer" +) + +func TestNewAuthorizer(t *testing.T) { + tests := []struct { + name string + excludedPaths []string + allowed, denied, noOpinion []string + wantErr bool + }{ + {"inner star", []string{"/foo*bar"}, nil, nil, nil, true}, + {"double star", []string{"/foo**"}, nil, nil, nil, true}, + {"empty", nil, nil, nil, []string{"/"}, false}, + {"slash", []string{"/"}, []string{"/"}, nil, []string{"/foo", "//"}, false}, + {"foo", []string{"/foo"}, []string{"/foo", "foo"}, nil, []string{"/", "", "/bar", "/foo/", "/fooooo", "//foo"}, false}, + {"foo slash", []string{"/foo/"}, []string{"/foo/"}, nil, []string{"/", "", "/bar", "/foo", "/fooooo"}, false}, + {"foo slash star", []string{"/foo/*"}, []string{"/foo/", "/foo/bar/bla"}, nil, []string{"/", "", "/foo", "/bar", "/fooooo"}, false}, + {"foo bar", []string{"/foo", "/bar"}, []string{"/foo", "/bar"}, nil, []string{"/", "", "/foo/", "/bar/", "/fooooo"}, false}, + {"foo star", []string{"/foo*"}, []string{"/foo", "/foooo"}, nil, []string{"/", "", "/fo", "/bar"}, false}, + {"star", []string{"/*"}, []string{"/", "", "/foo", "/foooo"}, nil, nil, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + a, err := NewAuthorizer(tt.excludedPaths) + if err != nil && !tt.wantErr { + t.Fatalf("unexpected error: %v", err) + } + if err == nil && tt.wantErr { + t.Fatalf("expected error, didn't get any") + } + if err != nil { + return + } + + for _, cases := range []struct { + paths []string + want authorizer.Decision + }{ + {tt.allowed, authorizer.DecisionAllow}, + {tt.denied, authorizer.DecisionDeny}, + {tt.noOpinion, authorizer.DecisionNoOpinion}, + } { + for _, pth := range cases.paths { + info := authorizer.AttributesRecord{ + Path: pth, + } + if got, _, err := a.Authorize(info); err != nil { + t.Errorf("NewAuthorizer(%v).Authorize(%q) return unexpected error: %v", tt.excludedPaths, pth, err) + } else if got != cases.want { + t.Errorf("NewAuthorizer(%v).Authorize(%q) = %v, want %v", tt.excludedPaths, pth, got, cases.want) + } + } + } + }) + } +} diff --git a/pkg/server/options/authorization.go b/pkg/server/options/authorization.go index eadf3d1e1..738faa1d4 100644 --- a/pkg/server/options/authorization.go +++ b/pkg/server/options/authorization.go @@ -22,7 +22,10 @@ import ( "github.com/spf13/pflag" + "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/authorization/authorizerfactory" + "k8s.io/apiserver/pkg/authorization/path" + "k8s.io/apiserver/pkg/authorization/union" "k8s.io/apiserver/pkg/server" authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1" "k8s.io/client-go/rest" @@ -45,6 +48,10 @@ type DelegatingAuthorizationOptions struct { // DenyCacheTTL is the length of time that an unsuccessful authorization response will be cached. // You generally want more responsive, "deny, try again" flows. DenyCacheTTL time.Duration + + // AlwaysAllowPaths are HTTP paths which are excluded from authorization. They can be plain + // paths or end in * in which case prefix-match is applied. A leading / is optional. + AlwaysAllowPaths []string } func NewDelegatingAuthorizationOptions() *DelegatingAuthorizationOptions { @@ -65,9 +72,9 @@ func (s *DelegatingAuthorizationOptions) AddFlags(fs *pflag.FlagSet) { return } - fs.StringVar(&s.RemoteKubeConfigFile, "authorization-kubeconfig", s.RemoteKubeConfigFile, ""+ + fs.StringVar(&s.RemoteKubeConfigFile, "authorization-kubeconfig", s.RemoteKubeConfigFile, "kubeconfig file pointing at the 'core' kubernetes server with enough rights to create "+ - " subjectaccessreviews.authorization.k8s.io.") + " subjectaccessreviews.authorization.k8s.io.") fs.DurationVar(&s.AllowCacheTTL, "authorization-webhook-cache-authorized-ttl", s.AllowCacheTTL, @@ -76,6 +83,10 @@ func (s *DelegatingAuthorizationOptions) AddFlags(fs *pflag.FlagSet) { fs.DurationVar(&s.DenyCacheTTL, "authorization-webhook-cache-unauthorized-ttl", s.DenyCacheTTL, "The duration to cache 'unauthorized' responses from the webhook authorizer.") + + fs.StringSliceVar(&s.AlwaysAllowPaths, "authorization-always-allow-paths", s.AlwaysAllowPaths, + "A list of HTTP paths to skip during authorization, i.e. these are authorized without "+ + "contacting the 'core' kubernetes server.") } func (s *DelegatingAuthorizationOptions) ApplyTo(c *server.AuthorizationInfo) error { @@ -84,31 +95,41 @@ func (s *DelegatingAuthorizationOptions) ApplyTo(c *server.AuthorizationInfo) er return nil } - cfg, err := s.ToAuthorizationConfig() - if err != nil { - return err - } - authorizer, err := cfg.New() + a, err := s.ToAuthorization() if err != nil { return err } - - c.Authorizer = authorizer + c.Authorizer = a return nil } -func (s *DelegatingAuthorizationOptions) ToAuthorizationConfig() (authorizerfactory.DelegatingAuthorizerConfig, error) { +func (s *DelegatingAuthorizationOptions) ToAuthorization() (authorizer.Authorizer, error) { + var authorizers []authorizer.Authorizer + + if len(s.AlwaysAllowPaths) > 0 { + a, err := path.NewAuthorizer(s.AlwaysAllowPaths) + if err != nil { + return nil, err + } + authorizers = append(authorizers, a) + } + sarClient, err := s.newSubjectAccessReview() if err != nil { - return authorizerfactory.DelegatingAuthorizerConfig{}, err + return nil, err } - - ret := authorizerfactory.DelegatingAuthorizerConfig{ + cfg := authorizerfactory.DelegatingAuthorizerConfig{ SubjectAccessReviewClient: sarClient, AllowCacheTTL: s.AllowCacheTTL, DenyCacheTTL: s.DenyCacheTTL, } - return ret, nil + a, err := cfg.New() + if err != nil { + return nil, err + } + authorizers = append(authorizers, a) + + return union.New(authorizers...), nil } func (s *DelegatingAuthorizationOptions) newSubjectAccessReview() (authorizationclient.SubjectAccessReviewInterface, error) {