forked from LaconicNetwork/kompose
69 lines
2.1 KiB
Go
69 lines
2.1 KiB
Go
package client
|
|
|
|
import (
|
|
"net/url"
|
|
|
|
"k8s.io/kubernetes/pkg/api/errors"
|
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
|
"k8s.io/kubernetes/pkg/client/restclient"
|
|
"k8s.io/kubernetes/pkg/client/typed/discovery"
|
|
)
|
|
|
|
// DiscoveryClient implements the functions that discovery server-supported API groups,
|
|
// versions and resources.
|
|
type DiscoveryClient struct {
|
|
*discovery.DiscoveryClient
|
|
}
|
|
|
|
// ServerResourcesForGroupVersion returns the supported resources for a group and version.
|
|
func (d *DiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (resources *unversioned.APIResourceList, err error) {
|
|
parentList, err := d.DiscoveryClient.ServerResourcesForGroupVersion(groupVersion)
|
|
if err != nil {
|
|
return parentList, err
|
|
}
|
|
|
|
if groupVersion != "v1" {
|
|
return parentList, nil
|
|
}
|
|
|
|
// we request v1, we must combine the parent list with the list from /oapi
|
|
|
|
url := url.URL{}
|
|
url.Path = "/oapi/" + groupVersion
|
|
originResources := &unversioned.APIResourceList{}
|
|
err = d.Get().AbsPath(url.String()).Do().Into(originResources)
|
|
if err != nil {
|
|
// ignore 403 or 404 error to be compatible with an v1.0 server.
|
|
if groupVersion == "v1" && (errors.IsNotFound(err) || errors.IsForbidden(err)) {
|
|
return parentList, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
parentList.APIResources = append(parentList.APIResources, originResources.APIResources...)
|
|
return parentList, nil
|
|
}
|
|
|
|
// ServerResources returns the supported resources for all groups and versions.
|
|
func (d *DiscoveryClient) ServerResources() (map[string]*unversioned.APIResourceList, error) {
|
|
apiGroups, err := d.ServerGroups()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
groupVersions := unversioned.ExtractGroupVersions(apiGroups)
|
|
result := map[string]*unversioned.APIResourceList{}
|
|
for _, groupVersion := range groupVersions {
|
|
resources, err := d.ServerResourcesForGroupVersion(groupVersion)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result[groupVersion] = resources
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// New creates a new DiscoveryClient for the given RESTClient.
|
|
func NewDiscoveryClient(c *restclient.RESTClient) *DiscoveryClient {
|
|
return &DiscoveryClient{discovery.NewDiscoveryClient(c)}
|
|
}
|