uffizzi_core 0.1.16 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +1 -1
  3. data/app/forms/uffizzi_core/api/cli/v1/compose_file/create_form.rb +0 -2
  4. data/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb +1 -0
  5. data/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb +2 -0
  6. data/app/lib/uffizzi_core/concerns/models/account.rb +84 -0
  7. data/app/lib/uffizzi_core/concerns/models/activity_item.rb +39 -0
  8. data/app/lib/uffizzi_core/concerns/models/build.rb +47 -0
  9. data/app/lib/uffizzi_core/concerns/models/comment.rb +20 -0
  10. data/app/lib/uffizzi_core/concerns/models/compose_file.rb +60 -0
  11. data/app/lib/uffizzi_core/concerns/models/config_file.rb +21 -0
  12. data/app/lib/uffizzi_core/concerns/models/container.rb +95 -0
  13. data/app/lib/uffizzi_core/concerns/models/container_config_file.rb +12 -0
  14. data/app/lib/uffizzi_core/concerns/models/coupon.rb +9 -0
  15. data/app/lib/uffizzi_core/concerns/models/credential.rb +65 -0
  16. data/app/lib/uffizzi_core/concerns/models/deployment.rb +71 -0
  17. data/app/lib/uffizzi_core/concerns/models/event.rb +17 -0
  18. data/app/lib/uffizzi_core/concerns/models/invitation.rb +31 -0
  19. data/app/lib/uffizzi_core/concerns/models/membership.rb +20 -0
  20. data/app/lib/uffizzi_core/concerns/models/payment.rb +15 -0
  21. data/app/lib/uffizzi_core/concerns/models/price.rb +13 -0
  22. data/app/lib/uffizzi_core/concerns/models/product.rb +15 -0
  23. data/app/lib/uffizzi_core/concerns/models/project.rb +62 -0
  24. data/app/lib/uffizzi_core/concerns/models/rating.rb +24 -0
  25. data/app/lib/uffizzi_core/concerns/models/repo.rb +33 -0
  26. data/app/lib/uffizzi_core/concerns/models/role.rb +21 -0
  27. data/app/lib/uffizzi_core/concerns/models/secret.rb +13 -0
  28. data/app/lib/uffizzi_core/concerns/models/template.rb +23 -0
  29. data/app/lib/uffizzi_core/concerns/models/user.rb +66 -0
  30. data/app/lib/uffizzi_core/concerns/models/user_project.rb +18 -0
  31. data/app/models/uffizzi_core/account.rb +1 -79
  32. data/app/models/uffizzi_core/activity_item.rb +1 -31
  33. data/app/models/uffizzi_core/build.rb +1 -35
  34. data/app/models/uffizzi_core/comment.rb +1 -12
  35. data/app/models/uffizzi_core/compose_file.rb +1 -44
  36. data/app/models/uffizzi_core/config_file.rb +1 -13
  37. data/app/models/uffizzi_core/container.rb +1 -85
  38. data/app/models/uffizzi_core/container_config_file.rb +1 -4
  39. data/app/models/uffizzi_core/coupon.rb +1 -1
  40. data/app/models/uffizzi_core/credential.rb +1 -57
  41. data/app/models/uffizzi_core/deployment.rb +1 -63
  42. data/app/models/uffizzi_core/event.rb +1 -9
  43. data/app/models/uffizzi_core/invitation.rb +1 -23
  44. data/app/models/uffizzi_core/membership.rb +1 -12
  45. data/app/models/uffizzi_core/payment.rb +1 -7
  46. data/app/models/uffizzi_core/price.rb +1 -5
  47. data/app/models/uffizzi_core/product.rb +1 -7
  48. data/app/models/uffizzi_core/project.rb +1 -54
  49. data/app/models/uffizzi_core/rating.rb +1 -16
  50. data/app/models/uffizzi_core/repo.rb +1 -25
  51. data/app/models/uffizzi_core/role.rb +1 -13
  52. data/app/models/uffizzi_core/secret.rb +1 -5
  53. data/app/models/uffizzi_core/template.rb +1 -15
  54. data/app/models/uffizzi_core/user.rb +1 -58
  55. data/app/models/uffizzi_core/user_project.rb +1 -10
  56. data/app/repositories/uffizzi_core/template_repo.rb +14 -6
  57. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +2 -1
  58. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb +1 -1
  59. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +16 -1
  60. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +13 -7
  61. data/app/services/uffizzi_core/compose_file/{configs_options_service.rb → parsers/configs_parser_service.rb} +1 -1
  62. data/app/services/uffizzi_core/compose_file/{continuous_preview_options_service.rb → parsers/continuous_preview_parser_service.rb} +1 -1
  63. data/app/services/uffizzi_core/compose_file/{ingress_options_service.rb → parsers/ingress_parser_service.rb} +1 -1
  64. data/app/services/uffizzi_core/compose_file/{secrets_options_service.rb → parsers/secrets_parser_service.rb} +1 -1
  65. data/app/services/uffizzi_core/compose_file/{services_options/command_service.rb → parsers/services/command_parser_service.rb} +1 -1
  66. data/app/services/uffizzi_core/compose_file/{services_options/configs_service.rb → parsers/services/configs_parser_service.rb} +1 -1
  67. data/app/services/uffizzi_core/compose_file/{services_options/deploy_service.rb → parsers/services/deploy_parser_service.rb} +1 -1
  68. data/app/services/uffizzi_core/compose_file/{services_options/entrypoint_service.rb → parsers/services/entrypoint_parser_service.rb} +1 -1
  69. data/app/services/uffizzi_core/compose_file/{services_options/env_file_service.rb → parsers/services/env_file_parser_service.rb} +1 -1
  70. data/app/services/uffizzi_core/compose_file/{services_options/environment_service.rb → parsers/services/environment_parser_service.rb} +2 -2
  71. data/app/services/uffizzi_core/compose_file/parsers/services/healthcheck_parser_service.rb +73 -0
  72. data/app/services/uffizzi_core/compose_file/{services_options/image_service.rb → parsers/services/image_parser_service.rb} +1 -1
  73. data/app/services/uffizzi_core/compose_file/{services_options/secrets_service.rb → parsers/services/secrets_parser_service.rb} +1 -1
  74. data/app/services/uffizzi_core/compose_file/{services_options_service.rb → parsers/services_parser_service.rb} +12 -10
  75. data/app/services/uffizzi_core/compose_file/{variables_service.rb → parsers/variables_parser_service.rb} +1 -1
  76. data/app/services/uffizzi_core/compose_file/template_service.rb +4 -4
  77. data/app/services/uffizzi_core/compose_file_service.rb +10 -6
  78. data/app/services/uffizzi_core/deployment_service.rb +19 -6
  79. data/app/services/uffizzi_core/manage_activity_items_service.rb +0 -4
  80. data/config/locales/en.yml +1 -0
  81. data/db/migrate/20220419074956_add_health_check_to_containers.rb +7 -0
  82. data/lib/uffizzi_core/version.rb +1 -1
  83. data/lib/uffizzi_core.rb +2 -0
  84. metadata +43 -16
