diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 9d3213bf..49b99e3a 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -280,339 +280,339 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/auditregistration/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta2", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/imagepolicy/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "843ad2d9b9ae703c74f2f43959e6ce0b24cc3185" + "Rev": "049920e654584910f24144786a75b837be5a84e6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "60666be32c5de527b69dabe8e4400b4f0aa897de" + "Rev": "fddbff74510a1159770789381aeaccd2effa2d4e" }, { "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", diff --git a/discovery/cached/memcache.go b/discovery/cached/memcache.go index a6ebbe4f..70239251 100644 --- a/discovery/cached/memcache.go +++ b/discovery/cached/memcache.go @@ -44,6 +44,7 @@ type memCacheClient struct { cacheValid bool } +// Error Constants var ( ErrCacheEmpty = errors.New("the cache has not been filled yet") ErrCacheNotFound = errors.New("not found") diff --git a/discovery/cached_discovery.go b/discovery/cached_discovery.go index d38a0bbd..90cd3420 100644 --- a/discovery/cached_discovery.go +++ b/discovery/cached_discovery.go @@ -94,6 +94,8 @@ func (d *CachedDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, er return ServerResources(d) } +// ServerGroups returns the supported groups, with information like supported versions and the +// preferred version. func (d *CachedDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { filename := filepath.Join(d.cacheDirectory, "servergroups.json") cachedBytes, err := d.getCachedFile(filename) @@ -202,26 +204,36 @@ func (d *CachedDiscoveryClient) writeCachedFile(filename string, obj runtime.Obj return err } +// RESTClient returns a RESTClient that is used to communicate with API server +// by this client implementation. func (d *CachedDiscoveryClient) RESTClient() restclient.Interface { return d.delegate.RESTClient() } +// ServerPreferredResources returns the supported resources with the version preferred by the +// server. func (d *CachedDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { return ServerPreferredResources(d) } +// ServerPreferredNamespacedResources returns the supported namespaced resources with the +// version preferred by the server. func (d *CachedDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { return ServerPreferredNamespacedResources(d) } +// ServerVersion retrieves and parses the server's version (git version). func (d *CachedDiscoveryClient) ServerVersion() (*version.Info, error) { return d.delegate.ServerVersion() } +// OpenAPISchema retrieves and parses the swagger API schema the server supports. func (d *CachedDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { return d.delegate.OpenAPISchema() } +// Fresh is supposed to tell the caller whether or not to retry if the cache +// fails to find something (false = retry, true = no need to retry). func (d *CachedDiscoveryClient) Fresh() bool { d.mutex.Lock() defer d.mutex.Unlock() @@ -229,6 +241,7 @@ func (d *CachedDiscoveryClient) Fresh() bool { return d.fresh } +// Invalidate enforces that no cached data is used in the future that is older than the current time. func (d *CachedDiscoveryClient) Invalidate() { d.mutex.Lock() defer d.mutex.Unlock() diff --git a/discovery/discovery_client.go b/discovery/discovery_client.go index a9660297..17b39de0 100644 --- a/discovery/discovery_client.go +++ b/discovery/discovery_client.go @@ -263,8 +263,8 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList, result := []*metav1.APIResourceList{} grVersions := map[schema.GroupResource]string{} // selected version of a GroupResource - grApiResources := map[schema.GroupResource]*metav1.APIResource{} // selected APIResource for a GroupResource - gvApiResourceLists := map[schema.GroupVersion]*metav1.APIResourceList{} // blueprint for a APIResourceList for later grouping + grAPIResources := map[schema.GroupResource]*metav1.APIResource{} // selected APIResource for a GroupResource + gvAPIResourceLists := map[schema.GroupVersion]*metav1.APIResourceList{} // blueprint for a APIResourceList for later grouping for _, apiGroup := range serverGroupList.Groups { for _, version := range apiGroup.Versions { @@ -276,11 +276,11 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList, } // create empty list which is filled later in another loop - emptyApiResourceList := metav1.APIResourceList{ + emptyAPIResourceList := metav1.APIResourceList{ GroupVersion: version.GroupVersion, } - gvApiResourceLists[groupVersion] = &emptyApiResourceList - result = append(result, &emptyApiResourceList) + gvAPIResourceLists[groupVersion] = &emptyAPIResourceList + result = append(result, &emptyAPIResourceList) for i := range apiResourceList.APIResources { apiResource := &apiResourceList.APIResources[i] @@ -288,21 +288,21 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList, continue } gv := schema.GroupResource{Group: apiGroup.Name, Resource: apiResource.Name} - if _, ok := grApiResources[gv]; ok && version.Version != apiGroup.PreferredVersion.Version { + if _, ok := grAPIResources[gv]; ok && version.Version != apiGroup.PreferredVersion.Version { // only override with preferred version continue } grVersions[gv] = version.Version - grApiResources[gv] = apiResource + grAPIResources[gv] = apiResource } } } // group selected APIResources according to GroupVersion into APIResourceLists - for groupResource, apiResource := range grApiResources { + for groupResource, apiResource := range grAPIResources { version := grVersions[groupResource] groupVersion := schema.GroupVersion{Group: groupResource.Group, Version: version} - apiResourceList := gvApiResourceLists[groupVersion] + apiResourceList := gvAPIResourceLists[groupVersion] apiResourceList.APIResources = append(apiResourceList.APIResources, *apiResource) } @@ -464,9 +464,9 @@ func NewDiscoveryClient(c restclient.Interface) *DiscoveryClient { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *DiscoveryClient) RESTClient() restclient.Interface { - if c == nil { +func (d *DiscoveryClient) RESTClient() restclient.Interface { + if d == nil { return nil } - return c.restClient + return d.restClient } diff --git a/discovery/fake/discovery.go b/discovery/fake/discovery.go index 984a0ba1..9565fa46 100644 --- a/discovery/fake/discovery.go +++ b/discovery/fake/discovery.go @@ -36,6 +36,8 @@ type FakeDiscovery struct { FakedServerVersion *version.Info } +// ServerResourcesForGroupVersion returns the supported resources for a group +// and version. func (c *FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { action := testing.ActionImpl{ Verb: "get", @@ -50,6 +52,7 @@ func (c *FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*me return nil, fmt.Errorf("GroupVersion %q not found", groupVersion) } +// ServerResources returns the supported resources for all groups and versions. func (c *FakeDiscovery) ServerResources() ([]*metav1.APIResourceList, error) { action := testing.ActionImpl{ Verb: "get", @@ -59,14 +62,20 @@ func (c *FakeDiscovery) ServerResources() ([]*metav1.APIResourceList, error) { return c.Resources, nil } +// ServerPreferredResources returns the supported resources with the version +// preferred by the server. func (c *FakeDiscovery) ServerPreferredResources() ([]*metav1.APIResourceList, error) { return nil, nil } +// ServerPreferredNamespacedResources returns the supported namespaced resources +// with the version preferred by the server. func (c *FakeDiscovery) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { return nil, nil } +// ServerGroups returns the supported groups, with information like supported +// versions and the preferred version. func (c *FakeDiscovery) ServerGroups() (*metav1.APIGroupList, error) { action := testing.ActionImpl{ Verb: "get", @@ -108,6 +117,7 @@ func (c *FakeDiscovery) ServerGroups() (*metav1.APIGroupList, error) { } +// ServerVersion retrieves and parses the server's version. func (c *FakeDiscovery) ServerVersion() (*version.Info, error) { action := testing.ActionImpl{} action.Verb = "get" @@ -122,10 +132,13 @@ func (c *FakeDiscovery) ServerVersion() (*version.Info, error) { return &versionInfo, nil } +// OpenAPISchema retrieves and parses the swagger API schema the server supports. func (c *FakeDiscovery) OpenAPISchema() (*openapi_v2.Document, error) { return &openapi_v2.Document{}, nil } +// RESTClient returns a RESTClient that is used to communicate with API server +// by this client implementation. func (c *FakeDiscovery) RESTClient() restclient.Interface { return nil } diff --git a/discovery/helper.go b/discovery/helper.go index 353d34b3..3bfe514e 100644 --- a/discovery/helper.go +++ b/discovery/helper.go @@ -31,11 +31,11 @@ import ( func MatchesServerVersion(clientVersion apimachineryversion.Info, client DiscoveryInterface) error { sVer, err := client.ServerVersion() if err != nil { - return fmt.Errorf("couldn't read version from server: %v\n", err) + return fmt.Errorf("couldn't read version from server: %v", err) } // GitVersion includes GitCommit and GitTreeState, but best to be safe? if clientVersion.GitVersion != sVer.GitVersion || clientVersion.GitCommit != sVer.GitCommit || clientVersion.GitTreeState != sVer.GitTreeState { - return fmt.Errorf("server version (%#v) differs from client version (%#v)!\n", sVer, clientVersion) + return fmt.Errorf("server version (%#v) differs from client version (%#v)", sVer, clientVersion) } return nil @@ -101,12 +101,15 @@ func FilteredBy(pred ResourcePredicate, rls []*metav1.APIResourceList) []*metav1 return result } +// ResourcePredicate has a method to check if a resource matches a given condition. type ResourcePredicate interface { Match(groupVersion string, r *metav1.APIResource) bool } +// ResourcePredicateFunc returns true if it matches a resource based on a custom condition. type ResourcePredicateFunc func(groupVersion string, r *metav1.APIResource) bool +// Match is a wrapper around ResourcePredicateFunc. func (fn ResourcePredicateFunc) Match(groupVersion string, r *metav1.APIResource) bool { return fn(groupVersion, r) } @@ -116,6 +119,7 @@ type SupportsAllVerbs struct { Verbs []string } +// Match checks if a resource contains all the given verbs. func (p SupportsAllVerbs) Match(groupVersion string, r *metav1.APIResource) bool { return sets.NewString([]string(r.Verbs)...).HasAll(p.Verbs...) }