mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 22:46:12 +00:00
Merge pull request #18599 from smarterclayton/abstract_explain
Auto commit by PR queue bot
This commit is contained in:
commit
b12f6b341f
@ -1291,6 +1291,17 @@ __EOF__
|
||||
kubectl delete all -l app=cassandra "${kube_flags[@]}"
|
||||
|
||||
|
||||
###########
|
||||
# Explain #
|
||||
###########
|
||||
|
||||
kube::log::status "Testing kubectl(${version}:explain)"
|
||||
kubectl explain pods
|
||||
# shortcuts work
|
||||
kubectl explain po
|
||||
kubectl explain po.status.message
|
||||
|
||||
|
||||
###########
|
||||
# Swagger #
|
||||
###########
|
||||
|
@ -65,11 +65,6 @@ func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []st
|
||||
return cmdutil.UsageError(cmd, "We accept only this format: explain RESOURCE")
|
||||
}
|
||||
|
||||
client, err := f.Client()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
recursive := cmdutil.GetFlagBool(cmd, "recursive")
|
||||
apiVersionString := cmdutil.GetFlagString(cmd, "api-version")
|
||||
apiVersion := unversioned.GroupVersion{}
|
||||
@ -103,10 +98,10 @@ func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []st
|
||||
}
|
||||
}
|
||||
|
||||
swagSchema, err := kubectl.GetSwaggerSchema(apiVersion, client)
|
||||
schema, err := f.SwaggerSchema(apiVersion)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return kubectl.PrintModelDescription(inModel, fieldsPath, out, swagSchema, recursive)
|
||||
return kubectl.PrintModelDescription(inModel, fieldsPath, out, schema, recursive)
|
||||
}
|
||||
|
@ -29,6 +29,7 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/emicklei/go-restful/swagger"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
|
||||
@ -88,6 +89,8 @@ type Factory struct {
|
||||
LogsForObject func(object, options runtime.Object) (*client.Request, error)
|
||||
// Returns a schema that can validate objects stored on disk.
|
||||
Validator func(validate bool, cacheDir string) (validation.Schema, error)
|
||||
// SwaggerSchema returns the schema declaration for the provided group version.
|
||||
SwaggerSchema func(unversioned.GroupVersion) (*swagger.ApiDeclaration, error)
|
||||
// Returns the default namespace to use in cases where no
|
||||
// other namespace is specified and whether the namespace was
|
||||
// overriden.
|
||||
@ -304,6 +307,13 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
|
||||
}
|
||||
return validation.NullSchema{}, nil
|
||||
},
|
||||
SwaggerSchema: func(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) {
|
||||
client, err := clients.ClientForVersion(&version)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return client.SwaggerSchema(version)
|
||||
},
|
||||
DefaultNamespace: func() (string, bool, error) {
|
||||
return clientConfig.Namespace()
|
||||
},
|
||||
|
@ -24,27 +24,16 @@ import (
|
||||
"github.com/emicklei/go-restful/swagger"
|
||||
|
||||
"k8s.io/kubernetes/pkg/api/meta"
|
||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||
apiutil "k8s.io/kubernetes/pkg/api/util"
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
)
|
||||
|
||||
var allModels = make(map[string]*swagger.NamedModel)
|
||||
var recursive = false // this is global for convenience, can become int for multiple levels
|
||||
|
||||
// GetSwaggerSchema returns the swagger spec from master
|
||||
func GetSwaggerSchema(version unversioned.GroupVersion, kubeClient client.Interface) (*swagger.ApiDeclaration, error) {
|
||||
swaggerSchema, err := kubeClient.SwaggerSchema(version)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("couldn't read swagger schema from server: %v", err)
|
||||
}
|
||||
return swaggerSchema, nil
|
||||
}
|
||||
|
||||
// SplitAndParseResourceRequest separates the users input into a model and fields
|
||||
func SplitAndParseResourceRequest(inResource string, mapper meta.RESTMapper) (string, []string, error) {
|
||||
inResource, fieldsPath := splitDotNotation(inResource)
|
||||
inResource, _ = mapper.ResourceSingularizer(expandResourceShortcut(inResource))
|
||||
inResource, _ = mapper.ResourceSingularizer(inResource)
|
||||
return inResource, fieldsPath, nil
|
||||
}
|
||||
|
||||
@ -63,7 +52,7 @@ func PrintModelDescription(inModel string, fieldsPath []string, w io.Writer, swa
|
||||
}
|
||||
}
|
||||
if pointedModel == nil {
|
||||
return fmt.Errorf("Requested resource: %s doesn't exist", inModel)
|
||||
return fmt.Errorf("requested resource %q is not defined", inModel)
|
||||
}
|
||||
|
||||
if len(fieldsPath) == 0 {
|
||||
@ -80,7 +69,7 @@ func PrintModelDescription(inModel string, fieldsPath []string, w io.Writer, swa
|
||||
return printPrimitive(w, prop)
|
||||
}
|
||||
} else {
|
||||
return fmt.Errorf("field: %s doesn't exist", field)
|
||||
return fmt.Errorf("field %q does not exist", field)
|
||||
}
|
||||
}
|
||||
return printModelInfo(w, pointedModel, pointedModelAsProp)
|
||||
|
@ -91,6 +91,11 @@ func (e ShortcutExpander) ResourceIsValid(resource string) bool {
|
||||
return e.RESTMapper.ResourceIsValid(expandResourceShortcut(resource))
|
||||
}
|
||||
|
||||
// ResourceSingularizer expands the named resource and then singularizes it.
|
||||
func (e ShortcutExpander) ResourceSingularizer(resource string) (string, error) {
|
||||
return e.RESTMapper.ResourceSingularizer(expandResourceShortcut(resource))
|
||||
}
|
||||
|
||||
// expandResourceShortcut will return the expanded version of resource
|
||||
// (something that a pkg/api/meta.RESTMapper can understand), if it is
|
||||
// indeed a shortcut. Otherwise, will return resource unmodified.
|
||||
|
Loading…
Reference in New Issue
Block a user