2014-12-17 13:03:03 +00:00
/ *
Copyright 2014 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 config
import (
"fmt"
"io"
2015-02-03 13:56:06 +00:00
"os"
2014-12-17 13:03:03 +00:00
2015-02-05 01:47:52 +00:00
"github.com/golang/glog"
2014-12-17 13:03:03 +00:00
"github.com/spf13/cobra"
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd"
clientcmdapi "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd/api"
2015-02-20 14:27:34 +00:00
cmdutil "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
2014-12-17 13:03:03 +00:00
)
type viewOptions struct {
pathOptions * pathOptions
2015-02-20 14:27:34 +00:00
merge util . BoolFlag
2014-12-17 13:03:03 +00:00
}
func NewCmdConfigView ( out io . Writer , pathOptions * pathOptions ) * cobra . Command {
options := & viewOptions { pathOptions : pathOptions }
cmd := & cobra . Command {
Use : "view" ,
2015-02-05 01:47:52 +00:00
Short : "displays merged .kubeconfig settings or a specified .kubeconfig file." ,
2015-02-20 21:28:43 +00:00
Long : "displays merged .kubeconfig settings or a specified .kubeconfig file." ,
Example : ` // Show merged .kubeconfig settings.
$ kubectl config view
2015-02-05 01:47:52 +00:00
2015-02-20 21:28:43 +00:00
// Show only local ./.kubeconfig settings
$ kubectl config view -- local ` ,
2014-12-17 13:03:03 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2015-02-20 14:27:34 +00:00
options . complete ( )
2015-02-24 20:06:24 +00:00
printer , _ , err := cmdutil . PrinterForCommand ( cmd )
2014-12-17 13:03:03 +00:00
if err != nil {
2015-02-05 01:47:52 +00:00
glog . FatalDepth ( 1 , err )
}
config , err := options . loadConfig ( )
if err != nil {
glog . FatalDepth ( 1 , err )
}
err = printer . PrintObj ( config , out )
if err != nil {
glog . FatalDepth ( 1 , err )
2014-12-17 13:03:03 +00:00
}
} ,
}
2015-02-20 14:27:34 +00:00
cmdutil . AddPrinterFlags ( cmd )
2015-02-05 01:47:52 +00:00
// Default to yaml
cmd . Flags ( ) . Set ( "output" , "yaml" )
2015-02-20 14:27:34 +00:00
options . merge . Default ( true )
cmd . Flags ( ) . Var ( & options . merge , "merge" , "merge together the full hierarchy of .kubeconfig files" )
2014-12-17 13:03:03 +00:00
return cmd
}
2015-02-20 14:27:34 +00:00
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 ( len ( o . pathOptions . specifiedFile ) > 0 ) || o . pathOptions . global || o . pathOptions . local {
if ! o . merge . Provided ( ) {
o . merge . Set ( "false" )
}
}
return true
}
2015-02-05 01:47:52 +00:00
func ( o viewOptions ) loadConfig ( ) ( * clientcmdapi . Config , error ) {
2014-12-17 13:03:03 +00:00
err := o . validate ( )
if err != nil {
2015-02-05 01:47:52 +00:00
return nil , err
2014-12-17 13:03:03 +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
}
func ( o viewOptions ) validate ( ) error {
return nil
}
// 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 , string , error ) {
switch {
2015-02-20 14:27:34 +00:00
case o . merge . Value ( ) :
2014-12-17 13:03:03 +00:00
loadingRules := clientcmd . NewClientConfigLoadingRules ( )
2015-02-03 13:56:06 +00:00
loadingRules . EnvVarPath = os . Getenv ( "KUBECONFIG" )
2014-12-17 13:03:03 +00:00
loadingRules . CommandLinePath = o . pathOptions . specifiedFile
overrides := & clientcmd . ConfigOverrides { }
clientConfig := clientcmd . NewNonInteractiveDeferredLoadingClientConfig ( loadingRules , overrides )
config , err := clientConfig . RawConfig ( )
if err != nil {
return nil , "" , fmt . Errorf ( "Error getting config: %v" , err )
}
return & config , "" , nil
default :
return o . pathOptions . getStartingConfig ( )
}
}