create.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package environment_groups
  2. import (
  3. "net/http"
  4. "time"
  5. "connectrpc.com/connect"
  6. porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
  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/models"
  14. "github.com/porter-dev/porter/internal/telemetry"
  15. )
  16. type UpdateEnvironmentGroupHandler struct {
  17. handlers.PorterHandlerReadWriter
  18. authz.KubernetesAgentGetter
  19. }
  20. func NewUpdateEnvironmentGroupHandler(
  21. config *config.Config,
  22. decoderValidator shared.RequestDecoderValidator,
  23. writer shared.ResultWriter,
  24. ) *UpdateEnvironmentGroupHandler {
  25. return &UpdateEnvironmentGroupHandler{
  26. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  27. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  28. }
  29. }
  30. type UpdateEnvironmentGroupRequest struct {
  31. // Name of the env group to create or update
  32. Name string `json:"name"`
  33. // Type of the env group to create or update
  34. Type string `json:"type"`
  35. // AuthToken for the env group
  36. AuthToken string `json:"auth_token"`
  37. // Variables are values which are not sensitive. All values must be a string due to a kubernetes limitation.
  38. Variables map[string]string `json:"variables"`
  39. // SecretVariables are sensitive values. All values must be a string due to a kubernetes limitation.
  40. SecretVariables map[string]string `json:"secret_variables"`
  41. // IsEnvOverride is a flag to determine if provided variables should override or merge with existing variables
  42. IsEnvOverride bool `json:"is_env_override"`
  43. }
  44. type UpdateEnvironmentGroupResponse struct {
  45. // Name of the env group to create or update
  46. Name string `json:"name"`
  47. // Variables are variables which should are not sensitive. All values must be a string due to a kubernetes limitation.
  48. Variables map[string]string `json:"variables,omitempty"`
  49. // SecretVariables are sensitive variables. All values must be a string due to a kubernetes limitation.
  50. SecretVariables map[string]string `json:"secret_variables,omitempty"`
  51. CreatedAt time.Time `json:"created_at"`
  52. }
  53. func (c *UpdateEnvironmentGroupHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  54. ctx, span := telemetry.NewSpan(r.Context(), "serve-update-env-group")
  55. defer span.End()
  56. request := &UpdateEnvironmentGroupRequest{}
  57. if ok := c.DecodeAndValidate(w, r, request); !ok {
  58. return
  59. }
  60. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  61. telemetry.WithAttributes(span,
  62. telemetry.AttributeKV{Key: "environment-group-name", Value: request.Name},
  63. telemetry.AttributeKV{Key: "environment-group-type", Value: request.Type},
  64. )
  65. switch request.Type {
  66. case "doppler":
  67. _, err := c.Config().ClusterControlPlaneClient.CreateOrUpdateEnvGroup(ctx, connect.NewRequest(&porterv1.CreateOrUpdateEnvGroupRequest{
  68. ProjectId: int64(cluster.ProjectID),
  69. ClusterId: int64(cluster.ID),
  70. EnvGroupProviderType: porterv1.EnumEnvGroupProviderType_ENUM_ENV_GROUP_PROVIDER_TYPE_DOPPLER,
  71. EnvGroupName: request.Name,
  72. EnvGroupAuthToken: request.AuthToken,
  73. }))
  74. if err != nil {
  75. err := telemetry.Error(ctx, span, err, "unable to create environment group")
  76. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  77. return
  78. }
  79. default:
  80. _, err := c.Config().ClusterControlPlaneClient.CreateOrUpdateEnvGroup(ctx, connect.NewRequest(&porterv1.CreateOrUpdateEnvGroupRequest{
  81. ProjectId: int64(cluster.ProjectID),
  82. ClusterId: int64(cluster.ID),
  83. EnvGroupProviderType: porterv1.EnumEnvGroupProviderType_ENUM_ENV_GROUP_PROVIDER_TYPE_PORTER,
  84. EnvGroupName: request.Name,
  85. EnvVars: &porterv1.EnvGroupVariables{
  86. Normal: request.Variables,
  87. Secret: request.SecretVariables,
  88. },
  89. IsEnvOverride: request.IsEnvOverride,
  90. }))
  91. if err != nil {
  92. err := telemetry.Error(ctx, span, err, "unable to create environment group")
  93. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  94. return
  95. }
  96. }
  97. envGroupResponse := &UpdateEnvironmentGroupResponse{
  98. Name: request.Name,
  99. CreatedAt: time.Now().UTC(),
  100. }
  101. c.WriteResult(w, r, envGroupResponse)
  102. }