in pkg/cmd/ns.go [106:183]
func (o *NamespaceOptions) Complete(cmd *cobra.Command, args []string) error {
o.args = args
var err error
o.rawConfig, err = o.configFlags.ToRawKubeConfigLoader().RawConfig()
if err != nil {
return err
}
o.userSpecifiedNamespace, err = cmd.Flags().GetString("namespace")
if err != nil {
return err
}
if len(args) > 0 {
if len(o.userSpecifiedNamespace) > 0 {
return fmt.Errorf("cannot specify both a --namespace value and a new namespace argument")
}
o.userSpecifiedNamespace = args[0]
}
// if no namespace argument or flag value was specified, then there
// is no need to generate a resulting context
if len(o.userSpecifiedNamespace) == 0 {
return nil
}
o.userSpecifiedContext, err = cmd.Flags().GetString("context")
if err != nil {
return err
}
o.userSpecifiedCluster, err = cmd.Flags().GetString("cluster")
if err != nil {
return err
}
o.userSpecifiedAuthInfo, err = cmd.Flags().GetString("user")
if err != nil {
return err
}
currentContext, exists := o.rawConfig.Contexts[o.rawConfig.CurrentContext]
if !exists {
return errNoContext
}
o.resultingContext = api.NewContext()
o.resultingContext.Cluster = currentContext.Cluster
o.resultingContext.AuthInfo = currentContext.AuthInfo
// if a target context is explicitly provided by the user,
// use that as our reference for the final, resulting context
if len(o.userSpecifiedContext) > 0 {
o.resultingContextName = o.userSpecifiedContext
if userCtx, exists := o.rawConfig.Contexts[o.userSpecifiedContext]; exists {
o.resultingContext = userCtx.DeepCopy()
}
}
// override context info with user provided values
o.resultingContext.Namespace = o.userSpecifiedNamespace
if len(o.userSpecifiedCluster) > 0 {
o.resultingContext.Cluster = o.userSpecifiedCluster
}
if len(o.userSpecifiedAuthInfo) > 0 {
o.resultingContext.AuthInfo = o.userSpecifiedAuthInfo
}
// generate a unique context name based on its new values if
// user did not explicitly request a context by name
if len(o.userSpecifiedContext) == 0 {
o.resultingContextName = generateContextName(o.resultingContext)
}
return nil
}