history.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package systemstatus
  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/handlers"
  7. "github.com/porter-dev/porter/api/server/shared"
  8. "github.com/porter-dev/porter/api/server/shared/apierrors"
  9. "github.com/porter-dev/porter/api/server/shared/config"
  10. "github.com/porter-dev/porter/api/types"
  11. "github.com/porter-dev/porter/internal/models"
  12. "github.com/porter-dev/porter/internal/telemetry"
  13. )
  14. // HistoryHandler handles requests to fetch history of system status
  15. type HistoryHandler struct {
  16. handlers.PorterHandlerWriter
  17. }
  18. // NewHistoryHandler returns a HistoryHandler
  19. func NewHistoryHandler(
  20. config *config.Config,
  21. writer shared.ResultWriter,
  22. ) *HistoryHandler {
  23. return &HistoryHandler{
  24. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  25. }
  26. }
  27. func (p *HistoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  28. ctx, span := telemetry.NewSpan(r.Context(), "serve-system-service-status-handler")
  29. defer span.End()
  30. // read the project and cluster from context
  31. project, _ := ctx.Value(types.ProjectScope).(*models.Project)
  32. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  33. telemetry.WithAttributes(
  34. span,
  35. telemetry.AttributeKV{Key: "project_id", Value: project.ID},
  36. telemetry.AttributeKV{Key: "cluster_id", Value: cluster.ID},
  37. )
  38. cloudProvider := p.getCloudProviderEnum(cluster.CloudProvider)
  39. telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "cloud_provider", Value: cloudProvider.String()})
  40. request := connect.NewRequest(&porterv1.SystemStatusHistoryRequest{
  41. ProjectId: int64(project.ID),
  42. ClusterId: int64(cluster.ID),
  43. CloudProvider: cloudProvider,
  44. })
  45. resp, err := p.Config().ClusterControlPlaneClient.SystemStatusHistory(ctx, request)
  46. if err != nil {
  47. err = telemetry.Error(ctx, span, err, "error getting system status history from ccp")
  48. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  49. return
  50. }
  51. systemStatusHistory, err := types.ToSystemStatusHistory(resp.Msg)
  52. if err != nil {
  53. err = telemetry.Error(ctx, span, err, "error converting to system status history type")
  54. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  55. return
  56. }
  57. p.WriteResult(w, r, systemStatusHistory)
  58. }
  59. func (p *HistoryHandler) getCloudProviderEnum(cloudProvider string) porterv1.EnumCloudProvider {
  60. switch cloudProvider {
  61. case "AWS":
  62. return porterv1.EnumCloudProvider_ENUM_CLOUD_PROVIDER_AWS
  63. case "AZURE":
  64. return porterv1.EnumCloudProvider_ENUM_CLOUD_PROVIDER_AZURE
  65. case "GCP":
  66. return porterv1.EnumCloudProvider_ENUM_CLOUD_PROVIDER_GCP
  67. default:
  68. // We use unspecified to mean local kind cluster which is used in testing
  69. return porterv1.EnumCloudProvider_ENUM_CLOUD_PROVIDER_UNSPECIFIED
  70. }
  71. }