uffizzi_core 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb +2 -2
  3. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +3 -3
  4. data/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb +2 -1
  5. data/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb +4 -2
  6. data/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb +4 -0
  7. data/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb +4 -0
  8. data/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb +4 -0
  9. data/app/lib/uffizzi_core/concerns/models/compose_file.rb +11 -0
  10. data/app/lib/uffizzi_core/concerns/models/container.rb +3 -0
  11. data/app/lib/uffizzi_core/concerns/models/container_host_volume_file.rb +12 -0
  12. data/app/lib/uffizzi_core/concerns/models/host_volume_file.rb +22 -0
  13. data/app/lib/uffizzi_core/concerns/models/project.rb +1 -0
  14. data/app/models/uffizzi_core/container_host_volume_file.rb +5 -0
  15. data/app/models/uffizzi_core/host_volume_file.rb +5 -0
  16. data/app/repositories/uffizzi_core/host_volume_file_repo.rb +17 -0
  17. data/app/serializers/uffizzi_core/controller/deploy_containers/compose_file_serializer.rb +5 -0
  18. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_host_volume_file_serializer.rb +5 -0
  19. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +1 -0
  20. data/app/serializers/uffizzi_core/controller/deploy_containers/host_volume_file_serializer.rb +9 -0
  21. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +16 -5
  22. data/app/services/uffizzi_core/compose_file/builders/container_config_files_builder_service.rb +27 -0
  23. data/app/services/uffizzi_core/compose_file/builders/container_host_volume_files_builder_service.rb +30 -0
  24. data/app/services/uffizzi_core/compose_file/builders/template_builder_service.rb +3 -7
  25. data/app/services/uffizzi_core/compose_file/dependencies_service.rb +36 -3
  26. data/app/services/uffizzi_core/compose_file/github_dependencies_service.rb +9 -0
  27. data/app/services/uffizzi_core/compose_file/host_volume_files_service.rb +40 -0
  28. data/app/services/uffizzi_core/compose_file/parsers/{volumes_parser_service.rb → named_volumes_parser_service.rb} +1 -1
  29. data/app/services/uffizzi_core/compose_file/parsers/services/volumes_parser_service.rb +14 -13
  30. data/app/services/uffizzi_core/compose_file/parsers/services_parser_service.rb +3 -3
  31. data/app/services/uffizzi_core/compose_file/template_service.rb +1 -1
  32. data/app/services/uffizzi_core/compose_file_service.rb +6 -3
  33. data/app/services/uffizzi_core/controller_service.rb +11 -0
  34. data/app/services/uffizzi_core/deployment_service.rb +2 -2
  35. data/config/locales/en.yml +2 -1
  36. data/db/migrate/20220901110752_create_host_volume_files.rb +23 -0
  37. data/db/migrate/20220901165313_create_container_host_volume_files.rb +18 -0
  38. data/lib/uffizzi_core/version.rb +1 -1
  39. data/lib/uffizzi_core.rb +2 -0
  40. metadata +30 -4
  41. data/app/services/uffizzi_core/compose_file/builders/config_files_builder_service.rb +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62fa420959689bef475db8e095621079cc7e96ae0b73decf0282a1d9bec5744e
4
- data.tar.gz: 76c69a8e8bfa2c6265dd3bcc7ad065a34e6ac6b3cfe8cc22ac3afcba6d477d1e
3
+ metadata.gz: 00ba39a6ed0a43804f4225204a8a8bead0bd930b6e41d0af55ed5055b0341148
4
+ data.tar.gz: d0f0312479a28b67acda70fa8cc9294f8296215942cceb795f065d356ee62f83
5
5
  SHA512:
6
- metadata.gz: 005451ab5a4349aec3311fddb5257d1513f7d7b1f381375a75c5739c0635aea5d463574d7d6fb20424af76cc6c49e1d9146848fec7235d1a7d3b5c8ab2de5635
7
- data.tar.gz: f3ac1a20fdb378b4926438abd9b3814cdedecea4de75fb48bc88f8a7d5b3d076f24becfce10df9edc794f55f6457f76c652a7395606f6b31dd9b56af0b98fc9d
6
+ metadata.gz: 00ae81e5bd57a538db963bf231ef34c6e57b574238c1374208f5f412918fd47746b694fe5b5a8f511f0d3d121b26037f4e02dc1149fe65c2369de72b4ad65550
7
+ data.tar.gz: e8a42e3edb430950a2eb641b57633f132e49ed94c2e62d51ed4fe48e37c8e9801f69316ff833e0ecafa37848527e9810c2c397a8eeeae4b82a2f9ade1dd62e18
@@ -24,7 +24,7 @@ class UffizziCore::Api::Cli::V1::Projects::ComposeFilesController < UffizziCore:
24
24
  # @parameter project_slug(required,path) [string] The project slug
25
25
  # @parameter params(required,body) [object <
26
26
  # compose_file: object<path: string, source: string, content: string>,
27
- # dependencies: Array<object<path: string, source: string, content: string>>>]
27
+ # dependencies: Array<object<path: string, source: string, content: string, use_kind: string, is_file: boolean>>>]
28
28
  #
29
29
  # @response [ComposeFile] 201 OK
30
30
  # @response 422 A compose file already exists for this project
@@ -72,7 +72,7 @@ class UffizziCore::Api::Cli::V1::Projects::ComposeFilesController < UffizziCore:
72
72
  end
73
73
 
74
74
  def dependencies_params
75
- params.permit(dependencies: [:name, :path, :source, :content])
75
+ params.permit(dependencies: [:path, :source, :content, :use_kind, :is_file])
76
76
  end
77
77
 
78
78
  def create_or_update_compose_file(params)
@@ -40,7 +40,7 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
40
40
  # @parameter project_slug(required,path) [string] The project slug
41
41
  # @parameter params(required,body) [object<
42
42
  # compose_file: object<path: string, source: string, content: string>,
43
- # dependencies: Array<object<path: string, source: string, content: string>>>]
43
+ # dependencies: Array<object<path: string, source: string, content: string, use_kind: string, is_file: boolean>>>]
44
44
  #
45
45
  # @response [Deployment] 201 OK
46
46
  # @response [object<errors: object<state: string>>] 422 Unprocessable Entity
