2
0

delete_resource.go 4.1 KB

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