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"
2015-11-02 23:47:09 +00:00
"fmt"
2014-12-17 13:03:03 +00:00
"io"
2016-05-20 17:49:56 +00:00
"github.com/renstrom/dedent"
2014-12-17 13:03:03 +00:00
"github.com/spf13/cobra"
2015-08-13 19:01:50 +00:00
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest"
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2016-03-09 07:25:34 +00:00
"k8s.io/kubernetes/pkg/util/flag"
2014-12-17 13:03:03 +00:00
)
2015-04-10 18:30:08 +00:00
type ViewOptions struct {
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
2014-12-17 13:03:03 +00:00
}
2016-05-20 17:49:56 +00:00
var (
view_long = dedent . Dedent ( `
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 . ` )
view_example = dedent . Dedent ( `
# Show Merged kubeconfig settings .
kubectl config view
2015-02-05 01:47:52 +00:00
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 } ' ` )
2015-03-11 17:22:08 +00:00
)
2016-04-14 18:47:19 +00:00
func NewCmdConfigView ( out io . Writer , ConfigAccess clientcmd . ConfigAccess ) * cobra . Command {
2015-04-10 12:54:22 +00:00
options := & ViewOptions { ConfigAccess : ConfigAccess }
2015-11-02 23:47:09 +00:00
// Default to yaml
defaultOutputFormat := "yaml"
2015-03-11 17:22:08 +00:00
cmd := & cobra . Command {
Use : "view" ,
2016-06-07 17:38:04 +00:00
Short : "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 ) {
2015-04-10 18:30:08 +00:00
options . Complete ( )
2015-11-02 23:47:09 +00:00
outputFormat := cmdutil . GetFlagString ( cmd , "output" )
if outputFormat == "wide" {
fmt . Printf ( "--output wide is not available in kubectl config view; reset to default output format (%s)\n\n" , defaultOutputFormat )
cmd . Flags ( ) . Set ( "output" , defaultOutputFormat )
}
2016-04-29 03:04:57 +00:00
if outputFormat == "" {
fmt . Printf ( "reset to default output format (%s) as --output is empty" , defaultOutputFormat )
cmd . Flags ( ) . Set ( "output" , defaultOutputFormat )
}
2015-02-20 14:27:34 +00:00
2015-02-24 20:06:24 +00:00
printer , _ , err := cmdutil . PrinterForCommand ( cmd )
2015-12-01 16:52:11 +00:00
cmdutil . CheckErr ( err )
version , err := cmdutil . OutputVersion ( cmd , & latest . ExternalVersion )
cmdutil . CheckErr ( err )
2015-02-20 14:03:38 +00:00
printer = kubectl . NewVersionedPrinter ( printer , clientcmdapi . Scheme , version )
2015-12-01 16:52:11 +00:00
cmdutil . CheckErr ( options . Run ( out , printer ) )
2014-12-17 13:03:03 +00:00
} ,
}
2015-02-20 14:27:34 +00:00
cmdutil . AddPrinterFlags ( cmd )
2015-11-02 23:47:09 +00:00
cmd . Flags ( ) . Set ( "output" , defaultOutputFormat )
2015-02-20 14:27:34 +00:00
2015-04-10 18:30:08 +00:00
options . Merge . Default ( true )
2016-08-02 16:51:51 +00:00
f := cmd . Flags ( ) . VarPF ( & options . Merge , "merge" , "" , "merge the full hierarchy of kubeconfig files" )
2016-01-08 16:42:06 +00:00
f . NoOptDefVal = "true"
2015-04-17 22:36:31 +00:00
cmd . Flags ( ) . BoolVar ( & options . RawByteData , "raw" , false , "display raw byte data" )
2016-08-02 16:51:51 +00:00
cmd . Flags ( ) . BoolVar ( & options . Flatten , "flatten" , false , "flatten the resulting kubeconfig file into self-contained output (useful for creating portable kubeconfig files)" )
2015-04-10 18:30:08 +00:00
cmd . Flags ( ) . BoolVar ( & options . Minify , "minify" , false , "remove all information not used by current-context from the output" )
2014-12-17 13:03:03 +00:00
return cmd
}
2015-04-10 18:30:08 +00:00
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
}
2015-04-17 22:36:31 +00:00
} else if ! o . RawByteData {
clientcmdapi . ShortenConfig ( config )
2015-04-10 18:30:08 +00:00
}
err = printer . PrintObj ( config , out )
if err != nil {
return err
}
return nil
}
func ( o * ViewOptions ) Complete ( ) bool {
2015-04-10 12:54:22 +00:00
if o . ConfigAccess . IsExplicitFile ( ) {
2015-04-10 18:30:08 +00:00
if ! o . Merge . Provided ( ) {
o . Merge . Set ( "false" )
2015-02-20 14:27:34 +00:00
}
}
return true
}
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
}
2015-04-10 18:30:08 +00:00
func ( o ViewOptions ) Validate ( ) error {
2015-04-10 12:54:22 +00:00
if ! o . Merge . Value ( ) && ! o . ConfigAccess . IsExplicitFile ( ) {
return errors . New ( "if merge==false a precise file must to specified" )
}
return nil
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
}
}