@@ -1,61 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Credential < UffizziCore::ApplicationRecord
4
- include AASM
5
- include UffizziCore::CredentialRepo
6
-
7
- self.table_name = UffizziCore.table_names[:credentials]
8
-
9
- belongs_to :account
10
-
11
- before_destroy :remove_token
12
-
13
- validates :registry_url, presence: true
14
-
15
- aasm :state, column: :state do
16
- state :not_connected, initial: true
17
- state :active
18
- state :unauthorized
19
-
20
- event :activate do
21
- transitions from: [:not_connected, :unauthorized], to: :active
22
- end
23
-
24
- event :unauthorize do
25
- transitions from: [:not_connected, :active], to: :unauthorized
26
- end
27
- end
28
-
29
- def github_container_registry?
30
- type == UffizziCore::Credential::GithubContainerRegistry.name
31
- end
32
-
33
- def docker_hub?
34
- type == UffizziCore::Credential::DockerHub.name
35
- end
36
-
37
- def azure?
38
- type == UffizziCore::Credential::Azure.name
39
- end
40
-
41
- def google?
42
- type == UffizziCore::Credential::Google.name
43
- end
44
-
45
- def amazon?
46
- type == UffizziCore::Credential::Amazon.name
47
- end
48
-
49
- private
50
-
51
- def remove_token
52
- account.projects.find_each do |project|
53
- project.deployments.find_each do |deployment|
54
- containers = deployment.containers
55
- attributes = { continuously_deploy: UffizziCore::Container::STATE_DISABLED }
56
-
57
- containers.with_docker_hub_repo.update_all(attributes) if docker_hub?
58
- end
59
- end
60
- end
4
+ include UffizziCore::Concerns::Models::Credential
61
5
  end
