diff --git a/cmd/fission-cli/app/app.go b/cmd/fission-cli/app/app.go index 1f304606..04c56252 100644 --- a/cmd/fission-cli/app/app.go +++ b/cmd/fission-cli/app/app.go @@ -73,7 +73,7 @@ func App() *cobra.Command { }) wrapper.SetFlags(rootCmd, flag.FlagSet{ - Global: []flag.Flag{flag.GlobalServer, flag.GlobalVerbosity}, + Global: []flag.Flag{flag.GlobalServer, flag.GlobalVerbosity, flag.KubeContext}, }) groups := helptemplate.CommandGroups{} @@ -86,7 +86,7 @@ func App() *cobra.Command { flagExposer := helptemplate.ActsAsRootCommand(rootCmd, nil, groups...) // show global options in usage - flagExposer.ExposeFlags(rootCmd, flagkey.Server, flagkey.Verbosity) + flagExposer.ExposeFlags(rootCmd, flagkey.Server, flagkey.Verbosity, flagkey.KubeContext) return rootCmd } diff --git a/pkg/fission-cli/cmd/function/log.go b/pkg/fission-cli/cmd/function/log.go index da07a015..73754761 100644 --- a/pkg/fission-cli/cmd/function/log.go +++ b/pkg/fission-cli/cmd/function/log.go @@ -42,6 +42,7 @@ func Log(input cli.Input) error { func (opts *LogSubCommand) do(input cli.Input) error { dbType := input.String(flagkey.FnLogDBType) fnPod := input.String(flagkey.FnLogPod) + kubeContext := input.String(flagkey.KubeContext) 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") } - server, err := util.GetApplicationUrl("application=fission-api") + server, err := util.GetApplicationUrl("application=fission-api", kubeContext) if err != nil { return err } diff --git a/pkg/fission-cli/cmd/function/test.go b/pkg/fission-cli/cmd/function/test.go index e481d807..2905720b 100644 --- a/pkg/fission-cli/cmd/function/test.go +++ b/pkg/fission-cli/cmd/function/test.go @@ -51,14 +51,14 @@ func (opts *TestSubCommand) do(input cli.Input) error { Name: input.String(flagkey.FnName), Namespace: input.String(flagkey.NamespaceFunction), } - + kubeContext := input.String(flagkey.KubeContext) routerURL := os.Getenv("FISSION_ROUTER") if len(routerURL) != 0 { console.Warn("The environment variable FISSION_ROUTER is no longer supported for this command") } // 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 { return err } diff --git a/pkg/fission-cli/cmd/support/dump.go b/pkg/fission-cli/cmd/support/dump.go index decc421a..58147355 100644 --- a/pkg/fission-cli/cmd/support/dump.go +++ b/pkg/fission-cli/cmd/support/dump.go @@ -51,7 +51,7 @@ func (opts *DumpSubCommand) do(input cli.Input) error { nozip := input.Bool(flagkey.SupportNoZip) outputDir := input.String(flagkey.SupportOutput) - + kubeContext := input.String(flagkey.KubeContext) // check whether the dump directory exists. _, err := os.Stat(outputDir) 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")) } - _, k8sClient, err := util.GetKubernetesClient() + _, k8sClient, err := util.GetKubernetesClient(kubeContext) if err != nil { return err } diff --git a/pkg/fission-cli/flag/flag.go b/pkg/fission-cli/flag/flag.go index 8c277f58..65e192e4 100644 --- a/pkg/fission-cli/flag/flag.go +++ b/pkg/fission-cli/flag/flag.go @@ -72,6 +72,8 @@ var ( 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} 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} diff --git a/pkg/fission-cli/flag/key/key.go b/pkg/fission-cli/flag/key/key.go index 0a9fd1fa..ec3d8d07 100644 --- a/pkg/fission-cli/flag/key/key.go +++ b/pkg/fission-cli/flag/key/key.go @@ -17,9 +17,10 @@ limitations under the License. package flagkey const ( - Verbosity = "verbosity" - Server = "server" - ClientOnly = "client-only" + Verbosity = "verbosity" + Server = "server" + ClientOnly = "client-only" + KubeContext = "kube-context" resourceName = "name" force = "force" diff --git a/pkg/fission-cli/util/portforward.go b/pkg/fission-cli/util/portforward.go index 5d004458..97e9c5eb 100644 --- a/pkg/fission-cli/util/portforward.go +++ b/pkg/fission-cli/util/portforward.go @@ -40,7 +40,7 @@ import ( // 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 // 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", labelSelector, namespace) @@ -63,7 +63,7 @@ func SetupPortForward(namespace, labelSelector string) (string, error) { console.Verbose(2, "Starting port forward from local port %v", localPort) go func() { - err := runPortForward(labelSelector, localPort, namespace) + err := runPortForward(labelSelector, localPort, namespace, kubeContext) if err != nil { fmt.Printf("Error forwarding to port %v: %s", localPort, err.Error()) os.Exit(1) @@ -103,8 +103,8 @@ func findFreePort() (string, error) { } // runPortForward creates a local port forward to the specified pod -func runPortForward(labelSelector string, localPort string, ns string) error { - config, clientset, err := GetKubernetesClient() +func runPortForward(labelSelector string, localPort string, ns string, kubeContext string) error { + config, clientset, err := GetKubernetesClient(kubeContext) if err != nil { return err } diff --git a/pkg/fission-cli/util/util.go b/pkg/fission-cli/util/util.go index 1a639ecb..3c329eee 100644 --- a/pkg/fission-cli/util/util.go +++ b/pkg/fission-cli/util/util.go @@ -18,7 +18,6 @@ package util import ( "fmt" - "github.com/fission/fission/pkg/controller/client/rest" "os" "os/user" "path/filepath" @@ -26,6 +25,8 @@ import ( "strconv" "strings" + "github.com/fission/fission/pkg/controller/client/rest" + "github.com/hashicorp/go-multierror" "github.com/pkg/errors" v1 "k8s.io/api/core/v1" @@ -49,13 +50,13 @@ func GetFissionNamespace() string { return fissionNamespace } -func GetApplicationUrl(selector string) (string, error) { +func GetApplicationUrl(selector string, kubeContext string) (string, error) { var serverUrl string // Use FISSION_URL env variable if set; otherwise, port-forward to controller. fissionUrl := os.Getenv("FISSION_URL") if len(fissionUrl) == 0 { fissionNamespace := GetFissionNamespace() - localPort, err := SetupPortForward(fissionNamespace, selector) + localPort, err := SetupPortForward(fissionNamespace, selector, kubeContext) if err != nil { return "", err } @@ -102,7 +103,7 @@ func KubifyName(old string) string { // GetKubernetesClient builds a new kubernetes client. If the KUBECONFIG // environment variable is empty or doesn't exist, ~/.kube/config is used for // the kube config path -func GetKubernetesClient() (*restclient.Config, *kubernetes.Clientset, error) { +func GetKubernetesClient(kubeContext string) (*restclient.Config, *kubernetes.Clientset, error) { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() kubeConfigPath := os.Getenv("KUBECONFIG") @@ -131,7 +132,7 @@ func GetKubernetesClient() (*restclient.Config, *kubernetes.Clientset, error) { } config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( - loadingRules, &clientcmd.ConfigOverrides{}).ClientConfig() + loadingRules, &clientcmd.ConfigOverrides{CurrentContext: kubeContext}).ClientConfig() if err != nil { 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) { serverUrl = input.GlobalString(flagkey.Server) + kubeContext := input.String(flagkey.KubeContext) if len(serverUrl) == 0 { // starts local portforwarder etc. - serverUrl, err = GetApplicationUrl("application=fission-api") + serverUrl, err = GetApplicationUrl("application=fission-api", kubeContext) if err != nil { return "", err }