Added support for kube-context flag, to specify kubernetes context (#1595)

This commit is contained in:
Rahul Bhati
2020-05-11 18:54:06 +05:30
committed by GitHub
parent 3e8cbe112f
commit 2d69542265
8 changed files with 26 additions and 20 deletions
+2 -2
View File
@@ -73,7 +73,7 @@ func App() *cobra.Command {
}) })
wrapper.SetFlags(rootCmd, flag.FlagSet{ wrapper.SetFlags(rootCmd, flag.FlagSet{
Global: []flag.Flag{flag.GlobalServer, flag.GlobalVerbosity}, Global: []flag.Flag{flag.GlobalServer, flag.GlobalVerbosity, flag.KubeContext},
}) })
groups := helptemplate.CommandGroups{} groups := helptemplate.CommandGroups{}
@@ -86,7 +86,7 @@ func App() *cobra.Command {
flagExposer := helptemplate.ActsAsRootCommand(rootCmd, nil, groups...) flagExposer := helptemplate.ActsAsRootCommand(rootCmd, nil, groups...)
// show global options in usage // show global options in usage
flagExposer.ExposeFlags(rootCmd, flagkey.Server, flagkey.Verbosity) flagExposer.ExposeFlags(rootCmd, flagkey.Server, flagkey.Verbosity, flagkey.KubeContext)
return rootCmd return rootCmd
} }
+2 -1
View File
@@ -42,6 +42,7 @@ func Log(input cli.Input) error {
func (opts *LogSubCommand) do(input cli.Input) error { func (opts *LogSubCommand) do(input cli.Input) error {
dbType := input.String(flagkey.FnLogDBType) dbType := input.String(flagkey.FnLogDBType)
fnPod := input.String(flagkey.FnLogPod) fnPod := input.String(flagkey.FnLogPod)
kubeContext := input.String(flagkey.KubeContext)
logReverseQuery := !input.Bool(flagkey.FnLogFollow) && input.Bool(flagkey.FnLogReverseQuery) logReverseQuery := !input.Bool(flagkey.FnLogFollow) && input.Bool(flagkey.FnLogReverseQuery)
@@ -58,7 +59,7 @@ func (opts *LogSubCommand) do(input cli.Input) error {
return errors.Wrap(err, "error getting function") return errors.Wrap(err, "error getting function")
} }
server, err := util.GetApplicationUrl("application=fission-api") server, err := util.GetApplicationUrl("application=fission-api", kubeContext)
if err != nil { if err != nil {
return err return err
} }
+2 -2
View File
@@ -51,14 +51,14 @@ func (opts *TestSubCommand) do(input cli.Input) error {
Name: input.String(flagkey.FnName), Name: input.String(flagkey.FnName),
Namespace: input.String(flagkey.NamespaceFunction), Namespace: input.String(flagkey.NamespaceFunction),
} }
kubeContext := input.String(flagkey.KubeContext)
routerURL := os.Getenv("FISSION_ROUTER") routerURL := os.Getenv("FISSION_ROUTER")
if len(routerURL) != 0 { if len(routerURL) != 0 {
console.Warn("The environment variable FISSION_ROUTER is no longer supported for this command") console.Warn("The environment variable FISSION_ROUTER is no longer supported for this command")
} }
// Portforward to the fission router // Portforward to the fission router
localRouterPort, err := util.SetupPortForward(util.GetFissionNamespace(), "application=fission-router") localRouterPort, err := util.SetupPortForward(util.GetFissionNamespace(), "application=fission-router", kubeContext)
if err != nil { if err != nil {
return err return err
} }
+2 -2
View File
@@ -51,7 +51,7 @@ func (opts *DumpSubCommand) do(input cli.Input) error {
nozip := input.Bool(flagkey.SupportNoZip) nozip := input.Bool(flagkey.SupportNoZip)
outputDir := input.String(flagkey.SupportOutput) outputDir := input.String(flagkey.SupportOutput)
kubeContext := input.String(flagkey.KubeContext)
// check whether the dump directory exists. // check whether the dump directory exists.
_, err := os.Stat(outputDir) _, err := os.Stat(outputDir)
if err != nil && os.IsNotExist(err) { if err != nil && os.IsNotExist(err) {
@@ -68,7 +68,7 @@ func (opts *DumpSubCommand) do(input cli.Input) error {
panic(errors.Wrap(err, "Error creating dump directory for dumping files")) panic(errors.Wrap(err, "Error creating dump directory for dumping files"))
} }
_, k8sClient, err := util.GetKubernetesClient() _, k8sClient, err := util.GetKubernetesClient(kubeContext)
if err != nil { if err != nil {
return err return err
} }
+2
View File
@@ -72,6 +72,8 @@ var (
ClientOnly = Flag{Type: Bool, Name: flagkey.ClientOnly, Usage: "If set, the CLI won't connect to remote server"} ClientOnly = Flag{Type: Bool, Name: flagkey.ClientOnly, Usage: "If set, the CLI won't connect to remote server"}
KubeContext = Flag{Type: String, Name: flagkey.KubeContext, Usage: "Kubernetes context to be used for the execution of Fission commands", DefaultValue: ""}
NamespaceFunction = Flag{Type: String, Name: flagkey.NamespaceFunction, Aliases: []string{"fns"}, Usage: "Namespace for function object", DefaultValue: metav1.NamespaceDefault} NamespaceFunction = Flag{Type: String, Name: flagkey.NamespaceFunction, Aliases: []string{"fns"}, Usage: "Namespace for function object", DefaultValue: metav1.NamespaceDefault}
NamespaceEnvironment = Flag{Type: String, Name: flagkey.NamespaceEnvironment, Aliases: []string{"envns"}, Usage: "Namespace for environment object", DefaultValue: metav1.NamespaceDefault} NamespaceEnvironment = Flag{Type: String, Name: flagkey.NamespaceEnvironment, Aliases: []string{"envns"}, Usage: "Namespace for environment object", DefaultValue: metav1.NamespaceDefault}
NamespacePackage = Flag{Type: String, Name: flagkey.NamespacePackage, Aliases: []string{"pkgns"}, Usage: "Namespace for package object", DefaultValue: metav1.NamespaceDefault} NamespacePackage = Flag{Type: String, Name: flagkey.NamespacePackage, Aliases: []string{"pkgns"}, Usage: "Namespace for package object", DefaultValue: metav1.NamespaceDefault}
+4 -3
View File
@@ -17,9 +17,10 @@ limitations under the License.
package flagkey package flagkey
const ( const (
Verbosity = "verbosity" Verbosity = "verbosity"
Server = "server" Server = "server"
ClientOnly = "client-only" ClientOnly = "client-only"
KubeContext = "kube-context"
resourceName = "name" resourceName = "name"
force = "force" force = "force"
+4 -4
View File
@@ -40,7 +40,7 @@ import (
// is found by looking for a service in the same namespace and using // is found by looking for a service in the same namespace and using
// its targetPort. Once the port forward is started, wait for it to // its targetPort. Once the port forward is started, wait for it to
// start accepting connections before returning. // start accepting connections before returning.
func SetupPortForward(namespace, labelSelector string) (string, error) { func SetupPortForward(namespace, labelSelector string, kubeContext string) (string, error) {
console.Verbose(2, "Setting up port forward to %s in namespace %s", console.Verbose(2, "Setting up port forward to %s in namespace %s",
labelSelector, namespace) labelSelector, namespace)
@@ -63,7 +63,7 @@ func SetupPortForward(namespace, labelSelector string) (string, error) {
console.Verbose(2, "Starting port forward from local port %v", localPort) console.Verbose(2, "Starting port forward from local port %v", localPort)
go func() { go func() {
err := runPortForward(labelSelector, localPort, namespace) err := runPortForward(labelSelector, localPort, namespace, kubeContext)
if err != nil { if err != nil {
fmt.Printf("Error forwarding to port %v: %s", localPort, err.Error()) fmt.Printf("Error forwarding to port %v: %s", localPort, err.Error())
os.Exit(1) os.Exit(1)
@@ -103,8 +103,8 @@ func findFreePort() (string, error) {
} }
// runPortForward creates a local port forward to the specified pod // runPortForward creates a local port forward to the specified pod
func runPortForward(labelSelector string, localPort string, ns string) error { func runPortForward(labelSelector string, localPort string, ns string, kubeContext string) error {
config, clientset, err := GetKubernetesClient() config, clientset, err := GetKubernetesClient(kubeContext)
if err != nil { if err != nil {
return err return err
} }
+8 -6
View File
@@ -18,7 +18,6 @@ package util
import ( import (
"fmt" "fmt"
"github.com/fission/fission/pkg/controller/client/rest"
"os" "os"
"os/user" "os/user"
"path/filepath" "path/filepath"
@@ -26,6 +25,8 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/fission/fission/pkg/controller/client/rest"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
"github.com/pkg/errors" "github.com/pkg/errors"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
@@ -49,13 +50,13 @@ func GetFissionNamespace() string {
return fissionNamespace return fissionNamespace
} }
func GetApplicationUrl(selector string) (string, error) { func GetApplicationUrl(selector string, kubeContext string) (string, error) {
var serverUrl string var serverUrl string
// Use FISSION_URL env variable if set; otherwise, port-forward to controller. // Use FISSION_URL env variable if set; otherwise, port-forward to controller.
fissionUrl := os.Getenv("FISSION_URL") fissionUrl := os.Getenv("FISSION_URL")
if len(fissionUrl) == 0 { if len(fissionUrl) == 0 {
fissionNamespace := GetFissionNamespace() fissionNamespace := GetFissionNamespace()
localPort, err := SetupPortForward(fissionNamespace, selector) localPort, err := SetupPortForward(fissionNamespace, selector, kubeContext)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -102,7 +103,7 @@ func KubifyName(old string) string {
// GetKubernetesClient builds a new kubernetes client. If the KUBECONFIG // GetKubernetesClient builds a new kubernetes client. If the KUBECONFIG
// environment variable is empty or doesn't exist, ~/.kube/config is used for // environment variable is empty or doesn't exist, ~/.kube/config is used for
// the kube config path // the kube config path
func GetKubernetesClient() (*restclient.Config, *kubernetes.Clientset, error) { func GetKubernetesClient(kubeContext string) (*restclient.Config, *kubernetes.Clientset, error) {
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
kubeConfigPath := os.Getenv("KUBECONFIG") kubeConfigPath := os.Getenv("KUBECONFIG")
@@ -131,7 +132,7 @@ func GetKubernetesClient() (*restclient.Config, *kubernetes.Clientset, error) {
} }
config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
loadingRules, &clientcmd.ConfigOverrides{}).ClientConfig() loadingRules, &clientcmd.ConfigOverrides{CurrentContext: kubeContext}).ClientConfig()
if err != nil { if err != nil {
return nil, nil, errors.Wrap(err, "Failed to build Kubernetes config") return nil, nil, errors.Wrap(err, "Failed to build Kubernetes config")
} }
@@ -206,9 +207,10 @@ func GetServer(input cli.Input) (c client.Interface, err error) {
func GetServerURL(input cli.Input) (serverUrl string, err error) { func GetServerURL(input cli.Input) (serverUrl string, err error) {
serverUrl = input.GlobalString(flagkey.Server) serverUrl = input.GlobalString(flagkey.Server)
kubeContext := input.String(flagkey.KubeContext)
if len(serverUrl) == 0 { if len(serverUrl) == 0 {
// starts local portforwarder etc. // starts local portforwarder etc.
serverUrl, err = GetApplicationUrl("application=fission-api") serverUrl, err = GetApplicationUrl("application=fission-api", kubeContext)
if err != nil { if err != nil {
return "", err return "", err
} }