@@ -20,67 +20,5 @@
20
20
  # @property deployed_by [object]
21
21
 
22
22
  class UffizziCore::Deployment < UffizziCore::ApplicationRecord
23
- include AASM
24
- include UffizziCore::StateMachineConcern
25
- include UffizziCore::DeploymentRepo
26
- extend Enumerize
27
-
28
- self.table_name = UffizziCore.table_names[:deployments]
29
-
30
- enumerize :kind, in: [:standard, :performance, :enterprise, :free], predicates: true, default: :standard
31
-
32
- belongs_to :project, touch: true
33
- belongs_to :deployed_by, class_name: UffizziCore::User.name, foreign_key: :deployed_by_id, optional: true
34
- belongs_to :template, optional: true
35
- belongs_to :compose_file, optional: true
36
-
37
- has_many :credentials, through: :project
38
- has_many :containers, dependent: :destroy, index_errors: true
39
- has_many :activity_items, dependent: :destroy
40
-
41
- has_one :ingress_container, -> { where(receive_incoming_requests: true) }, class_name: UffizziCore::Container.name
42
-
43
- validates :kind, presence: true
44
-
45
- enumerize :creation_source, in: [:manual, :continuous_preview, :compose_file_manual, :compose_file_continuous_preview], predicates: true,
46
- scope: true, default: :manual
47
-
48
- accepts_nested_attributes_for :containers, allow_destroy: true
49
-
50
- after_destroy_commit :clean
51
-
52
- def active_containers
53
- containers.active
54
- end
55
-
56
- aasm(:state) do
57
- state :active, initial: true
58
- state :failed
59
- state :disabled
60
-
61
- event :activate do
62
- transitions from: [:disabled], to: :active
63
- end
64
-
65
- event :fail, after: :after_fail do
66
- transitions from: [:active], to: :failed
67
- end
68
-
69
- event :disable, after: :after_disable do
70
- transitions from: [:active, :failed], to: :disabled
71
- end
72
- end
73
-
74
- def after_disable
75
- clean
76
- end
77
-
78
- def after_fail
79
- active_containers.each(&:disable!)
80
- end
81
-
82
- def clean
83
- active_containers.each(&:disable!)
84
- UffizziCore::Deployment::DeleteJob.perform_async(id)
85
- end
23
+ include UffizziCore::Concerns::Models::Deployment
86
24
  end
@@ -1,13 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Event < UffizziCore::ApplicationRecord
4
- include UffizziCore::EventRepo
5
- extend Enumerize
6
-
7
- self.table_name = UffizziCore.table_names[:events]
8
-
9
- enumerize :state, in: [:queued, :successful, :deployed, :failed, :building, :timeout, :cancelled, :deploying], predicates: true,
10
- scope: true
11
-
12
- belongs_to :activity_item, touch: true
4
+ include UffizziCore::Concerns::Models::Event
13
5
  end
@@ -1,27 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Invitation < UffizziCore::ApplicationRecord
4
- include AASM
5
- include UffizziCore::StateMachineConcern
6
- extend Enumerize
7
-
8
- self.table_name = UffizziCore.table_names[:invitations]
9
-
10
- enumerize :role, in: [:admin, :developer, :viewer], predicates: true
11
-
12
- belongs_to :entityable, polymorphic: true
13
- belongs_to :invited_by, class_name: UffizziCore::User.name, foreign_key: :invited_by_id
14
- belongs_to :invitee, class_name: UffizziCore::User.name, foreign_key: :invitee_id, optional: true
15
-
16
- validates :email, presence: true, 'uffizzi_core/email': true
17
- validates :token, presence: true, uniqueness: true
18
-
19
- aasm(:status) do
20
- state :pending, initial: true
21
- state :accepted
22
-
23
- event :accept do
24
- transitions from: :pending, to: :accepted
25
- end
26
- end
4
+ include UffizziCore::Concerns::Models::Invitation
27
5
  end
