deployment_target.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package gorm
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/google/uuid"
  6. "github.com/porter-dev/porter/internal/models"
  7. "github.com/porter-dev/porter/internal/repository"
  8. "gorm.io/gorm"
  9. )
  10. // DeploymentTargetRepository uses gorm.DB for querying the database
  11. type DeploymentTargetRepository struct {
  12. db *gorm.DB
  13. }
  14. // NewDeploymentTargetRepository returns a DeploymentTargetRepository which uses
  15. // gorm.DB for querying the database
  16. func NewDeploymentTargetRepository(db *gorm.DB) repository.DeploymentTargetRepository {
  17. return &DeploymentTargetRepository{db}
  18. }
  19. // DeploymentTargetBySelectorAndSelectorType finds a deployment target for a projectID and clusterID by its selector and selector type
  20. func (repo *DeploymentTargetRepository) DeploymentTargetBySelectorAndSelectorType(projectID uint, clusterID uint, selector, selectorType string) (*models.DeploymentTarget, error) {
  21. deploymentTarget := &models.DeploymentTarget{}
  22. if err := repo.db.Where("project_id = ? AND cluster_id = ? AND selector = ? AND selector_type = ?", projectID, clusterID, selector, selectorType).Limit(1).Find(&deploymentTarget).Error; err != nil {
  23. return nil, err
  24. }
  25. return deploymentTarget, nil
  26. }
  27. // DeploymentTargetByID does not scope by projectID and should only be used for internal queries when project id cannot be known. This should never be exposed to the user.
  28. func (repo *DeploymentTargetRepository) DeploymentTargetByID(id uuid.UUID) (*models.DeploymentTarget, error) {
  29. deploymentTarget := &models.DeploymentTarget{}
  30. if err := repo.db.Where("id = ?", id).Limit(1).Find(&deploymentTarget).Error; err != nil {
  31. return nil, err
  32. }
  33. return deploymentTarget, nil
  34. }
  35. // DefaultDeploymentTarget finds the default deployment target for a projectID and clusterID
  36. func (repo *DeploymentTargetRepository) DefaultDeploymentTarget(projectID uint, clusterID uint) (*models.DeploymentTarget, error) {
  37. deploymentTarget := &models.DeploymentTarget{}
  38. if err := repo.db.Where("project_id = ? AND cluster_id = ? AND is_default = TRUE", projectID, clusterID).Limit(1).Find(&deploymentTarget).Error; err != nil {
  39. return nil, err
  40. }
  41. return deploymentTarget, nil
  42. }
  43. // List finds all deployment targets for a given project
  44. func (repo *DeploymentTargetRepository) List(projectID uint, clusterID uint, preview bool) ([]*models.DeploymentTarget, error) {
  45. deploymentTargets := []*models.DeploymentTarget{}
  46. if err := repo.db.Where("project_id = ? AND cluster_id = ? AND preview = ?", projectID, clusterID, preview).Find(&deploymentTargets).Error; err != nil {
  47. return nil, err
  48. }
  49. return deploymentTargets, nil
  50. }
  51. // CreateDeploymentTarget creates a new deployment target
  52. func (repo *DeploymentTargetRepository) CreateDeploymentTarget(deploymentTarget *models.DeploymentTarget) (*models.DeploymentTarget, error) {
  53. if deploymentTarget == nil {
  54. return nil, errors.New("deployment target is nil")
  55. }
  56. if deploymentTarget.Selector == "" {
  57. return nil, errors.New("deployment target selector is empty")
  58. }
  59. if deploymentTarget.SelectorType == "" {
  60. return nil, errors.New("deployment target selector type is empty")
  61. }
  62. if deploymentTarget.ClusterID == 0 {
  63. return nil, errors.New("deployment target cluster id is empty")
  64. }
  65. if deploymentTarget.ProjectID == 0 {
  66. return nil, errors.New("deployment target project id is empty")
  67. }
  68. if deploymentTarget.ID == uuid.Nil {
  69. deploymentTarget.ID = uuid.New()
  70. }
  71. if deploymentTarget.CreatedAt.IsZero() {
  72. deploymentTarget.CreatedAt = time.Now().UTC()
  73. }
  74. if deploymentTarget.UpdatedAt.IsZero() {
  75. deploymentTarget.UpdatedAt = time.Now().UTC()
  76. }
  77. if err := repo.db.Create(deploymentTarget).Error; err != nil {
  78. return nil, err
  79. }
  80. return deploymentTarget, nil
  81. }