mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	add flattening and minifying options to config view
This commit is contained in:
		@@ -530,9 +530,11 @@ _kubectl_config_view()
 | 
				
			|||||||
    flags_with_completion=()
 | 
					    flags_with_completion=()
 | 
				
			||||||
    flags_completion=()
 | 
					    flags_completion=()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    flags+=("--flatten")
 | 
				
			||||||
    flags+=("--help")
 | 
					    flags+=("--help")
 | 
				
			||||||
    flags+=("-h")
 | 
					    flags+=("-h")
 | 
				
			||||||
    flags+=("--merge")
 | 
					    flags+=("--merge")
 | 
				
			||||||
 | 
					    flags+=("--minify")
 | 
				
			||||||
    flags+=("--no-headers")
 | 
					    flags+=("--no-headers")
 | 
				
			||||||
    flags+=("--output=")
 | 
					    flags+=("--output=")
 | 
				
			||||||
    two_word_flags+=("-o")
 | 
					    two_word_flags+=("-o")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,4 +66,4 @@ kubectl
 | 
				
			|||||||
* [kubectl update](kubectl_update.md)	 - Update a resource by filename or stdin.
 | 
					* [kubectl update](kubectl_update.md)	 - Update a resource by filename or stdin.
 | 
				
			||||||
* [kubectl version](kubectl_version.md)	 - Print the client and server version information.
 | 
					* [kubectl version](kubectl_version.md)	 - Print the client and server version information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.865844658 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.453079685 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,4 +50,4 @@ kubectl api-versions
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.865438603 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452805417 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,4 +50,4 @@ kubectl cluster-info
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.865291243 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452687658 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,6 @@ kubectl config SUBCOMMAND
 | 
				
			|||||||
* [kubectl config set-credentials](kubectl_config_set-credentials.md)	 - Sets a user entry in kubeconfig
 | 
					* [kubectl config set-credentials](kubectl_config_set-credentials.md)	 - Sets a user entry in kubeconfig
 | 
				
			||||||
* [kubectl config unset](kubectl_config_unset.md)	 - Unsets an individual value in a kubeconfig file
 | 
					* [kubectl config unset](kubectl_config_unset.md)	 - Unsets an individual value in a kubeconfig file
 | 
				
			||||||