@@ -1,16 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Membership < UffizziCore::ApplicationRecord
4
- include UffizziCore::MembershipRepo
5
- extend Enumerize
6
-
7
- self.table_name = UffizziCore.table_names[:memberships]
8
-
9
- enumerize :role, in: [:admin, :developer, :viewer], predicates: true
10
- validates :role, presence: true
11
-
12
- belongs_to :account
13
- belongs_to :user
14
-
15
- validates :role, presence: true
4
+ include UffizziCore::Concerns::Models::Membership
16
5
  end
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Payment < UffizziCore::ApplicationRecord
4
- self.table_name = UffizziCore.table_names[:payments]
5
-
6
- belongs_to :account
7
-
8
- scope :succeeded, -> { where(status: :succeeded) }
9
- scope :pending, -> { where(status: :pending) }
10
- scope :failed, -> { where(status: :failed) }
4
+ include UffizziCore::Concerns::Models::Payment
11
5
  end
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Price < UffizziCore::ApplicationRecord
4
- include UffizziCore::PriceRepo
5
-
6
- self.table_name = UffizziCore.table_names[:prices]
7
-
8
- belongs_to :product
4
+ include UffizziCore::Concerns::Models::Price
9
5
  end
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Product < UffizziCore::ApplicationRecord
4
- include UffizziCore::ProductRepo
5
-
6
- self.table_name = UffizziCore.table_names[:products]
7
-
8
- has_one :price, dependent: :destroy
9
-
10
- UffizziCore::Product.inheritance_column = :sti
4
+ include UffizziCore::Concerns::Models::Product
11
5
  end
@@ -10,58 +10,5 @@
10
10
  # @property deployments [object<id: integer, domain: string>]
11
11
 
12
12
  class UffizziCore::Project < UffizziCore::ApplicationRecord
13
- include AASM
14
- include UffizziCore::StateMachineConcern
15
- include UffizziCore::ProjectRepo
16
-
17
- self.table_name = UffizziCore.table_names[:projects]
18
-
19
- belongs_to :account
20
-
21
- has_many :repos
22
- has_many :deployments, dependent: :destroy
23
- has_many :user_projects, dependent: :destroy
24
- has_many :users, through: :user_projects
25
- has_many :invitations, as: :entityable
26
- has_many :config_files, dependent: :destroy
27
- has_many :templates, dependent: :destroy
28
- has_many :credentials, through: :account
29
- has_many :compose_files, dependent: :destroy
30
- has_many :secrets, dependent: :destroy, as: :resource
31
-
32
- validates :name, presence: true, uniqueness: { scope: :account, message: 'Name already exists' }
33
- validates :slug, presence: true, uniqueness: { message: 'Project slug already taken' }
34
-
35
- aasm(:state) do
36
- state :active, initial: true
37
- state :disabled
38
-
39
- event :activate do
40
- transitions from: [:disabled], to: :active
41
- end
42
-
43
- event :disable, after: :after_disable do
44
- transitions from: [:active], to: :disabled
45
- end
46
- end
47
-
48
- def after_disable
49
- update(name: "#{name} deleted #{DateTime.current.strftime('%H:%M:%S-%m%d%Y')}")
50
- update(slug: "#{slug} deleted #{DateTime.current.strftime('%H:%M:%S-%m%d%Y')}")
51
- disable_deployments
52
- end
53
-
54
- def active_deployments
55
- deployments.active
56
- end
57
-
58
- def disable_deployments
59
- active_deployments.each do |deployment|
60
- UffizziCore::DeploymentService.disable!(deployment)
61
- end
62
- end
63
-
64
- def compose_file
65
- compose_files.main.first
66
- end
13
+ include UffizziCore::Concerns::Models::Project
67
14
  end
@@ -1,20 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Rating < UffizziCore::ApplicationRecord
4
- include AASM
5
-
6
- self.table_name = UffizziCore.table_names[:ratings]
7
-
8
- aasm(:state) do
9
- state :active, initial: true
10
- state :disabled
11
-
12
- event :activate do
13
- transitions from: [:disabled], to: :active
14
- end
15
-
16
- event :disable do
17
- transitions from: [:active], to: :disabled
18
- end
19
- end
4
+ include UffizziCore::Concerns::Models::Rating
20
5
  end
