get_env_group.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package namespace
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "strings"
  7. "github.com/porter-dev/porter/api/server/authz"
  8. "github.com/porter-dev/porter/api/server/handlers"
  9. "github.com/porter-dev/porter/api/server/shared"
  10. "github.com/porter-dev/porter/api/server/shared/apierrors"
  11. "github.com/porter-dev/porter/api/server/shared/config"
  12. "github.com/porter-dev/porter/api/types"
  13. "github.com/porter-dev/porter/internal/kubernetes/envgroup"
  14. "github.com/porter-dev/porter/internal/models"
  15. "github.com/porter-dev/porter/internal/stacks"
  16. "gorm.io/gorm"
  17. )
  18. type GetEnvGroupHandler struct {
  19. handlers.PorterHandlerReadWriter
  20. authz.KubernetesAgentGetter
  21. }
  22. func NewGetEnvGroupHandler(
  23. config *config.Config,
  24. decoderValidator shared.RequestDecoderValidator,
  25. writer shared.ResultWriter,
  26. ) *GetEnvGroupHandler {
  27. return &GetEnvGroupHandler{
  28. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  29. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  30. }
  31. }
  32. func (c *GetEnvGroupHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  33. request := &types.GetEnvGroupRequest{}
  34. if ok := c.DecodeAndValidate(w, r, request); !ok {
  35. return
  36. }
  37. namespace := r.Context().Value(types.NamespaceScope).(string)
  38. cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
  39. agent, err := c.GetAgent(r, cluster, "")
  40. if err != nil {
  41. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  42. return
  43. }
  44. envGroup, err := envgroup.GetEnvGroup(agent, request.Name, namespace, request.Version)
  45. if err != nil {
  46. if strings.Contains(err.Error(), "not found") {
  47. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(
  48. fmt.Errorf("env group not found"),
  49. http.StatusNotFound),
  50. )
  51. return
  52. }
  53. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  54. return
  55. }
  56. stackId, err := stacks.GetStackForEnvGroup(c.Config(), cluster.ProjectID, cluster.ID, envGroup)
  57. if err != nil {
  58. if errors.Is(err, gorm.ErrRecordNotFound) {
  59. c.WriteResult(w, r, &types.GetEnvGroupResponse{EnvGroup: envGroup})
  60. return
  61. }
  62. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  63. return
  64. }
  65. res := &types.GetEnvGroupResponse{
  66. EnvGroup: envGroup,
  67. StackID: stackId,
  68. }
  69. c.WriteResult(w, r, res)
  70. }