* [kubectl config use-context](kubectl_config_use-context.md)	 - Sets the current-context in a kubeconfig file
 | 
					* [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.
 | 
					* [kubectl config view](kubectl_config_view.md)	 - displays Merged kubeconfig settings or a specified kubeconfig file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.86513156 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452570294 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,4 +68,4 @@ $ kubectl config set-cluster e2e --insecure-skip-tls-verify=true
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.864096021 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.451768559 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,4 +61,4 @@ $ kubectl config set-context gce --user=cluster-admin
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.86442717 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452031181 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,4 +81,4 @@ $ kubectl set-credentials cluster-admin --client-certificate=~/.kube/admin.crt -
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.864263862 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.451906112 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,4 +55,4 @@ kubectl config set PROPERTY_NAME PROPERTY_VALUE
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.864594301 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.45217009 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,4 +54,4 @@ kubectl config unset PROPERTY_NAME
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.864788809 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452318625 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,4 +53,4 @@ kubectl config use-context CONTEXT_NAME
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.864953658 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452447654 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
## kubectl config view
 | 
					## kubectl config view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
displays merged kubeconfig settings or a specified kubeconfig file.
 | 
					displays Merged kubeconfig settings or a specified kubeconfig file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Synopsis
 | 
					### Synopsis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
displays merged kubeconfig settings or a specified kubeconfig file.
 | 
					displays Merged kubeconfig settings or a specified kubeconfig file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can use --output=template --template=TEMPLATE to extract specific values.
 | 
					You can use --output=template --template=TEMPLATE to extract specific values.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -16,7 +16,7 @@ kubectl config view
 | 
				
			|||||||
### Examples
 | 
					### Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
// Show merged kubeconfig settings.
 | 
					// Show Merged kubeconfig settings.
 | 
				
			||||||
$ kubectl config view
 | 
					$ kubectl config view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Show only local kubeconfig settings
 | 
					// Show only local kubeconfig settings
 | 
				
			||||||
@@ -29,8 +29,10 @@ $ kubectl config view -o template --template='{{range .users}}{{ if eq .name "e2
 | 
				
			|||||||
### Options
 | 
					### Options
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					      --flatten=false: flatten the resulting kubeconfig file into self contained output (useful for creating portable kubeconfig files)
 | 
				
			||||||
  -h, --help=false: help for view
 | 
					  -h, --help=false: help for view
 | 
				
			||||||
      --merge=true: merge together the full hierarchy of kubeconfig files
 | 
					      --merge=true: merge together the full hierarchy of kubeconfig files
 | 
				
			||||||
 | 
					      --minify=false: remove all information not used by current-context from the output
 | 
				
			||||||
      --no-headers=false: When using the default output, don't print headers.
 | 
					      --no-headers=false: When using the default output, don't print headers.
 | 
				
			||||||
  -o, --output="": Output format. One of: json|yaml|template|templatefile.
 | 
					  -o, --output="": Output format. One of: json|yaml|template|templatefile.
 | 
				
			||||||
      --output-version="": Output the formatted object with the given version (default api-version).
 | 
					      --output-version="": Output the formatted object with the given version (default api-version).
 | 
				
			||||||
@@ -73,4 +75,4 @@ $ kubectl config view -o template --template='{{range .users}}{{ if eq .name "e2
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
					* [kubectl config](kubectl_config.md)	 - config modifies kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.863759642 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.451646336 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,4 +63,4 @@ $ cat pod.json | kubectl create -f -
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.858089037 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.44924428 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,4 +81,4 @@ $ kubectl delete pods --all
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.858739718 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.449502668 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,4 +53,4 @@ kubectl describe RESOURCE ID
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.857744518 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.449099339 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,4 +64,4 @@ $ kubectl exec -p 123456-7890 -c ruby-container -i -t -- bash -il
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.860311374 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.450677119 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,4 +82,4 @@ $ kubectl expose streamer --port=4100 --protocol=udp --service-name=video-stream
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.863051668 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.451362859 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,4 +85,4 @@ $ kubectl get rc/web service/frontend pods/web-pod-13je7
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.836684094 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.448937009 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,4 +81,4 @@ $ kubectl label pods foo bar-
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.863412074 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.45150424 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,4 +62,4 @@ $ kubectl log -f 123456-7890 ruby-container
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.859351191 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.450201574 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,4 +53,4 @@ kubectl namespace [namespace]
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.859053402 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.449618977 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,4 +68,4 @@ $ kubectl port-forward -p mypod 0:5000
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.860596821 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.45080362 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,4 +65,4 @@ $ kubectl proxy --api-prefix=k8s-api
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.860912037 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.45092701 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,4 +68,4 @@ $ kubectl resize --current-replicas=2 --replicas=3 replicationcontrollers foo
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.859972905 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.450528897 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,4 +68,4 @@ $ cat frontend-v2.json | kubectl rolling-update frontend-v1 -f -
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.859654934 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.450394023 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,4 +78,4 @@ $ kubectl run-container nginx --image=dockerfile/nginx --overrides='{ "apiVersio
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.861280128 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.4510703 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,4 +72,4 @@ $ kubectl stop -f path/to/resources
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.862654585 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.451196696 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,4 +67,4 @@ $ kubectl update pods my-pod --patch='{ "apiVersion": "v1beta1", "desiredState":
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.858390462 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.449377932 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,4 +51,4 @@ kubectl version
 | 
				
			|||||||
### SEE ALSO
 | 
					### SEE ALSO
 | 
				
			||||||
* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
					* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Auto generated by spf13/cobra at 2015-04-12 19:00:26.865600008 +0000 UTC
 | 
					###### Auto generated by spf13/cobra at 2015-04-14 14:22:51.452926558 +0000 UTC
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.SH NAME
 | 
					.SH NAME
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
kubectl config view \- displays merged kubeconfig settings or a specified kubeconfig file.
 | 
					kubectl config view \- displays Merged kubeconfig settings or a specified kubeconfig file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.SH SYNOPSIS
 | 
					.SH SYNOPSIS
 | 
				
			||||||
@@ -13,13 +13,17 @@ kubectl config view \- displays merged kubeconfig settings or a specified kubeco
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.SH DESCRIPTION
 | 
					.SH DESCRIPTION
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
displays merged kubeconfig settings or a specified kubeconfig file.
 | 
					displays Merged kubeconfig settings or a specified kubeconfig file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
You can use \-\-output=template \-\-template=TEMPLATE to extract specific values.
 | 
					You can use \-\-output=template \-\-template=TEMPLATE to extract specific values.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.SH OPTIONS
 | 
					.SH OPTIONS
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					\fB\-\-flatten\fP=false
 | 
				
			||||||
 | 
					    flatten the resulting kubeconfig file into self contained output (useful for creating portable kubeconfig files)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
\fB\-h\fP, \fB\-\-help\fP=false
 | 
					\fB\-h\fP, \fB\-\-help\fP=false
 | 
				
			||||||
    help for view
 | 
					    help for view
 | 
				
			||||||
@@ -28,6 +32,10 @@ You can use \-\-output=template \-\-template=TEMPLATE to extract specific values
 | 
				
			|||||||
\fB\-\-merge\fP=true
 | 
					\fB\-\-merge\fP=true
 | 
				
			||||||
    merge together the full hierarchy of kubeconfig files
 | 
					    merge together the full hierarchy of kubeconfig files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					\fB\-\-minify\fP=false
 | 
				
			||||||
 | 
					    remove all information not used by current\-context from the output
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PP
 | 
					.PP
 | 
				
			||||||
\fB\-\-no\-headers\fP=false
 | 
					\fB\-\-no\-headers\fP=false
 | 
				
			||||||
    When using the default output, don't print headers.
 | 
					    When using the default output, don't print headers.
 | 
				
			||||||
@@ -165,7 +173,7 @@ You can use \-\-output=template \-\-template=TEMPLATE to extract specific values
 | 
				
			|||||||
.RS
 | 
					.RS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.nf
 | 
					.nf
 | 
				
			||||||
// Show merged kubeconfig settings.
 | 
					// Show Merged kubeconfig settings.
 | 
				
			||||||
$ kubectl config view
 | 
					$ kubectl config view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Show only local kubeconfig settings
 | 
					// Show only local kubeconfig settings
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										149
									
								
								pkg/client/clientcmd/api/helpers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								pkg/client/clientcmd/api/helpers.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,149 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2015 Google Inc. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package api
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MinifyConfig read the current context and uses that to keep only the relevant pieces of config
 | 
				
			||||||
 | 
					// This is useful for making secrets based on kubeconfig files
 | 
				
			||||||
 | 
					func MinifyConfig(config *Config) error {
 | 
				
			||||||
 | 
						if len(config.CurrentContext) == 0 {
 | 
				
			||||||
 | 
							return errors.New("current-context must exist in order to minify")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						currContext, exists := config.Contexts[config.CurrentContext]
 | 
				
			||||||
 | 
						if !exists {
 | 
				
			||||||
 | 
							return fmt.Errorf("cannot locate context %v", config.CurrentContext)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						newContexts := map[string]Context{}
 | 
				
			||||||
 | 
						newContexts[config.CurrentContext] = currContext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						newClusters := map[string]Cluster{}
 | 
				
			||||||
 | 
						if len(currContext.Cluster) > 0 {
 | 
				
			||||||
 | 
							if _, exists := config.Clusters[currContext.Cluster]; !exists {
 | 
				
			||||||
 | 
								return fmt.Errorf("cannot locate cluster %v", currContext.Cluster)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							newClusters[currContext.Cluster] = config.Clusters[currContext.Cluster]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						newAuthInfos := map[string]AuthInfo{}
 | 
				
			||||||
 | 
						if len(currContext.AuthInfo) > 0 {
 | 
				
			||||||
 | 
							if _, exists := config.AuthInfos[currContext.AuthInfo]; !exists {
 | 
				
			||||||
 | 
								return fmt.Errorf("cannot locate user %v", currContext.AuthInfo)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							newAuthInfos[currContext.AuthInfo] = config.AuthInfos[currContext.AuthInfo]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config.AuthInfos = newAuthInfos
 | 
				
			||||||
 | 
						config.Clusters = newClusters
 | 
				
			||||||
 | 
						config.Contexts = newContexts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flatten changes the config object into a self contained config (useful for making secrets)
 | 
				
			||||||
 | 
					// AuthPath is not handled.
 | 
				
			||||||
 | 
					func FlattenConfig(config *Config) error {
 | 
				
			||||||
 | 
						for key, authInfo := range config.AuthInfos {
 | 
				
			||||||
 | 
							baseDir, err := MakeAbs(path.Dir(authInfo.LocationOfOrigin), "")
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(authInfo.AuthPath) != 0 {
 | 
				
			||||||
 | 
								return fmt.Errorf("auth path of %v is not empty: %v", key, authInfo.AuthPath)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err := FlattenContent(&authInfo.ClientCertificate, &authInfo.ClientCertificateData, baseDir); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err := FlattenContent(&authInfo.ClientKey, &authInfo.ClientKeyData, baseDir); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							config.AuthInfos[key] = authInfo
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for key, cluster := range config.Clusters {
 | 
				
			||||||
 | 
							baseDir, err := MakeAbs(path.Dir(cluster.LocationOfOrigin), "")
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err := FlattenContent(&cluster.CertificateAuthority, &cluster.CertificateAuthorityData, baseDir); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							config.Clusters[key] = cluster
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func FlattenContent(path *string, contents *[]byte, baseDir string) error {
 | 
				
			||||||
 | 
						if len(*path) != 0 {
 | 
				
			||||||
 | 
							if len(*contents) > 0 {
 | 
				
			||||||
 | 
								return errors.New("cannot have values for both path and contents")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var err error
 | 
				
			||||||
 | 
							absPath := ResolvePath(*path, baseDir)
 | 
				
			||||||
 | 
							*contents, err = ioutil.ReadFile(absPath)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							*path = ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ResolvePath returns the path as an absolute paths, relative to the given base directory
 | 
				
			||||||
 | 
					func ResolvePath(path string, base string) string {
 | 
				
			||||||
 | 
						// Don't resolve empty paths
 | 
				
			||||||
 | 
						if len(path) > 0 {
 | 
				
			||||||
 | 
							// Don't resolve absolute paths
 | 
				
			||||||
 | 
							if !filepath.IsAbs(path) {
 | 
				
			||||||
 | 
								return filepath.Join(base, path)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return path
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func MakeAbs(path, base string) (string, error) {
 | 
				
			||||||
 | 
						if filepath.IsAbs(path) {
 | 
				
			||||||
 | 
							return path, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(base) == 0 {
 | 
				
			||||||
 | 
							cwd, err := os.Getwd()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							base = cwd
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return filepath.Join(base, path), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										204
									
								
								pkg/client/clientcmd/api/helpers_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								pkg/client/clientcmd/api/helpers_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,204 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2015 Google Inc. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package api
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newMergedConfig(certFile, certContent, keyFile, keyContent, caFile, caContent string, t *testing.T) Config {
 | 
				
			||||||
 | 
						if err := ioutil.WriteFile(certFile, []byte(certContent), 0644); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := ioutil.WriteFile(keyFile, []byte(keyContent), 0600); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := ioutil.WriteFile(caFile, []byte(caContent), 0644); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return Config{
 | 
				
			||||||
 | 
							AuthInfos: map[string]AuthInfo{
 | 
				
			||||||
 | 
								"red-user":  {Token: "red-token"},
 | 
				
			||||||
 | 
								"blue-user": {Token: "blue-token", ClientCertificate: certFile, ClientKey: keyFile}},
 | 
				
			||||||
 | 
							Clusters: map[string]Cluster{
 | 
				
			||||||
 | 
								"cow-cluster":     {Server: "http://cow.org:8080"},
 | 
				
			||||||
 | 
								"chicken-cluster": {Server: "http://chicken.org:8080", CertificateAuthority: caFile}},
 | 
				
			||||||
 | 
							Contexts: map[string]Context{
 | 
				
			||||||
 | 
								"federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"},
 | 
				
			||||||
 | 
								"shaker-context":  {AuthInfo: "blue-user", Cluster: "chicken-cluster"}},
 | 
				
			||||||
 | 
							CurrentContext: "federal-context",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMinifySuccess(t *testing.T) {
 | 
				
			||||||
 | 
						certFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(certFile.Name())
 | 
				
			||||||
 | 
						keyFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(keyFile.Name())
 | 
				
			||||||
 | 
						caFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(caFile.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := MinifyConfig(&mutatingConfig); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(mutatingConfig.Contexts) > 1 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if _, exists := mutatingConfig.Contexts["federal-context"]; !exists {
 | 
				
			||||||
 | 
							t.Errorf("missing context")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(mutatingConfig.Clusters) > 1 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if _, exists := mutatingConfig.Clusters["cow-cluster"]; !exists {
 | 
				
			||||||
 | 
							t.Errorf("missing cluster")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(mutatingConfig.AuthInfos) > 1 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if _, exists := mutatingConfig.AuthInfos["red-user"]; !exists {
 | 
				
			||||||
 | 
							t.Errorf("missing user")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMinifyMissingContext(t *testing.T) {
 | 
				
			||||||
 | 
						certFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(certFile.Name())
 | 
				
			||||||
 | 
						keyFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(keyFile.Name())
 | 
				
			||||||
 | 
						caFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(caFile.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t)
 | 
				
			||||||
 | 
						mutatingConfig.CurrentContext = "missing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						errMsg := "cannot locate context missing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", errMsg, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMinifyMissingCluster(t *testing.T) {
 | 
				
			||||||
 | 
						certFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(certFile.Name())
 | 
				
			||||||
 | 
						keyFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(keyFile.Name())
 | 
				
			||||||
 | 
						caFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(caFile.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t)
 | 
				
			||||||
 | 
						delete(mutatingConfig.Clusters, mutatingConfig.Contexts[mutatingConfig.CurrentContext].Cluster)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						errMsg := "cannot locate cluster cow-cluster"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", errMsg, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMinifyMissingAuthInfo(t *testing.T) {
 | 
				
			||||||
 | 
						certFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(certFile.Name())
 | 
				
			||||||
 | 
						keyFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(keyFile.Name())
 | 
				
			||||||
 | 
						caFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(caFile.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t)
 | 
				
			||||||
 | 
						delete(mutatingConfig.AuthInfos, mutatingConfig.Contexts[mutatingConfig.CurrentContext].AuthInfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						errMsg := "cannot locate user red-user"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", errMsg, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestFlattenSuccess(t *testing.T) {
 | 
				
			||||||
 | 
						certFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(certFile.Name())
 | 
				
			||||||
 | 
						keyFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(keyFile.Name())
 | 
				
			||||||
 | 
						caFile, _ := ioutil.TempFile("", "")
 | 
				
			||||||
 | 
						defer os.Remove(caFile.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						certData := "cert"
 | 
				
			||||||
 | 
						keyData := "key"
 | 
				
			||||||
 | 
						caData := "ca"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unchangingCluster := "cow-cluster"
 | 
				
			||||||
 | 
						unchangingAuthInfo := "red-user"
 | 
				
			||||||
 | 
						changingCluster := "chicken-cluster"
 | 
				
			||||||
 | 
						changingAuthInfo := "blue-user"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						startingConfig := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, t)
 | 
				
			||||||
 | 
						mutatingConfig := startingConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := FlattenConfig(&mutatingConfig); err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(mutatingConfig.Contexts) != 2 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !reflect.DeepEqual(startingConfig.Contexts, mutatingConfig.Contexts) {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", startingConfig.Contexts, mutatingConfig.Contexts)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(mutatingConfig.Clusters) != 2 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !reflect.DeepEqual(startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(mutatingConfig.Clusters[changingCluster].CertificateAuthority) != 0 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected caFile")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData) != caData {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", caData, string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(mutatingConfig.AuthInfos) != 2 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !reflect.DeepEqual(startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificate) != 0 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected caFile")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData) != certData {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", certData, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(mutatingConfig.AuthInfos[changingAuthInfo].ClientKey) != 0 {
 | 
				
			||||||
 | 
							t.Errorf("unexpected caFile")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData) != keyData {
 | 
				
			||||||
 | 
							t.Errorf("expected %v, got %v", keyData, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -39,6 +39,7 @@ func newRedFederalCowHammerConfig() clientcmdapi.Config {
 | 
				
			|||||||
			"cow-cluster": {Server: "http://cow.org:8080"}},
 | 
								"cow-cluster": {Server: "http://cow.org:8080"}},
 | 
				
			||||||
		Contexts: map[string]clientcmdapi.Context{
 | 
							Contexts: map[string]clientcmdapi.Context{
 | 
				
			||||||
			"federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"}},
 | 
								"federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"}},
 | 
				
			||||||
 | 
							CurrentContext: "federal-context",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,7 +71,7 @@ func ExampleView() {
 | 
				
			|||||||
	//     cluster: cow-cluster
 | 
						//     cluster: cow-cluster
 | 
				
			||||||
	//     user: red-user
 | 
						//     user: red-user
 | 
				
			||||||
	//   name: federal-context
 | 
						//   name: federal-context
 | 
				
			||||||
	// current-context: ""
 | 
						// current-context: federal-context
 | 
				
			||||||
	// kind: Config
 | 
						// kind: Config
 | 
				
			||||||
	// preferences: {}
 | 
						// preferences: {}
 | 
				
			||||||
	// users:
 | 
						// users:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,16 +31,18 @@ import (
 | 
				
			|||||||
	"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
 | 
						"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type viewOptions struct {
 | 
					type ViewOptions struct {
 | 
				
			||||||
	pathOptions *PathOptions
 | 
						PathOptions *PathOptions
 | 
				
			||||||
	merge       util.BoolFlag
 | 
						Merge       util.BoolFlag
 | 
				
			||||||
 | 
						Flatten     bool
 | 
				
			||||||
 | 
						Minify      bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	view_long = `displays merged kubeconfig settings or a specified kubeconfig file.
 | 
						view_long = `displays Merged kubeconfig settings or a specified kubeconfig file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can use --output=template --template=TEMPLATE to extract specific values.`
 | 
					You can use --output=template --template=TEMPLATE to extract specific values.`
 | 
				
			||||||
	view_example = `// Show merged kubeconfig settings.
 | 
						view_example = `// Show Merged kubeconfig settings.
 | 
				
			||||||
$ kubectl config view
 | 
					$ kubectl config view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Show only local kubeconfig settings
 | 
					// Show only local kubeconfig settings
 | 
				
			||||||
@@ -50,16 +52,16 @@ $ kubectl config view --local
 | 
				
			|||||||
$ kubectl config view -o template --template='{{range .users}}{{ if eq .name "e2e" }}{{ index .user.password }}{{end}}{{end}}'`
 | 
					$ kubectl config view -o template --template='{{range .users}}{{ if eq .name "e2e" }}{{ index .user.password }}{{end}}{{end}}'`
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewCmdConfigView(out io.Writer, pathOptions *PathOptions) *cobra.Command {
 | 
					func NewCmdConfigView(out io.Writer, PathOptions *PathOptions) *cobra.Command {
 | 
				
			||||||
	options := &viewOptions{pathOptions: pathOptions}
 | 
						options := &ViewOptions{PathOptions: PathOptions}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cmd := &cobra.Command{
 | 
						cmd := &cobra.Command{
 | 
				
			||||||
		Use:     "view",
 | 
							Use:     "view",
 | 
				
			||||||
		Short:   "displays merged kubeconfig settings or a specified kubeconfig file.",
 | 
							Short:   "displays Merged kubeconfig settings or a specified kubeconfig file.",
 | 
				
			||||||
		Long:    view_long,
 | 
							Long:    view_long,
 | 
				
			||||||
		Example: view_example,
 | 
							Example: view_example,
 | 
				
			||||||
		Run: func(cmd *cobra.Command, args []string) {
 | 
							Run: func(cmd *cobra.Command, args []string) {
 | 
				
			||||||
			options.complete()
 | 
								options.Complete()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			printer, _, err := cmdutil.PrinterForCommand(cmd)
 | 
								printer, _, err := cmdutil.PrinterForCommand(cmd)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -68,15 +70,10 @@ func NewCmdConfigView(out io.Writer, pathOptions *PathOptions) *cobra.Command {
 | 
				
			|||||||
			version := cmdutil.OutputVersion(cmd, latest.Version)
 | 
								version := cmdutil.OutputVersion(cmd, latest.Version)
 | 
				
			||||||
			printer = kubectl.NewVersionedPrinter(printer, clientcmdapi.Scheme, version)
 | 
								printer = kubectl.NewVersionedPrinter(printer, clientcmdapi.Scheme, version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			config, err := options.loadConfig()
 | 
								if err := options.Run(out, printer); err != nil {
 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				glog.FatalDepth(1, err)
 | 
									glog.FatalDepth(1, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			err = printer.PrintObj(config, out)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				glog.FatalDepth(1, err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -84,24 +81,52 @@ func NewCmdConfigView(out io.Writer, pathOptions *PathOptions) *cobra.Command {
 | 
				
			|||||||
	// Default to yaml
 | 
						// Default to yaml
 | 
				
			||||||
	cmd.Flags().Set("output", "yaml")
 | 
						cmd.Flags().Set("output", "yaml")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	options.merge.Default(true)
 | 
						options.Merge.Default(true)
 | 
				
			||||||
	cmd.Flags().Var(&options.merge, "merge", "merge together the full hierarchy of kubeconfig files")
 | 
						cmd.Flags().Var(&options.Merge, "merge", "merge together the full hierarchy of kubeconfig files")
 | 
				
			||||||
 | 
						cmd.Flags().BoolVar(&options.Flatten, "flatten", false, "flatten the resulting kubeconfig file into self contained output (useful for creating portable kubeconfig files)")
 | 
				
			||||||
 | 
						cmd.Flags().BoolVar(&options.Minify, "minify", false, "remove all information not used by current-context from the output")
 | 
				
			||||||
	return cmd
 | 
						return cmd
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *viewOptions) complete() bool {
 | 
					func (o ViewOptions) Run(out io.Writer, printer kubectl.ResourcePrinter) error {
 | 
				
			||||||
 | 
						config, err := o.loadConfig()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if o.Minify {
 | 
				
			||||||
 | 
							if err := clientcmdapi.MinifyConfig(config); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if o.Flatten {
 | 
				
			||||||
 | 
							if err := clientcmdapi.FlattenConfig(config); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = printer.PrintObj(config, out)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o *ViewOptions) Complete() bool {
 | 
				
			||||||
	// if --kubeconfig, --global, or --local is specified, then merging doesn't make sense since you're declaring precise intent
 | 
						// if --kubeconfig, --global, or --local is specified, then merging doesn't make sense since you're declaring precise intent
 | 
				
			||||||
	if o.pathOptions.Global || o.pathOptions.Local || o.pathOptions.UseEnvVar {
 | 
						if o.PathOptions.Global || o.PathOptions.Local || o.PathOptions.UseEnvVar {
 | 
				
			||||||
		if !o.merge.Provided() {
 | 
							if !o.Merge.Provided() {
 | 
				
			||||||
			o.merge.Set("false")
 | 
								o.Merge.Set("false")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o viewOptions) loadConfig() (*clientcmdapi.Config, error) {
 | 
					func (o ViewOptions) loadConfig() (*clientcmdapi.Config, error) {
 | 
				
			||||||
	err := o.validate()
 | 
						err := o.Validate()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -110,33 +135,33 @@ func (o viewOptions) loadConfig() (*clientcmdapi.Config, error) {
 | 
				
			|||||||
	return config, err
 | 
						return config, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o viewOptions) validate() error {
 | 
					func (o ViewOptions) Validate() error {
 | 
				
			||||||
	return o.pathOptions.Validate()
 | 
						return o.PathOptions.Validate()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getStartingConfig returns the Config object built from the sources specified by the options, the filename read (only if it was a single file), and an error if something goes wrong
 | 
					// getStartingConfig returns the Config object built from the sources specified by the options, the filename read (only if it was a single file), and an error if something goes wrong
 | 
				
			||||||
func (o *viewOptions) getStartingConfig() (*clientcmdapi.Config, error) {
 | 
					func (o *ViewOptions) getStartingConfig() (*clientcmdapi.Config, error) {
 | 
				
			||||||
	switch {
 | 
						switch {
 | 
				
			||||||
	case !o.merge.Value():
 | 
						case !o.Merge.Value():
 | 
				
			||||||
		switch {
 | 
							switch {
 | 
				
			||||||
		case len(o.pathOptions.LoadingRules.ExplicitPath) > 0:
 | 
							case len(o.PathOptions.LoadingRules.ExplicitPath) > 0:
 | 
				
			||||||
			return clientcmd.LoadFromFile(o.pathOptions.LoadingRules.ExplicitPath)
 | 
								return clientcmd.LoadFromFile(o.PathOptions.LoadingRules.ExplicitPath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case o.pathOptions.Global:
 | 
							case o.PathOptions.Global:
 | 
				
			||||||
			return clientcmd.LoadFromFile(o.pathOptions.GlobalFile)
 | 
								return clientcmd.LoadFromFile(o.PathOptions.GlobalFile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case o.pathOptions.UseEnvVar:
 | 
							case o.PathOptions.UseEnvVar:
 | 
				
			||||||
			return clientcmd.LoadFromFile(o.pathOptions.EnvVarFile)
 | 
								return clientcmd.LoadFromFile(o.PathOptions.EnvVarFile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case o.pathOptions.Local:
 | 
							case o.PathOptions.Local:
 | 
				
			||||||
			return clientcmd.LoadFromFile(o.pathOptions.LocalFile)
 | 
								return clientcmd.LoadFromFile(o.PathOptions.LocalFile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return nil, errors.New("if merge==false a precise file must to specified")
 | 
								return nil, errors.New("if Merge==false a precise file must to specified")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return o.pathOptions.getStartingConfig()
 | 
							return o.PathOptions.getStartingConfig()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user