@@ -1,29 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Repo < UffizziCore::ApplicationRecord
4
- extend Enumerize
5
- include UffizziCore::RepoRepo
6
-
7
- self.table_name = UffizziCore.table_names[:repos]
8
-
9
- enumerize :kind, in: [:buildpacks18, :dockerfile, :dotnet, :gatsby, :barestatic], predicates: true
10
-
11
- belongs_to :project
12
- has_one :container, inverse_of: :repo, dependent: :destroy
13
- has_many :builds, dependent: :destroy
14
-
15
- validates :dockerfile_path, presence: true, if: :dockerfile?
16
- validates :delete_preview_after, numericality: { greater_than: 0, only_integer: true }, allow_nil: true
17
-
18
- def docker_hub?
19
- type == UffizziCore::Repo::DockerHub.name
20
- end
21
-
22
- def azure?
23
- type == UffizziCore::Repo::Azure.name
24
- end
25
-
26
- def google?
27
- type == UffizziCore::Repo::Google.name
28
- end
4
+ include UffizziCore::Concerns::Models::Repo
29
5
  end
@@ -1,17 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Role < UffizziCore::ApplicationRecord
4
- self.table_name = UffizziCore.table_names[:roles]
5
-
6
- has_and_belongs_to_many :users, join_table: UffizziCore.table_names[:users_roles]
7
-
8
- belongs_to :resource,
9
- polymorphic: true,
10
- optional: true
11
-
12
- validates :resource_type,
13
- inclusion: { in: Rolify.resource_types },
14
- allow_nil: true
15
-
16
- scopify
4
+ include UffizziCore::Concerns::Models::Role
17
5
  end
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Secret < ApplicationRecord
4
- self.table_name = UffizziCore.table_names[:secrets]
5
-
6
- belongs_to :resource, polymorphic: true
7
-
8
- validates :name, presence: true, uniqueness: { scope: :resource }
4
+ include UffizziCore::Concerns::Models::Secret
9
5
  end
@@ -1,19 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Template < UffizziCore::ApplicationRecord
4
- include UffizziCore::TemplateRepo
5
- extend Enumerize
6
-
7
- self.table_name = UffizziCore.table_names[:templates]
8
-
9
- belongs_to :added_by, class_name: UffizziCore::User.name, foreign_key: :added_by_id
10
- belongs_to :project, touch: true
11
- belongs_to :compose_file, optional: true
12
-
13
- has_many :deployments, dependent: :nullify
14
-
15
- enumerize :creation_source, in: [:manual, :compose_file, :system], predicates: true, scope: true
16
-
17
- validates :name, presence: true
18
- validates :name, uniqueness: { scope: :project }, if: -> { compose_file.blank? || compose_file.kind.main? }
4
+ include UffizziCore::Concerns::Models::Template
19
5
  end
@@ -1,62 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::User < ActiveRecord::Base
4
- include AASM
5
- include ActiveModel::Validations
6
- include UffizziCore::StateMachineConcern
7
- include UffizziCore::HashidConcern
8
- include UffizziCore::UserRepo
9
- extend Enumerize
10
-
11
- self.table_name = UffizziCore.table_names[:users]
12
-
13
- rolify
14
-
15
- has_secure_password
16
-
17
- validates :email, presence: true, 'uffizzi_core/email': true, uniqueness: { case_sensitive: false }
18
- validates :password, allow_nil: true, length: { minimum: 8 }, on: :update
19
-
20
- has_many :memberships, dependent: :destroy
21
- has_many :accounts, through: :memberships
22
- has_many :user_projects
23
- has_many :projects, through: :user_projects
24
-
25
- has_one_attached :avatar
26
-
27
- enumerize :creation_source, in: [:system, :online_registration, :google, :sso], predicates: true
28
-
29
- def organizational_account
30
- accounts.find_by(kind: UffizziCore::Account.kind.organizational)
31
- end
32
-
33
- def active_projects
34
- projects.active
35
- end
36
-
37
- def deployments
38
- UffizziCore::Deployment.where(project_id: active_projects)
39
- end
40
-
41
- def full_name
42
- "#{first_name} #{last_name}"
43
- end
44
-
45
- aasm(:state) do
46
- state :initial, initial: true
47
- state :active
48
- state :disabled
49
-
50
- event :activate do
51
- transitions from: [:initial, :disabled], to: :active
52
- end
53
-
54
- event :disable do
55
- transitions from: [:initial, :active], to: :disabled
56
- end
57
- end
58
-
59
- def admin_access_to_project?(project)
60
- projects.by_ids(project).by_accounts(memberships.by_role_admin.select(:account_id)).exists?
61
- end
4
+ include UffizziCore::Concerns::Models::User
62
5
  end
