mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 13:50:01 +00:00 
			
		
		
		
	Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Make kubectl explain print the Kind and APIVersion of the resource **What this PR does / why we need it**: Kubectl explain currently doesn't print out the Kind and APIversion of the resource being explained. When running `kubectl explain hpa.spec`, for example, there is no way of knowing whether you're looking at the `autoscaling/v1` or the `autoscaling/v2beta1` version. Also, `kubectl explain` is often used as a reference when writing YAML/JSON object manifests. It allows you to look up everything except the API version. Currently, you either need to know the API Version of a resource by heart or look it up in the online API docs. This PR fixes both problems by having `kubectl explain` print out the full Kind and APIVersion of the resource it is explaining. Here are a few examples of the new output: ``` $ kubectl explain deploy KIND: Deployment VERSION: extensions/v1beta1 DESCRIPTION: ... $ kubectl explain hpa.spec KIND: HorizontalPodAutoscaler VERSION: autoscaling/v1 RESOURCE: spec <Object> DESCRIPTION: ... $ kubectl explain hpa.spec.maxReplicas KIND: HorizontalPodAutoscaler VERSION: autoscaling/v1 FIELD: maxReplicas <integer> DESCRIPTION: ... $ kubectl explain hpa.spec --recursive KIND: HorizontalPodAutoscaler VERSION: autoscaling/v1 RESOURCE: spec <Object> DESCRIPTION: behaviour of autoscaler. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status. specification of a horizontal pod autoscaler. FIELDS: maxReplicas <integer> minReplicas <integer> scaleTargetRef <Object> apiVersion <string> kind <string> name <string> targetCPUUtilizationPercentage <integer> ``` **Release note**: ```release-note Kubectl explain now prints out the Kind and API version of the resource being explained ```
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2017 The Kubernetes Authors.
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| package explain
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"strings"
 | |
| 
 | |
| 	"k8s.io/apimachinery/pkg/api/meta"
 | |
| 	"k8s.io/apimachinery/pkg/runtime/schema"
 | |
| 	"k8s.io/kube-openapi/pkg/util/proto"
 | |
| )
 | |
| 
 | |
| type fieldsPrinter interface {
 | |
| 	PrintFields(proto.Schema) error
 | |
| }
 | |
| 
 | |
| func splitDotNotation(model string) (string, []string) {
 | |
| 	var fieldsPath []string
 | |
| 
 | |
| 	// ignore trailing period
 | |
| 	model = strings.TrimSuffix(model, ".")
 | |
| 
 | |
| 	dotModel := strings.Split(model, ".")
 | |
| 	if len(dotModel) >= 1 {
 | |
| 		fieldsPath = dotModel[1:]
 | |
| 	}
 | |
| 	return dotModel[0], fieldsPath
 | |
| }
 | |
| 
 | |
| // 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(inResource)
 | |
| 	return inResource, fieldsPath, nil
 | |
| }
 | |
| 
 | |
| // PrintModelDescription prints the description of a specific model or dot path.
 | |
| // If recursive, all components nested within the fields of the schema will be
 | |
| // printed.
 | |
| func PrintModelDescription(fieldsPath []string, w io.Writer, schema proto.Schema, gvk schema.GroupVersionKind, recursive bool) error {
 | |
| 	fieldName := ""
 | |
| 	if len(fieldsPath) != 0 {
 | |
| 		fieldName = fieldsPath[len(fieldsPath)-1]
 | |
| 	}
 | |
| 
 | |
| 	// Go down the fieldsPath to find what we're trying to explain
 | |
| 	schema, err := LookupSchemaForField(schema, fieldsPath)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	b := fieldsPrinterBuilder{Recursive: recursive}
 | |
| 	f := &Formatter{Writer: w, Wrap: 80}
 | |
| 	return PrintModel(fieldName, f, b, schema, gvk)
 | |
| }
 |