get_kubeconfig.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package cluster
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "github.com/bufbuild/connect-go"
  8. porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
  9. "github.com/porter-dev/porter/api/server/authz"
  10. "github.com/porter-dev/porter/api/server/handlers"
  11. "github.com/porter-dev/porter/api/server/shared"
  12. "github.com/porter-dev/porter/api/server/shared/apierrors"
  13. "github.com/porter-dev/porter/api/server/shared/config"
  14. "github.com/porter-dev/porter/api/types"
  15. "github.com/porter-dev/porter/internal/models"
  16. "k8s.io/client-go/tools/clientcmd"
  17. )
  18. type GetTemporaryKubeconfigHandler struct {
  19. handlers.PorterHandlerWriter
  20. authz.KubernetesAgentGetter
  21. }
  22. func NewGetTemporaryKubeconfigHandler(
  23. config *config.Config,
  24. writer shared.ResultWriter,
  25. ) *GetTemporaryKubeconfigHandler {
  26. return &GetTemporaryKubeconfigHandler{
  27. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  28. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  29. }
  30. }
  31. func (c *GetTemporaryKubeconfigHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  32. if c.Config().ServerConf.DisableTemporaryKubeconfig {
  33. c.HandleAPIError(w, r, apierrors.NewErrNotFound(
  34. errors.New("temporary kubeconfig generation is disabled on this instance"),
  35. ))
  36. return
  37. }
  38. ctx := r.Context()
  39. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  40. outOfClusterConfig := c.GetOutOfClusterConfig(cluster)
  41. if cluster.ProvisionedBy == "CAPI" {
  42. kubeconfigResp, err := c.Config().ClusterControlPlaneClient.KubeConfigForCluster(context.Background(), connect.NewRequest(
  43. &porterv1.KubeConfigForClusterRequest{
  44. ProjectId: int64(cluster.ProjectID),
  45. ClusterId: int64(cluster.ID),
  46. },
  47. ))
  48. if err != nil {
  49. c.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error getting temporary capi config: %w", err)))
  50. return
  51. }
  52. if kubeconfigResp.Msg == nil {
  53. c.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error reading temporary capi config: %w", err)))
  54. return
  55. }
  56. res := &types.GetTemporaryKubeconfigResponse{
  57. Kubeconfig: []byte(kubeconfigResp.Msg.KubeConfig),
  58. }
  59. c.WriteResult(w, r, res)
  60. return
  61. }
  62. kubeconfig, err := outOfClusterConfig.CreateRawConfigFromCluster()
  63. if err != nil {
  64. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  65. return
  66. }
  67. kubeconfigBytes, err := clientcmd.Write(*kubeconfig)
  68. if err != nil {
  69. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  70. return
  71. }
  72. res := &types.GetTemporaryKubeconfigResponse{
  73. Kubeconfig: kubeconfigBytes,
  74. }
  75. c.WriteResult(w, r, res)
  76. }