@@ -1,14 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::UserProject < UffizziCore::ApplicationRecord
4
- extend Enumerize
5
-
6
- self.table_name = UffizziCore.table_names[:user_projects]
7
-
8
- enumerize :role, in: [:admin, :developer, :viewer], predicates: true
9
- validates :role, presence: true
10
-
11
- belongs_to :user
12
- belongs_to :project
13
- belongs_to :invited_by, class_name: UffizziCore::User.name, foreign_key: :invited_by_id, optional: true
4
+ include UffizziCore::Concerns::Models::UserProject
14
5
  end
@@ -30,7 +30,7 @@ module UffizziCore::TemplateRepo
30
30
  ],
31
31
  }
32
32
 
33
- where('payload @> ?', general_query.to_json).where.not('payload @> ?', excluding_query.to_json)
33
+ where('templates.payload @> ?', general_query.to_json).where.not('templates.payload @> ?', excluding_query.to_json)
34
34
  }
35
35
 
36
36
  scope :by_docker_containers_with_delete_preview_when_image_tag_is_updated, ->(source, image, tag) {
@@ -47,7 +47,7 @@ module UffizziCore::TemplateRepo
47
47
  ],
48
48
  }
49
49
 
50
- where('payload @> ?', general_query.to_json)
50
+ where('templates.payload @> ?', general_query.to_json)
51
51
  }
52
52
 
