kubectl.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package cmd
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. api "github.com/porter-dev/porter/api/client"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/spf13/cobra"
  10. )
  11. var kubectlCmd = &cobra.Command{
  12. Use: "kubectl",
  13. Short: "Use kubectl to interact with a Porter cluster",
  14. DisableFlagParsing: true,
  15. DisableFlagsInUseLine: true,
  16. Run: func(cmd *cobra.Command, args []string) {
  17. err := checkLoginAndRun(args, runKubectl)
  18. if err != nil {
  19. os.Exit(1)
  20. }
  21. },
  22. }
  23. func init() {
  24. rootCmd.AddCommand(kubectlCmd)
  25. }
  26. func runKubectl(_ *types.GetAuthenticatedUserResponse, client *api.Client, args []string) error {
  27. _, err := exec.LookPath("kubectl")
  28. if err != nil {
  29. return fmt.Errorf("error finding kubectl: %w", err)
  30. }
  31. tmpFile, err := downloadTempKubeconfig(client)
  32. if err != nil {
  33. return err
  34. }
  35. defer func() {
  36. os.Remove(tmpFile)
  37. }()
  38. os.Setenv("KUBECONFIG", tmpFile)
  39. cmd := exec.Command("kubectl", args...)
  40. cmd.Stdout = os.Stdout
  41. cmd.Stderr = os.Stderr
  42. err = cmd.Run()
  43. if err != nil {
  44. return fmt.Errorf("error running kubectl: %w", err)
  45. }
  46. return nil
  47. }
  48. func downloadTempKubeconfig(client *api.Client) (string, error) {
  49. tmpFile, err := os.CreateTemp("", "porter_kubeconfig_*.yaml")
  50. if err != nil {
  51. return "", fmt.Errorf("error creating temp file for kubeconfig: %w", err)
  52. }
  53. defer tmpFile.Close()
  54. resp, err := client.GetKubeconfig(context.Background(), cliConf.Project, cliConf.Cluster, cliConf.Kubeconfig)
  55. if err != nil {
  56. return "", fmt.Errorf("error fetching kubeconfig for cluster: %w", err)
  57. }
  58. _, err = tmpFile.Write(resp.Kubeconfig)
  59. if err != nil {
  60. return "", fmt.Errorf("error writing kubeconfig to temp file: %w", err)
  61. }
  62. return tmpFile.Name(), nil
  63. }