diff --git a/contrib/completions/bash/kubectl b/contrib/completions/bash/kubectl index ec85d36f545..57f8e092c1e 100644 --- a/contrib/completions/bash/kubectl +++ b/contrib/completions/bash/kubectl @@ -272,6 +272,7 @@ _kubectl_get() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--label-columns=") two_word_flags+=("-L") flags+=("--no-headers") @@ -342,6 +343,7 @@ _kubectl_get() must_have_one_noun+=("service") must_have_one_noun+=("serviceaccount") must_have_one_noun+=("thirdpartyresource") + must_have_one_noun+=("thirdpartyresourcedata") } _kubectl_describe() @@ -360,6 +362,7 @@ _kubectl_describe() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--recursive") flags+=("-R") flags+=("--selector=") @@ -484,6 +487,7 @@ _kubectl_create_secret_docker-registry() flags+=("--docker-username=") flags+=("--dry-run") flags+=("--generator=") + flags+=("--include-extended-apis") flags+=("--no-headers") flags+=("--output=") two_word_flags+=("-o") @@ -695,6 +699,7 @@ _kubectl_create_serviceaccount() flags+=("--dry-run") flags+=("--generator=") + flags+=("--include-extended-apis") flags+=("--no-headers") flags+=("--output=") two_word_flags+=("-o") @@ -757,6 +762,7 @@ _kubectl_create() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--record") @@ -815,6 +821,7 @@ _kubectl_replace() flags_completion+=("__handle_filename_extension_flag json|yaml|yml") flags+=("--force") flags+=("--grace-period=") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--record") @@ -871,6 +878,7 @@ _kubectl_patch() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--patch=") @@ -930,6 +938,7 @@ _kubectl_delete() flags_completion+=("__handle_filename_extension_flag json|yaml|yml") flags+=("--grace-period=") flags+=("--ignore-not-found") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--recursive") @@ -988,6 +997,7 @@ _kubectl_delete() must_have_one_noun+=("service") must_have_one_noun+=("serviceaccount") must_have_one_noun+=("thirdpartyresource") + must_have_one_noun+=("thirdpartyresourcedata") } _kubectl_edit() @@ -1006,6 +1016,7 @@ _kubectl_edit() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--output-version=") @@ -1059,6 +1070,7 @@ _kubectl_apply() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--record") @@ -1150,6 +1162,7 @@ _kubectl_logs() two_word_flags+=("-c") flags+=("--follow") flags+=("-f") + flags+=("--include-extended-apis") flags+=("--interactive") flags+=("--limit-bytes=") flags+=("--previous") @@ -1207,6 +1220,7 @@ _kubectl_rolling-update() flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") flags+=("--image=") + flags+=("--include-extended-apis") flags+=("--no-headers") flags+=("--output=") two_word_flags+=("-o") @@ -1272,6 +1286,7 @@ _kubectl_scale() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--output=") two_word_flags+=("-o") flags+=("--record") @@ -1635,6 +1650,7 @@ _kubectl_run() flags+=("--generator=") flags+=("--hostport=") flags+=("--image=") + flags+=("--include-extended-apis") flags+=("--labels=") two_word_flags+=("-l") flags+=("--leave-stdin-open") @@ -1787,6 +1803,7 @@ _kubectl_autoscale() flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") flags+=("--generator=") + flags+=("--include-extended-apis") flags+=("--max=") flags+=("--min=") flags+=("--name=") @@ -2085,6 +2102,7 @@ _kubectl_label() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--no-headers") flags+=("--output=") two_word_flags+=("-o") @@ -2153,6 +2171,7 @@ _kubectl_label() must_have_one_noun+=("service") must_have_one_noun+=("serviceaccount") must_have_one_noun+=("thirdpartyresource") + must_have_one_noun+=("thirdpartyresourcedata") } _kubectl_annotate() @@ -2172,6 +2191,7 @@ _kubectl_annotate() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--no-headers") flags+=("--output=") two_word_flags+=("-o") @@ -2602,6 +2622,7 @@ _kubectl_cluster-info() flags_with_completion=() flags_completion=() + flags+=("--include-extended-apis") flags+=("--alsologtostderr") flags+=("--api-version=") flags+=("--certificate-authority=") @@ -2721,6 +2742,7 @@ _kubectl_explain() flags_with_completion=() flags_completion=() + flags+=("--include-extended-apis") flags+=("--recursive") flags+=("--alsologtostderr") flags+=("--api-version=") @@ -2767,6 +2789,7 @@ _kubectl_convert() two_word_flags+=("-f") flags_with_completion+=("-f") flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags+=("--include-extended-apis") flags+=("--local") flags+=("--no-headers") flags+=("--output=") diff --git a/docs/man/man1/kubectl-annotate.1 b/docs/man/man1/kubectl-annotate.1 index 5ce78a4ac63..0cf2dd3d055 100644 --- a/docs/man/man1/kubectl-annotate.1 +++ b/docs/man/man1/kubectl-annotate.1 @@ -37,6 +37,10 @@ horizontalpodautoscalers (hpa), resourcequotas (quota) or secrets. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to a file identifying the resource to update the annotation +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-no\-headers\fP=false When using the default output, don't print headers. diff --git a/docs/man/man1/kubectl-apply.1 b/docs/man/man1/kubectl-apply.1 index 4046f332488..78dba1e950f 100644 --- a/docs/man/man1/kubectl-apply.1 +++ b/docs/man/man1/kubectl-apply.1 @@ -25,6 +25,10 @@ JSON and YAML formats are accepted. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to file that contains the configuration to apply +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/man/man1/kubectl-autoscale.1 b/docs/man/man1/kubectl-autoscale.1 index c7674eb49d2..67373b6b406 100644 --- a/docs/man/man1/kubectl-autoscale.1 +++ b/docs/man/man1/kubectl-autoscale.1 @@ -37,6 +37,10 @@ An autoscaler can automatically increase or decrease number of pods deployed wit \fB\-\-generator\fP="horizontalpodautoscaler/v1beta1" The name of the API generator to use. Currently there is only 1 generator. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-max\fP=\-1 The upper limit for the number of pods that can be set by the autoscaler. Required. diff --git a/docs/man/man1/kubectl-cluster-info.1 b/docs/man/man1/kubectl-cluster-info.1 index 0a488b81a0b..9a6cfca3f99 100644 --- a/docs/man/man1/kubectl-cluster-info.1 +++ b/docs/man/man1/kubectl-cluster-info.1 @@ -16,6 +16,12 @@ kubectl cluster\-info \- Display cluster info Display addresses of the master and services with label kubernetes.io/cluster\-service=true +.SH OPTIONS +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + + .SH OPTIONS INHERITED FROM PARENT COMMANDS .PP \fB\-\-alsologtostderr\fP=false diff --git a/docs/man/man1/kubectl-convert.1 b/docs/man/man1/kubectl-convert.1 index 4008eac3bec..2988533d17b 100644 --- a/docs/man/man1/kubectl-convert.1 +++ b/docs/man/man1/kubectl-convert.1 @@ -31,6 +31,10 @@ to change to output destination. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to file to need to get converted. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-local\fP=true If true, convert will NOT try to contact api\-server but run locally. diff --git a/docs/man/man1/kubectl-create-secret-docker-registry.1 b/docs/man/man1/kubectl-create-secret-docker-registry.1 index f6e35142a56..2bbd0379fe9 100644 --- a/docs/man/man1/kubectl-create-secret-docker-registry.1 +++ b/docs/man/man1/kubectl-create-secret-docker-registry.1 @@ -56,6 +56,10 @@ by creating a dockercfg secret and attaching it to your service account. \fB\-\-generator\fP="secret\-for\-docker\-registry/v1" The name of the API generator to use. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-no\-headers\fP=false When using the default output, don't print headers. diff --git a/docs/man/man1/kubectl-create-serviceaccount.1 b/docs/man/man1/kubectl-create-serviceaccount.1 index 6808a5df5e8..0edaa8bedc4 100644 --- a/docs/man/man1/kubectl-create-serviceaccount.1 +++ b/docs/man/man1/kubectl-create-serviceaccount.1 @@ -25,6 +25,10 @@ Create a service account with the specified name. \fB\-\-generator\fP="serviceaccount/v1" The name of the API generator to use. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-no\-headers\fP=false When using the default output, don't print headers. diff --git a/docs/man/man1/kubectl-create.1 b/docs/man/man1/kubectl-create.1 index 415e1bf2e54..f7f7c0cb100 100644 --- a/docs/man/man1/kubectl-create.1 +++ b/docs/man/man1/kubectl-create.1 @@ -24,6 +24,10 @@ JSON and YAML formats are accepted. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to file to use to create the resource +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/man/man1/kubectl-delete.1 b/docs/man/man1/kubectl-delete.1 index cfb9be889ec..cafe6a59194 100644 --- a/docs/man/man1/kubectl-delete.1 +++ b/docs/man/man1/kubectl-delete.1 @@ -48,6 +48,10 @@ will be lost along with the rest of the resource. \fB\-\-ignore\-not\-found\fP=false Treat "resource not found" as a successful delete. Defaults to "true" when \-\-all is specified. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/man/man1/kubectl-describe.1 b/docs/man/man1/kubectl-describe.1 index 6c435ae4d9d..0b860e03d35 100644 --- a/docs/man/man1/kubectl-describe.1 +++ b/docs/man/man1/kubectl-describe.1 @@ -39,6 +39,10 @@ componentstatuses (cs), endpoints (ep), and secrets. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to a file containing the resource to describe +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-R\fP, \fB\-\-recursive\fP=false If true, process directory recursively. diff --git a/docs/man/man1/kubectl-edit.1 b/docs/man/man1/kubectl-edit.1 index fa04d8843e2..540e1801a91 100644 --- a/docs/man/man1/kubectl-edit.1 +++ b/docs/man/man1/kubectl-edit.1 @@ -42,6 +42,10 @@ saved copy to include the latest resource version. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to file to use to edit the resource +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="yaml" Output format. One of: yaml|json. diff --git a/docs/man/man1/kubectl-explain.1 b/docs/man/man1/kubectl-explain.1 index 4c7b387b37a..842bc6d1d47 100644 --- a/docs/man/man1/kubectl-explain.1 +++ b/docs/man/man1/kubectl-explain.1 @@ -24,6 +24,10 @@ componentstatuses (cs), endpoints (ep), and secrets. .SH OPTIONS +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-recursive\fP=false Print the fields of fields (Currently only 1 level deep) diff --git a/docs/man/man1/kubectl-get.1 b/docs/man/man1/kubectl-get.1 index d65518e41c6..e089e8599af 100644 --- a/docs/man/man1/kubectl-get.1 +++ b/docs/man/man1/kubectl-get.1 @@ -40,6 +40,10 @@ of the \-\-template flag, you can filter the attributes of the fetched resource( \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to a file identifying the resource to get from a server. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-L\fP, \fB\-\-label\-columns\fP=[] Accepts a comma separated list of labels that are going to be presented as columns. Names are case\-sensitive. You can also use multiple flag statements like \-L label1 \-L label2... diff --git a/docs/man/man1/kubectl-label.1 b/docs/man/man1/kubectl-label.1 index 1078be01fea..987ab698eb5 100644 --- a/docs/man/man1/kubectl-label.1 +++ b/docs/man/man1/kubectl-label.1 @@ -34,6 +34,10 @@ If \-\-resource\-version is specified, then updates will use this resource versi \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to a file identifying the resource to update the labels +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-no\-headers\fP=false When using the default output, don't print headers. diff --git a/docs/man/man1/kubectl-logs.1 b/docs/man/man1/kubectl-logs.1 index 7a2ebb59024..e69b874cdc8 100644 --- a/docs/man/man1/kubectl-logs.1 +++ b/docs/man/man1/kubectl-logs.1 @@ -25,6 +25,10 @@ Print the logs for a container in a pod. If the pod has only one container, the \fB\-f\fP, \fB\-\-follow\fP=false Specify if the logs should be streamed. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-interactive\fP=false If true, prompt the user for input when required. diff --git a/docs/man/man1/kubectl-patch.1 b/docs/man/man1/kubectl-patch.1 index 7b605320744..8151868fc60 100644 --- a/docs/man/man1/kubectl-patch.1 +++ b/docs/man/man1/kubectl-patch.1 @@ -28,6 +28,10 @@ Please refer to the models in \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to a file identifying the resource to update +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/man/man1/kubectl-replace.1 b/docs/man/man1/kubectl-replace.1 index d86ead1c527..c2534e02d5d 100644 --- a/docs/man/man1/kubectl-replace.1 +++ b/docs/man/man1/kubectl-replace.1 @@ -42,6 +42,10 @@ Please refer to the models in \fB\-\-grace\-period\fP=\-1 Only relevant during a force replace. Period of time in seconds given to the old resource to terminate gracefully. Ignored if negative. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/man/man1/kubectl-rolling-update.1 b/docs/man/man1/kubectl-rolling-update.1 index f64dea30bee..d44d723dfe6 100644 --- a/docs/man/man1/kubectl-rolling-update.1 +++ b/docs/man/man1/kubectl-rolling-update.1 @@ -42,6 +42,10 @@ existing replication controller and overwrite at least one (common) label in its \fB\-\-image\fP="" Image to use for upgrading the replication controller. Must be distinct from the existing image (either new image or new image tag). Can not be used with \-\-filename/\-f +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-\-no\-headers\fP=false When using the default output, don't print headers. diff --git a/docs/man/man1/kubectl-run.1 b/docs/man/man1/kubectl-run.1 index 6bd3564dca2..b8d92dcce40 100644 --- a/docs/man/man1/kubectl-run.1 +++ b/docs/man/man1/kubectl-run.1 @@ -50,6 +50,10 @@ Creates a deployment or job to manage the created container(s). \fB\-\-image\fP="" The image for the container to run. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-l\fP, \fB\-\-labels\fP="" Labels to apply to the pod(s). diff --git a/docs/man/man1/kubectl-scale.1 b/docs/man/man1/kubectl-scale.1 index decf06f4237..2dc35893d8a 100644 --- a/docs/man/man1/kubectl-scale.1 +++ b/docs/man/man1/kubectl-scale.1 @@ -31,6 +31,10 @@ scale is sent to the server. \fB\-f\fP, \fB\-\-filename\fP=[] Filename, directory, or URL to a file identifying the resource to set a new size +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/man/man1/kubectl-stop.1 b/docs/man/man1/kubectl-stop.1 index c4b760ae95e..8e560c757d8 100644 --- a/docs/man/man1/kubectl-stop.1 +++ b/docs/man/man1/kubectl-stop.1 @@ -41,6 +41,10 @@ If the resource is scalable it will be scaled to 0 before deletion. \fB\-\-ignore\-not\-found\fP=false Treat "resource not found" as a successful stop. +.PP +\fB\-\-include\-extended\-apis\fP=true + If true, include definitions of new APIs via calls to the API server. [default true] + .PP \fB\-o\fP, \fB\-\-output\fP="" Output mode. Use "\-o name" for shorter output (resource/name). diff --git a/docs/user-guide/kubectl/kubectl.md b/docs/user-guide/kubectl/kubectl.md index 83d3370e9da..1785efad5d5 100644 --- a/docs/user-guide/kubectl/kubectl.md +++ b/docs/user-guide/kubectl/kubectl.md @@ -108,7 +108,7 @@ kubectl * [kubectl uncordon](kubectl_uncordon.md) - Mark node as schedulable * [kubectl version](kubectl_version.md) - Print the client and server version information. -###### Auto generated by spf13/cobra on 22-Mar-2016 +###### Auto generated by spf13/cobra on 25-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_annotate.md b/docs/user-guide/kubectl/kubectl_annotate.md index cba6858bf89..31398b92359 100644 --- a/docs/user-guide/kubectl/kubectl_annotate.md +++ b/docs/user-guide/kubectl/kubectl_annotate.md @@ -84,6 +84,7 @@ kubectl annotate pods foo description- ``` --all[=false]: select all resources in the namespace of the specified resource types -f, --filename=[]: Filename, directory, or URL to a file identifying the resource to update the annotation + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. --output-version="": Output the formatted object with the given group version (for ex: 'extensions/v1beta1'). @@ -129,7 +130,7 @@ kubectl annotate pods foo description- * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_annotate.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_api-versions.md b/docs/user-guide/kubectl/kubectl_api-versions.md index 05ac7c23043..daf003b5eb4 100644 --- a/docs/user-guide/kubectl/kubectl_api-versions.md +++ b/docs/user-guide/kubectl/kubectl_api-versions.md @@ -76,7 +76,7 @@ kubectl api-versions * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_api-versions.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_apply.md b/docs/user-guide/kubectl/kubectl_apply.md index 5e65d0412ee..effbd94b71c 100644 --- a/docs/user-guide/kubectl/kubectl_apply.md +++ b/docs/user-guide/kubectl/kubectl_apply.md @@ -62,6 +62,7 @@ cat pod.json | kubectl apply -f - ``` -f, --filename=[]: Filename, directory, or URL to file that contains the configuration to apply + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": Output mode. Use "-o name" for shorter output (resource/name). --record[=false]: Record current kubectl command in the resource annotation. -R, --recursive[=false]: If true, process directory recursively. @@ -100,7 +101,7 @@ cat pod.json | kubectl apply -f - * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_apply.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_attach.md b/docs/user-guide/kubectl/kubectl_attach.md index f4c648eb78e..0e88c9d3cab 100644 --- a/docs/user-guide/kubectl/kubectl_attach.md +++ b/docs/user-guide/kubectl/kubectl_attach.md @@ -98,7 +98,7 @@ kubectl attach 123456-7890 -c ruby-container -i -t * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_attach.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_autoscale.md b/docs/user-guide/kubectl/kubectl_autoscale.md index d8b71219e86..7c1d21c841f 100644 --- a/docs/user-guide/kubectl/kubectl_autoscale.md +++ b/docs/user-guide/kubectl/kubectl_autoscale.md @@ -65,6 +65,7 @@ kubectl autoscale rc foo --max=5 --cpu-percent=80 --dry-run[=false]: If true, only print the object that would be sent, without creating it. -f, --filename=[]: Filename, directory, or URL to a file identifying the resource to autoscale. --generator="horizontalpodautoscaler/v1beta1": The name of the API generator to use. Currently there is only 1 generator. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --max=-1: The upper limit for the number of pods that can be set by the autoscaler. Required. --min=-1: The lower limit for the number of pods that can be set by the autoscaler. If it's not specified or negative, the server will apply a default value. --name="": The name for the newly created object. If not specified, the name of the input resource will be used. @@ -111,7 +112,7 @@ kubectl autoscale rc foo --max=5 --cpu-percent=80 * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_autoscale.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_cluster-info.md b/docs/user-guide/kubectl/kubectl_cluster-info.md index 6868cdc60de..b593e276b60 100644 --- a/docs/user-guide/kubectl/kubectl_cluster-info.md +++ b/docs/user-guide/kubectl/kubectl_cluster-info.md @@ -45,6 +45,12 @@ Display addresses of the master and services with label kubernetes.io/cluster-se kubectl cluster-info ``` +### Options + +``` + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] +``` + ### Options inherited from parent commands ``` @@ -76,7 +82,7 @@ kubectl cluster-info * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_cluster-info.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config.md b/docs/user-guide/kubectl/kubectl_config.md index 7cbc7b6fc74..d5a46dae551 100644 --- a/docs/user-guide/kubectl/kubectl_config.md +++ b/docs/user-guide/kubectl/kubectl_config.md @@ -95,7 +95,7 @@ kubectl config SUBCOMMAND * [kubectl config use-context](kubectl_config_use-context.md) - Sets the current-context in a kubeconfig file * [kubectl config view](kubectl_config_view.md) - Displays merged kubeconfig settings or a specified kubeconfig file. -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_current-context.md b/docs/user-guide/kubectl/kubectl_config_current-context.md index 256e4a36c08..5fad18c0642 100644 --- a/docs/user-guide/kubectl/kubectl_config_current-context.md +++ b/docs/user-guide/kubectl/kubectl_config_current-context.md @@ -83,7 +83,7 @@ kubectl config current-context * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_current-context.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_set-cluster.md b/docs/user-guide/kubectl/kubectl_config_set-cluster.md index efe7b1c127b..06572829ed3 100644 --- a/docs/user-guide/kubectl/kubectl_config_set-cluster.md +++ b/docs/user-guide/kubectl/kubectl_config_set-cluster.md @@ -97,7 +97,7 @@ kubectl config set-cluster e2e --insecure-skip-tls-verify=true * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_set-cluster.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_set-context.md b/docs/user-guide/kubectl/kubectl_config_set-context.md index c4f8bb8a2a0..ca7ee9206a7 100644 --- a/docs/user-guide/kubectl/kubectl_config_set-context.md +++ b/docs/user-guide/kubectl/kubectl_config_set-context.md @@ -89,7 +89,7 @@ kubectl config set-context gce --user=cluster-admin * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_set-context.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_set-credentials.md b/docs/user-guide/kubectl/kubectl_config_set-credentials.md index fb28c0a4c0e..831f96ab314 100644 --- a/docs/user-guide/kubectl/kubectl_config_set-credentials.md +++ b/docs/user-guide/kubectl/kubectl_config_set-credentials.md @@ -109,7 +109,7 @@ kubectl config set-credentials cluster-admin --client-certificate=~/.kube/admin. * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_set-credentials.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_set.md b/docs/user-guide/kubectl/kubectl_config_set.md index 8c696ac85ed..6320ef2c3c9 100644 --- a/docs/user-guide/kubectl/kubectl_config_set.md +++ b/docs/user-guide/kubectl/kubectl_config_set.md @@ -78,7 +78,7 @@ kubectl config set PROPERTY_NAME PROPERTY_VALUE * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_set.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_unset.md b/docs/user-guide/kubectl/kubectl_config_unset.md index 0309390b279..13f6c6ed865 100644 --- a/docs/user-guide/kubectl/kubectl_config_unset.md +++ b/docs/user-guide/kubectl/kubectl_config_unset.md @@ -77,7 +77,7 @@ kubectl config unset PROPERTY_NAME * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_unset.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_use-context.md b/docs/user-guide/kubectl/kubectl_config_use-context.md index 39f7ea233a5..affed2289bd 100644 --- a/docs/user-guide/kubectl/kubectl_config_use-context.md +++ b/docs/user-guide/kubectl/kubectl_config_use-context.md @@ -76,7 +76,7 @@ kubectl config use-context CONTEXT_NAME * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_use-context.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_config_view.md b/docs/user-guide/kubectl/kubectl_config_view.md index f34f119553b..2ff6417f197 100644 --- a/docs/user-guide/kubectl/kubectl_config_view.md +++ b/docs/user-guide/kubectl/kubectl_config_view.md @@ -104,7 +104,7 @@ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}' * [kubectl config](kubectl_config.md) - config modifies kubeconfig files -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_config_view.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_convert.md b/docs/user-guide/kubectl/kubectl_convert.md index 5ffcca93fee..ece241a8618 100644 --- a/docs/user-guide/kubectl/kubectl_convert.md +++ b/docs/user-guide/kubectl/kubectl_convert.md @@ -73,6 +73,7 @@ kubectl convert -f . | kubectl create -f - ``` -f, --filename=[]: Filename, directory, or URL to file to need to get converted. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --local[=true]: If true, convert will NOT try to contact api-server but run locally. --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. @@ -117,7 +118,7 @@ kubectl convert -f . | kubectl create -f - * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_convert.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_cordon.md b/docs/user-guide/kubectl/kubectl_cordon.md index 3c89b3ba6fa..f3afb7e6a76 100644 --- a/docs/user-guide/kubectl/kubectl_cordon.md +++ b/docs/user-guide/kubectl/kubectl_cordon.md @@ -85,7 +85,7 @@ kubectl cordon foo * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_cordon.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create.md b/docs/user-guide/kubectl/kubectl_create.md index b893e278468..581c471766d 100644 --- a/docs/user-guide/kubectl/kubectl_create.md +++ b/docs/user-guide/kubectl/kubectl_create.md @@ -61,6 +61,7 @@ cat pod.json | kubectl create -f - ``` -f, --filename=[]: Filename, directory, or URL to file to use to create the resource + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": Output mode. Use "-o name" for shorter output (resource/name). --record[=false]: Record current kubectl command in the resource annotation. -R, --recursive[=false]: If true, process directory recursively. @@ -104,7 +105,7 @@ cat pod.json | kubectl create -f - * [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand. * [kubectl create serviceaccount](kubectl_create_serviceaccount.md) - Create a service account with the specified name. -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create_configmap.md b/docs/user-guide/kubectl/kubectl_create_configmap.md index 0075f06a6ca..e45a8343e82 100644 --- a/docs/user-guide/kubectl/kubectl_create_configmap.md +++ b/docs/user-guide/kubectl/kubectl_create_configmap.md @@ -118,7 +118,7 @@ kubectl create configmap NAME [--type=string] [--from-file=[key=]source] [--from * [kubectl create](kubectl_create.md) - Create a resource by filename or stdin -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 31-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create_configmap.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create_namespace.md b/docs/user-guide/kubectl/kubectl_create_namespace.md index 8b33d3f38c6..a82dfd1ee8d 100644 --- a/docs/user-guide/kubectl/kubectl_create_namespace.md +++ b/docs/user-guide/kubectl/kubectl_create_namespace.md @@ -101,7 +101,7 @@ kubectl create namespace NAME [--dry-run] * [kubectl create](kubectl_create.md) - Create a resource by filename or stdin -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create_namespace.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create_secret.md b/docs/user-guide/kubectl/kubectl_create_secret.md index d8cb84d145d..4fbba72f095 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret.md +++ b/docs/user-guide/kubectl/kubectl_create_secret.md @@ -78,7 +78,7 @@ kubectl create secret * [kubectl create secret docker-registry](kubectl_create_secret_docker-registry.md) - Create a secret for use with a Docker registry. * [kubectl create secret generic](kubectl_create_secret_generic.md) - Create a secret from a local file, directory or literal value. -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create_secret.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md b/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md index 6119f31eaae..5cc3486d102 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md +++ b/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md @@ -73,6 +73,7 @@ kubectl create secret docker-registry NAME --docker-username=user --docker-passw --docker-username="": Username for Docker registry authentication --dry-run[=false]: If true, only print the object that would be sent, without sending it. --generator="secret-for-docker-registry/v1": The name of the API generator to use. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. --output-version="": Output the formatted object with the given group version (for ex: 'extensions/v1beta1'). @@ -116,7 +117,7 @@ kubectl create secret docker-registry NAME --docker-username=user --docker-passw * [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand. -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create_secret_generic.md b/docs/user-guide/kubectl/kubectl_create_secret_generic.md index b41611a249b..25fc21a33bd 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret_generic.md +++ b/docs/user-guide/kubectl/kubectl_create_secret_generic.md @@ -120,7 +120,7 @@ kubectl create secret generic NAME [--type=string] [--from-file=[key=]source] [- * [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand. -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 31-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create_secret_generic.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_create_serviceaccount.md b/docs/user-guide/kubectl/kubectl_create_serviceaccount.md index 14b16478256..b1064eae45c 100644 --- a/docs/user-guide/kubectl/kubectl_create_serviceaccount.md +++ b/docs/user-guide/kubectl/kubectl_create_serviceaccount.md @@ -58,6 +58,7 @@ kubectl create serviceaccount NAME [--dry-run] ``` --dry-run[=false]: If true, only print the object that would be sent, without sending it. --generator="serviceaccount/v1": The name of the API generator to use. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. --output-version="": Output the formatted object with the given group version (for ex: 'extensions/v1beta1'). @@ -101,7 +102,7 @@ kubectl create serviceaccount NAME [--dry-run] * [kubectl create](kubectl_create.md) - Create a resource by filename or stdin -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_create_serviceaccount.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_delete.md b/docs/user-guide/kubectl/kubectl_delete.md index c6e546832ae..de803e05010 100644 --- a/docs/user-guide/kubectl/kubectl_delete.md +++ b/docs/user-guide/kubectl/kubectl_delete.md @@ -83,6 +83,7 @@ kubectl delete pods --all -f, --filename=[]: Filename, directory, or URL to a file containing the resource to delete. --grace-period=-1: Period of time in seconds given to the resource to terminate gracefully. Ignored if negative. --ignore-not-found[=false]: Treat "resource not found" as a successful delete. Defaults to "true" when --all is specified. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": Output mode. Use "-o name" for shorter output (resource/name). -R, --recursive[=false]: If true, process directory recursively. -l, --selector="": Selector (label query) to filter on. @@ -120,7 +121,7 @@ kubectl delete pods --all * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_delete.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_describe.md b/docs/user-guide/kubectl/kubectl_describe.md index 2a55ebe7b13..9d63a8fd651 100644 --- a/docs/user-guide/kubectl/kubectl_describe.md +++ b/docs/user-guide/kubectl/kubectl_describe.md @@ -86,6 +86,7 @@ kubectl describe pods frontend ``` -f, --filename=[]: Filename, directory, or URL to a file containing the resource to describe + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -R, --recursive[=false]: If true, process directory recursively. -l, --selector="": Selector (label query) to filter on ``` @@ -121,7 +122,7 @@ kubectl describe pods frontend * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_describe.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_drain.md b/docs/user-guide/kubectl/kubectl_drain.md index 4f121808281..0f612eb0345 100644 --- a/docs/user-guide/kubectl/kubectl_drain.md +++ b/docs/user-guide/kubectl/kubectl_drain.md @@ -108,7 +108,7 @@ $ kubectl drain foo --grace-period=900 * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 31-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_drain.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_edit.md b/docs/user-guide/kubectl/kubectl_edit.md index b7a7875c198..6e7e598bd9f 100644 --- a/docs/user-guide/kubectl/kubectl_edit.md +++ b/docs/user-guide/kubectl/kubectl_edit.md @@ -80,6 +80,7 @@ kubectl edit (RESOURCE/NAME | -f FILENAME) ``` -f, --filename=[]: Filename, directory, or URL to file to use to edit the resource + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="yaml": Output format. One of: yaml|json. --output-version="": Output the formatted object with the given group version (for ex: 'extensions/v1beta1'). --record[=false]: Record current kubectl command in the resource annotation. @@ -119,7 +120,7 @@ kubectl edit (RESOURCE/NAME | -f FILENAME) * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_edit.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_exec.md b/docs/user-guide/kubectl/kubectl_exec.md index 96e4b66b5d3..8aac4accd2f 100644 --- a/docs/user-guide/kubectl/kubectl_exec.md +++ b/docs/user-guide/kubectl/kubectl_exec.md @@ -99,7 +99,7 @@ kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_exec.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_explain.md b/docs/user-guide/kubectl/kubectl_explain.md index 4c76a8001cc..c5a2bb603b5 100644 --- a/docs/user-guide/kubectl/kubectl_explain.md +++ b/docs/user-guide/kubectl/kubectl_explain.md @@ -64,6 +64,7 @@ kubectl explain pods.spec.containers ### Options ``` + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --recursive[=false]: Print the fields of fields (Currently only 1 level deep) ``` @@ -98,7 +99,7 @@ kubectl explain pods.spec.containers * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 25-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_explain.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_expose.md b/docs/user-guide/kubectl/kubectl_expose.md index 628f000e4c1..ef0f723a328 100644 --- a/docs/user-guide/kubectl/kubectl_expose.md +++ b/docs/user-guide/kubectl/kubectl_expose.md @@ -138,7 +138,7 @@ kubectl expose deployment nginx --port=80 --target-port=8000 * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_expose.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_get.md b/docs/user-guide/kubectl/kubectl_get.md index 643bf54e758..8fd350ff621 100644 --- a/docs/user-guide/kubectl/kubectl_get.md +++ b/docs/user-guide/kubectl/kubectl_get.md @@ -88,6 +88,7 @@ kubectl get rc/web service/frontend pods/web-pod-13je7 --all-namespaces[=false]: If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace. --export[=false]: If true, use 'export' for the resources. Exported resources are stripped of cluster-specific information. -f, --filename=[]: Filename, directory, or URL to a file identifying the resource to get from a server. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -L, --label-columns=[]: Accepts a comma separated list of labels that are going to be presented as columns. Names are case-sensitive. You can also use multiple flag statements like -L label1 -L label2... --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. @@ -133,7 +134,7 @@ kubectl get rc/web service/frontend pods/web-pod-13je7 * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_get.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_label.md b/docs/user-guide/kubectl/kubectl_label.md index 716de827f8c..87a5ee968fe 100644 --- a/docs/user-guide/kubectl/kubectl_label.md +++ b/docs/user-guide/kubectl/kubectl_label.md @@ -78,6 +78,7 @@ kubectl label pods foo bar- --all[=false]: select all resources in the namespace of the specified resource types --dry-run[=false]: If true, only print the object that would be sent, without sending it. -f, --filename=[]: Filename, directory, or URL to a file identifying the resource to update the labels + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. --output-version="": Output the formatted object with the given group version (for ex: 'extensions/v1beta1'). @@ -123,7 +124,7 @@ kubectl label pods foo bar- * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_label.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_logs.md b/docs/user-guide/kubectl/kubectl_logs.md index e0892a9980a..8a2e4bb6477 100644 --- a/docs/user-guide/kubectl/kubectl_logs.md +++ b/docs/user-guide/kubectl/kubectl_logs.md @@ -69,6 +69,7 @@ kubectl logs --since=1h nginx ``` -c, --container="": Print the logs of this container -f, --follow[=false]: Specify if the logs should be streamed. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --limit-bytes=0: Maximum bytes of logs to return. Defaults to no limit. -p, --previous[=false]: If true, print the logs for the previous instance of the container in a pod if it exists. --since=0: Only return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs. Only one of since-time / since may be used. @@ -108,7 +109,7 @@ kubectl logs --since=1h nginx * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_logs.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_namespace.md b/docs/user-guide/kubectl/kubectl_namespace.md index dd347557396..8cd41ad464c 100644 --- a/docs/user-guide/kubectl/kubectl_namespace.md +++ b/docs/user-guide/kubectl/kubectl_namespace.md @@ -79,7 +79,7 @@ kubectl namespace [namespace] * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_namespace.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_patch.md b/docs/user-guide/kubectl/kubectl_patch.md index afe58dcd572..93be2b28af4 100644 --- a/docs/user-guide/kubectl/kubectl_patch.md +++ b/docs/user-guide/kubectl/kubectl_patch.md @@ -70,6 +70,7 @@ kubectl patch pod valid-pod -type='json' -p='[{"op": "replace", "path": "/spec/c ``` -f, --filename=[]: Filename, directory, or URL to a file identifying the resource to update + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": Output mode. Use "-o name" for shorter output (resource/name). -p, --patch="": The patch to be applied to the resource JSON file. --record[=false]: Record current kubectl command in the resource annotation. @@ -108,7 +109,7 @@ kubectl patch pod valid-pod -type='json' -p='[{"op": "replace", "path": "/spec/c * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_patch.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_port-forward.md b/docs/user-guide/kubectl/kubectl_port-forward.md index 8e971d2c72b..256c341a60f 100644 --- a/docs/user-guide/kubectl/kubectl_port-forward.md +++ b/docs/user-guide/kubectl/kubectl_port-forward.md @@ -99,7 +99,7 @@ kubectl port-forward mypod 0:5000 * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_port-forward.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_proxy.md b/docs/user-guide/kubectl/kubectl_proxy.md index 462e301c742..4a84fb438aa 100644 --- a/docs/user-guide/kubectl/kubectl_proxy.md +++ b/docs/user-guide/kubectl/kubectl_proxy.md @@ -122,7 +122,7 @@ kubectl proxy --api-prefix=/k8s-api * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_proxy.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_replace.md b/docs/user-guide/kubectl/kubectl_replace.md index 6302d5e939d..a3548f6c1b8 100644 --- a/docs/user-guide/kubectl/kubectl_replace.md +++ b/docs/user-guide/kubectl/kubectl_replace.md @@ -74,6 +74,7 @@ kubectl replace --force -f ./pod.json -f, --filename=[]: Filename, directory, or URL to file to use to replace the resource. --force[=false]: Delete and re-create the specified resource --grace-period=-1: Only relevant during a force replace. Period of time in seconds given to the old resource to terminate gracefully. Ignored if negative. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": Output mode. Use "-o name" for shorter output (resource/name). --record[=false]: Record current kubectl command in the resource annotation. -R, --recursive[=false]: If true, process directory recursively. @@ -114,7 +115,7 @@ kubectl replace --force -f ./pod.json * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_replace.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_rolling-update.md b/docs/user-guide/kubectl/kubectl_rolling-update.md index 81dbaec25b1..a99d66d66a9 100644 --- a/docs/user-guide/kubectl/kubectl_rolling-update.md +++ b/docs/user-guide/kubectl/kubectl_rolling-update.md @@ -78,6 +78,7 @@ kubectl rolling-update frontend-v1 frontend-v2 --rollback --dry-run[=false]: If true, print out the changes that would be made, but don't actually make them. -f, --filename=[]: Filename or URL to file to use to create the new replication controller. --image="": Image to use for upgrading the replication controller. Must be distinct from the existing image (either new image or new image tag). Can not be used with --filename/-f + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] --no-headers[=false]: When using the default output, don't print headers. -o, --output="": Output format. One of: json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://releases.k8s.io/HEAD/docs/user-guide/jsonpath.md]. --output-version="": Output the formatted object with the given group version (for ex: 'extensions/v1beta1'). @@ -124,7 +125,7 @@ kubectl rolling-update frontend-v1 frontend-v2 --rollback * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_rolling-update.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_rollout.md b/docs/user-guide/kubectl/kubectl_rollout.md index 3242d8aa00e..90b65db7d38 100644 --- a/docs/user-guide/kubectl/kubectl_rollout.md +++ b/docs/user-guide/kubectl/kubectl_rollout.md @@ -87,7 +87,7 @@ kubectl rollout undo deployment/abc * [kubectl rollout resume](kubectl_rollout_resume.md) - Resume a paused resource * [kubectl rollout undo](kubectl_rollout_undo.md) - undoes a previous rollout -###### Auto generated by spf13/cobra on 21-Mar-2016 +###### Auto generated by spf13/cobra on 25-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_rollout.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_rollout_history.md b/docs/user-guide/kubectl/kubectl_rollout_history.md index 5ee18b5205b..97cc674f776 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_history.md +++ b/docs/user-guide/kubectl/kubectl_rollout_history.md @@ -94,7 +94,7 @@ kubectl rollout history deployment/abc --revision=3 * [kubectl rollout](kubectl_rollout.md) - rollout manages a deployment -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_rollout_history.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_rollout_pause.md b/docs/user-guide/kubectl/kubectl_rollout_pause.md index 022d060b851..8f85f55dee9 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_pause.md +++ b/docs/user-guide/kubectl/kubectl_rollout_pause.md @@ -96,7 +96,7 @@ kubectl rollout pause deployment/nginx * [kubectl rollout](kubectl_rollout.md) - rollout manages a deployment -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_rollout_pause.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_rollout_resume.md b/docs/user-guide/kubectl/kubectl_rollout_resume.md index 9787b2f7245..6da9e8d46ae 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_resume.md +++ b/docs/user-guide/kubectl/kubectl_rollout_resume.md @@ -94,7 +94,7 @@ kubectl rollout resume deployment/nginx * [kubectl rollout](kubectl_rollout.md) - rollout manages a deployment -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_rollout_resume.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_rollout_undo.md b/docs/user-guide/kubectl/kubectl_rollout_undo.md index c50e0f25fa8..ba5357d166b 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_undo.md +++ b/docs/user-guide/kubectl/kubectl_rollout_undo.md @@ -94,7 +94,7 @@ kubectl rollout undo deployment/abc --to-revision=3 * [kubectl rollout](kubectl_rollout.md) - rollout manages a deployment -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_rollout_undo.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_run.md b/docs/user-guide/kubectl/kubectl_run.md index 6a3ac1de7f3..fbb4eaf8d91 100644 --- a/docs/user-guide/kubectl/kubectl_run.md +++ b/docs/user-guide/kubectl/kubectl_run.md @@ -91,6 +91,7 @@ kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print --generator="": The name of the API generator to use. Default is 'deployment/v1beta1' if --restart=Always, otherwise the default is 'job/v1'. This will happen only for cluster version at least 1.2, for olders we will fallback to 'run/v1' for --restart=Always, 'run-pod/v1' for others. --hostport=-1: The host port mapping for the container port. To demonstrate a single-machine container. --image="": The image for the container to run. + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -l, --labels="": Labels to apply to the pod(s). --leave-stdin-open[=false]: If the pod is started in interactive mode or with stdin, leave stdin open after the first attach completes. By default, stdin will be closed after the first attach completes. --limits="": The resource requirement limits for this container. For example, 'cpu=200m,memory=512Mi' @@ -146,7 +147,7 @@ kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 11-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_run.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_scale.md b/docs/user-guide/kubectl/kubectl_scale.md index 4acffcb2114..855a070df5a 100644 --- a/docs/user-guide/kubectl/kubectl_scale.md +++ b/docs/user-guide/kubectl/kubectl_scale.md @@ -74,6 +74,7 @@ kubectl scale --replicas=3 job/cron ``` --current-replicas=-1: Precondition for current size. Requires that the current size of the resource match this value in order to scale. -f, --filename=[]: Filename, directory, or URL to a file identifying the resource to set a new size + --include-extended-apis[=true]: If true, include definitions of new APIs via calls to the API server. [default true] -o, --output="": Output mode. Use "-o name" for shorter output (resource/name). --record[=false]: Record current kubectl command in the resource annotation. -R, --recursive[=false]: If true, process directory recursively. @@ -113,7 +114,7 @@ kubectl scale --replicas=3 job/cron * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 28-Mar-2016 +###### Auto generated by spf13/cobra on 30-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_scale.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_uncordon.md b/docs/user-guide/kubectl/kubectl_uncordon.md index 58a890f3733..a5a15f4bd70 100644 --- a/docs/user-guide/kubectl/kubectl_uncordon.md +++ b/docs/user-guide/kubectl/kubectl_uncordon.md @@ -85,7 +85,7 @@ $ kubectl uncordon foo * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 31-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_uncordon.md?pixel)]() diff --git a/docs/user-guide/kubectl/kubectl_version.md b/docs/user-guide/kubectl/kubectl_version.md index 06acb2a84e6..0e97c66d30a 100644 --- a/docs/user-guide/kubectl/kubectl_version.md +++ b/docs/user-guide/kubectl/kubectl_version.md @@ -82,7 +82,7 @@ kubectl version * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -###### Auto generated by spf13/cobra on 2-Mar-2016 +###### Auto generated by spf13/cobra on 23-Mar-2016 [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_version.md?pixel)]() diff --git a/hack/verify-flags/known-flags.txt b/hack/verify-flags/known-flags.txt index bd360f2efd4..496ffa3f11e 100644 --- a/hack/verify-flags/known-flags.txt +++ b/hack/verify-flags/known-flags.txt @@ -162,6 +162,7 @@ ignore-daemonsets ignore-not-found image-gc-high-threshold image-gc-low-threshold +include-extended-apis input-dirs insecure-bind-address insecure-port diff --git a/pkg/apimachinery/registered/registered.go b/pkg/apimachinery/registered/registered.go index a660c223f31..c1e1511beee 100644 --- a/pkg/apimachinery/registered/registered.go +++ b/pkg/apimachinery/registered/registered.go @@ -35,6 +35,10 @@ var ( // registeredGroupVersions stores all API group versions for which RegisterGroup is called. registeredVersions = map[unversioned.GroupVersion]struct{}{} + // thirdPartyGroupVersions are API versions which are dynamically + // registered (and unregistered) via API calls to the apiserver + thirdPartyGroupVersions []unversioned.GroupVersion + // enabledVersions represents all enabled API versions. It should be a // subset of registeredVersions. Please call EnableVersions() to add // enabled versions. @@ -158,6 +162,51 @@ func IsRegistered(group string) bool { return found } +// IsRegisteredVersion returns if a version is registered. +func IsRegisteredVersion(v unversioned.GroupVersion) bool { + _, found := registeredVersions[v] + return found +} + +// IsThirdPartyAPIGroupVersion returns true if the api version is a user-registered group/version. +func IsThirdPartyAPIGroupVersion(gv unversioned.GroupVersion) bool { + for ix := range thirdPartyGroupVersions { + if thirdPartyGroupVersions[ix] == gv { + return true + } + } + return false +} + +// AddThirdPartyAPIGroupVersions sets the list of third party versions, +// registers them in the API machinery and enables them. +// Skips GroupVersions that are already registered. +// Returns the list of GroupVersions that were skipped. +func AddThirdPartyAPIGroupVersions(gvs ...unversioned.GroupVersion) []unversioned.GroupVersion { + filteredGVs := []unversioned.GroupVersion{} + skippedGVs := []unversioned.GroupVersion{} + for ix := range gvs { + if !IsRegisteredVersion(gvs[ix]) { + filteredGVs = append(filteredGVs, gvs[ix]) + } else { + glog.V(3).Infof("Skipping %s, because its already registered", gvs[ix].String()) + skippedGVs = append(skippedGVs, gvs[ix]) + } + } + if len(filteredGVs) == 0 { + return skippedGVs + } + RegisterVersions(filteredGVs) + EnableVersions(filteredGVs...) + next := make([]unversioned.GroupVersion, len(gvs)) + for ix := range filteredGVs { + next[ix] = filteredGVs[ix] + } + thirdPartyGroupVersions = next + + return skippedGVs +} + // TODO: This is an expedient function, because we don't check if a Group is // supported throughout the code base. We will abandon this function and // checking the error returned by the Group() function. diff --git a/pkg/client/restclient/client.go b/pkg/client/restclient/client.go index ba6e009cc18..7522b6c2b8f 100644 --- a/pkg/client/restclient/client.go +++ b/pkg/client/restclient/client.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util/flowcontrol" ) @@ -159,3 +160,7 @@ func (c *RESTClient) Delete() *Request { func (c *RESTClient) APIVersion() unversioned.GroupVersion { return *c.contentConfig.GroupVersion } + +func (c *RESTClient) Codec() runtime.Codec { + return c.contentConfig.Codec +} diff --git a/pkg/kubectl/cmd/annotate.go b/pkg/kubectl/cmd/annotate.go index 1737152b877..cb77a50cc6f 100644 --- a/pkg/kubectl/cmd/annotate.go +++ b/pkg/kubectl/cmd/annotate.go @@ -110,6 +110,7 @@ func NewCmdAnnotate(f *cmdutil.Factory, out io.Writer) *cobra.Command { }, } cmdutil.AddPrinterFlags(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) cmd.Flags().StringVarP(&options.selector, "selector", "l", "", "Selector (label query) to filter on") cmd.Flags().BoolVar(&options.overwrite, "overwrite", false, "If true, allow annotations to be overwritten, otherwise reject annotation updates that overwrite existing annotations.") cmd.Flags().BoolVar(&options.all, "all", false, "select all resources in the namespace of the specified resource types") @@ -161,7 +162,7 @@ func (o *AnnotateOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra o.recordChangeCause = cmdutil.GetRecordFlag(cmd) o.changeCause = f.Command() - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) o.builder = resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). @@ -246,11 +247,13 @@ func (o AnnotateOptions) RunAnnotate() error { if err != nil { return err } + + mapper, _ := o.f.Object(cmdutil.GetIncludeThirdPartyAPIs(o.cmd)) outputFormat := cmdutil.GetFlagString(o.cmd, "output") if outputFormat != "" { - return o.f.PrintObject(o.cmd, outputObj, o.out) + return o.f.PrintObject(o.cmd, mapper, outputObj, o.out) } - mapper, _ := o.f.Object() + cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, "annotated") return nil }) diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index 7c25de7efcc..f673ecddb70 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -72,6 +72,7 @@ func NewCmdApply(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.AddRecursiveFlag(cmd, &options.Recursive) cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -95,7 +96,7 @@ func RunApply(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *Ap return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). Schema(schema). ContinueOnError(). diff --git a/pkg/kubectl/cmd/autoscale.go b/pkg/kubectl/cmd/autoscale.go index 4ceb59447fc..fcb19052151 100644 --- a/pkg/kubectl/cmd/autoscale.go +++ b/pkg/kubectl/cmd/autoscale.go @@ -74,6 +74,7 @@ func NewCmdAutoscale(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.AddRecursiveFlag(cmd, &options.Recursive) cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -88,7 +89,7 @@ func RunAutoscale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args [] return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). @@ -157,7 +158,7 @@ func RunAutoscale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args [] } // TODO: extract this flag to a central location, when such a location exists. if cmdutil.GetFlagBool(cmd, "dry-run") { - return f.PrintObject(cmd, object, out) + return f.PrintObject(cmd, mapper, object, out) } if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), hpa, f.JSONEncoder()); err != nil { @@ -170,7 +171,7 @@ func RunAutoscale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args [] } if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, object, out) + return f.PrintObject(cmd, mapper, object, out) } cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, "autoscaled") return nil diff --git a/pkg/kubectl/cmd/clusterinfo.go b/pkg/kubectl/cmd/clusterinfo.go index c76e28f7c63..66843bf3178 100644 --- a/pkg/kubectl/cmd/clusterinfo.go +++ b/pkg/kubectl/cmd/clusterinfo.go @@ -42,6 +42,7 @@ func NewCmdClusterInfo(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.CheckErr(err) }, } + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -56,7 +57,7 @@ func RunClusterInfo(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command) error } printService(out, "Kubernetes master", client.Host) - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) cmdNamespace := cmdutil.GetFlagString(cmd, "namespace") if cmdNamespace == "" { cmdNamespace = api.NamespaceSystem diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index 6dd0e3e24df..6d4ac0a58e2 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -180,7 +180,7 @@ func NewTestFactory() (*cmdutil.Factory, *testFactory, runtime.Codec) { Typer: scheme, } return &cmdutil.Factory{ - Object: func() (meta.RESTMapper, runtime.ObjectTyper) { + Object: func(discovery bool) (meta.RESTMapper, runtime.ObjectTyper) { priorityRESTMapper := meta.PriorityRESTMapper{ Delegate: t.Mapper, ResourcePriority: []unversioned.GroupVersionResource{ @@ -221,7 +221,7 @@ func NewTestFactory() (*cmdutil.Factory, *testFactory, runtime.Codec) { func NewMixedFactory(apiClient resource.RESTClient) (*cmdutil.Factory, *testFactory, runtime.Codec) { f, t, c := NewTestFactory() - f.Object = func() (meta.RESTMapper, runtime.ObjectTyper) { + f.Object = func(discovery bool) (meta.RESTMapper, runtime.ObjectTyper) { priorityRESTMapper := meta.PriorityRESTMapper{ Delegate: meta.MultiRESTMapper{t.Mapper, testapi.Default.RESTMapper()}, ResourcePriority: []unversioned.GroupVersionResource{ @@ -248,7 +248,7 @@ func NewAPIFactory() (*cmdutil.Factory, *testFactory, runtime.Codec) { } f := &cmdutil.Factory{ - Object: func() (meta.RESTMapper, runtime.ObjectTyper) { + Object: func(discovery bool) (meta.RESTMapper, runtime.ObjectTyper) { return testapi.Default.RESTMapper(), api.Scheme }, Client: func() (*client.Client, error) { @@ -380,7 +380,8 @@ func ExamplePrintReplicationControllerWithNamespace() { Replicas: 1, }, } - err := f.PrintObject(cmd, ctrl, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -428,7 +429,8 @@ func ExamplePrintMultiContainersReplicationControllerWithWide() { Replicas: 1, }, } - err := f.PrintObject(cmd, ctrl, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -476,7 +478,8 @@ func ExamplePrintReplicationController() { Replicas: 1, }, } - err := f.PrintObject(cmd, ctrl, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -511,7 +514,8 @@ func ExamplePrintPodWithWideFormat() { }, }, } - err := f.PrintObject(cmd, pod, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, pod, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -550,7 +554,8 @@ func ExamplePrintPodWithShowLabels() { }, }, } - err := f.PrintObject(cmd, pod, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, pod, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -660,7 +665,8 @@ func ExamplePrintPodHideTerminated() { } cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) podList := newAllPhasePodList() - err := f.PrintObject(cmd, podList, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, podList, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -680,7 +686,8 @@ func ExamplePrintPodShowAll() { } cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) podList := newAllPhasePodList() - err := f.PrintObject(cmd, podList, os.Stdout) + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, podList, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -748,7 +755,9 @@ func ExamplePrintServiceWithNamespacesAndLabels() { } ld := util.NewLineDelimiter(os.Stdout, "|") defer ld.Flush() - err := f.PrintObject(cmd, svc, ld) + + mapper, _ := f.Object(false) + err := f.PrintObject(cmd, mapper, svc, ld) if err != nil { fmt.Printf("Unexpected error: %v", err) } diff --git a/pkg/kubectl/cmd/convert.go b/pkg/kubectl/cmd/convert.go index 64959f8f3a4..d6b8003b266 100644 --- a/pkg/kubectl/cmd/convert.go +++ b/pkg/kubectl/cmd/convert.go @@ -79,7 +79,7 @@ func NewCmdConvert(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) cmd.Flags().BoolVar(&options.local, "local", true, "If true, convert will NOT try to contact api-server but run locally.") - + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -109,8 +109,9 @@ func (o *ConvertOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra. } // build the builder - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) clientMapper := resource.ClientMapperFunc(f.ClientForMapping) + if o.local { fmt.Fprintln(out, "running in local mode...") o.builder = resource.NewBuilder(mapper, typer, resource.DisabledClientForMapping{ClientMapper: clientMapper}, f.Decoder(true)) diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index 1edecccce04..81eedf5ef19 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -76,6 +76,7 @@ func NewCmdCreate(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) // create subcommands cmd.AddCommand(NewCmdCreateNamespace(f, out)) @@ -103,7 +104,7 @@ func RunCreate(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *C return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). Schema(schema). ContinueOnError(). @@ -223,7 +224,7 @@ func RunCreateSubcommand(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, if err != nil { return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) gvk, err := typer.ObjectKind(obj) mapping, err := mapper.RESTMapping(unversioned.GroupKind{Group: gvk.Group, Kind: gvk.Kind}, gvk.Version) if err != nil { @@ -257,5 +258,5 @@ func RunCreateSubcommand(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, return nil } - return f.PrintObject(cmd, obj, out) + return f.PrintObject(cmd, mapper, obj, out) } diff --git a/pkg/kubectl/cmd/create_namespace.go b/pkg/kubectl/cmd/create_namespace.go index fcb4be75c7f..299c5e9408c 100644 --- a/pkg/kubectl/cmd/create_namespace.go +++ b/pkg/kubectl/cmd/create_namespace.go @@ -51,6 +51,7 @@ func NewCmdCreateNamespace(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) cmdutil.AddGeneratorFlags(cmd, cmdutil.NamespaceV1GeneratorName) + return cmd } diff --git a/pkg/kubectl/cmd/create_secret.go b/pkg/kubectl/cmd/create_secret.go index 3028da743df..48cb8f99b08 100644 --- a/pkg/kubectl/cmd/create_secret.go +++ b/pkg/kubectl/cmd/create_secret.go @@ -38,6 +38,7 @@ func NewCmdCreateSecret(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { } cmd.AddCommand(NewCmdCreateSecretDockerRegistry(f, cmdOut)) cmd.AddCommand(NewCmdCreateSecretGeneric(f, cmdOut)) + return cmd } @@ -155,6 +156,7 @@ func NewCmdCreateSecretDockerRegistry(f *cmdutil.Factory, cmdOut io.Writer) *cob cmd.Flags().String("docker-email", "", "Email for Docker registry") cmd.MarkFlagRequired("docker-email") cmd.Flags().String("docker-server", "https://index.docker.io/v1/", "Server location for Docker registry") + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } diff --git a/pkg/kubectl/cmd/create_serviceaccount.go b/pkg/kubectl/cmd/create_serviceaccount.go index bd6f7eb8f5b..61d2d3cc516 100644 --- a/pkg/kubectl/cmd/create_serviceaccount.go +++ b/pkg/kubectl/cmd/create_serviceaccount.go @@ -50,6 +50,7 @@ func NewCmdCreateServiceAccount(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Com cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceAccountV1GeneratorName) return cmd } diff --git a/pkg/kubectl/cmd/delete.go b/pkg/kubectl/cmd/delete.go index e3b1a7eacee..a6c07e243e0 100644 --- a/pkg/kubectl/cmd/delete.go +++ b/pkg/kubectl/cmd/delete.go @@ -100,6 +100,7 @@ func NewCmdDelete(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().Int("grace-period", -1, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative.") cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object") cmdutil.AddOutputFlagsForMutation(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -109,7 +110,7 @@ func RunDelete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str return err } deleteAll := cmdutil.GetFlagBool(cmd, "all") - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/describe.go b/pkg/kubectl/cmd/describe.go index ca6854c31aa..85e80da48c0 100644 --- a/pkg/kubectl/cmd/describe.go +++ b/pkg/kubectl/cmd/describe.go @@ -89,6 +89,7 @@ func NewCmdDescribe(f *cmdutil.Factory, out io.Writer) *cobra.Command { kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) cmdutil.AddRecursiveFlag(cmd, &options.Recursive) cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on") + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -103,7 +104,7 @@ func RunDescribe(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s return cmdutil.UsageError(cmd, "Required resource not specified.") } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 1455f486e57..67962827515 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -60,7 +60,7 @@ kubectl cordon foo func NewCmdCordon(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &DrainOptions{factory: f, out: out} - return &cobra.Command{ + cmd := &cobra.Command{ Use: "cordon NODE", Short: "Mark node as unschedulable", Long: cordon_long, @@ -70,6 +70,7 @@ func NewCmdCordon(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.CheckErr(options.RunCordonOrUncordon(true)) }, } + return cmd } const ( @@ -83,7 +84,7 @@ $ kubectl uncordon foo func NewCmdUncordon(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &DrainOptions{factory: f, out: out} - return &cobra.Command{ + cmd := &cobra.Command{ Use: "uncordon NODE", Short: "Mark node as schedulable", Long: uncordon_long, @@ -93,6 +94,7 @@ func NewCmdUncordon(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.CheckErr(options.RunCordonOrUncordon(false)) }, } + return cmd } const ( @@ -149,14 +151,14 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { return err } - o.mapper, o.typer = o.factory.Object() + o.mapper, o.typer = o.factory.Object(false) cmdNamespace, _, err := o.factory.DefaultNamespace() if err != nil { return err } - r := o.factory.NewBuilder(). + r := o.factory.NewBuilder(cmdutil.GetIncludeThirdPartyAPIs(cmd)). NamespaceParam(cmdNamespace).DefaultNamespace(). ResourceNames("node", args[0]). Do() diff --git a/pkg/kubectl/cmd/edit.go b/pkg/kubectl/cmd/edit.go index 8a8a001e98f..abfa32b00b8 100644 --- a/pkg/kubectl/cmd/edit.go +++ b/pkg/kubectl/cmd/edit.go @@ -107,6 +107,7 @@ func NewCmdEdit(f *cmdutil.Factory, out, errOut io.Writer) *cobra.Command { cmd.Flags().Bool("windows-line-endings", gruntime.GOOS == "windows", "Use Windows line-endings (default Unix line-endings)") cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -129,7 +130,7 @@ func RunEdit(f *cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) resourceMapper := &resource.Mapper{ ObjectTyper: typer, RESTMapper: mapper, diff --git a/pkg/kubectl/cmd/explain.go b/pkg/kubectl/cmd/explain.go index 6b868f5de29..ce959e39408 100644 --- a/pkg/kubectl/cmd/explain.go +++ b/pkg/kubectl/cmd/explain.go @@ -52,6 +52,7 @@ func NewCmdExplain(f *cmdutil.Factory, out io.Writer) *cobra.Command { }, } cmd.Flags().Bool("recursive", false, "Print the fields of fields (Currently only 1 level deep)") + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -65,7 +66,7 @@ func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []st apiVersionString := cmdutil.GetFlagString(cmd, "api-version") apiVersion := unversioned.GroupVersion{} - mapper, _ := f.Object() + mapper, _ := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) // TODO: After we figured out the new syntax to separate group and resource, allow // the users to use it in explain (kubectl explain ). // Refer to issue #16039 for why we do this. Refer to PR #15808 that used "/" syntax. diff --git a/pkg/kubectl/cmd/expose.go b/pkg/kubectl/cmd/expose.go index 2eb4d736cb7..6a7e804fc12 100644 --- a/pkg/kubectl/cmd/expose.go +++ b/pkg/kubectl/cmd/expose.go @@ -115,7 +115,7 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str return err } - mapper, typer := f.Object() + mapper, typer := f.Object(false) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). @@ -229,7 +229,7 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str info.Refresh(object, true) // TODO: extract this flag to a central location, when such a location exists. if cmdutil.GetFlagBool(cmd, "dry-run") { - return f.PrintObject(cmd, object, out) + return f.PrintObject(cmd, mapper, object, out) } if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), info, f.JSONEncoder()); err != nil { return err @@ -242,7 +242,7 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str } if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, object, out) + return f.PrintObject(cmd, mapper, object, out) } cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, "exposed") return nil diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 0a253f89821..493fff9f4ae 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -102,6 +102,7 @@ func NewCmdGet(f *cmdutil.Factory, out io.Writer) *cobra.Command { usage := "Filename, directory, or URL to a file identifying the resource to get from a server." kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) cmdutil.AddRecursiveFlag(cmd, &options.Recursive) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -110,7 +111,7 @@ func NewCmdGet(f *cmdutil.Factory, out io.Writer) *cobra.Command { func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *GetOptions) error { selector := cmdutil.GetFlagString(cmd, "selector") allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces") - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index f0d82a6b702..091d7a23e0d 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -100,6 +100,7 @@ func NewCmdLabel(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.AddRecursiveFlag(cmd, &options.Recursive) cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without sending it.") cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -204,8 +205,7 @@ func RunLabel(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri if err != nil { return cmdutil.UsageError(cmd, err.Error()) } - mapper, typer := f.Object() - + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) b := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -296,7 +296,7 @@ func RunLabel(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri } outputFormat := cmdutil.GetFlagString(cmd, "output") if outputFormat != "" { - return f.PrintObject(cmd, outputObj, out) + return f.PrintObject(cmd, mapper, outputObj, out) } cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, dataChangeMsg) return nil diff --git a/pkg/kubectl/cmd/logs.go b/pkg/kubectl/cmd/logs.go index 0c1bbca407e..b79d8c07d12 100644 --- a/pkg/kubectl/cmd/logs.go +++ b/pkg/kubectl/cmd/logs.go @@ -101,6 +101,7 @@ func NewCmdLogs(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().Bool("interactive", false, "If true, prompt the user for input when required.") cmd.Flags().MarkDeprecated("interactive", "This flag is no longer respected and there is no replacement.") + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -155,7 +156,7 @@ func (o *LogsOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Com o.ClientMapper = resource.ClientMapperFunc(f.ClientForMapping) o.Out = out - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) decoder := f.Decoder(true) if o.Object == nil { infos, err := resource.NewBuilder(mapper, typer, o.ClientMapper, decoder). diff --git a/pkg/kubectl/cmd/patch.go b/pkg/kubectl/cmd/patch.go index 5ab7a1e501f..093a82543ff 100644 --- a/pkg/kubectl/cmd/patch.go +++ b/pkg/kubectl/cmd/patch.go @@ -80,6 +80,7 @@ func NewCmdPatch(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().String("type", "strategic", fmt.Sprintf("The type of patch being provided; one of %v", sets.StringKeySet(patchTypes).List())) cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) usage := "Filename, directory, or URL to a file identifying the resource to update" kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) @@ -112,7 +113,7 @@ func RunPatch(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri return fmt.Errorf("unable to parse %q: %v", patch, err) } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/replace.go b/pkg/kubectl/cmd/replace.go index 807e0d409a6..e7157ebb3ef 100644 --- a/pkg/kubectl/cmd/replace.go +++ b/pkg/kubectl/cmd/replace.go @@ -87,6 +87,8 @@ func NewCmdReplace(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) + return cmd } @@ -114,7 +116,7 @@ func RunReplace(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []st return forceReplace(f, out, cmd, args, shortOutput, options) } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). Schema(schema). ContinueOnError(). @@ -182,7 +184,7 @@ func forceReplace(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args [] } } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index c2b41d103c2..b6956e9cf9e 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -102,6 +102,8 @@ func NewCmdRollingUpdate(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().Bool("rollback", false, "If true, this is a request to abort an existing rollout that is partially rolled out. It effectively reverses current and next and runs a rollout") cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) + return cmd } @@ -190,7 +192,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg var keepOldName bool var replicasDefaulted bool - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) if len(filename) != 0 { schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) @@ -311,10 +313,10 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg oldRcData.WriteString(oldRc.Name) newRcData.WriteString(newRc.Name) } else { - if err := f.PrintObject(cmd, oldRc, oldRcData); err != nil { + if err := f.PrintObject(cmd, mapper, oldRc, oldRcData); err != nil { return err } - if err := f.PrintObject(cmd, newRc, newRcData); err != nil { + if err := f.PrintObject(cmd, mapper, newRc, newRcData); err != nil { return err } } @@ -359,7 +361,7 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg return err } if outputFormat != "" { - return f.PrintObject(cmd, newRc, out) + return f.PrintObject(cmd, mapper, newRc, out) } kind, err := api.Scheme.ObjectKind(newRc) if err != nil { diff --git a/pkg/kubectl/cmd/rollout/rollout.go b/pkg/kubectl/cmd/rollout/rollout.go index ab5b2e6bc98..93e9f2362b6 100644 --- a/pkg/kubectl/cmd/rollout/rollout.go +++ b/pkg/kubectl/cmd/rollout/rollout.go @@ -43,7 +43,6 @@ func NewCmdRollout(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Help() }, } - // subcommands cmd.AddCommand(NewCmdRolloutHistory(f, out)) cmd.AddCommand(NewCmdRolloutPause(f, out)) diff --git a/pkg/kubectl/cmd/rollout/rollout_history.go b/pkg/kubectl/cmd/rollout/rollout_history.go index 522f005ee7b..09fddde633d 100644 --- a/pkg/kubectl/cmd/rollout/rollout_history.go +++ b/pkg/kubectl/cmd/rollout/rollout_history.go @@ -70,7 +70,7 @@ func RunHistory(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []st } revisionDetail := cmdutil.GetFlagInt64(cmd, "revision") - mapper, typer := f.Object() + mapper, typer := f.Object(false) cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { diff --git a/pkg/kubectl/cmd/rollout/rollout_pause.go b/pkg/kubectl/cmd/rollout/rollout_pause.go index 16dffe6c24e..5eed89fdeca 100644 --- a/pkg/kubectl/cmd/rollout/rollout_pause.go +++ b/pkg/kubectl/cmd/rollout/rollout_pause.go @@ -80,7 +80,7 @@ func (o *PauseConfig) CompletePause(f *cmdutil.Factory, cmd *cobra.Command, out return cmdutil.UsageError(cmd, cmd.Use) } - o.Mapper, o.Typer = f.Object() + o.Mapper, o.Typer = f.Object(false) o.PauseObject = f.PauseObject o.Out = out diff --git a/pkg/kubectl/cmd/rollout/rollout_resume.go b/pkg/kubectl/cmd/rollout/rollout_resume.go index b76e66912f2..cbdfc0dc3f2 100644 --- a/pkg/kubectl/cmd/rollout/rollout_resume.go +++ b/pkg/kubectl/cmd/rollout/rollout_resume.go @@ -78,7 +78,7 @@ func (o *ResumeConfig) CompleteResume(f *cmdutil.Factory, cmd *cobra.Command, ou return cmdutil.UsageError(cmd, cmd.Use) } - o.Mapper, o.Typer = f.Object() + o.Mapper, o.Typer = f.Object(false) o.ResumeObject = f.ResumeObject o.Out = out diff --git a/pkg/kubectl/cmd/rollout/rollout_undo.go b/pkg/kubectl/cmd/rollout/rollout_undo.go index 814f9e3c503..b70b003d801 100644 --- a/pkg/kubectl/cmd/rollout/rollout_undo.go +++ b/pkg/kubectl/cmd/rollout/rollout_undo.go @@ -79,7 +79,7 @@ func (o *UndoOptions) CompleteUndo(f *cmdutil.Factory, cmd *cobra.Command, out i } o.ToRevision = cmdutil.GetFlagInt64(cmd, "to-revision") - o.Mapper, o.Typer = f.Object() + o.Mapper, o.Typer = f.Object(false) o.Out = out cmdNamespace, enforceNamespace, err := f.DefaultNamespace() diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index 526d18d5ddb..17cd31ed180 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -87,6 +87,7 @@ func NewCmdRun(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *c addRunFlags(cmd) cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -256,7 +257,7 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob if err != nil { return err } - _, typer := f.Object() + _, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). @@ -270,7 +271,7 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob outputFormat := cmdutil.GetFlagString(cmd, "output") if outputFormat != "" { - return f.PrintObject(cmd, obj, cmdOut) + return f.PrintObject(cmd, mapper, obj, cmdOut) } cmdutil.PrintSuccess(mapper, false, cmdOut, mapping.Resource, args[0], "created") return nil @@ -421,7 +422,7 @@ func generateService(f *cmdutil.Factory, cmd *cobra.Command, args []string, serv } if cmdutil.GetFlagString(cmd, "output") != "" { - return f.PrintObject(cmd, obj, out) + return f.PrintObject(cmd, mapper, obj, out) } cmdutil.PrintSuccess(mapper, false, out, mapping.Resource, args[0], "created") @@ -440,7 +441,7 @@ func createGeneratedObject(f *cmdutil.Factory, cmd *cobra.Command, generator kub return nil, "", nil, nil, err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) groupVersionKind, err := typer.ObjectKind(obj) if err != nil { return nil, "", nil, nil, err diff --git a/pkg/kubectl/cmd/run_test.go b/pkg/kubectl/cmd/run_test.go index d635c3781a3..1894deca89c 100644 --- a/pkg/kubectl/cmd/run_test.go +++ b/pkg/kubectl/cmd/run_test.go @@ -302,6 +302,7 @@ func TestGenerateService(t *testing.T) { cmd.Flags().String("output", "", "") cmd.Flags().Bool(cmdutil.ApplyAnnotationsFlag, false, "") cmd.Flags().Bool("record", false, "Record current kubectl command in the resource annotation.") + cmdutil.AddInclude3rdPartyFlags(cmd) addRunFlags(cmd) if !test.expectPOST { diff --git a/pkg/kubectl/cmd/scale.go b/pkg/kubectl/cmd/scale.go index 19069762351..9c8c6f01b6c 100644 --- a/pkg/kubectl/cmd/scale.go +++ b/pkg/kubectl/cmd/scale.go @@ -85,6 +85,7 @@ func NewCmdScale(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a scale operation, zero means don't wait.") cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddRecordFlag(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) usage := "Filename, directory, or URL to a file identifying the resource to set a new size" kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) @@ -108,7 +109,7 @@ func RunScale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/stop.go b/pkg/kubectl/cmd/stop.go index 4a0c353d242..fc25be9aebf 100644 --- a/pkg/kubectl/cmd/stop.go +++ b/pkg/kubectl/cmd/stop.go @@ -77,6 +77,7 @@ func NewCmdStop(f *cmdutil.Factory, out io.Writer) *cobra.Command { cmd.Flags().Int("grace-period", -1, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative.") cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object") cmdutil.AddOutputFlagsForMutation(cmd) + cmdutil.AddInclude3rdPartyFlags(cmd) return cmd } @@ -86,7 +87,7 @@ func RunStop(f *cmdutil.Factory, cmd *cobra.Command, args []string, out io.Write return err } - mapper, typer := f.Object() + mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index f8c001f85e8..b1257139c26 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -39,6 +39,7 @@ import ( "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/validation" + "k8s.io/kubernetes/pkg/apimachinery" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/batch" @@ -51,6 +52,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/labels" + "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime/serializer/json" utilflag "k8s.io/kubernetes/pkg/util/flag" @@ -69,8 +71,9 @@ type Factory struct { clients *ClientCache flags *pflag.FlagSet - // Returns interfaces for dealing with arbitrary runtime.Objects. - Object func() (meta.RESTMapper, runtime.ObjectTyper) + // Returns interfaces for dealing with arbitrary runtime.Objects. If thirdPartyDiscovery is true, performs API calls + // to discovery dynamic API objects registered by third parties. + Object func(thirdPartyDiscovery bool) (meta.RESTMapper, runtime.ObjectTyper) // Returns interfaces for decoding objects - if toInternal is set, decoded objects will be converted // into their internal form (if possible). Eventually the internal form will be removed as an option, // and only versioned objects will be returned. @@ -179,6 +182,31 @@ func DefaultGenerators(cmdName string) map[string]kubectl.Generator { return generators[cmdName] } +func getGroupVersionKinds(gvks []unversioned.GroupVersionKind, group string) []unversioned.GroupVersionKind { + result := []unversioned.GroupVersionKind{} + for ix := range gvks { + if gvks[ix].Group == group { + result = append(result, gvks[ix]) + } + } + return result +} + +func makeInterfacesFor(versionList []unversioned.GroupVersion) func(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { + accessor := meta.NewAccessor() + return func(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { + for ix := range versionList { + if versionList[ix].String() == version.String() { + return &meta.VersionInterfaces{ + ObjectConvertor: thirdpartyresourcedata.NewThirdPartyObjectConverter(api.Scheme), + MetadataAccessor: accessor, + }, nil + } + } + return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, versionList) + } +} + // NewFactory creates a factory with the default Kubernetes resources defined // if optionalClientConfig is nil, then flags will be bound to a new clientcmd.ClientConfig. // if optionalClientConfig is not nil, then this factory will make use of it. @@ -199,17 +227,61 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { clients: clients, flags: flags, - Object: func() (meta.RESTMapper, runtime.ObjectTyper) { + // If discoverDynamicAPIs is true, make API calls to the discovery service to find APIs that + // have been dynamically added to the apiserver + Object: func(discoverDynamicAPIs bool) (meta.RESTMapper, runtime.ObjectTyper) { cfg, err := clientConfig.ClientConfig() CheckErr(err) cmdApiVersion := unversioned.GroupVersion{} if cfg.GroupVersion != nil { cmdApiVersion = *cfg.GroupVersion } + if discoverDynamicAPIs { + client, err := clients.ClientForVersion(&unversioned.GroupVersion{Version: "v1"}) + CheckErr(err) + versions, gvks, err := GetThirdPartyGroupVersions(client.Discovery()) + CheckErr(err) + if len(versions) > 0 { + priorityMapper, ok := mapper.RESTMapper.(meta.PriorityRESTMapper) + if !ok { + CheckErr(fmt.Errorf("expected PriorityMapper, saw: %v", mapper.RESTMapper)) + return nil, nil + } + multiMapper, ok := priorityMapper.Delegate.(meta.MultiRESTMapper) + if !ok { + CheckErr(fmt.Errorf("unexpected type: %v", mapper.RESTMapper)) + return nil, nil + } + groupsMap := map[string][]unversioned.GroupVersion{} + for _, version := range versions { + groupsMap[version.Group] = append(groupsMap[version.Group], version) + } + for group, versionList := range groupsMap { + preferredExternalVersion := versionList[0] + + thirdPartyMapper, err := kubectl.NewThirdPartyResourceMapper(versionList, getGroupVersionKinds(gvks, group)) + CheckErr(err) + accessor := meta.NewAccessor() + groupMeta := apimachinery.GroupMeta{ + GroupVersion: preferredExternalVersion, + GroupVersions: versionList, + RESTMapper: thirdPartyMapper, + SelfLinker: runtime.SelfLinker(accessor), + InterfacesFor: makeInterfacesFor(versionList), + } + + CheckErr(registered.RegisterGroup(groupMeta)) + registered.AddThirdPartyAPIGroupVersions(versionList...) + multiMapper = append(meta.MultiRESTMapper{thirdPartyMapper}, multiMapper...) + } + priorityMapper.Delegate = multiMapper + // Re-assign to the RESTMapper here because priorityMapper is actually a copy, so if we + // don't re-assign, the above assignement won't actually update mapper.RESTMapper + mapper.RESTMapper = priorityMapper + } + } outputRESTMapper := kubectl.OutputVersionMapper{RESTMapper: mapper, OutputVersions: []unversioned.GroupVersion{cmdApiVersion}} - - // eventually this should allow me choose a group priority based on the order of the discovery doc, for now hardcode a given order priorityRESTMapper := meta.PriorityRESTMapper{ Delegate: outputRESTMapper, ResourcePriority: []unversioned.GroupVersionResource{ @@ -223,7 +295,6 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { {Group: metrics.GroupName, Version: meta.AnyVersion, Kind: meta.AnyKind}, }, } - return priorityRESTMapper, api.Scheme }, Client: func() (*client.Client, error) { @@ -233,22 +304,39 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { return clients.ClientConfigForVersion(nil) }, ClientForMapping: func(mapping *meta.RESTMapping) (resource.RESTClient, error) { + gvk := mapping.GroupVersionKind mappingVersion := mapping.GroupVersionKind.GroupVersion() - client, err := clients.ClientForVersion(&mappingVersion) + c, err := clients.ClientForVersion(&mappingVersion) if err != nil { return nil, err } - switch mapping.GroupVersionKind.Group { + switch gvk.Group { case api.GroupName: - return client.RESTClient, nil + return c.RESTClient, nil case autoscaling.GroupName: - return client.AutoscalingClient.RESTClient, nil + return c.AutoscalingClient.RESTClient, nil case batch.GroupName: - return client.BatchClient.RESTClient, nil + return c.BatchClient.RESTClient, nil case extensions.GroupName: - return client.ExtensionsClient.RESTClient, nil + return c.ExtensionsClient.RESTClient, nil + case api.SchemeGroupVersion.Group: + return c.RESTClient, nil + case extensions.SchemeGroupVersion.Group: + return c.ExtensionsClient.RESTClient, nil + default: + if !registered.IsThirdPartyAPIGroupVersion(gvk.GroupVersion()) { + return nil, fmt.Errorf("unknown api group/version: %s", gvk.String()) + } + cfg, err := clientConfig.ClientConfig() + if err != nil { + return nil, err + } + gv := gvk.GroupVersion() + cfg.GroupVersion = &gv + cfg.APIPath = "/apis" + cfg.Codec = thirdpartyresourcedata.NewCodec(c.ExtensionsClient.RESTClient.Codec(), gvk.Kind) + return restclient.RESTClientFor(cfg) } - return nil, fmt.Errorf("unable to get RESTClient for resource '%s'", mapping.Resource) }, Describer: func(mapping *meta.RESTMapping) (kubectl.Describer, error) { mappingVersion := mapping.GroupVersionKind.GroupVersion() @@ -810,6 +898,10 @@ func (c *clientSwaggerSchema) ValidateBytes(data []byte) error { } return getSchemaAndValidate(c.c.BatchClient.RESTClient, data, "apis/", gvk.GroupVersion().String(), c.cacheDir) } + if registered.IsThirdPartyAPIGroupVersion(gvk.GroupVersion()) { + // Don't attempt to validate third party objects + return nil + } if gvk.Group == extensions.GroupName { if c.c.ExtensionsClient == nil { return errors.New("unable to validate: no experimental client") @@ -874,8 +966,7 @@ func DefaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig { } // PrintObject prints an api object given command line flags to modify the output format -func (f *Factory) PrintObject(cmd *cobra.Command, obj runtime.Object, out io.Writer) error { - mapper, _ := f.Object() +func (f *Factory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { gvk, err := api.Scheme.ObjectKind(obj) if err != nil { return err @@ -936,8 +1027,8 @@ func (f *Factory) PrinterForMapping(cmd *cobra.Command, mapping *meta.RESTMappin } // One stop shopping for a Builder -func (f *Factory) NewBuilder() *resource.Builder { - mapper, typer := f.Object() +func (f *Factory) NewBuilder(thirdPartyDiscovery bool) *resource.Builder { + mapper, typer := f.Object(thirdPartyDiscovery) return resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index 4c674f97c0c..a7c6d4324f1 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -32,6 +32,8 @@ import ( "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/apimachinery/registered" + "k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/resource" @@ -514,3 +516,53 @@ func ContainsChangeCause(info *resource.Info) bool { func ShouldRecord(cmd *cobra.Command, info *resource.Info) bool { return GetRecordFlag(cmd) || ContainsChangeCause(info) } + +func GetThirdPartyGroupVersions(discovery discovery.DiscoveryInterface) ([]unversioned.GroupVersion, []unversioned.GroupVersionKind, error) { + result := []unversioned.GroupVersion{} + gvks := []unversioned.GroupVersionKind{} + + groupList, err := discovery.ServerGroups() + if err != nil { + // On forbidden or not found, just return empty lists. + if errors.IsForbidden(err) || errors.IsNotFound(err) { + return result, gvks, nil + } + + return nil, nil, err + } + + for ix := range groupList.Groups { + group := &groupList.Groups[ix] + for jx := range group.Versions { + gv, err2 := unversioned.ParseGroupVersion(group.Versions[jx].GroupVersion) + if err2 != nil { + return nil, nil, err + } + // Skip GroupVersionKinds that have been statically registered. + if registered.IsRegisteredVersion(gv) { + continue + } + result = append(result, gv) + + resourceList, err := discovery.ServerResourcesForGroupVersion(group.Versions[jx].GroupVersion) + if err != nil { + return nil, nil, err + } + for kx := range resourceList.APIResources { + gvks = append(gvks, gv.WithKind(resourceList.APIResources[kx].Kind)) + } + } + } + return result, gvks, nil +} + +func GetIncludeThirdPartyAPIs(cmd *cobra.Command) bool { + if cmd.Flags().Lookup("include-extended-apis") == nil { + return false + } + return GetFlagBool(cmd, "include-extended-apis") +} + +func AddInclude3rdPartyFlags(cmd *cobra.Command) { + cmd.Flags().Bool("include-extended-apis", true, "If true, include definitions of new APIs via calls to the API server. [default true]") +} diff --git a/pkg/kubectl/kubectl.go b/pkg/kubectl/kubectl.go index b0c3861e5a6..2b6b0007a7f 100644 --- a/pkg/kubectl/kubectl.go +++ b/pkg/kubectl/kubectl.go @@ -54,6 +54,28 @@ func makeImageList(spec *api.PodSpec) string { return strings.Join(listOfImages(spec), ",") } +func NewThirdPartyResourceMapper(gvs []unversioned.GroupVersion, gvks []unversioned.GroupVersionKind) (meta.RESTMapper, error) { + mapper := meta.NewDefaultRESTMapper(gvs, func(gv unversioned.GroupVersion) (*meta.VersionInterfaces, error) { + for ix := range gvs { + if gvs[ix].Group == gv.Group && gvs[ix].Version == gv.Version { + return &meta.VersionInterfaces{ + ObjectConvertor: api.Scheme, + MetadataAccessor: meta.NewAccessor(), + }, nil + } + } + groupVersions := []string{} + for ix := range gvs { + groupVersions = append(groupVersions, gvs[ix].String()) + } + return nil, fmt.Errorf("unsupported storage version: %s (valid: %s)", gv.String(), strings.Join(groupVersions, ", ")) + }) + for ix := range gvks { + mapper.Add(gvks[ix], meta.RESTScopeNamespace) + } + return mapper, nil +} + // OutputVersionMapper is a RESTMapper that will prefer mappings that // correspond to a preferred output version (if feasible) type OutputVersionMapper struct { diff --git a/pkg/kubectl/resource/mapper.go b/pkg/kubectl/resource/mapper.go index 25fd97d90bd..27e85043b0e 100644 --- a/pkg/kubectl/resource/mapper.go +++ b/pkg/kubectl/resource/mapper.go @@ -22,6 +22,8 @@ import ( "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/apimachinery/registered" + "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata" "k8s.io/kubernetes/pkg/runtime" ) @@ -50,8 +52,16 @@ type Mapper struct { func (m *Mapper) InfoForData(data []byte, source string) (*Info, error) { versions := &runtime.VersionedObjects{} _, gvk, err := m.Decode(data, nil, versions) + var obj runtime.Object + var versioned runtime.Object + if registered.IsThirdPartyAPIGroupVersion(gvk.GroupVersion()) { + obj, err = runtime.Decode(thirdpartyresourcedata.NewCodec(nil, gvk.Kind), data) + versioned = obj + } else { + obj, versioned = versions.Last(), versions.First() + } if err != nil { - return nil, fmt.Errorf("unable to decode %q: %v", source, err) + return nil, fmt.Errorf("unable to decode %q: %v [%v]", source, err, gvk) } mapping, err := m.RESTMapping(gvk.GroupKind(), gvk.Version) if err != nil { @@ -63,10 +73,6 @@ func (m *Mapper) InfoForData(data []byte, source string) (*Info, error) { return nil, fmt.Errorf("unable to connect to a server to handle %q: %v", mapping.Resource, err) } - // TODO: decoding the version object is convenient, but questionable. This is used by apply - // and rolling-update today, but both of those cases should probably be requesting the raw - // object and performing their own decoding. - obj, versioned := versions.Last(), versions.First() name, _ := mapping.MetadataAccessor.Name(obj) namespace, _ := mapping.MetadataAccessor.Namespace(obj) resourceVersion, _ := mapping.MetadataAccessor.ResourceVersion(obj) diff --git a/pkg/kubectl/resource/result.go b/pkg/kubectl/resource/result.go index 7beaf74909b..f382da0d7a3 100644 --- a/pkg/kubectl/resource/result.go +++ b/pkg/kubectl/resource/result.go @@ -24,6 +24,7 @@ import ( "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apimachinery/registered" + "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/runtime" utilerrors "k8s.io/kubernetes/pkg/util/errors" "k8s.io/kubernetes/pkg/util/sets" @@ -241,6 +242,11 @@ func AsVersionedObjects(infos []*Info, version string, encoder runtime.Encoder) } // TODO: use info.VersionedObject as the value? + switch obj := info.Object.(type) { + case *extensions.ThirdPartyResourceData: + objects = append(objects, &runtime.Unknown{Raw: obj.Data}) + continue + } // objects that are not part of api.Scheme must be converted to JSON // TODO: convert to map[string]interface{}, attach to runtime.Unknown? diff --git a/pkg/kubectl/resource_printer.go b/pkg/kubectl/resource_printer.go index 26ea10a933f..32eaa2e163c 100644 --- a/pkg/kubectl/resource_printer.go +++ b/pkg/kubectl/resource_printer.go @@ -255,6 +255,12 @@ type JSONPrinter struct { // PrintObj is an implementation of ResourcePrinter.PrintObj which simply writes the object to the Writer. func (p *JSONPrinter) PrintObj(obj runtime.Object, w io.Writer) error { + switch obj := obj.(type) { + case *runtime.Unknown: + _, err := w.Write(obj.Raw) + return err + } + data, err := json.Marshal(obj) if err != nil { return err @@ -281,6 +287,16 @@ type YAMLPrinter struct { // PrintObj prints the data as YAML. func (p *YAMLPrinter) PrintObj(obj runtime.Object, w io.Writer) error { + switch obj := obj.(type) { + case *runtime.Unknown: + data, err := yaml.JSONToYAML(obj.Raw) + if err != nil { + return err + } + _, err = w.Write(data) + return err + } + output, err := yaml.Marshal(obj) if err != nil { return err @@ -414,6 +430,9 @@ var persistentVolumeColumns = []string{"NAME", "CAPACITY", "ACCESSMODES", "STATU var persistentVolumeClaimColumns = []string{"NAME", "STATUS", "VOLUME", "CAPACITY", "ACCESSMODES", "AGE"} var componentStatusColumns = []string{"NAME", "STATUS", "MESSAGE", "ERROR"} var thirdPartyResourceColumns = []string{"NAME", "DESCRIPTION", "VERSION(S)"} + +// TODO: consider having 'KIND' for third party resource data +var thirdPartyResourceDataColumns = []string{"NAME", "LABELS", "DATA"} var horizontalPodAutoscalerColumns = []string{"NAME", "REFERENCE", "TARGET", "CURRENT", "MINPODS", "MAXPODS", "AGE"} var withNamespacePrefixColumns = []string{"NAMESPACE"} // TODO(erictune): print cluster name too. var deploymentColumns = []string{"NAME", "DESIRED", "CURRENT", "UP-TO-DATE", "AVAILABLE", "AGE"} @@ -470,6 +489,8 @@ func (h *HumanReadablePrinter) addDefaultHandlers() { h.Handler(configMapColumns, printConfigMapList) h.Handler(podSecurityPolicyColumns, printPodSecurityPolicy) h.Handler(podSecurityPolicyColumns, printPodSecurityPolicyList) + h.Handler(thirdPartyResourceDataColumns, printThirdPartyResourceData) + h.Handler(thirdPartyResourceDataColumns, printThirdPartyResourceDataList) } func (h *HumanReadablePrinter) unknown(data []byte, w io.Writer) error { @@ -1471,6 +1492,35 @@ func printThirdPartyResourceList(list *extensions.ThirdPartyResourceList, w io.W return nil } +func truncate(str string, maxLen int) string { + if len(str) > maxLen { + return str[0:maxLen] + "..." + } + return str +} + +func printThirdPartyResourceData(rsrc *extensions.ThirdPartyResourceData, w io.Writer, options PrintOptions) error { + l := labels.FormatLabels(rsrc.Labels) + truncateCols := 50 + if options.Wide { + truncateCols = 100 + } + if _, err := fmt.Fprintf(w, "%s\t%s\t%s\n", rsrc.Name, l, truncate(string(rsrc.Data), truncateCols)); err != nil { + return err + } + return nil +} + +func printThirdPartyResourceDataList(list *extensions.ThirdPartyResourceDataList, w io.Writer, options PrintOptions) error { + for _, item := range list.Items { + if err := printThirdPartyResourceData(&item, w, options); err != nil { + return err + } + } + + return nil +} + func printDeployment(deployment *extensions.Deployment, w io.Writer, options PrintOptions) error { if options.WithNamespace { if _, err := fmt.Fprintf(w, "%s\t", deployment.Namespace); err != nil { diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 5bb2a549e42..3e1f59246db 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -370,7 +370,7 @@ func TestAPIVersionOfDiscoveryEndpoints(t *testing.T) { } func TestDiscoveryAtAPIS(t *testing.T) { - // TODO(caesarxuchao): make this pass now that batch is added, + // TODO(caesarxuchao): make this pass now that batch is added, // and rewrite it so that the indexes do not need to change each time a new api group is added. /* master, etcdserver, config, assert := newMaster(t) diff --git a/pkg/registry/thirdpartyresourcedata/codec.go b/pkg/registry/thirdpartyresourcedata/codec.go index 29709f4e866..a0e47c560a0 100644 --- a/pkg/registry/thirdpartyresourcedata/codec.go +++ b/pkg/registry/thirdpartyresourcedata/codec.go @@ -31,9 +31,37 @@ import ( "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/runtime" ) +type thirdPartyObjectConverter struct { + converter runtime.ObjectConvertor +} + +func (t *thirdPartyObjectConverter) ConvertToVersion(in runtime.Object, outVersion string) (out runtime.Object, err error) { + switch in.(type) { + // This seems weird, but in this case the ThirdPartyResourceData is really just a wrapper on the raw 3rd party data. + // The actual thing printed/sent to server is the actual raw third party resource data, which only has one version. + case *extensions.ThirdPartyResourceData: + return in, nil + default: + return t.converter.ConvertToVersion(in, outVersion) + } +} + +func (t *thirdPartyObjectConverter) Convert(in, out interface{}) error { + return t.converter.Convert(in, out) +} + +func (t *thirdPartyObjectConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { + return t.converter.ConvertFieldLabel(version, kind, label, value) +} + +func NewThirdPartyObjectConverter(converter runtime.ObjectConvertor) runtime.ObjectConvertor { + return &thirdPartyObjectConverter{converter} +} + type thirdPartyResourceDataMapper struct { mapper meta.RESTMapper kind string @@ -117,6 +145,7 @@ func (t *thirdPartyResourceDataMapper) RESTMapping(gk unversioned.GroupKind, ver if err != nil { return nil, err } + mapping.ObjectConvertor = &thirdPartyObjectConverter{mapping.ObjectConvertor} return mapping, nil } @@ -177,28 +206,51 @@ func NewCodec(codec runtime.Codec, kind string) runtime.Codec { return &thirdPartyResourceDataCodec{codec, kind} } -func (t *thirdPartyResourceDataCodec) populate(objIn *extensions.ThirdPartyResourceData, data []byte) error { +func parseObject(data []byte) (map[string]interface{}, error) { var obj interface{} if err := json.Unmarshal(data, &obj); err != nil { fmt.Printf("Invalid JSON:\n%s\n", string(data)) - return err + return nil, err } mapObj, ok := obj.(map[string]interface{}) if !ok { - return fmt.Errorf("unexpected object: %#v", obj) + return nil, fmt.Errorf("unexpected object: %#v", obj) } - return t.populateFromObject(objIn, mapObj, data) + return mapObj, nil } -func (t *thirdPartyResourceDataCodec) populateFromObject(objIn *extensions.ThirdPartyResourceData, mapObj map[string]interface{}, data []byte) error { +func (t *thirdPartyResourceDataCodec) populate(data []byte) (runtime.Object, error) { + mapObj, err := parseObject(data) + if err != nil { + return nil, err + } + return t.populateFromObject(mapObj, data) +} + +func (t *thirdPartyResourceDataCodec) populateFromObject(mapObj map[string]interface{}, data []byte) (runtime.Object, error) { typeMeta := unversioned.TypeMeta{} if err := json.Unmarshal(data, &typeMeta); err != nil { - return err + return nil, err } - if typeMeta.Kind != t.kind { - return fmt.Errorf("unexpected kind: %s, expected %s", typeMeta.Kind, t.kind) + switch typeMeta.Kind { + case t.kind: + result := &extensions.ThirdPartyResourceData{} + if err := t.populateResource(result, mapObj, data); err != nil { + return nil, err + } + return result, nil + case t.kind + "List": + list := &extensions.ThirdPartyResourceDataList{} + if err := t.populateListResource(list, mapObj); err != nil { + return nil, err + } + return list, nil + default: + return nil, fmt.Errorf("unexpected kind: %s, expected %s", typeMeta.Kind, t.kind) } +} +func (t *thirdPartyResourceDataCodec) populateResource(objIn *extensions.ThirdPartyResourceData, mapObj map[string]interface{}, data []byte) error { metadata, ok := mapObj["metadata"].(map[string]interface{}) if !ok { return fmt.Errorf("unexpected object for metadata: %#v", mapObj["metadata"]) @@ -212,6 +264,9 @@ func (t *thirdPartyResourceDataCodec) populateFromObject(objIn *extensions.Third if err := json.Unmarshal(metadataData, &objIn.ObjectMeta); err != nil { return err } + // Override API Version with the ThirdPartyResourceData value + // TODO: fix this hard code + objIn.APIVersion = v1beta1.SchemeGroupVersion.String() objIn.Data = data return nil @@ -219,17 +274,12 @@ func (t *thirdPartyResourceDataCodec) populateFromObject(objIn *extensions.Third func (t *thirdPartyResourceDataCodec) Decode(data []byte, gvk *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) { if into == nil { - obj := &extensions.ThirdPartyResourceData{} - if err := t.populate(obj, data); err != nil { - return nil, nil, err - } - objData, err := runtime.Encode(t.delegate, obj) + obj, err := t.populate(data) if err != nil { return nil, nil, err } - return t.delegate.Decode(objData, gvk, into) + return obj, gvk, nil } - thirdParty, ok := into.(*extensions.ThirdPartyResourceData) if !ok { return nil, nil, fmt.Errorf("unexpected object: %#v", into) @@ -241,7 +291,8 @@ func (t *thirdPartyResourceDataCodec) Decode(data []byte, gvk *unversioned.Group } mapObj, ok := dataObj.(map[string]interface{}) if !ok { - return nil, nil, fmt.Errorf("unexpcted object: %#v", dataObj) + + return nil, nil, fmt.Errorf("unexpected object: %#v", dataObj) } /*if gvk.Kind != "ThirdPartyResourceData" { return nil, nil, fmt.Errorf("unexpected kind: %s", gvk.Kind) @@ -284,12 +335,38 @@ func (t *thirdPartyResourceDataCodec) Decode(data []byte, gvk *unversioned.Group actual.Group, actual.Version = gv.Group, gv.Version } - if err := t.populate(thirdParty, data); err != nil { + mapObj, err := parseObject(data) + if err != nil { + return nil, actual, err + } + if err := t.populateResource(thirdParty, mapObj, data); err != nil { return nil, actual, err } return thirdParty, actual, nil } +func (t *thirdPartyResourceDataCodec) populateListResource(objIn *extensions.ThirdPartyResourceDataList, mapObj map[string]interface{}) error { + items, ok := mapObj["items"].([]interface{}) + if !ok { + return fmt.Errorf("unexpected object for items: %#v", mapObj["items"]) + } + objIn.Items = make([]extensions.ThirdPartyResourceData, len(items)) + for ix := range items { + objData, err := json.Marshal(items[ix]) + if err != nil { + return err + } + objMap, err := parseObject(objData) + if err != nil { + return err + } + if err := t.populateResource(&objIn.Items[ix], objMap, objData); err != nil { + return err + } + } + return nil +} + const template = `{ "kind": "%s", "items": [ %s ] diff --git a/pkg/registry/thirdpartyresourcedata/util.go b/pkg/registry/thirdpartyresourcedata/util.go index 482dadb1eff..120981e85ec 100644 --- a/pkg/registry/thirdpartyresourcedata/util.go +++ b/pkg/registry/thirdpartyresourcedata/util.go @@ -20,9 +20,28 @@ import ( "fmt" "strings" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apis/extensions" ) +func ExtractGroupVersionKind(list *extensions.ThirdPartyResourceList) ([]unversioned.GroupVersion, []unversioned.GroupVersionKind, error) { + gvs := []unversioned.GroupVersion{} + gvks := []unversioned.GroupVersionKind{} + for ix := range list.Items { + rsrc := &list.Items[ix] + kind, group, err := ExtractApiGroupAndKind(rsrc) + if err != nil { + return nil, nil, err + } + for _, version := range rsrc.Versions { + gv := unversioned.GroupVersion{Group: group, Version: version.Name} + gvs = append(gvs, gv) + gvks = append(gvks, unversioned.GroupVersionKind{Group: group, Version: version.Name, Kind: kind}) + } + } + return gvs, gvks, nil +} + func convertToCamelCase(input string) string { result := "" toUpper := true