53
53
  scope :by_github_containers_with_deploy_preview_when_pull_request_is_opened, ->(repository_id, branch) {
@@ -55,7 +55,7 @@ module UffizziCore::TemplateRepo
55
55
  containers_attributes: [
56
56
  {
57
57
  repo_attributes: {
58
- type: Repo::Github.name,
58
+ type: UffizziCore::Repo::Github.name,
59
59
  repository_id: repository_id,
60
60
  branch: branch,
61
61
  deploy_preview_when_pull_request_is_opened: true,
@@ -64,7 +64,7 @@ module UffizziCore::TemplateRepo
64
64
  ],
65
65
  }
66
66
 
67
- where('payload @> ?', query.to_json)
67
+ where('templates.payload @> ?', query.to_json)
68
68
  }
69
69
 
70
70
  scope :by_github_containers_with_delete_preview_when_pull_request_is_closed, ->(repository_id, branch) {
@@ -72,7 +72,7 @@ module UffizziCore::TemplateRepo
72
72
  containers_attributes: [
73
73
  {
74
74
  repo_attributes: {
75
- type: Repo::Github.name,
75
+ type: UffizziCore::Repo::Github.name,
76
76
  repository_id: repository_id,
77
77
  branch: branch,
78
78
  delete_preview_when_pull_request_is_closed: true,
@@ -81,7 +81,15 @@ module UffizziCore::TemplateRepo
81
81
  ],
82
82
  }
83
83
 
84
- where('payload @> ?', query.to_json)
84
+ where('templates.payload @> ?', query.to_json)
85
+ }
86
+
87
+ scope :by_compose_file_kind, ->(kind) {
88
+ left_joins(:compose_file).where(compose_files: { kind: kind })
89
+ }
90
+
91
+ scope :without_compose, -> {
92
+ left_joins(:compose_file).where(compose_files: { id: nil })
85
93
  }
86
94
  end
87
95
  end
@@ -19,7 +19,8 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer::ContainerSerial
19
19
  :public,
20
20
  :repo_id,
21
21
  :continuously_deploy,
22
- :receive_incoming_requests
22
+ :receive_incoming_requests,
23
+ :healthcheck
23
24
 
24
25
  def secret_variables
25
26
  return unless object.secret_variables.present?
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainerSerializer < UffizziCore::BaseSerializer
4
- attributes :id, :name, :memory_limit, :memory_request, :continuously_deploy, :variables, :secret_variables
4
+ attributes :id, :name, :memory_limit, :memory_request, :continuously_deploy, :variables, :secret_variables, :healthcheck
5
5
 
6
6
  has_many :container_config_files
7
7
 
@@ -15,7 +15,8 @@ class UffizziCore::Controller::DeployContainers::ContainerSerializer < UffizziCo
15
15
  :target_port,
16
16
  :public,
17
17
  :controller_name,
18
- :receive_incoming_requests
18
+ :receive_incoming_requests,
19
+ :healthcheck
19
20
 
20
21
  has_many :container_config_files
21
22
 
@@ -52,4 +53,18 @@ class UffizziCore::Controller::DeployContainers::ContainerSerializer < UffizziCo
52
53
  def command
53
54
  object.command.blank? ? nil : JSON.parse(object.command)
54
55
  end
56
+
57
+ def healthcheck
58
+ return {} if object.healthcheck.nil?
59
+
60
+ command = object.healthcheck['test']
61
+ new_command = if command.is_a?(Array)
62
+ items_to_remove = ['CMD', 'CMD-SHELL']
63
+ command.select { |item| items_to_remove.exclude?(item) }
64
+ elsif object.healthcheck['test'].is_a?(String)
65
+ command.split
66
+ end
67
+
68
+ object.healthcheck.merge(test: new_command)
69
+ end
55
70
  end
@@ -17,18 +17,14 @@ class UffizziCore::ComposeFile::Builders::ContainerBuilderService
17
17
  configs_data = container_data[:configs] || []
18
18
  secrets = container_data[:secrets] || []
19
19
  container_name = container_data[:container_name]
20
- continuous_preview_container_data = container_data[:'x-uffizzi-continuous-preview'] || container_data[:'x-uffizzi-continuous-previews']
20
+ healthcheck_data = container_data[:healthcheck] || {}
21
21
 
22
22
  env_file_dependencies = UffizziCore::ComposeFile::GithubDependenciesService.env_file_dependencies_for_container(compose_dependencies,
23
23
  container_name)
24
24
  configs_dependencies = UffizziCore::ComposeFile::GithubDependenciesService.configs_dependencies_for_container(compose_dependencies,
25
25
  container_name)
26
-
27
26
  is_ingress = ingress_container?(container_name, ingress_data)
28
- repo_attributes = build_repo_attributes(container_data, image_data, build_data, credentials)
29
-
30
- repo_attributes = set_continuous_preview_attributes_to_repo(repo_attributes, continuous_preview_global_data.to_h,
31
- continuous_preview_container_data.to_h)
27
+ repo_attributes = repo_attributes(container_data, continuous_preview_global_data)
32
28
 
33
29
  {
34
30
  tag: tag(image_data, repo_attributes),
@@ -46,11 +42,20 @@ class UffizziCore::ComposeFile::Builders::ContainerBuilderService
46
42
  receive_incoming_requests: is_ingress,
47
43
  container_config_files_attributes: config_files(configs_data, configs_dependencies),
48
44
  service_name: container_name,
45
+ name: container_name,
46
+ healthcheck: healthcheck_data,
49
47
  }
50
48
  end
51
49
 
52
50
  private
53
51
 
52
+ def repo_attributes(container_data, continuous_preview_global_data)
53
+ repo_attributes = build_repo_attributes(container_data)
54
+ continuous_preview_container_data = container_data[:'x-uffizzi-continuous-preview'] || container_data[:'x-uffizzi-continuous-previews']
55
+
56
+ set_continuous_preview_attributes_to_repo(repo_attributes, continuous_preview_global_data.to_h, continuous_preview_container_data.to_h)
57
+ end
58
+
54
59
  def set_continuous_preview_attributes_to_repo(repo_attributes, global_data, container_data)
55
60
  condition_attributes = [
56
61
  :deploy_preview_when_pull_request_is_opened,
@@ -148,8 +153,9 @@ class UffizziCore::ComposeFile::Builders::ContainerBuilderService
148
153
  memory_value
149
154
  end
150
155
 
151
- def build_repo_attributes(container_data, image_data, _build_data, credentials)
156
+ def build_repo_attributes(container_data)
152
157
  repo_type = repo_type(container_data)
158
+ image_data = container_data[:image]
153
159
 
154
160
  case repo_type
155
161
  when UffizziCore::Repo::DockerHub.name
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class UffizziCore::ComposeFile::ConfigsOptionsService
3
+ class UffizziCore::ComposeFile::Parsers::ConfigsParserService
4
4
  class << self
5
5
  def parse(configs_data)
6
6
  return [] if configs_data.nil?
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class UffizziCore::ComposeFile::ContinuousPreviewOptionsService
3
+ class UffizziCore::ComposeFile::Parsers::ContinuousPreviewParserService
4
4
  class << self
5
5
  def parse(continuous_preview_data)
6
6
  return {} if continuous_preview_data.nil?
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class UffizziCore::ComposeFile::IngressOptionsService
3
+ class UffizziCore::ComposeFile::Parsers::IngressParserService
4
4
  class << self
5
5
  def parse(ingress_data, services_data)
6
6
  raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.no_ingress') if ingress_data.nil?