2
0

update_linked_apps.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package environment_groups
  2. import (
  3. "net/http"
  4. "connectrpc.com/connect"
  5. porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
  6. "github.com/porter-dev/porter/api/server/authz"
  7. "github.com/porter-dev/porter/api/server/handlers"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/server/shared/config"
  11. "github.com/porter-dev/porter/api/types"
  12. "github.com/porter-dev/porter/internal/models"
  13. "github.com/porter-dev/porter/internal/telemetry"
  14. )
  15. // UpdateLinkedAppsHandler is the handle for the /environment-group/update-linked-apps endpoint
  16. type UpdateLinkedAppsHandler struct {
  17. handlers.PorterHandlerReadWriter
  18. authz.KubernetesAgentGetter
  19. }
  20. // NewUpdateLinkedAppsHandler creates an instance of UpdateLinkedAppsHandler
  21. func NewUpdateLinkedAppsHandler(
  22. config *config.Config,
  23. decoderValidator shared.RequestDecoderValidator,
  24. writer shared.ResultWriter,
  25. ) *UpdateLinkedAppsHandler {
  26. return &UpdateLinkedAppsHandler{
  27. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  28. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  29. }
  30. }
  31. // UpdateLinkedAppsRequest is the request object for the /environment-group/update-linked-apps endpoint
  32. type UpdateLinkedAppsRequest struct {
  33. Name string `json:"name"`
  34. }
  35. // UpdateLinkedAppsResponse is the response object for the /environment-group/update-linked-apps endpoint
  36. type UpdateLinkedAppsResponse struct{}
  37. // ServeHTTP updates all apps linked to an environment group
  38. func (c *UpdateLinkedAppsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  39. ctx, span := telemetry.NewSpan(r.Context(), "serve-update-apps-linked-to-env-group")
  40. defer span.End()
  41. project, _ := ctx.Value(types.ProjectScope).(*models.Project)
  42. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  43. if !project.GetFeatureFlag(models.ValidateApplyV2, c.Config().LaunchDarklyClient) {
  44. err := telemetry.Error(ctx, span, nil, "project does not have validate apply v2 enabled")
  45. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusForbidden))
  46. return
  47. }
  48. request := &UpdateLinkedAppsRequest{}
  49. if ok := c.DecodeAndValidate(w, r, request); !ok {
  50. err := telemetry.Error(ctx, span, nil, "error decoding request")
  51. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusBadRequest))
  52. return
  53. }
  54. telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "env-group-name", Value: request.Name})
  55. updateLinkedAppsReq := connect.NewRequest(&porterv1.UpdateAppsLinkedToEnvGroupRequest{
  56. ProjectId: int64(project.ID),
  57. ClusterId: int64(cluster.ID),
  58. EnvGroupName: request.Name,
  59. })
  60. _, err := c.Config().ClusterControlPlaneClient.UpdateAppsLinkedToEnvGroup(ctx, updateLinkedAppsReq)
  61. if err != nil {
  62. err := telemetry.Error(ctx, span, err, "error calling ccp update apps linked to env group")
  63. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  64. return
  65. }
  66. res := &UpdateLinkedAppsResponse{}
  67. c.WriteResult(w, r, res)
  68. }