blob: 0e2476761d3e22c86104b97125a8141abd0b2fb9 [file] [log] [blame] [edit]
package main
import (
"log"
"os"
"os/exec"
"github.com/spf13/cobra"
"source.monogon.dev/metropolis/cli/metroctl/core"
)
var k8sCommand = &cobra.Command{
Short: "Manages kubernetes-specific functionality in Metropolis.",
Use: "k8s",
}
var k8sConfigureCommand = &cobra.Command{
Use: "configure",
Short: "Configures local `kubectl` for use with a Metropolis cluster.",
Long: `Configures a local kubectl instance (or any other Kubernetes application)
to connect to a Metropolis cluster. A cluster endpoint must be provided with the
--endpoints parameter.`,
Args: cobra.ExactArgs(0),
Run: doK8sConfigure,
}
func doK8sConfigure(cmd *cobra.Command, _ []string) {
if len(flags.clusterEndpoints) < 1 {
log.Fatalf("k8s configure requires at least one cluster endpoint to be provided with the --endpoints parameter.")
}
// If the user has metroctl in their path, use the metroctl from path as
// a credential plugin. Otherwise use the path to the currently-running
// metroctl.
metroctlPath := "metroctl"
if _, err := exec.LookPath("metroctl"); err != nil {
metroctlPath, err = os.Executable()
if err != nil {
log.Fatalf("Failed to create kubectl entry as metroctl is neither in PATH nor can its absolute path be determined: %v", err)
}
}
// TODO(q3k, issues/144): this only works as long as all nodes are kubernetes controller
// nodes. This won't be the case for too long. Figure this out.
configName := "metroctl"
if err := core.InstallKubeletConfig(metroctlPath, connectOptions(), configName, flags.clusterEndpoints[0]); err != nil {
log.Fatalf("Failed to install metroctl/k8s integration: %v", err)
}
log.Printf("Success! kubeconfig is set up. You can now run kubectl --context=%s ... to access the Kubernetes cluster.", configName)
}
func init() {
k8sCommand.AddCommand(k8sConfigureCommand)
rootCmd.AddCommand(k8sCommand)
}