@@ -66,7 +66,7 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
66
66
  # @parameter project_slug(required,path) [string] The project slug
67
67
  # @parameter params(required,body) [object<
68
68
  # compose_file: object<path: string, source: string, content: string>,
69
- # dependencies: Array<object<path: string, source: string, content: string>>>]
69
+ # dependencies: Array<object<path: string, source: string, content: string, use_kind: string, is_file: boolean>>>]
70
70
  #
71
71
  # @response [Deployment] 201 OK
72
72
  # @response [object<errors: object<state: string>>] 422 Unprocessable Entity
@@ -172,7 +172,7 @@ class UffizziCore::Api::Cli::V1::Projects::DeploymentsController < UffizziCore::
172
172
  end
173
173
 
174
174
  def dependencies_params
175
- params.permit(dependencies: [:name, :path, :source, :content])
175
+ params.permit(dependencies: [:path, :source, :content, :use_kind, :is_file])
176
176
  end
177
177
 
178
178
  def metadata_params
@@ -12,7 +12,8 @@ class UffizziCore::Api::Cli::V1::ComposeFile::CheckCredentialsForm
12
12
 
13
13
  def check_containers_credentials
14
14
  compose_content = Base64.decode64(compose_file.content)
15
- compose_data = UffizziCore::ComposeFileService.parse(compose_content)
15
+ compose_payload = { compose_file: compose_file }
16
+ compose_data = UffizziCore::ComposeFileService.parse(compose_content, compose_payload)
16
17
 
17
18
  UffizziCore::ComposeFileService.containers_credentials(compose_data, credentials)
18
19
  rescue UffizziCore::ComposeFile::CredentialError => e
@@ -9,14 +9,16 @@ class UffizziCore::Api::Cli::V1::ComposeFile::CliForm
9
9
  attribute :compose_repositories, Array
10
10
  attribute :content, String
11
11
  attribute :source_kind, Symbol
12
+ attribute :compose_file, UffizziCore::ComposeFile
12
13
 
13
14
  validates :content, presence: true
14
-
15
+ validates :compose_file, presence: true
15
16
  validate :check_compose_parsed_data, if: -> { errors[:content].empty? }
16
17
 
17
18
  def check_compose_parsed_data
18
19
  compose_content = Base64.decode64(content)
19
- self.compose_data = UffizziCore::ComposeFileService.parse(compose_content)
20
+ compose_payload = { compose_file: compose_file }
21
+ self.compose_data = UffizziCore::ComposeFileService.parse(compose_content, compose_payload)
20
22
  rescue UffizziCore::ComposeFile::ParseError => e
21
23
  errors.add(:content, e.message)
22
24
  end
@@ -45,6 +45,10 @@ class UffizziCore::Api::Cli::V1::Deployment::CreateForm < UffizziCore::Deploymen
45
45
  container_config_files_attributes: [
46
46
  :config_file_id,
47
47
  :mount_path,
48
+ ],
49
+ container_host_volume_files_attributes: [
50
+ :host_volume_file_id,
51
+ :source_path,
48
52
  ] },
49
53
  ]
50
54
 
@@ -44,6 +44,10 @@ class UffizziCore::Api::Cli::V1::Deployment::UpdateForm < UffizziCore::Deploymen
44
44
  container_config_files_attributes: [
45
45
  :config_file_id,
46
46
  :mount_path,
47
+ ],
48
+ container_host_volume_files_attributes: [
49
+ :host_volume_file_id,
50
+ :source_path,
47
51
  ] },
48
52
  ]
49
53
 
@@ -46,6 +46,10 @@ class UffizziCore::Api::Cli::V1::Template::CreateForm < UffizziCore::Template
46
46
  container_config_files_attributes: [
47
47
  :config_file_id,
48
48
  :mount_path,
49
+ ],
50
+ container_host_volume_files_attributes: [
51
+ :host_volume_file_id,
52
+ :source_path,
49
53
  ] },
50
54
  ],
51
55
  }
@@ -3,6 +3,8 @@
3
3
  module UffizziCore::Concerns::Models::ComposeFile
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ LOCAL_SOURCE = :local
7
+
6
8
  included do
7
9
  include UffizziCore::ComposeFileRepo
8
10
  include AASM
@@ -15,6 +17,7 @@ module UffizziCore::Concerns::Models::ComposeFile
15
17
 
16
18
  has_one :template, dependent: :destroy
17
19
  has_many :config_files, dependent: :destroy
20
+ has_many :host_volume_files, dependent: :destroy
18
21
  has_many :deployments, dependent: :nullify
19
22
 
20
23
  enumerize :kind, in: [:main, :temporary], predicates: true, scope: :shallow, default: :main
@@ -48,6 +51,14 @@ module UffizziCore::Concerns::Models::ComposeFile
48
51
  end
49
52
  end
50
53
 
54
+ def local_source?
55
+ repository_id.nil? && branch.nil?
56
+ end
57
+
58
+ def source_kind
59
+ return LOCAL_SOURCE if local_source?
60
+ end
61
+
51
62
  private
52
63
 
53
64
  def main_compose_file_uniqueness
@@ -20,6 +20,8 @@ module UffizziCore::Concerns::Models::Container
20
20
  has_many :activity_items, dependent: :destroy
21
21
  has_many :container_config_files, dependent: :destroy
22
22
  has_many :config_files, through: :container_config_files
23
+ has_many :container_host_volume_files, dependent: :destroy
24
+ has_many :host_volume_files, through: :container_host_volume_files
23
25
 
24
26
  attribute :public, :boolean, default: false
25
27
  attribute :port, :integer, default: nil
@@ -38,6 +40,7 @@ module UffizziCore::Concerns::Models::Container
38
40
 
39
41
  accepts_nested_attributes_for :repo
40
42
  accepts_nested_attributes_for :container_config_files, allow_destroy: true
43
+ accepts_nested_attributes_for :container_host_volume_files, allow_destroy: true
41
44
 
42
45
  validates :variables, 'uffizzi_core/environment_variable_list': true, allow_nil: true
