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.
- checksums.yaml +4 -4
- data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +1 -1
- data/app/forms/uffizzi_core/api/cli/v1/compose_file/create_form.rb +0 -2
- data/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb +1 -0
- data/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb +2 -0
- data/app/lib/uffizzi_core/concerns/models/account.rb +84 -0
- data/app/lib/uffizzi_core/concerns/models/activity_item.rb +39 -0
- data/app/lib/uffizzi_core/concerns/models/build.rb +47 -0
- data/app/lib/uffizzi_core/concerns/models/comment.rb +20 -0
- data/app/lib/uffizzi_core/concerns/models/compose_file.rb +60 -0
- data/app/lib/uffizzi_core/concerns/models/config_file.rb +21 -0
- data/app/lib/uffizzi_core/concerns/models/container.rb +95 -0
- data/app/lib/uffizzi_core/concerns/models/container_config_file.rb +12 -0
- data/app/lib/uffizzi_core/concerns/models/coupon.rb +9 -0
- data/app/lib/uffizzi_core/concerns/models/credential.rb +65 -0
- data/app/lib/uffizzi_core/concerns/models/deployment.rb +71 -0
- data/app/lib/uffizzi_core/concerns/models/event.rb +17 -0
- data/app/lib/uffizzi_core/concerns/models/invitation.rb +31 -0
- data/app/lib/uffizzi_core/concerns/models/membership.rb +20 -0
- data/app/lib/uffizzi_core/concerns/models/payment.rb +15 -0
- data/app/lib/uffizzi_core/concerns/models/price.rb +13 -0
- data/app/lib/uffizzi_core/concerns/models/product.rb +15 -0
- data/app/lib/uffizzi_core/concerns/models/project.rb +62 -0
- data/app/lib/uffizzi_core/concerns/models/rating.rb +24 -0
- data/app/lib/uffizzi_core/concerns/models/repo.rb +33 -0
- data/app/lib/uffizzi_core/concerns/models/role.rb +21 -0
- data/app/lib/uffizzi_core/concerns/models/secret.rb +13 -0
- data/app/lib/uffizzi_core/concerns/models/template.rb +23 -0
- data/app/lib/uffizzi_core/concerns/models/user.rb +66 -0
- data/app/lib/uffizzi_core/concerns/models/user_project.rb +18 -0
- data/app/models/uffizzi_core/account.rb +1 -79
- data/app/models/uffizzi_core/activity_item.rb +1 -31
- data/app/models/uffizzi_core/build.rb +1 -35
- data/app/models/uffizzi_core/comment.rb +1 -12
- data/app/models/uffizzi_core/compose_file.rb +1 -44
- data/app/models/uffizzi_core/config_file.rb +1 -13
- data/app/models/uffizzi_core/container.rb +1 -85
- data/app/models/uffizzi_core/container_config_file.rb +1 -4
- data/app/models/uffizzi_core/coupon.rb +1 -1
- data/app/models/uffizzi_core/credential.rb +1 -57
- data/app/models/uffizzi_core/deployment.rb +1 -63
- data/app/models/uffizzi_core/event.rb +1 -9
- data/app/models/uffizzi_core/invitation.rb +1 -23
- data/app/models/uffizzi_core/membership.rb +1 -12
- data/app/models/uffizzi_core/payment.rb +1 -7
- data/app/models/uffizzi_core/price.rb +1 -5
- data/app/models/uffizzi_core/product.rb +1 -7
- data/app/models/uffizzi_core/project.rb +1 -54
- data/app/models/uffizzi_core/rating.rb +1 -16
- data/app/models/uffizzi_core/repo.rb +1 -25
- data/app/models/uffizzi_core/role.rb +1 -13
- data/app/models/uffizzi_core/secret.rb +1 -5
- data/app/models/uffizzi_core/template.rb +1 -15
- data/app/models/uffizzi_core/user.rb +1 -58
- data/app/models/uffizzi_core/user_project.rb +1 -10
- data/app/repositories/uffizzi_core/template_repo.rb +14 -6
- data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +2 -1
- data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb +1 -1
- data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +16 -1
- data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +13 -7
- data/app/services/uffizzi_core/compose_file/{configs_options_service.rb → parsers/configs_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{continuous_preview_options_service.rb → parsers/continuous_preview_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{ingress_options_service.rb → parsers/ingress_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{secrets_options_service.rb → parsers/secrets_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/command_service.rb → parsers/services/command_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/configs_service.rb → parsers/services/configs_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/deploy_service.rb → parsers/services/deploy_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/entrypoint_service.rb → parsers/services/entrypoint_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/env_file_service.rb → parsers/services/env_file_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/environment_service.rb → parsers/services/environment_parser_service.rb} +2 -2
- data/app/services/uffizzi_core/compose_file/parsers/services/healthcheck_parser_service.rb +73 -0
- data/app/services/uffizzi_core/compose_file/{services_options/image_service.rb → parsers/services/image_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options/secrets_service.rb → parsers/services/secrets_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/{services_options_service.rb → parsers/services_parser_service.rb} +12 -10
- data/app/services/uffizzi_core/compose_file/{variables_service.rb → parsers/variables_parser_service.rb} +1 -1
- data/app/services/uffizzi_core/compose_file/template_service.rb +4 -4
- data/app/services/uffizzi_core/compose_file_service.rb +10 -6
- data/app/services/uffizzi_core/deployment_service.rb +19 -6
- data/app/services/uffizzi_core/manage_activity_items_service.rb +0 -4
- data/config/locales/en.yml +1 -0
- data/db/migrate/20220419074956_add_health_check_to_containers.rb +7 -0
- data/lib/uffizzi_core/version.rb +1 -1
- data/lib/uffizzi_core.rb +2 -0
- metadata +43 -16
@@ -1,61 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class UffizziCore::Credential < UffizziCore::ApplicationRecord
|
4
|
-
include
|
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
|
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::
|
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
|
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::
|
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
|
-
|
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,11 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class UffizziCore::Product < UffizziCore::ApplicationRecord
|
4
|
-
include UffizziCore::
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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::
|
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
|
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
|
-
|
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
|
data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb
CHANGED
@@ -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
|
-
|
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 =
|
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
|
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::
|
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::
|
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?
|