diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 88a5383e..8dd3786d 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -372,303 +372,303 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/imagepolicy/v1alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1alpha1", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/unstructured", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "4d1e9a7d2810c3a1e1683220b377263bf5462210" + "Rev": "430fff74d5db6f361a1e309121cbfe58e4543d17" }, { "ImportPath": "k8s.io/kube-openapi/pkg/common", diff --git a/rest/config.go b/rest/config.go index 57848c8a..038fee94 100644 --- a/rest/config.go +++ b/rest/config.go @@ -420,5 +420,45 @@ func AnonymousClientConfig(config *Config) *Config { QPS: config.QPS, Burst: config.Burst, Timeout: config.Timeout, + Dial: config.Dial, + } +} + +// CopyConfig returns a copy of the given config +func CopyConfig(config *Config) *Config { + return &Config{ + Host: config.Host, + APIPath: config.APIPath, + Prefix: config.Prefix, + ContentConfig: config.ContentConfig, + Username: config.Username, + Password: config.Password, + BearerToken: config.BearerToken, + CacheDir: config.CacheDir, + Impersonate: ImpersonationConfig{ + Groups: config.Impersonate.Groups, + Extra: config.Impersonate.Extra, + UserName: config.Impersonate.UserName, + }, + AuthProvider: config.AuthProvider, + AuthConfigPersister: config.AuthConfigPersister, + TLSClientConfig: TLSClientConfig{ + Insecure: config.TLSClientConfig.Insecure, + ServerName: config.TLSClientConfig.ServerName, + CertFile: config.TLSClientConfig.CertFile, + KeyFile: config.TLSClientConfig.KeyFile, + CAFile: config.TLSClientConfig.CAFile, + CertData: config.TLSClientConfig.CertData, + KeyData: config.TLSClientConfig.KeyData, + CAData: config.TLSClientConfig.CAData, + }, + UserAgent: config.UserAgent, + Transport: config.Transport, + WrapTransport: config.WrapTransport, + QPS: config.QPS, + Burst: config.Burst, + RateLimiter: config.RateLimiter, + Timeout: config.Timeout, + Dial: config.Dial, } } diff --git a/rest/config_test.go b/rest/config_test.go index ff851e6a..0e86442d 100644 --- a/rest/config_test.go +++ b/rest/config_test.go @@ -35,6 +35,8 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/util/flowcontrol" + "errors" + "github.com/stretchr/testify/assert" ) @@ -206,6 +208,19 @@ func (n *fakeNegotiatedSerializer) DecoderToVersion(serializer runtime.Decoder, return &fakeCodec{} } +var fakeDialFunc = func(network, addr string) (net.Conn, error) { + return nil, fakeDialerError +} +var fakeDialerError = errors.New("fakedialer") + +type fakeAuthProviderConfigPersister struct{} + +func (fakeAuthProviderConfigPersister) Persist(map[string]string) error { + return fakeAuthProviderConfigPersisterError +} + +var fakeAuthProviderConfigPersisterError = errors.New("fakeAuthProviderConfigPersisterError") + func TestAnonymousConfig(t *testing.T) { f := fuzz.New().NilChance(0.0).NumElements(1, 1) f.Funcs( @@ -268,9 +283,94 @@ func TestAnonymousConfig(t *testing.T) { actual.WrapTransport = nil expected.WrapTransport = nil } + if actual.Dial != nil { + _, actualError := actual.Dial("", "") + _, expectedError := actual.Dial("", "") + if !reflect.DeepEqual(expectedError, actualError) { + t.Fatalf("CopyConfig dropped the Dial field") + } + } else { + actual.Dial = nil + expected.Dial = nil + } if !reflect.DeepEqual(*actual, expected) { t.Fatalf("AnonymousClientConfig dropped unexpected fields, identify whether they are security related or not: %s", diff.ObjectGoPrintDiff(expected, actual)) } } } + +func TestCopyConfig(t *testing.T) { + f := fuzz.New().NilChance(0.0).NumElements(1, 1) + f.Funcs( + func(r *runtime.Codec, f fuzz.Continue) { + codec := &fakeCodec{} + f.Fuzz(codec) + *r = codec + }, + func(r *http.RoundTripper, f fuzz.Continue) { + roundTripper := &fakeRoundTripper{} + f.Fuzz(roundTripper) + *r = roundTripper + }, + func(fn *func(http.RoundTripper) http.RoundTripper, f fuzz.Continue) { + *fn = fakeWrapperFunc + }, + func(r *runtime.NegotiatedSerializer, f fuzz.Continue) { + serializer := &fakeNegotiatedSerializer{} + f.Fuzz(serializer) + *r = serializer + }, + func(r *flowcontrol.RateLimiter, f fuzz.Continue) { + limiter := &fakeLimiter{} + f.Fuzz(limiter) + *r = limiter + }, + func(r *AuthProviderConfigPersister, f fuzz.Continue) { + *r = fakeAuthProviderConfigPersister{} + }, + func(r *func(network, addr string) (net.Conn, error), f fuzz.Continue) { + *r = fakeDialFunc + }, + ) + for i := 0; i < 20; i++ { + original := &Config{} + f.Fuzz(original) + actual := CopyConfig(original) + expected := *original + + // this is the list of known risky fields, add to this list if a new field + // is added to Config, update CopyConfig to preserve the field otherwise. + + // The DeepEqual cannot handle the func comparison, so we just verify if the + // function return the expected object. + if actual.WrapTransport == nil || !reflect.DeepEqual(expected.WrapTransport(nil), &fakeRoundTripper{}) { + t.Fatalf("CopyConfig dropped the WrapTransport field") + } else { + actual.WrapTransport = nil + expected.WrapTransport = nil + } + if actual.Dial != nil { + _, actualError := actual.Dial("", "") + _, expectedError := actual.Dial("", "") + if !reflect.DeepEqual(expectedError, actualError) { + t.Fatalf("CopyConfig dropped the Dial field") + } + } + actual.Dial = nil + expected.Dial = nil + if actual.AuthConfigPersister != nil { + actualError := actual.AuthConfigPersister.Persist(nil) + expectedError := actual.AuthConfigPersister.Persist(nil) + if !reflect.DeepEqual(expectedError, actualError) { + t.Fatalf("CopyConfig dropped the Dial field") + } + } + actual.AuthConfigPersister = nil + expected.AuthConfigPersister = nil + + if !reflect.DeepEqual(*actual, expected) { + t.Fatalf("CopyConfig dropped unexpected fields, identify whether they are security related or not: %s", diff.ObjectReflectDiff(expected, *actual)) + } + } +}