helpers.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //go:build ee
  2. // +build ee
  3. package main
  4. import (
  5. "fmt"
  6. "github.com/porter-dev/porter/api/types"
  7. "github.com/porter-dev/porter/internal/models"
  8. )
  9. type projectIteratorMethod func(project *models.Project) error
  10. type clusterIteratorMethod func(cluster *models.Cluster) error
  11. const stepSize = 100
  12. type IterateProjectsSelector struct {
  13. NotFreeTier bool
  14. }
  15. func iterateProjects(opts IterateProjectsSelector, fn projectIteratorMethod) error {
  16. // get count of model
  17. var count int64
  18. if err := db.Model(&models.Project{}).Count(&count).Error; err != nil {
  19. return err
  20. }
  21. // iterate (count / stepSize) + 1 times using Limit and Offset
  22. for i := 0; i < (int(count)/stepSize)+1; i++ {
  23. projects := []*models.Project{}
  24. if err := db.Order("id asc").Offset(i * stepSize).Limit(stepSize).Find(&projects).Error; err != nil {
  25. return err
  26. }
  27. for _, proj := range projects {
  28. // if there are conditions, check the conditions and skip if match
  29. if opts.NotFreeTier {
  30. // query for the project usage
  31. if usage, err := repo.ProjectUsage().ReadProjectUsage(proj.ID); err != nil || isFreeTier(usage) {
  32. continue
  33. }
  34. }
  35. fmt.Println("iterating on project:", proj.Name)
  36. err := fn(proj)
  37. if err != nil {
  38. return err
  39. }
  40. }
  41. }
  42. return nil
  43. }
  44. func isFreeTier(projUsage *models.ProjectUsage) bool {
  45. return types.BasicPlan.Clusters == projUsage.Clusters &&
  46. types.BasicPlan.Users == projUsage.Users &&
  47. types.BasicPlan.ResourceCPU == projUsage.ResourceCPU &&
  48. types.BasicPlan.ResourceMemory == projUsage.ResourceMemory
  49. }
  50. func iterateClusters(fn clusterIteratorMethod) error {
  51. // get count of model
  52. var count int64
  53. if err := db.Model(&models.Cluster{}).Count(&count).Error; err != nil {
  54. return err
  55. }
  56. // iterate (count / stepSize) + 1 times using Limit and Offset
  57. for i := 0; i < (int(count)/stepSize)+1; i++ {
  58. clusters := []*models.Cluster{}
  59. if err := db.Order("id asc").Offset(i * stepSize).Limit(stepSize).Find(&clusters).Error; err != nil {
  60. return err
  61. }
  62. for _, clusterSimple := range clusters {
  63. cluster, err := repo.Cluster().ReadCluster(clusterSimple.ProjectID, clusterSimple.ID)
  64. if err != nil {
  65. return err
  66. }
  67. fmt.Println("iterating on cluster:", cluster.Name)
  68. err = fn(cluster)
  69. if err != nil {
  70. return err
  71. }
  72. }
  73. }
  74. return nil
  75. }