43
46
  validates :secret_variables, 'uffizzi_core/environment_variable_list': true, allow_nil: true
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::Concerns::Models::ContainerHostVolumeFile
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ self.table_name = UffizziCore.table_names[:container_host_volume_files]
8
+
9
+ belongs_to :container
10
+ belongs_to :host_volume_file
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::Concerns::Models::HostVolumeFile
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include UffizziCore::HostVolumeFileRepo
8
+
9
+ self.table_name = UffizziCore.table_names[:host_volume_files]
10
+
11
+ belongs_to :project
12
+ belongs_to :added_by, class_name: UffizziCore::User.name, foreign_key: :added_by_id, optional: true
13
+ belongs_to :compose_file, optional: true
14
+
15
+ has_many :container_host_volume_files, dependent: :destroy
16
+
17
+ validates :source, presence: true
18
+ validates :path, presence: true
19
+ validates :payload, presence: true
20
+ validates :is_file, inclusion: [true, false]
21
+ end
22
+ end
@@ -21,6 +21,7 @@ module UffizziCore::Concerns::Models::Project
21
21
  has_many :credentials, through: :account
22
22
  has_many :compose_files, dependent: :destroy
23
23
  has_many :secrets, dependent: :destroy, as: :resource
24
+ has_many :host_volume_files, dependent: :destroy
24
25
 
25
26
  validates :name, presence: true, uniqueness: { scope: :account, message: 'Name already exists' }
26
27
  validates :slug, presence: true, uniqueness: { message: 'Project slug already taken' }
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ContainerHostVolumeFile < UffizziCore::ApplicationRecord
4
+ include UffizziCore::Concerns::Models::ContainerHostVolumeFile
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::HostVolumeFile < UffizziCore::ApplicationRecord
4
+ include UffizziCore::Concerns::Models::HostVolumeFile
5
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::HostVolumeFileRepo
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ scope :by_deployment, ->(deployment) {
8
+ joins(:container_host_volume_files)
9
+ .where(container_host_volume_files: { container: deployment.containers })
10
+ .distinct
11
+ }
12
+
13
+ scope :by_source, ->(source) {
14
+ where(source: source)
15
+ }
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Controller::DeployContainers::ComposeFileSerializer < UffizziCore::BaseSerializer
4
+ attributes :source_kind
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Controller::DeployContainers::ContainerSerializer::ContainerHostVolumeFileSerializer < UffizziCore::BaseSerializer
4
+ attributes :host_volume_file_id, :source_path
5
+ end
@@ -22,6 +22,7 @@ class UffizziCore::Controller::DeployContainers::ContainerSerializer < UffizziCo
22
22
  :additional_subdomains
23
23
 
24
24
  has_many :container_config_files
25
+ has_many :container_host_volume_files
25
26
 
26
27
  def image
27
28
  repo = object.repo
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Controller::DeployContainers::HostVolumeFileSerializer < UffizziCore::BaseSerializer
4
+ attributes :id, :source, :path, :payload, :is_file
5
+
6
+ def payload
7
+ Base64.encode64(object.payload)
8
+ end
9
+ end
@@ -25,9 +25,12 @@ class UffizziCore::ComposeFile::Builders::ContainerBuilderService
25
25
  container_name)
26
26
  configs_dependencies = UffizziCore::ComposeFile::GithubDependenciesService.configs_dependencies_for_container(compose_dependencies,
27
27
  container_name)
28
+ host_volumes_dependencies = UffizziCore::ComposeFile::GithubDependenciesService.host_volumes_dependencies_for_container(
29
+ compose_dependencies, container_name
30
+ )
28
31
  is_ingress = ingress_container?(container_name, ingress_data)
29
32
  repo_attributes = repo_attributes(container_data, continuous_preview_global_data)
30
- additional_subdomains = is_ingress ? ingress_data[:additional_subdomains] : []
33
+ additional_subdomains = is_ingress ? ingress_data.fetch(:additional_subdomains, []) : []
31
34
 
32
35
  {
33
36
  tag: tag(image_data, repo_attributes),
@@ -43,12 +46,13 @@ class UffizziCore::ComposeFile::Builders::ContainerBuilderService
43
46
  repo_attributes: repo_attributes,
44
47
  continuously_deploy: continuously_deploy(deploy_data),
45
48
  receive_incoming_requests: is_ingress,
46
- container_config_files_attributes: config_files(configs_data, configs_dependencies),
49
+ container_config_files_attributes: container_config_files_attributes(configs_data, configs_dependencies),
47
50
  service_name: container_name,
48
51
  name: container_name,
49
52
  healthcheck: healthcheck_data,
50
53
  volumes: volumes_data,
51
54
  additional_subdomains: additional_subdomains,
55
+ container_host_volume_files_attributes: container_host_volume_files_attributes(volumes_data, host_volumes_dependencies),
52
56
  }
53
57
  end
54
58
  # rubocop:enable Metrics/PerceivedComplexity
@@ -226,10 +230,17 @@ class UffizziCore::ComposeFile::Builders::ContainerBuilderService
226
230
  variables_builder.build_secret_attributes(secrets)
227
231
  end
228
232
 
229
- def config_files(config_files_data, dependencies)
230
- builder = UffizziCore::ComposeFile::Builders::ConfigFilesBuilderService.new(project)
233
+ def container_config_files_attributes(config_files_data, dependencies)
234
+ UffizziCore::ComposeFile::Builders::ContainerConfigFilesBuilderService.build_attributes(config_files_data, dependencies, project)
235
+ end
236
+
237
+ def container_host_volume_files_attributes(volumes_data, host_volumes_dependencies)
238
+ host_volumes_data = volumes_data.select do |v|
239
+ v[:type] == UffizziCore::ComposeFile::Parsers::Services::VolumesParserService::HOST_VOLUME_TYPE
240
+ end
231
241
 
232
- builder.build_attributes(config_files_data, dependencies)
242
+ UffizziCore::ComposeFile::Builders::ContainerHostVolumeFilesBuilderService
243
+ .build_attributes(host_volumes_data, host_volumes_dependencies, project)
233
244
  end
234
245
 
235
246
  def docker_builder(type)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ComposeFile::Builders::ContainerConfigFilesBuilderService
