mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
move SwaggerSchema to DiscoveryClient
This commit is contained in:
parent
144b5acd08
commit
6a104ee46c
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user