Added support for kube-context flag, to specify kubernetes context (#1595)
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user