mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	move SwaggerSchema to DiscoveryClient
This commit is contained in:
		@@ -17,16 +17,9 @@ limitations under the License.
 | 
				
			|||||||
package unversioned
 | 
					package unversioned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
	"strings"
 | 
						"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,
 | 
					// Interface holds the methods for clients of Kubernetes,
 | 
				
			||||||
@@ -47,7 +40,6 @@ type Interface interface {
 | 
				
			|||||||
	PersistentVolumesInterface
 | 
						PersistentVolumesInterface
 | 
				
			||||||
	PersistentVolumeClaimsNamespacer
 | 
						PersistentVolumeClaimsNamespacer
 | 
				
			||||||
	ComponentStatusesInterface
 | 
						ComponentStatusesInterface
 | 
				
			||||||
	SwaggerSchemaInterface
 | 
					 | 
				
			||||||
	Extensions() ExtensionsInterface
 | 
						Extensions() ExtensionsInterface
 | 
				
			||||||
	Discovery() DiscoveryInterface
 | 
						Discovery() DiscoveryInterface
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -118,46 +110,6 @@ type Client struct {
 | 
				
			|||||||
	*DiscoveryClient
 | 
						*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 {
 | 
					func stringDoesntExistIn(str string, slice []string) bool {
 | 
				
			||||||
	for _, s := range slice {
 | 
						for _, s := range slice {
 | 
				
			||||||
		if s == str {
 | 
							if s == str {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -273,7 +273,7 @@ func TestGetSwaggerSchema(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client := NewOrDie(&Config{Host: server.URL})
 | 
						client := NewOrDie(&Config{Host: server.URL})
 | 
				
			||||||
	got, err := client.SwaggerSchema(v1.SchemeGroupVersion)
 | 
						got, err := client.Discovery().SwaggerSchema(v1.SchemeGroupVersion)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected encoding error: %v", err)
 | 
							t.Fatalf("unexpected encoding error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -292,7 +292,7 @@ func TestGetSwaggerSchemaFail(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client := NewOrDie(&Config{Host: server.URL})
 | 
						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 {
 | 
						if got != nil {
 | 
				
			||||||
		t.Fatalf("unexpected response: %v", got)
 | 
							t.Fatalf("unexpected response: %v", got)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,9 +21,12 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/emicklei/go-restful/swagger"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/errors"
 | 
						"k8s.io/kubernetes/pkg/api/errors"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/v1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/version"
 | 
						"k8s.io/kubernetes/pkg/version"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,6 +36,7 @@ type DiscoveryInterface interface {
 | 
				
			|||||||
	ServerGroupsInterface
 | 
						ServerGroupsInterface
 | 
				
			||||||
	ServerResourcesInterface
 | 
						ServerResourcesInterface
 | 
				
			||||||
	ServerVersionInterface
 | 
						ServerVersionInterface
 | 
				
			||||||
 | 
						SwaggerSchemaInterface
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ServerGroupsInterface has methods for obtaining supported groups on the API server
 | 
					// ServerGroupsInterface has methods for obtaining supported groups on the API server
 | 
				
			||||||
@@ -56,6 +60,12 @@ type ServerVersionInterface interface {
 | 
				
			|||||||
	ServerVersion() (*version.Info, error)
 | 
						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,
 | 
					// DiscoveryClient implements the functions that dicovery server-supported API groups,
 | 
				
			||||||
// versions and resources.
 | 
					// versions and resources.
 | 
				
			||||||
type DiscoveryClient struct {
 | 
					type DiscoveryClient struct {
 | 
				
			||||||
@@ -162,6 +172,40 @@ func (d *DiscoveryClient) ServerVersion() (*version.Info, error) {
 | 
				
			|||||||
	return &info, nil
 | 
						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 {
 | 
					func setDiscoveryDefaults(config *Config) error {
 | 
				
			||||||
	config.Prefix = ""
 | 
						config.Prefix = ""
 | 
				
			||||||
	config.GroupVersion = nil
 | 
						config.GroupVersion = nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -320,7 +320,7 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
 | 
				
			|||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return client.SwaggerSchema(version)
 | 
								return client.Discovery().SwaggerSchema(version)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DefaultNamespace: func() (string, bool, error) {
 | 
							DefaultNamespace: func() (string, bool, error) {
 | 
				
			||||||
			return clientConfig.Namespace()
 | 
								return clientConfig.Namespace()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user