list.go 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package deployment_target
  2. import (
  3. "net/http"
  4. "github.com/porter-dev/porter/api/server/handlers"
  5. "github.com/porter-dev/porter/api/server/shared"
  6. "github.com/porter-dev/porter/api/server/shared/apierrors"
  7. "github.com/porter-dev/porter/api/server/shared/config"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/porter-dev/porter/internal/models"
  10. "github.com/porter-dev/porter/internal/telemetry"
  11. )
  12. // ListDeploymentTargetsHandler is the handler for the /deployment-targets endpoint
  13. type ListDeploymentTargetsHandler struct {
  14. handlers.PorterHandlerReadWriter
  15. }
  16. // NewListDeploymentTargetsHandler handles GET requests to the endpoint /deployment-targets
  17. func NewListDeploymentTargetsHandler(
  18. config *config.Config,
  19. decoderValidator shared.RequestDecoderValidator,
  20. writer shared.ResultWriter,
  21. ) *ListDeploymentTargetsHandler {
  22. return &ListDeploymentTargetsHandler{
  23. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  24. }
  25. }
  26. func (c *ListDeploymentTargetsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  27. ctx, span := telemetry.NewSpan(r.Context(), "serve-list-deployment-targets")
  28. defer span.End()
  29. project, _ := ctx.Value(types.ProjectScope).(*models.Project)
  30. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  31. telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "cluster-provided", Value: cluster != nil})
  32. if !project.GetFeatureFlag(models.ValidateApplyV2, c.Config().LaunchDarklyClient) {
  33. err := telemetry.Error(ctx, span, nil, "project does not have validate apply v2 enabled")
  34. c.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
  35. return
  36. }
  37. request := &types.ListDeploymentTargetsRequest{}
  38. if ok := c.DecodeAndValidate(w, r, request); !ok {
  39. err := telemetry.Error(ctx, span, nil, "error decoding request")
  40. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
  41. return
  42. }
  43. var deploymentTargets []*models.DeploymentTarget
  44. var err error
  45. if cluster != nil {
  46. deploymentTargets, err = c.Repo().DeploymentTarget().ListForCluster(project.ID, cluster.ID, request.Preview)
  47. if err != nil {
  48. err := telemetry.Error(ctx, span, err, "error retrieving deployment targets for cluster")
  49. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  50. return
  51. }
  52. } else {
  53. deploymentTargets, err = c.Repo().DeploymentTarget().List(project.ID, request.Preview)
  54. if err != nil {
  55. err := telemetry.Error(ctx, span, err, "error retrieving deployment targets for project")
  56. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  57. return
  58. }
  59. }
  60. response := types.ListDeploymentTargetsResponse{
  61. DeploymentTargets: make([]types.DeploymentTarget, 0),
  62. }
  63. for _, dt := range deploymentTargets {
  64. if dt == nil {
  65. continue
  66. }
  67. response.DeploymentTargets = append(response.DeploymentTargets, *dt.ToDeploymentTargetType())
  68. }
  69. c.WriteResult(w, r, response)
  70. }