4
+ class << self
5
+ def build_attributes(config_files_data, dependencies, project)
6
+ return [] if config_files_data.empty?
7
+
8
+ config_file_sources = dependencies.pluck(:source)
9
+ config_files = project.config_files.with_creation_source(UffizziCore::ConfigFile.creation_source.compose_file)
10
+ .by_source(config_file_sources)
11
+
12
+ config_files_data.map do |config_file_data|
13
+ detected_dependency = dependencies.detect { |dependency| dependency[:path] == config_file_data[:source] }
14
+ detected_config_file = config_files.detect { |config_file| config_file.source == detected_dependency[:source] }
15
+
16
+ if detected_config_file.nil?
17
+ raise UffizziCore::ComposeFile::BuildError, I18n.t('compose.config_file_not_found', name: config_file_data[:source])
18
+ end
19
+
20
+ {
21
+ mount_path: config_file_data[:target],
22
+ config_file_id: detected_config_file.id,
23
+ }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ComposeFile::Builders::ContainerHostVolumeFilesBuilderService
4
+ class << self
5
+ def build_attributes(container_host_volumes_data, host_volumes_dependencies, project)
6
+ return [] if container_host_volumes_data.empty?
7
+
8
+ host_volume_files = project
9
+ .host_volume_files
10
+ .by_source(host_volumes_dependencies.pluck(:source))
11
+
12
+ container_host_volumes_data.map do |container_host_volume_data|
13
+ detected_dependency = host_volumes_dependencies.detect do |dependency|
14
+ dependency[:raw_source] == container_host_volume_data[:source]
15
+ end
16
+ detected_host_volume_file = host_volume_files.detect { |host_volume_file| host_volume_file.source == detected_dependency[:source] }
17
+
18
+ if detected_host_volume_file.nil?
19
+ raise UffizziCore::ComposeFile::BuildError,
20
+ I18n.t('compose.host_volume_file_not_found', name: container_host_volume_data[:source])
21
+ end
22
+
23
+ {
24
+ source_path: container_host_volume_data[:source],
25
+ host_volume_file_id: detected_host_volume_file.id,
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -33,13 +33,9 @@ class UffizziCore::ComposeFile::Builders::TemplateBuilderService
33
33
 
34
34
  def build_containers_attributes(containers_data, ingress_data, continuous_preview_global_data, compose_dependencies)
35
35
  containers_data.map do |container_data|
36
- container_attributes(container_data, ingress_data, continuous_preview_global_data, compose_dependencies)
37
- end
38
- end
36
+ builder = UffizziCore::ComposeFile::Builders::ContainerBuilderService.new(credentials, project, repositories)
39
37
 
40
- def container_attributes(containers_data, ingress_data, continuous_preview_global_data, compose_dependencies)
41
- builder = UffizziCore::ComposeFile::Builders::ContainerBuilderService.new(credentials, project, repositories)
42
-
43
- builder.build_attributes(containers_data, ingress_data, continuous_preview_global_data, compose_dependencies)
38
+ builder.build_attributes(container_data, ingress_data, continuous_preview_global_data, compose_dependencies)
39
+ end
44
40
  end
45
41
  end
@@ -3,14 +3,21 @@
3
3
  class UffizziCore::ComposeFile::DependenciesService
4
4
  ENV_FILE_TYPE = 'env_file'
5
5
  CONFIG_TYPE = 'config'
6
+ VOLUME_TYPE = 'volume'
7
+ DEPENDENCY_CONFIG_USE_KIND = 'config_map'
8
+ DEPENDENCY_VOLUME_USE_KIND = 'volume'
6
9
 
7
10
  class << self
8
11
  def build_dependencies(compose_data, compose_path, dependencies_params)
12
+ config_dependencies_params = dependencies_params.select { |d| d[:use_kind] == DEPENDENCY_CONFIG_USE_KIND }
13
+ volume_dependencies_params = dependencies_params.select { |d| d[:use_kind] == DEPENDENCY_VOLUME_USE_KIND }
14
+
9
15
  dependencies = compose_data[:containers].map do |container|
10
- env_file_dependencies = build_env_files_dependencies(container, compose_path, dependencies_params)
11
- configs_dependencies = build_configs_dependencies(container, compose_path, dependencies_params)
16
+ env_file_dependencies = build_env_files_dependencies(container, compose_path, config_dependencies_params)
17
+ configs_dependencies = build_configs_dependencies(container, compose_path, config_dependencies_params)
18
+ volumes_dependencies = build_volumes_dependencies(container, compose_path, volume_dependencies_params)
12
19
 
13
- env_file_dependencies + configs_dependencies
20
+ env_file_dependencies + configs_dependencies + volumes_dependencies
14
21
  end
15
22
 
16
23
  dependencies.compact.flatten
@@ -40,6 +47,28 @@ class UffizziCore::ComposeFile::DependenciesService
40
47
  end
41
48
  end
42
49
 
50
+ def build_volumes_dependencies(container, compose_path, raw_dependencies)
51
+ container_volumes = container[:volumes]
52
+ return [] unless container_volumes.present?
53
+
54
+ container_volumes
55
+ .select { |c| c[:type] == UffizziCore::ComposeFile::Parsers::Services::VolumesParserService::HOST_VOLUME_TYPE }
56
+ .map do |container_volume|
57
+ detected_raw_dependency = raw_dependencies.detect { |raw_dependency| raw_dependency[:source] == container_volume[:source] }
58
+ builded_source = build_source_path(compose_path, detected_raw_dependency[:source])
59
+
60
+ {
61
+ content: detected_raw_dependency[:content],
62
+ path: detected_raw_dependency[:path],
63
+ container_name: container[:container_name],
64
+ source: builded_source,
65
+ raw_source: detected_raw_dependency[:source],
66
+ type: VOLUME_TYPE,
67
+ is_file: detected_raw_dependency[:is_file],
68
+ }
69
+ end
70
+ end
71
+
43
72
  def base_file_params(dependency, container)
44
73
  {
45
74
  content: dependency[:content],
@@ -52,5 +81,9 @@ class UffizziCore::ComposeFile::DependenciesService
52
81
  prepared_compose_path = Pathname.new(compose_path).basename.to_s
53
82
  "#{prepared_compose_path}/#{dependency_path}"
54
83
  end
84
+
85
+ def host_volume_binary_content(dependency)
86
+ Base64.decode64(dependency[:content])
87
+ end
55
88
  end
56
89
  end
@@ -3,6 +3,7 @@
3
3
  class UffizziCore::ComposeFile::GithubDependenciesService
4
4
  ENV_FILE_TYPE = 'env_file'
5
5
  CONFIG_TYPE = 'config'
6
+ VOLUME_TYPE = 'volume'
6
7
 
7
8
  class << self
8
9
  def filename(dependency)
@@ -23,10 +24,18 @@ class UffizziCore::ComposeFile::GithubDependenciesService
23
24
  configs_dependencies(dependencies).select { |dependency| dependency[:container_name] == container_name }
24
25
  end
25
26
 
27
+ def host_volumes_dependencies_for_container(dependencies, container_name)
28
+ dependencies.select { |dependency| dependency[:type] == VOLUME_TYPE && dependency[:container_name] == container_name }
29
+ end
30
+
26
31
  def configs_dependencies(dependencies)
27
32
  dependencies.select { |dependency| dependency[:type] == CONFIG_TYPE }
28
33
  end
29
34
 
35
+ def select_dependencies_by_type(dependencies, type)
36
+ dependencies.select { |dependency| dependency[:type].to_s == type.to_s }
37
+ end
38
+
30
39
  def build_source_path(compose_path, dependency_path, repository_id, branch)
31
40
  prepared_compose_path = Pathname.new(compose_path).basename.to_s
32
41
  base_source = "#{prepared_compose_path}/#{dependency_path}"
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ComposeFile::HostVolumeFilesService
4
+ class << self
5
+ def bulk_create(compose_file_form, compose_dependencies)
6
+ volumes_dependencies = UffizziCore::ComposeFile::GithubDependenciesService
7
+ .select_dependencies_by_type(compose_dependencies, UffizziCore::ComposeFile::DependenciesService::VOLUME_TYPE)
8
+
9
+ errors = []
10
+ volumes_dependencies.each do |volume_dependency|
11
+ new_errors = create(compose_file_form, volume_dependency)
12
+ errors << new_errors if new_errors
13
+ end
14
+
15
+ errors
16
+ end
17
+
18
+ def create(compose_file_form, volume_dependency)
19
+ source = volume_dependency[:source]
20
+ host_volume_file = compose_file_form.project.host_volume_files.find_or_initialize_by(source: source)
21
+ attributes = {
22
+ payload: UffizziCore::ComposeFile::DependenciesService.host_volume_binary_content(volume_dependency),
23
+ source: source,
24
+ path: volume_dependency[:path],
25
+ is_file: volume_dependency[:is_file],
26
+ }
27
+
28
+ host_volume_file.assign_attributes(attributes)
29
+ host_volume_file.project = compose_file_form.project
30
+ host_volume_file.added_by = compose_file_form.added_by
31
+ host_volume_file.compose_file = compose_file_form
32
+
33
+ return host_volume_file.errors if host_volume_file.invalid?
34
+
35
+ host_volume_file.save
36
+
37
+ nil
38
+ end
39
+ end
40
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class UffizziCore::ComposeFile::Parsers::VolumesParserService
3
+ class UffizziCore::ComposeFile::Parsers::NamedVolumesParserService
4
4
  VALID_VOLUME_NAME_REGEX = /^[a-zA-Z0-9._-]+$/.freeze
5
5
 
6
6
  class << self
@@ -8,26 +8,30 @@ class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService
8
8
  READ_WRITE_OPTION = 'rw'
9
9
 
10
10
  class << self
11
- def parse(volumes, volumes_payload)
11
+ def parse(volumes, additional_data)
12
12
  return [] if volumes.blank?
13
13
 
14
+ if volumes.is_a?(String)
15
+ raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.volumes_should_be_array', volumes: volumes)
16
+ end
17
+
14
18
  volumes.map do |volume|
15
19
  volume_data = case volume
16
20
  when String
17
- process_short_syntax(volume, volumes_payload)
21
+ process_short_syntax(volume, additional_data)
18
22
  when Hash
19
- process_long_syntax(volume, volumes_payload)
23
+ process_long_syntax(volume, additional_data)
20
24
  else
21
25
  raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_type', option: :volumes)
22
26
  end
23
27
 
24
28
  volume_data
25
- end
29
+ end.uniq
26
30
  end
27
31
 
28
32
  private
29
33
 
30
- def process_short_syntax(volume_data, volumes_payload)
34
+ def process_short_syntax(volume_data, additional_data)
31
35
  volume_parts = volume_data.split(':').map(&:strip)
32
36
  read_only = volume_parts.last.to_s.downcase == READONLY_OPTION
33
37
  part1, part2 = volume_parts
@@ -36,10 +40,10 @@ class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService
36
40
 
37
41
  raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.volume_prop_is_required', prop_name: 'source') if source_path.blank?
38
42
 
39
- build_volume_attributes(source_path, target_path, read_only, volumes_payload)
43
+ build_volume_attributes(source_path, target_path, read_only, additional_data)
40
44
  end
41
45
 
42
- def process_long_syntax(volume_data, volumes_payload)
46
+ def process_long_syntax(volume_data, additional_data)
43
47
  source_path = volume_data['source'].to_s.strip
44
48
  target_path = volume_data['target'].to_s.strip
45
49
  read_only = volume_data['read_only'].present?
@@ -47,7 +51,7 @@ class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService
47
51
  raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.volume_prop_is_required', prop_name: 'source') if source_path.blank?
48
52
  raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.volume_prop_is_required', prop_name: 'target') if target_path.blank?
49
53
 
50
- build_volume_attributes(source_path, target_path, read_only, volumes_payload)
54
+ build_volume_attributes(source_path, target_path, read_only, additional_data)
51
55
  end
52
56
 
53
57
  def build_volume_attributes(source_path, target_path, read_only, params = {})
@@ -70,10 +74,7 @@ class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService
70
74
  end
71
75
 
72
76
  def build_volume_type(source_path, target_path)
73
- if path?(source_path) && path?(target_path)
74
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.volume_type_not_supported', type: HOST_VOLUME_TYPE)
75
- end
76
-
77
+ return HOST_VOLUME_TYPE if path?(source_path) && path?(target_path)
77
78
  return ANONYMOUS_VOLUME_TYPE if path?(source_path) && target_path.blank?
78
79
  return NAMED_VOLUME_TYPE if source_path.present? && !path?(source_path) && path?(target_path)
79
80
 
@@ -81,7 +82,7 @@ class UffizziCore::ComposeFile::Parsers::Services::VolumesParserService
81
82
  end
82
83
 
83
84
  def path?(path)
84
- /^(\/|\.\/|~\/)/.match?(path)
85
+ path.to_s.start_with?('/', './', '../')
85
86
  end
86
87
 
87
88
  def validate_named_volume(source_path, target_path, named_volumes_names, service_name)
@@ -70,12 +70,12 @@ class UffizziCore::ComposeFile::Parsers::ServicesParserService
70
70
  build_parser_module.parse(value, compose_payload)
71
71
  end
72
72
 
73
- def parse_volumes(value, volumes_payload)
73
+ def parse_volumes(volumes, additional_data)
74
74
  volume_parser_module = find_volume_parser_module
75
75
 
76
- return UffizziCore::ComposeFile::Parsers::Services::VolumesParserService.parse(value, volumes_payload) unless volume_parser_module
76
+ return UffizziCore::ComposeFile::Parsers::Services::VolumesParserService.parse(volumes, additional_data) unless volume_parser_module
77
77
 
78
- volume_parser_module.parse(value, volumes_payload)
78
+ volume_parser_module.parse(volumes, additional_data)
79
79
  end
80
80
  end
81
81
  end
@@ -42,7 +42,7 @@ class UffizziCore::ComposeFile::TemplateService
42
42
  attributes = compose_file_template_form.template_attributes
43
43
  source = compose_file_template_form.source
44
44
  template = compose_file_form.template
45
- template = @project.templates.find_or_initialize_by(name: source) if !template.present?
45
+ template = @project.templates.find_or_initialize_by(name: source) if template.blank?
46
46
  template.assign_attributes(attributes)
47
47
  template_form = template.becomes(UffizziCore::Api::Cli::V1::Template::CreateForm)
48
48
  template_form.project = @project
@@ -21,7 +21,7 @@ class UffizziCore::ComposeFileService
21
21
  check_config_options_format(compose_data)
22
22
  configs_data = UffizziCore::ComposeFile::Parsers::ConfigsParserService.parse(compose_data['configs'])
23
23
  secrets_data = UffizziCore::ComposeFile::Parsers::SecretsParserService.parse(compose_data['secrets'])
24
- named_volume_names = UffizziCore::ComposeFile::Parsers::VolumesParserService.parse(compose_data['volumes'])
24
+ named_volume_names = UffizziCore::ComposeFile::Parsers::NamedVolumesParserService.parse(compose_data['volumes'])
25
25
  containers_data = UffizziCore::ComposeFile::Parsers::ServicesParserService.parse(
26
26
  compose_data['services'],
27
27
  configs_data,
@@ -132,6 +132,7 @@ class UffizziCore::ComposeFileService
132
132
  def process_compose_file(compose_file_form, params)
133
133
  cli_form = UffizziCore::Api::Cli::V1::ComposeFile::CliForm.new
134
134
  cli_form.content = compose_file_form.content
135
+ cli_form.compose_file = compose_file_form.becomes(UffizziCore::ComposeFile)
135
136
  return [compose_file_form, cli_form.errors] if cli_form.invalid?
136
137
 
137
138
  dependencies = params[:dependencies].to_a
@@ -188,8 +189,10 @@ class UffizziCore::ComposeFileService
188
189
  end
189
190
 
190
191
  config_files_service = UffizziCore::ComposeFile::ConfigFilesService.new(compose_file_form)
191
- errors = config_files_service.create_config_files(cli_form.compose_dependencies)
192
- raise ActiveRecord::Rollback if errors.present?
192
+ config_file_errors = config_files_service.create_config_files(cli_form.compose_dependencies)
193
+ host_volume_file_errors = UffizziCore::ComposeFile::HostVolumeFilesService
194
+ .bulk_create(compose_file_form, cli_form.compose_dependencies)
195
+ raise ActiveRecord::Rollback if config_file_errors.present? || host_volume_file_errors.present?
193
196
 
194
197
  project = compose_file_form.project
195
198
  user = compose_file_form.added_by
@@ -45,14 +45,25 @@ class UffizziCore::ControllerService
45
45
  containers = containers.map do |container|
46
46
  UffizziCore::Controller::DeployContainers::ContainerSerializer.new(container).as_json(include: '**')
47
47
  end
48
+
48
49
  credentials = deployment.credentials.deployable.map do |credential|
49
50
  UffizziCore::Controller::DeployContainers::CredentialSerializer.new(credential).as_json
50
51
  end
51
52
 
53
+ host_volume_files = UffizziCore::HostVolumeFile.by_deployment(deployment).map do |host_volume_file|
54
+ UffizziCore::Controller::DeployContainers::HostVolumeFileSerializer.new(host_volume_file).as_json
55
+ end
56
+
57
+ compose_file = if deployment.compose_file.present?
58
+ UffizziCore::Controller::DeployContainers::ComposeFileSerializer.new(deployment.compose_file).as_json
59
+ end
60
+
52
61
  body = {
53
62
  containers: containers,
54
63
  credentials: credentials,
55
64
  deployment_url: deployment.preview_url,
65
+ compose_file: compose_file,
66
+ host_volume_files: host_volume_files,
56
67
  }
57
68
 
58
69
  if password_protection_module.present?
@@ -63,9 +63,9 @@ class UffizziCore::DeploymentService
63
63
  Rails.logger.info("DEPLOYMENT_PROCESS deployment_id=#{deployment.id} start deploying into controller")
64
64
 
65
65
  containers = deployment.active_containers
66
- containers = add_default_deployment_variables!(containers, deployment)
66
+ containers_with_variables = add_default_deployment_variables!(containers, deployment)
67
67
 
68
- UffizziCore::ControllerService.deploy_containers(deployment, containers)
68
+ UffizziCore::ControllerService.deploy_containers(deployment, containers_with_variables)
69
69
  else
70
70
  Rails.logger.info("DEPLOYMENT_PROCESS deployment_id=#{deployment.id} deployment has builds errors, stopping")
71
71
  end
@@ -33,6 +33,7 @@ en:
33
33
  image_build_no_specified: Service '%{value}' has neither an image nor a build context specified. At least one must be provided.
34
34
  build_context_no_specified: The context option should be specified
35
35
  config_file_not_found: Config file not found '%{name}'
36
+ host_volume_file_not_found: Host volume file not found '%{name}'
36
37
  invalid_context: Invalid context value '%{value}'
37
38
  invalid_bool_value: Invalid %{field} value '%{value}'. The value should be `true` or `false`
38
39
  invalid_delete_after_postfix: The postfix of the delete_preview_after value should be `h`
@@ -64,10 +65,10 @@ en:
64
65
  volume_path_is_invalid: The path '%{path}' is invalid
65
66
  volume_prop_is_required: The '%{prop_name}' is a required property
66
67
  volume_invalid_name: "Volumes value '%{name}' does not match any of the regexes: '^[a-zA-Z0-9._-]+$'"
67
- volume_type_not_supported: Volumes with type '%{type}' does not supported
68
68
  named_volume_not_exists: Named volume '%{source_path}:%{target_path}' is used in service '%{service_name}' but no declaration was found in the volumes section.
69
69
  invalid_volume_destination: Invalid volume specification '%{spec}' destination can't be '/'
70
70
  required_start_commands: "When 'test' is a list the first item must be one of: '%{available_commands}'"
71
+ volumes_should_be_array: Volumes '%{volumes}' should be an arra
71
72
  secrets:
72
73
  duplicates_exists: Secret with key %{secrets} already exist.
73
74
  invalid_key_length: A secret key must be no longer than 256 characters.
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateHostVolumeFiles < ActiveRecord::Migration[6.1]
4
+ def change
5
+ create_table :uffizzi_core_host_volume_files do |t|
6
+ t.string :source
7
+ t.string :path
8
+ t.boolean :is_file
9
+ t.binary :payload
10
+ t.bigint :added_by_id
11
+ t.timestamps
12
+
13
+ t.references :project, null: false,
14
+ foreign_key: true,
15
+ index: { name: :index_host_volume_file_on_project_id },
16
+ foreign_key: { to_table: :uffizzi_core_projects }
17
+ t.references :compose_file, null: false,
18
+ foreign_key: true,
19
+ index: { name: :index_host_volume_file_on_compose_file_id },
20
+ foreign_key: { to_table: :uffizzi_core_compose_files }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateContainerHostVolumeFiles < ActiveRecord::Migration[6.1]
4
+ def change
5
+ create_table :uffizzi_core_container_host_volume_files do |t|
6
+ t.string :source_path
7
+ t.timestamps
8
+ t.references :container, null: false,
9
+ foreign_key: true,
10
+ index: { name: :uf_core_cont_h_v_on_cont },
11
+ foreign_key: { to_table: :uffizzi_core_containers }
12
+ t.references :host_volume_file, null: false,
13
+ foreign_key: true,
14
+ index: { name: :uf_core_cont_h_v_on_h_v_file },
15
+ foreign_key: { to_table: :uffizzi_core_host_volume_files }
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UffizziCore
4
- VERSION = '2.0.3'
4
+ VERSION = '2.0.4'
5
5
  end
data/lib/uffizzi_core.rb CHANGED
@@ -58,6 +58,8 @@ module UffizziCore
58
58
  user_projects: :uffizzi_core_user_projects,
59
59
  users: :uffizzi_core_users,
60
60
  users_roles: :uffizzi_core_users_roles,
61
+ host_volume_files: :uffizzi_core_host_volume_files,
62
+ container_host_volume_files: :uffizzi_core_container_host_volume_files,
61
63
  }
62
64
  mattr_accessor :user_creation_sources, default: [:system, :online_registration, :google, :sso]
63
65
  mattr_accessor :user_project_roles, default: [:admin, :developer, :viewer]
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: 2.0.3
4
+ version: 2.0.4
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-10-10 00:00:00.000000000 Z
12
+ date: 2022-10-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aasm
@@ -563,6 +563,20 @@ dependencies:
563
563
  - - ">="
564
564
  - !ruby/object:Gem::Version
565
565
  version: '0'
566
+ - !ruby/object:Gem::Dependency
567
+ name: hash_diff
568
+ requirement: !ruby/object:Gem::Requirement
569
+ requirements:
570
+ - - "~>"
571
+ - !ruby/object:Gem::Version
572
+ version: '1.1'
573
+ type: :development
574
+ prerelease: false
575
+ version_requirements: !ruby/object:Gem::Requirement
576
+ requirements:
577
+ - - "~>"
578
+ - !ruby/object:Gem::Version
579
+ version: '1.1'
566
580
  - !ruby/object:Gem::Dependency
567
581
  name: minitest
568
582
  requirement: !ruby/object:Gem::Requirement
@@ -802,10 +816,12 @@ files:
802
816
  - app/lib/uffizzi_core/concerns/models/config_file.rb
803
817
  - app/lib/uffizzi_core/concerns/models/container.rb
804
818
  - app/lib/uffizzi_core/concerns/models/container_config_file.rb
819
+ - app/lib/uffizzi_core/concerns/models/container_host_volume_file.rb
805
820
  - app/lib/uffizzi_core/concerns/models/coupon.rb
806
821
  - app/lib/uffizzi_core/concerns/models/credential.rb
807
822
  - app/lib/uffizzi_core/concerns/models/deployment.rb
808
823
  - app/lib/uffizzi_core/concerns/models/event.rb
824
+ - app/lib/uffizzi_core/concerns/models/host_volume_file.rb
809
825
  - app/lib/uffizzi_core/concerns/models/membership.rb
810
826
  - app/lib/uffizzi_core/concerns/models/payment.rb
811
827
  - app/lib/uffizzi_core/concerns/models/price.rb
@@ -834,6 +850,7 @@ files:
834
850
  - app/models/uffizzi_core/config_file.rb
835
851
  - app/models/uffizzi_core/container.rb
836
852
  - app/models/uffizzi_core/container_config_file.rb
853
+ - app/models/uffizzi_core/container_host_volume_file.rb
837
854
  - app/models/uffizzi_core/continuous_preview.rb
838
855
  - app/models/uffizzi_core/coupon.rb
839
856
  - app/models/uffizzi_core/credential.rb
@@ -848,6 +865,7 @@ files:
848
865
  - app/models/uffizzi_core/database_offering.rb
849
866
  - app/models/uffizzi_core/deployment.rb
850
867
  - app/models/uffizzi_core/event.rb
868
+ - app/models/uffizzi_core/host_volume_file.rb
851
869
  - app/models/uffizzi_core/membership.rb
852
870
  - app/models/uffizzi_core/payment.rb
853
871
  - app/models/uffizzi_core/price.rb
@@ -887,6 +905,7 @@ files:
887
905
  - app/repositories/uffizzi_core/credential_repo.rb
888
906
  - app/repositories/uffizzi_core/deployment_repo.rb
889
907
  - app/repositories/uffizzi_core/event_repo.rb
908
+ - app/repositories/uffizzi_core/host_volume_file_repo.rb
890
909
  - app/repositories/uffizzi_core/membership_repo.rb
891
910
  - app/repositories/uffizzi_core/price_repo.rb
892
911
  - app/repositories/uffizzi_core/product_repo.rb
@@ -920,17 +939,21 @@ files:
920
939
  - app/serializers/uffizzi_core/controller/apply_config_file/config_file_serializer.rb
921
940
  - app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb
922
941
  - app/serializers/uffizzi_core/controller/create_deployment/deployment_serializer.rb
942
+ - app/serializers/uffizzi_core/controller/deploy_containers/compose_file_serializer.rb
923
943
  - app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb
924
944
  - app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer.rb
925
945
  - app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer/config_file_serializer.rb
946
+ - app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_host_volume_file_serializer.rb
926
947
  - app/serializers/uffizzi_core/controller/deploy_containers/credential_serializer.rb
948
+ - app/serializers/uffizzi_core/controller/deploy_containers/host_volume_file_serializer.rb
927
949
  - app/services/uffizzi_core/account_service.rb
928
950
  - app/services/uffizzi_core/activity_item_service.rb
929
951
  - app/services/uffizzi_core/amazon/credential_service.rb
930
952
  - app/services/uffizzi_core/amazon_service.rb
931
953
  - app/services/uffizzi_core/azure/credential_service.rb
932
- - app/services/uffizzi_core/compose_file/builders/config_files_builder_service.rb
933
954
  - app/services/uffizzi_core/compose_file/builders/container_builder_service.rb
955
+ - app/services/uffizzi_core/compose_file/builders/container_config_files_builder_service.rb
956
+ - app/services/uffizzi_core/compose_file/builders/container_host_volume_files_builder_service.rb
934
957
  - app/services/uffizzi_core/compose_file/builders/docker_repo_builder_service.rb
935
958
  - app/services/uffizzi_core/compose_file/builders/template_builder_service.rb
936
959
  - app/services/uffizzi_core/compose_file/builders/variables_builder_service.rb
@@ -940,9 +963,11 @@ files:
940
963
  - app/services/uffizzi_core/compose_file/dependencies_service.rb
941
964
  - app/services/uffizzi_core/compose_file/errors_service.rb
942
965
  - app/services/uffizzi_core/compose_file/github_dependencies_service.rb
966
+ - app/services/uffizzi_core/compose_file/host_volume_files_service.rb
943
967
  - app/services/uffizzi_core/compose_file/parsers/configs_parser_service.rb
944
968
  - app/services/uffizzi_core/compose_file/parsers/continuous_preview_parser_service.rb
945
969
  - app/services/uffizzi_core/compose_file/parsers/ingress_parser_service.rb
970
+ - app/services/uffizzi_core/compose_file/parsers/named_volumes_parser_service.rb
946
971
  - app/services/uffizzi_core/compose_file/parsers/secrets_parser_service.rb
947
972
  - app/services/uffizzi_core/compose_file/parsers/services/command_parser_service.rb
948
973
  - app/services/uffizzi_core/compose_file/parsers/services/configs_parser_service.rb
@@ -956,7 +981,6 @@ files:
956
981
  - app/services/uffizzi_core/compose_file/parsers/services/volumes_parser_service.rb
957
982
  - app/services/uffizzi_core/compose_file/parsers/services_parser_service.rb
958
983
  - app/services/uffizzi_core/compose_file/parsers/variables_parser_service.rb
959
- - app/services/uffizzi_core/compose_file/parsers/volumes_parser_service.rb
960
984
  - app/services/uffizzi_core/compose_file/template_service.rb
961
985
  - app/services/uffizzi_core/compose_file_service.rb
962
986
  - app/services/uffizzi_core/container_service.rb
@@ -1001,6 +1025,8 @@ files:
1001
1025
  - db/migrate/20220525113412_rename_name_to_uffizzi_containers.rb
1002
1026
  - db/migrate/20220704135629_add_disabled_at_to_deployments.rb
1003
1027
  - db/migrate/20220805164628_add_metadata_to_deployment.rb
1028
+ - db/migrate/20220901110752_create_host_volume_files.rb
1029
+ - db/migrate/20220901165313_create_container_host_volume_files.rb
1004
1030
  - db/migrate/20220927113647_add_additional_subdomains_to_containers.rb
1005
1031
  - db/seeds.rb
1006
1032
  - lib/tasks/uffizzi_core_tasks.rake
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::Builders::ConfigFilesBuilderService
4
- attr_accessor :project
5
-
6
- def initialize(project)
7
- @project = project
8
- end
9
-
10
- def build_attributes(config_files_data, dependencies)
11
- return [] if config_files_data.empty?
12
-
13
- config_file_sources = dependencies.pluck(:source)
14
- config_files = project.config_files.with_creation_source(UffizziCore::ConfigFile.creation_source.compose_file)
15
- .by_source(config_file_sources)
16
-
17
- config_files_data.map do |config_file_data|
18
- detected_dependency = dependencies.detect { |dependency| dependency[:path] == config_file_data[:source] }
19
- detected_config_file = config_files.detect { |config_file| config_file.source == detected_dependency[:source] }
20
-
21
- if detected_config_file.nil?
22
- raise UffizziCore::ComposeFile::BuildError, I18n.t('compose.config_file_not_found', name: config_file_data[:source])
23
- end
24
-
25
- {
26
- mount_path: config_file_data[:target],
27
- config_file_id: detected_config_file.id,
28
- }
29
- end
30
- end
31
- end