From 6a104ee46cae5f142102dc05c348f394e67d80a4 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 5 Jan 2016 13:24:44 -0800 Subject: [PATCH] move SwaggerSchema to DiscoveryClient --- pkg/client/unversioned/client.go | 48 ---------------------- pkg/client/unversioned/client_test.go | 4 +- pkg/client/unversioned/discovery_client.go | 44 ++++++++++++++++++++ pkg/kubectl/cmd/util/factory.go | 2 +- 4 files changed, 47 insertions(+), 51 deletions(-) diff --git a/pkg/client/unversioned/client.go b/pkg/client/unversioned/client.go index 9ffc1afa814..e48f3274fcf 100644 --- a/pkg/client/unversioned/client.go +++ b/pkg/client/unversioned/client.go @@ -17,16 +17,9 @@ limitations under the License. package unversioned import ( - "encoding/json" - "fmt" "net" "net/url" "strings" - - "github.com/emicklei/go-restful/swagger" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" ) // Interface holds the methods for clients of Kubernetes, @@ -47,7 +40,6 @@ type Interface interface { PersistentVolumesInterface PersistentVolumeClaimsNamespacer ComponentStatusesInterface - SwaggerSchemaInterface Extensions() ExtensionsInterface Discovery() DiscoveryInterface } @@ -118,46 +110,6 @@ type Client struct { *DiscoveryClient } -// SwaggerSchemaInterface has a method to retrieve the swagger schema. Used in -// client.Interface -type SwaggerSchemaInterface interface { - SwaggerSchema(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) -} - -// SwaggerSchema retrieves and parses the swagger API schema the server supports. -func (c *Client) SwaggerSchema(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) { - if version.IsEmpty() { - return nil, fmt.Errorf("groupVersion cannot be empty") - } - - groupList, err := c.Discovery().ServerGroups() - if err != nil { - return nil, err - } - groupVersions := ExtractGroupVersions(groupList) - // This check also takes care the case that kubectl is newer than the running endpoint - if stringDoesntExistIn(version.String(), groupVersions) { - return nil, fmt.Errorf("API version: %v is not supported by the server. Use one of: %v", version, groupVersions) - } - var path string - if version == v1.SchemeGroupVersion { - path = "/swaggerapi/api/" + version.Version - } else { - path = "/swaggerapi/apis/" + version.Group + "/" + version.Version - } - - body, err := c.Get().AbsPath(path).Do().Raw() - if err != nil { - return nil, err - } - var schema swagger.ApiDeclaration - err = json.Unmarshal(body, &schema) - if err != nil { - return nil, fmt.Errorf("got '%s': %v", string(body), err) - } - return &schema, nil -} - func stringDoesntExistIn(str string, slice []string) bool { for _, s := range slice { if s == str { diff --git a/pkg/client/unversioned/client_test.go b/pkg/client/unversioned/client_test.go index f61f6eb8b84..8f5ea61bfd8 100644 --- a/pkg/client/unversioned/client_test.go +++ b/pkg/client/unversioned/client_test.go @@ -273,7 +273,7 @@ func TestGetSwaggerSchema(t *testing.T) { defer server.Close() client := NewOrDie(&Config{Host: server.URL}) - got, err := client.SwaggerSchema(v1.SchemeGroupVersion) + got, err := client.Discovery().SwaggerSchema(v1.SchemeGroupVersion) if err != nil { t.Fatalf("unexpected encoding error: %v", err) } @@ -292,7 +292,7 @@ func TestGetSwaggerSchemaFail(t *testing.T) { defer server.Close() client := NewOrDie(&Config{Host: server.URL}) - got, err := client.SwaggerSchema(unversioned.GroupVersion{Group: "api.group", Version: "v4"}) + got, err := client.Discovery().SwaggerSchema(unversioned.GroupVersion{Group: "api.group", Version: "v4"}) if got != nil { t.Fatalf("unexpected response: %v", got) } diff --git a/pkg/client/unversioned/discovery_client.go b/pkg/client/unversioned/discovery_client.go index 3b9e55c2a58..c55bd3e7b36 100644 --- a/pkg/client/unversioned/discovery_client.go +++ b/pkg/client/unversioned/discovery_client.go @@ -21,9 +21,12 @@ import ( "fmt" "net/url" + "github.com/emicklei/go-restful/swagger" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/version" ) @@ -33,6 +36,7 @@ type DiscoveryInterface interface { ServerGroupsInterface ServerResourcesInterface ServerVersionInterface + SwaggerSchemaInterface } // ServerGroupsInterface has methods for obtaining supported groups on the API server @@ -56,6 +60,12 @@ type ServerVersionInterface interface { ServerVersion() (*version.Info, error) } +// SwaggerSchemaInterface has a method to retrieve the swagger schema. +type SwaggerSchemaInterface interface { + // SwaggerSchema retrieves and parses the swagger API schema the server supports. + SwaggerSchema(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) +} + // DiscoveryClient implements the functions that dicovery server-supported API groups, // versions and resources. type DiscoveryClient struct { @@ -162,6 +172,40 @@ func (d *DiscoveryClient) ServerVersion() (*version.Info, error) { return &info, nil } +// SwaggerSchema retrieves and parses the swagger API schema the server supports. +func (d *DiscoveryClient) SwaggerSchema(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) { + if version.IsEmpty() { + return nil, fmt.Errorf("groupVersion cannot be empty") + } + + groupList, err := d.ServerGroups() + if err != nil { + return nil, err + } + groupVersions := ExtractGroupVersions(groupList) + // This check also takes care the case that kubectl is newer than the running endpoint + if stringDoesntExistIn(version.String(), groupVersions) { + return nil, fmt.Errorf("API version: %v is not supported by the server. Use one of: %v", version, groupVersions) + } + var path string + if version == v1.SchemeGroupVersion { + path = "/swaggerapi/api/" + version.Version + } else { + path = "/swaggerapi/apis/" + version.Group + "/" + version.Version + } + + body, err := d.Get().AbsPath(path).Do().Raw() + if err != nil { + return nil, err + } + var schema swagger.ApiDeclaration + err = json.Unmarshal(body, &schema) + if err != nil { + return nil, fmt.Errorf("got '%s': %v", string(body), err) + } + return &schema, nil +} + func setDiscoveryDefaults(config *Config) error { config.Prefix = "" config.GroupVersion = nil diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index dda5fc1da39..65283eb2b67 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -320,7 +320,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { if err != nil { return nil, err } - return client.SwaggerSchema(version) + return client.Discovery().SwaggerSchema(version) }, DefaultNamespace: func() (string, bool, error) { return clientConfig.Namespace()