uffizzi_core 0.6.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +12 -4
- data/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb +15 -0
- data/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb +41 -40
- data/app/lib/uffizzi_core/concerns/models/container.rb +1 -1
- data/app/lib/uffizzi_core/concerns/models/credential.rb +5 -1
- data/app/repositories/uffizzi_core/deployment_repo.rb +4 -0
- data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer.rb +2 -5
- data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments_serializer/user_serializer.rb +7 -0
- data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments_serializer.rb +14 -0
- data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +1 -6
- data/app/services/uffizzi_core/container_service.rb +1 -1
- data/app/services/uffizzi_core/deployment_service.rb +28 -28
- data/db/migrate/20220805164628_add_metadata_to_deployment.rb +7 -0
- data/lib/uffizzi_core/version.rb +1 -1
- metadata +5 -3
- data/app/models/uffizzi_core/repo/github.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dea69b2a59531600dfb66428f656f48199aca57b46090feb7908c4c2649d6a0
|
4
|
+
data.tar.gz: '0049394671ce7727844814ebe46a671a9a1d420063546d5d12faf1d61748f5bb'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 278c7ce3923efa9d4db4476eb3ddad88c28b664af7fbf75a0c7547921d478ad6860fd7ea5987932bbcdcf1d01a418c55bac388a864e1f186468d3ec163f911cf
|
7
|
+
data.tar.gz: 83927e7d75d0e926cc1d42f16f31c9e086de1daedd33cb1315b60e118896f9d90b3ee102893ef7e9716e7e354c793610e609ae64aaf7be1657694fe166a62480
|
@@ -14,7 +14,10 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
|
|
14
14
|
# @response [Array<Deployment>] 200 OK
|
15
15
|
# @response 401 Not authorized
|
16
16
|
def index
|
17
|
-
|
17
|
+
search_labels = JSON.parse(q_param)
|
18
|
+
filtered_deployments = deployments.with_labels(search_labels)
|
19
|
+
|
20
|
+
respond_with filtered_deployments, each_serializer: UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer
|
18
21
|
end
|
19
22
|
|
20
23
|
# Get deployment information by id
|
@@ -51,7 +54,7 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
|
|
51
54
|
errors = check_credentials(compose_file)
|
52
55
|
return render_errors(errors) if errors.present?
|
53
56
|
|
54
|
-
deployment = UffizziCore::DeploymentService.create_from_compose(compose_file, resource_project, current_user)
|
57
|
+
deployment = UffizziCore::DeploymentService.create_from_compose(compose_file, resource_project, current_user, metadata_params)
|
55
58
|
|
56
59
|
respond_with deployment
|
57
60
|
end
|
@@ -82,8 +85,9 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
|
|
82
85
|
errors = check_credentials(compose_file)
|
83
86
|
return render_errors(errors) if errors.present?
|
84
87
|
|
85
|
-
deployment =
|
86
|
-
updated_deployment = UffizziCore::DeploymentService.update_from_compose(compose_file, resource_project, current_user, deployment
|
88
|
+
deployment = deployments.find(params[:id])
|
89
|
+
updated_deployment = UffizziCore::DeploymentService.update_from_compose(compose_file, resource_project, current_user, deployment,
|
90
|
+
metadata_params)
|
87
91
|
|
88
92
|
respond_with updated_deployment
|
89
93
|
end
|
@@ -171,6 +175,10 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
|
|
171
175
|
params.permit(dependencies: [:name, :path, :source, :content])
|
172
176
|
end
|
173
177
|
|
178
|
+
def metadata_params
|
179
|
+
params[:metadata]
|
180
|
+
end
|
181
|
+
|
174
182
|
def render_invalid_file
|
175
183
|
render json: { errors: { state: ['Invalid compose file'] } }, status: :unprocessable_entity
|
176
184
|
end
|
@@ -4,6 +4,7 @@ class UffizziCore::Api::Cli::V1::Deployment::CreateForm < UffizziCore::Deploymen
|
|
4
4
|
include UffizziCore::ApplicationForm
|
5
5
|
|
6
6
|
permit :creation_source,
|
7
|
+
:metadata,
|
7
8
|
containers_attributes: [
|
8
9
|
:image,
|
9
10
|
:service_name,
|
@@ -50,6 +51,7 @@ class UffizziCore::Api::Cli::V1::Deployment::CreateForm < UffizziCore::Deploymen
|
|
50
51
|
validate :check_exists_ingress_container
|
51
52
|
validate :check_max_memory_limit
|
52
53
|
validate :check_max_memory_request
|
54
|
+
validate :check_secrets_exist_in_database
|
53
55
|
|
54
56
|
def assign_dependences!(project, user)
|
55
57
|
self.project = project
|
@@ -90,4 +92,17 @@ class UffizziCore::Api::Cli::V1::Deployment::CreateForm < UffizziCore::Deploymen
|
|
90
92
|
|
91
93
|
errors.add(:containers, :max_memory_request_error, max: project.account.container_memory_limit)
|
92
94
|
end
|
95
|
+
|
96
|
+
def check_secrets_exist_in_database
|
97
|
+
return if compose_file.nil?
|
98
|
+
|
99
|
+
existing_secrets = project.secrets.pluck('name')
|
100
|
+
compose_file.template.payload['containers_attributes']
|
101
|
+
.map { |container| container['secret_variables'].map { |secret| secret['name'] } }.flatten.uniq
|
102
|
+
.select { |secret| existing_secrets.exclude?(secret) }
|
103
|
+
.each do |secret|
|
104
|
+
error_message = I18n.t('compose.project_secret_not_found', secret: secret)
|
105
|
+
errors.add(:secret_variables, error_message)
|
106
|
+
end
|
107
|
+
end
|
93
108
|
end
|
@@ -3,46 +3,47 @@
|
|
3
3
|
class UffizziCore::Api::Cli::V1::Deployment::UpdateForm < UffizziCore::Deployment
|
4
4
|
include UffizziCore::ApplicationForm
|
5
5
|
|
6
|
-
permit
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
6
|
+
permit :metadata,
|
7
|
+
containers_attributes: [
|
8
|
+
:image,
|
9
|
+
:service_name,
|
10
|
+
:tag,
|
11
|
+
:port,
|
12
|
+
:public,
|
13
|
+
:memory_limit,
|
14
|
+
:memory_request,
|
15
|
+
:entrypoint,
|
16
|
+
:command,
|
17
|
+
:receive_incoming_requests,
|
18
|
+
:continuously_deploy,
|
19
|
+
{ variables: [:name, :value],
|
20
|
+
secret_variables: [:name, :value],
|
21
|
+
volumes: [:source, :target, :type, :read_only],
|
22
|
+
repo_attributes: [
|
23
|
+
:namespace,
|
24
|
+
:name,
|
25
|
+
:slug,
|
26
|
+
:type,
|
27
|
+
:description,
|
28
|
+
:is_private,
|
29
|
+
:repository_id,
|
30
|
+
:branch,
|
31
|
+
:kind,
|
32
|
+
:dockerfile_path,
|
33
|
+
:dockerfile_context_path,
|
34
|
+
:deploy_preview_when_pull_request_is_opened,
|
35
|
+
:delete_preview_when_pull_request_is_closed,
|
36
|
+
:deploy_preview_when_image_tag_is_created,
|
37
|
+
:delete_preview_when_image_tag_is_updated,
|
38
|
+
:share_to_github,
|
39
|
+
:delete_preview_after,
|
40
|
+
{ args: [:name, :value] },
|
41
|
+
],
|
42
|
+
container_config_files_attributes: [
|
43
|
+
:config_file_id,
|
44
|
+
:mount_path,
|
45
|
+
] },
|
46
|
+
]
|
46
47
|
|
47
48
|
validate :check_all_containers_have_unique_ports
|
48
49
|
validate :check_exists_ingress_container
|
@@ -45,7 +45,7 @@ module UffizziCore::Concerns::Models::Container
|
|
45
45
|
validates :command, 'uffizzi_core/image_command_args': true, allow_nil: true
|
46
46
|
validates :tag, presence: true
|
47
47
|
|
48
|
-
aasm :continuously_deploy, column: :continuously_deploy do
|
48
|
+
aasm :continuously_deploy, column: :continuously_deploy, namespace: :cd do
|
49
49
|
state :disabled, initial: true
|
50
50
|
state :enabled
|
51
51
|
end
|
@@ -27,6 +27,10 @@ module UffizziCore::Concerns::Models::Credential
|
|
27
27
|
event :unauthorize do
|
28
28
|
transitions from: [:not_connected, :active], to: :unauthorized
|
29
29
|
end
|
30
|
+
|
31
|
+
event :disconnect do
|
32
|
+
transitions from: [:active, :unauthorized], to: :not_connected
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
def github_container_registry?
|
@@ -59,7 +63,7 @@ module UffizziCore::Concerns::Models::Credential
|
|
59
63
|
account.projects.find_each do |project|
|
60
64
|
project.deployments.find_each do |deployment|
|
61
65
|
containers = deployment.containers
|
62
|
-
attributes = { continuously_deploy: UffizziCore::Container::
|
66
|
+
attributes = { continuously_deploy: UffizziCore::Container::STATE_CD_DISABLED }
|
63
67
|
|
64
68
|
containers.with_docker_hub_repo.update_all(attributes) if docker_hub?
|
65
69
|
end
|
@@ -12,5 +12,9 @@ module UffizziCore::DeploymentRepo
|
|
12
12
|
scope :active_for_credential_id, ->(credential_id) {
|
13
13
|
active.joins(project: :credentials).merge(UffizziCore::Project.active).where(credentials: { id: credential_id })
|
14
14
|
}
|
15
|
+
|
16
|
+
scope :with_labels, ->(labels) {
|
17
|
+
where("#{UffizziCore::Deployment.table_name}.metadata @> ?", labels.to_json)
|
18
|
+
}
|
15
19
|
end
|
16
20
|
end
|
@@ -16,16 +16,13 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentSerializer < UffizziCore::B
|
|
16
16
|
:image_id,
|
17
17
|
:ingress_container_ready,
|
18
18
|
:ingress_container_state,
|
19
|
-
:creation_source
|
19
|
+
:creation_source,
|
20
|
+
:metadata
|
20
21
|
|
21
22
|
has_many :containers
|
22
23
|
|
23
24
|
belongs_to :deployed_by
|
24
25
|
|
25
|
-
def deployed_by
|
26
|
-
object.deployed_by
|
27
|
-
end
|
28
|
-
|
29
26
|
def containers
|
30
27
|
object.containers.active
|
31
28
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class UffizziCore::Api::Cli::V1::Projects::DeploymentsSerializer < UffizziCore::BaseSerializer
|
4
|
+
type :deployment
|
5
|
+
|
6
|
+
attributes :id,
|
7
|
+
:created_at,
|
8
|
+
:updated_at,
|
9
|
+
:state,
|
10
|
+
:preview_url,
|
11
|
+
:metadata
|
12
|
+
|
13
|
+
belongs_to :deployed_by
|
14
|
+
end
|
@@ -41,12 +41,7 @@ class UffizziCore::Controller::DeployContainers::ContainerSerializer < UffizziCo
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def tag
|
44
|
-
|
45
|
-
when UffizziCore::Repo::Github.name
|
46
|
-
UffizziCore::RepoService.tag(object.repo)
|
47
|
-
else
|
48
|
-
object.tag
|
49
|
-
end
|
44
|
+
object.tag
|
50
45
|
end
|
51
46
|
|
52
47
|
def entrypoint
|
@@ -20,7 +20,7 @@ class UffizziCore::ContainerService
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def continuously_deploy_enabled?(container)
|
23
|
-
container.aasm(:continuously_deploy).current_state == UffizziCore::Container::
|
23
|
+
container.aasm(:continuously_deploy).current_state == UffizziCore::Container::STATE_CD_ENABLED
|
24
24
|
end
|
25
25
|
|
26
26
|
def valid_memory_limit?(container)
|
@@ -12,38 +12,37 @@ class UffizziCore::DeploymentService
|
|
12
12
|
}.freeze
|
13
13
|
|
14
14
|
class << self
|
15
|
-
def create_from_compose(compose_file, project, user)
|
15
|
+
def create_from_compose(compose_file, project, user, metadata)
|
16
16
|
deployment_attributes = ActionController::Parameters.new(compose_file.template.payload)
|
17
17
|
deployment_form = UffizziCore::Api::Cli::V1::Deployment::CreateForm.new(deployment_attributes)
|
18
18
|
deployment_form.assign_dependences!(project, user)
|
19
19
|
deployment_form.compose_file = compose_file
|
20
20
|
deployment_form.creation_source = UffizziCore::Deployment.creation_source.compose_file_manual
|
21
|
+
deployment_form.metadata = metadata || {}
|
21
22
|
|
22
|
-
if deployment_form.save
|
23
|
-
update_subdomain!(deployment_form)
|
24
|
-
|
25
|
-
UffizziCore::Deployment::CreateJob.perform_async(deployment_form.id)
|
26
|
-
end
|
23
|
+
run_deployment_creation_tasks(deployment_form) if deployment_form.save
|
27
24
|
|
28
25
|
deployment_form
|
29
26
|
end
|
30
27
|
|
31
|
-
def update_from_compose(compose_file, project, user, deployment)
|
28
|
+
def update_from_compose(compose_file, project, user, deployment, metadata)
|
32
29
|
deployment_attributes = ActionController::Parameters.new(compose_file.template.payload)
|
33
30
|
|
34
31
|
deployment_form = UffizziCore::Api::Cli::V1::Deployment::UpdateForm.new(deployment_attributes)
|
35
32
|
deployment_form.assign_dependences!(project, user)
|
36
33
|
deployment_form.compose_file = compose_file
|
34
|
+
deployment_form.metadata = metadata || {}
|
37
35
|
|
38
36
|
ActiveRecord::Base.transaction do
|
39
37
|
deployment.containers.destroy_all
|
40
38
|
deployment.compose_file.destroy! if deployment.compose_file&.kind&.temporary?
|
41
|
-
|
42
|
-
deployment.update!(
|
39
|
+
params = {
|
43
40
|
containers: deployment_form.containers,
|
44
41
|
compose_file_id: compose_file.id,
|
45
42
|
creation_source: UffizziCore::Deployment.creation_source.compose_file_manual,
|
46
|
-
|
43
|
+
metadata: deployment_form.metadata,
|
44
|
+
}
|
45
|
+
deployment.update!(params)
|
47
46
|
end
|
48
47
|
|
49
48
|
deployment
|
@@ -88,27 +87,28 @@ class UffizziCore::DeploymentService
|
|
88
87
|
end
|
89
88
|
|
90
89
|
def build_subdomain(deployment)
|
91
|
-
if deployment
|
92
|
-
continuous_preview_payload = deployment.continuous_preview_payload
|
90
|
+
return build_docker_continuous_preview_subdomain(deployment) if deployment&.continuous_preview_payload&.fetch('docker', nil).present?
|
93
91
|
|
94
|
-
|
95
|
-
|
96
|
-
|
92
|
+
github_metadata = deployment.metadata.dig('labels', 'github')
|
93
|
+
return build_pull_request_subdomain(deployment) if
|
94
|
+
github_metadata&.dig('pull_request', 'number').present? && github_metadata&.dig('repository').present?
|
97
95
|
|
98
96
|
build_default_subdomain(deployment)
|
99
97
|
end
|
100
98
|
|
101
99
|
def build_pull_request_subdomain(deployment)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
deployment_name = name(deployment)
|
107
|
-
subdomain = "pr#{pull_request_payload['id']}-#{deployment_name}-#{repo_name}-#{project.slug}"
|
108
|
-
|
100
|
+
github_payload = deployment.metadata.dig('labels', 'github')
|
101
|
+
repo_name = github_payload['repository'].split('/').last
|
102
|
+
pull_request_number = github_payload['pull_request']['number']
|
103
|
+
subdomain = "pr-#{pull_request_number}-#{name(deployment)}-#{repo_name}-#{deployment.project.slug}"
|
109
104
|
format_subdomain(subdomain)
|
110
105
|
end
|
111
106
|
|
107
|
+
def update_subdomain!(deployment)
|
108
|
+
deployment.subdomain = build_subdomain(deployment)
|
109
|
+
deployment.save!
|
110
|
+
end
|
111
|
+
|
112
112
|
def build_docker_continuous_preview_subdomain(deployment)
|
113
113
|
project = deployment.project
|
114
114
|
continuous_preview_payload = deployment.continuous_preview_payload
|
@@ -201,12 +201,6 @@ class UffizziCore::DeploymentService
|
|
201
201
|
"deployment-#{deployment.id}"
|
202
202
|
end
|
203
203
|
|
204
|
-
def update_subdomain!(deployment)
|
205
|
-
deployment.subdomain = build_subdomain(deployment)
|
206
|
-
|
207
|
-
deployment.save!
|
208
|
-
end
|
209
|
-
|
210
204
|
def pull_request_payload_present?(deployment)
|
211
205
|
deployment.continuous_preview_payload.present? && deployment.continuous_preview_payload['pull_request'].present?
|
212
206
|
end
|
@@ -219,6 +213,12 @@ class UffizziCore::DeploymentService
|
|
219
213
|
|
220
214
|
private
|
221
215
|
|
216
|
+
def run_deployment_creation_tasks(deployment)
|
217
|
+
update_subdomain!(deployment)
|
218
|
+
|
219
|
+
UffizziCore::Deployment::CreateJob.perform_async(deployment.id)
|
220
|
+
end
|
221
|
+
|
222
222
|
def deployment_process_status(deployment)
|
223
223
|
containers = deployment.active_containers
|
224
224
|
activity_items = containers.map { |container| container.activity_items.order_by_id.last }.compact
|
data/lib/uffizzi_core/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uffizzi_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Thurman
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-08-
|
12
|
+
date: 2022-08-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aasm
|
@@ -829,7 +829,6 @@ files:
|
|
829
829
|
- app/models/uffizzi_core/repo/azure.rb
|
830
830
|
- app/models/uffizzi_core/repo/docker_hub.rb
|
831
831
|
- app/models/uffizzi_core/repo/docker_registry.rb
|
832
|
-
- app/models/uffizzi_core/repo/github.rb
|
833
832
|
- app/models/uffizzi_core/repo/github_container_registry.rb
|
834
833
|
- app/models/uffizzi_core/repo/google.rb
|
835
834
|
- app/models/uffizzi_core/role.rb
|
@@ -877,6 +876,8 @@ files:
|
|
877
876
|
- app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb
|
878
877
|
- app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer.rb
|
879
878
|
- app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer/config_file_serializer.rb
|
879
|
+
- app/serializers/uffizzi_core/api/cli/v1/projects/deployments_serializer.rb
|
880
|
+
- app/serializers/uffizzi_core/api/cli/v1/projects/deployments_serializer/user_serializer.rb
|
880
881
|
- app/serializers/uffizzi_core/api/cli/v1/projects/secret_serializer.rb
|
881
882
|
- app/serializers/uffizzi_core/api/cli/v1/short_project_serializer.rb
|
882
883
|
- app/serializers/uffizzi_core/api/cli/v1/user_serializer.rb
|
@@ -964,6 +965,7 @@ files:
|
|
964
965
|
- db/migrate/20220422151523_add_volumes_to_uffizzi_core_containers.rb
|
965
966
|
- db/migrate/20220525113412_rename_name_to_uffizzi_containers.rb
|
966
967
|
- db/migrate/20220704135629_add_disabled_at_to_deployments.rb
|
968
|
+
- db/migrate/20220805164628_add_metadata_to_deployment.rb
|
967
969
|
- db/seeds.rb
|
968
970
|
- lib/tasks/uffizzi_core_tasks.rake
|
969
971
|
- lib/uffizzi_core.rb
|