2014-12-17 13:03:03 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2014 The Kubernetes Authors .
2014-12-17 13:03:03 +00:00
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 config
import (
2015-04-08 14:32:32 +00:00
"errors"
2014-12-17 13:03:03 +00:00
"github.com/spf13/cobra"
2017-01-23 14:46:05 +00:00
"k8s.io/apiserver/pkg/util/flag"
2017-01-20 18:06:17 +00:00
"k8s.io/client-go/tools/clientcmd"
2017-01-18 14:57:11 +00:00
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
"k8s.io/client-go/tools/clientcmd/api/latest"
2016-10-07 22:24:42 +00:00
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
2015-08-05 22:03:47 +00:00
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2018-05-01 19:48:46 +00:00
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
2017-07-07 04:04:11 +00:00
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
2017-02-19 22:56:11 +00:00
"k8s.io/kubernetes/pkg/printers"
2014-12-17 13:03:03 +00:00
)
2015-04-10 18:30:08 +00:00
type ViewOptions struct {
2018-05-02 18:49:49 +00:00
PrintFlags * kubectlConfigPrintFlags
2018-05-01 19:48:46 +00:00
PrintObject printers . ResourcePrinterFunc
2016-04-14 18:47:19 +00:00
ConfigAccess clientcmd . ConfigAccess
2016-03-09 07:25:34 +00:00
Merge flag . Tristate
2015-04-10 12:54:22 +00:00
Flatten bool
Minify bool
2015-04-17 22:36:31 +00:00
RawByteData bool
2018-05-01 19:48:46 +00:00
OutputFormat string
genericclioptions . IOStreams
2014-12-17 13:03:03 +00:00
}
2016-05-20 17:49:56 +00:00
var (
2016-10-07 22:24:42 +00:00
view_long = templates . LongDesc ( `
2016-06-07 17:38:04 +00:00
Display merged kubeconfig settings or a specified kubeconfig file .
2014-12-17 13:03:03 +00:00
2016-05-20 17:49:56 +00:00
You can use -- output jsonpath = { ... } to extract specific values using a jsonpath expression . ` )
2016-10-07 22:24:42 +00:00
view_example = templates . Examples ( `
2018-03-23 01:51:47 +00:00
# Show merged kubeconfig settings .
2016-05-20 17:49:56 +00:00
kubectl config view
2015-02-05 01:47:52 +00:00
2018-03-23 01:51:47 +00:00
# Show merged kubeconfig settings and raw certificate data .
kubectl config view -- raw
2016-05-20 17:49:56 +00:00
# Get the password for the e2e user
kubectl config view - o jsonpath = ' { . users [ ? ( @ . name == "e2e" ) ] . user . password } ' ` )
2018-05-01 19:48:46 +00:00
defaultOutputFormat = "yaml"
2015-03-11 17:22:08 +00:00
)
2018-05-01 19:48:46 +00:00
func NewCmdConfigView ( f cmdutil . Factory , streams genericclioptions . IOStreams , ConfigAccess clientcmd . ConfigAccess ) * cobra . Command {
o := & ViewOptions {
2018-05-02 18:49:49 +00:00
PrintFlags : newKubeConfigPrintFlags ( "" ) . WithDefaultOutput ( "yaml" ) ,
2018-05-01 19:48:46 +00:00
ConfigAccess : ConfigAccess ,
IOStreams : streams ,
}
2015-03-11 17:22:08 +00:00
cmd := & cobra . Command {
Use : "view" ,
2017-01-25 01:01:55 +00:00
Short : i18n . T ( "Display merged kubeconfig settings or a specified kubeconfig file" ) ,
2015-03-11 17:22:08 +00:00
Long : view_long ,
Example : view_example ,
2014-12-17 13:03:03 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2018-05-01 19:48:46 +00:00
cmdutil . CheckErr ( o . Complete ( cmd ) )
cmdutil . CheckErr ( o . Validate ( ) )
cmdutil . CheckErr ( o . Run ( ) )
2014-12-17 13:03:03 +00:00
} ,
}
2018-05-01 19:48:46 +00:00
o . PrintFlags . AddFlags ( cmd )
2015-02-20 14:27:34 +00:00
2018-05-01 19:48:46 +00:00
o . Merge . Default ( true )
mergeFlag := cmd . Flags ( ) . VarPF ( & o . Merge , "merge" , "" , "Merge the full hierarchy of kubeconfig files" )
2017-10-31 19:44:05 +00:00
mergeFlag . NoOptDefVal = "true"
2018-05-01 19:48:46 +00:00
cmd . Flags ( ) . BoolVar ( & o . RawByteData , "raw" , o . RawByteData , "Display raw byte data" )
cmd . Flags ( ) . BoolVar ( & o . Flatten , "flatten" , o . Flatten , "Flatten the resulting kubeconfig file into self-contained output (useful for creating portable kubeconfig files)" )
cmd . Flags ( ) . BoolVar ( & o . Minify , "minify" , o . Minify , "Remove all information not used by current-context from the output" )
2014-12-17 13:03:03 +00:00
return cmd
}
2018-05-01 19:48:46 +00:00
func ( o * ViewOptions ) Complete ( cmd * cobra . Command ) error {
if o . ConfigAccess . IsExplicitFile ( ) {
if ! o . Merge . Provided ( ) {
o . Merge . Set ( "false" )
}
}
printer , err := o . PrintFlags . ToPrinter ( )
if err != nil {
return err
}
o . PrintObject = printer . PrintObj
return nil
}
func ( o ViewOptions ) Validate ( ) error {
if ! o . Merge . Value ( ) && ! o . ConfigAccess . IsExplicitFile ( ) {
return errors . New ( "if merge==false a precise file must to specified" )
}
return nil
}
func ( o ViewOptions ) Run ( ) error {
2015-04-10 18:30:08 +00:00
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
}
2015-04-17 22:36:31 +00:00
} else if ! o . RawByteData {
clientcmdapi . ShortenConfig ( config )
2015-04-10 18:30:08 +00:00
}
2018-02-19 20:16:45 +00:00
convertedObj , err := latest . Scheme . ConvertToVersion ( config , latest . ExternalVersion )
if err != nil {
return err
}
2018-05-01 19:48:46 +00:00
return o . PrintObject ( convertedObj , o . Out )
2015-02-20 14:27:34 +00:00
}
2015-04-10 18:30:08 +00:00
func ( o ViewOptions ) loadConfig ( ) ( * clientcmdapi . Config , error ) {
err := o . Validate ( )
2014-12-17 13:03:03 +00:00
if err != nil {
2015-02-05 01:47:52 +00:00
return nil , err
2014-12-17 13:03:03 +00:00
}
2015-04-08 14:32:32 +00:00
config , err := o . getStartingConfig ( )
2015-02-05 01:47:52 +00:00
return config , err
2014-12-17 13:03:03 +00:00
}
// 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
2015-04-10 18:30:08 +00:00
func ( o * ViewOptions ) getStartingConfig ( ) ( * clientcmdapi . Config , error ) {
2014-12-17 13:03:03 +00:00
switch {
2015-04-10 18:30:08 +00:00
case ! o . Merge . Value ( ) :
2015-04-10 12:54:22 +00:00
return clientcmd . LoadFromFile ( o . ConfigAccess . GetExplicitFile ( ) )
2015-04-08 14:32:32 +00:00
2014-12-17 13:03:03 +00:00
default :
2015-04-10 12:54:22 +00:00
return o . ConfigAccess . GetStartingConfig ( )
2014-12-17 13:03:03 +00:00
}
}