kubectl.go 1.7 KB

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