delete_resource.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package state
  2. import (
  3. "net/http"
  4. "github.com/porter-dev/porter/api/server/shared"
  5. "github.com/porter-dev/porter/api/server/shared/apierrors"
  6. "github.com/porter-dev/porter/api/types"
  7. "github.com/porter-dev/porter/internal/models"
  8. "github.com/porter-dev/porter/provisioner/integrations/redis_stream"
  9. "github.com/porter-dev/porter/provisioner/server/config"
  10. )
  11. type DeleteResourceHandler struct {
  12. Config *config.Config
  13. decoderValidator shared.RequestDecoderValidator
  14. }
  15. func NewDeleteResourceHandler(
  16. config *config.Config,
  17. ) *DeleteResourceHandler {
  18. return &DeleteResourceHandler{
  19. Config: config,
  20. decoderValidator: shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  21. }
  22. }
  23. func (c *DeleteResourceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  24. // read the infra from the attached scope
  25. infra, _ := r.Context().Value(types.InfraScope).(*models.Infra)
  26. operation, _ := r.Context().Value(types.OperationScope).(*models.Operation)
  27. // update the operation to indicate completion
  28. operation.Status = "completed"
  29. operation, err := c.Config.Repo.Infra().UpdateOperation(operation)
  30. if err != nil {
  31. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrInternal(err), true)
  32. return
  33. }
  34. // push to the operation stream
  35. err = redis_stream.SendOperationCompleted(c.Config.RedisClient, infra, operation)
  36. if err != nil {
  37. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrInternal(err), true)
  38. return
  39. }
  40. // push to the global stream
  41. err = redis_stream.PushToGlobalStream(c.Config.RedisClient, infra, operation, "destroyed")
  42. if err != nil {
  43. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrInternal(err), true)
  44. return
  45. }
  46. // update the infra to indicate deletion
  47. infra.Status = "deleted"
  48. infra, err = c.Config.Repo.Infra().UpdateInfra(infra)
  49. if err != nil {
  50. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrInternal(err), true)
  51. return
  52. }
  53. // switch on the kind of resource and write the corresponding objects to the database
  54. switch infra.Kind {
  55. case types.InfraECR, types.InfraGCR, types.InfraDOCR:
  56. _, err = deleteRegistry(c.Config, infra, operation)
  57. case types.InfraEKS, types.InfraDOKS, types.InfraGKE:
  58. _, err = deleteCluster(c.Config, infra, operation)
  59. case types.InfraRDS:
  60. _, err = deleteDatabase(c.Config, infra, operation)
  61. }
  62. if err != nil {
  63. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrInternal(err), true)
  64. return
  65. }
  66. }
  67. func deleteRegistry(config *config.Config, infra *models.Infra, operation *models.Operation) (*models.Registry, error) {
  68. reg, err := config.Repo.Registry().ReadRegistryByInfraID(infra.ProjectID, infra.ID)
  69. if err != nil {
  70. return nil, err
  71. }
  72. err = config.Repo.Registry().DeleteRegistry(reg)
  73. if err != nil {
  74. return nil, err
  75. }
  76. return reg, nil
  77. }
  78. func deleteCluster(config *config.Config, infra *models.Infra, operation *models.Operation) (*models.Cluster, error) {
  79. cluster, err := config.Repo.Cluster().ReadClusterByInfraID(infra.ProjectID, infra.ID)
  80. if err != nil {
  81. return nil, err
  82. }
  83. err = config.Repo.Cluster().DeleteCluster(cluster)
  84. if err != nil {
  85. return nil, err
  86. }
  87. return cluster, nil
  88. }
  89. func deleteDatabase(config *config.Config, infra *models.Infra, operation *models.Operation) (*models.Database, error) {
  90. database, err := config.Repo.Database().ReadDatabaseByInfraID(infra.ProjectID, infra.ID)
  91. if err != nil {
  92. return nil, err
  93. }
  94. err = config.Repo.Database().DeleteDatabase(database.ProjectID, database.ClusterID, database.ID)
  95. if err != nil {
  96. return nil, err
  97. }
  98. // TODO: add delete env group here
  99. return database, nil
  100. }