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 (
"errors"
"fmt"
"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"
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/util"
2014-12-17 13:03:03 +00:00
)
type createContextOptions struct {
2016-04-14 18:47:19 +00:00
configAccess clientcmd . ConfigAccess
2015-04-10 12:54:22 +00:00
name string
cluster util . StringFlag
authInfo util . StringFlag
namespace util . StringFlag
2014-12-17 13:03:03 +00:00
}
2016-05-20 17:49:56 +00:00
var (
create_context_long = dedent . Dedent ( `
Sets a context entry in kubeconfig
Specifying a name that already exists will merge new fields on top of existing values for those fields . ` )
create_context_example = dedent . Dedent ( `
# Set the user field on the gce context entry without touching other values
kubectl config set - context gce -- user = cluster - admin ` )
2015-03-11 17:22:08 +00:00
)
2016-04-14 18:47:19 +00:00
func NewCmdConfigSetContext ( out io . Writer , configAccess clientcmd . ConfigAccess ) * cobra . Command {
2015-04-10 12:54:22 +00:00
options := & createContextOptions { configAccess : configAccess }
2014-12-17 13:03:03 +00:00
cmd := & cobra . Command {
2015-03-11 17:22:08 +00:00
Use : fmt . Sprintf ( "set-context NAME [--%v=cluster_nickname] [--%v=user_nickname] [--%v=namespace]" , clientcmd . FlagClusterName , clientcmd . FlagAuthInfoName , clientcmd . FlagNamespace ) ,
2015-04-08 14:32:32 +00:00
Short : "Sets a context entry in kubeconfig" ,
2015-03-11 17:22:08 +00:00
Long : create_context_long ,
Example : create_context_example ,
2014-12-17 13:03:03 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
if ! options . complete ( cmd ) {
return
}
err := options . run ( )
if err != nil {
2015-09-23 08:08:42 +00:00
fmt . Fprintf ( out , "%v\n" , err )
} else {
fmt . Fprintf ( out , "context %q set.\n" , options . name )
2014-12-17 13:03:03 +00:00
}
} ,
}
2015-04-08 14:32:32 +00:00
cmd . Flags ( ) . Var ( & options . cluster , clientcmd . FlagClusterName , clientcmd . FlagClusterName + " for the context entry in kubeconfig" )
cmd . Flags ( ) . Var ( & options . authInfo , clientcmd . FlagAuthInfoName , clientcmd . FlagAuthInfoName + " for the context entry in kubeconfig" )
cmd . Flags ( ) . Var ( & options . namespace , clientcmd . FlagNamespace , clientcmd . FlagNamespace + " for the context entry in kubeconfig" )
2014-12-17 13:03:03 +00:00
return cmd
}
func ( o createContextOptions ) run ( ) error {
err := o . validate ( )
if err != nil {
return err
}
2015-04-10 12:54:22 +00:00
config , err := o . configAccess . GetStartingConfig ( )
2014-12-17 13:03:03 +00:00
if err != nil {
return err
}
2015-06-29 18:39:48 +00:00
startingStanza , exists := config . Contexts [ o . name ]
if ! exists {
startingStanza = clientcmdapi . NewContext ( )
}
context := o . modifyContext ( * startingStanza )
config . Contexts [ o . name ] = & context
2014-12-17 13:03:03 +00:00
2016-04-14 18:47:19 +00:00
if err := clientcmd . ModifyConfig ( o . configAccess , * config , true ) ; err != nil {
2014-12-17 13:03:03 +00:00
return err
}
return nil
}
2015-01-23 19:18:25 +00:00
func ( o * createContextOptions ) modifyContext ( existingContext clientcmdapi . Context ) clientcmdapi . Context {
modifiedContext := existingContext
if o . cluster . Provided ( ) {
modifiedContext . Cluster = o . cluster . Value ( )
}
if o . authInfo . Provided ( ) {
modifiedContext . AuthInfo = o . authInfo . Value ( )
}
if o . namespace . Provided ( ) {
modifiedContext . Namespace = o . namespace . Value ( )
2014-12-17 13:03:03 +00:00
}
2015-01-23 19:18:25 +00:00
return modifiedContext
2014-12-17 13:03:03 +00:00
}
func ( o * createContextOptions ) complete ( cmd * cobra . Command ) bool {
args := cmd . Flags ( ) . Args ( )
if len ( args ) != 1 {
cmd . Help ( )
return false
}
o . name = args [ 0 ]
return true
}
func ( o createContextOptions ) validate ( ) error {
if len ( o . name ) == 0 {
2015-09-23 08:08:42 +00:00
return errors . New ( "you must specify a non-empty context name" )
2014-12-17 13:03:03 +00:00
}
2015-04-10 12:54:22 +00:00
return nil
2014-12-17 13:03:03 +00:00
}