diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-17 13:07:47 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-17 13:07:47 +0300 |
commit | d670c3006e6e44901bce0d53cc4768d1d80ffa92 (patch) | |
tree | 8f65743c232e5b76850c4cc264ba15e1185815ff /app/services/packages | |
parent | a5f4bba440d7f9ea47046a0a561d49adf0a1e6d4 (diff) |
Add latest changes from gitlab-org/gitlab@14-0-stable-ee
Diffstat (limited to 'app/services/packages')
-rw-r--r-- | app/services/packages/helm/process_file_service.rb | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/app/services/packages/helm/process_file_service.rb b/app/services/packages/helm/process_file_service.rb new file mode 100644 index 00000000000..31b357c1616 --- /dev/null +++ b/app/services/packages/helm/process_file_service.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true + +module Packages + module Helm + class ProcessFileService + include Gitlab::Utils::StrongMemoize + include ExclusiveLeaseGuard + + ExtractionError = Class.new(StandardError) + DEFAULT_LEASE_TIMEOUT = 1.hour.to_i + + def initialize(channel, package_file) + @channel = channel + @package_file = package_file + end + + def execute + raise ExtractionError, 'Helm chart was not processed - package_file is not set' unless package_file + + try_obtain_lease do + temp_package.transaction do + rename_package_and_set_version + rename_package_file_and_set_metadata + cleanup_temp_package + end + end + end + + private + + attr_reader :channel, :package_file + + def rename_package_and_set_version + package.update!( + name: metadata['name'], + version: metadata['version'], + status: :default + ) + end + + def rename_package_file_and_set_metadata + # Updating file_name updates the path where the file is stored. + # We must pass the file again so that CarrierWave can handle the update + package_file.update!( + file_name: file_name, + file: package_file.file, + package_id: package.id, + helm_file_metadatum_attributes: { + channel: channel, + metadata: metadata + } + ) + end + + def cleanup_temp_package + temp_package.destroy if package.id != temp_package.id + end + + def temp_package + strong_memoize(:temp_package) do + package_file.package + end + end + + def package + strong_memoize(:package) do + project_packages = package_file.package.project.packages + package = project_packages.with_package_type(:helm) + .with_name(metadata['name']) + .with_version(metadata['version']) + .last + package || temp_package + end + end + + def metadata + strong_memoize(:metadata) do + ::Packages::Helm::ExtractFileMetadataService.new(package_file).execute + end + end + + def file_name + "#{metadata['name']}-#{metadata['version']}.tgz" + end + + # used by ExclusiveLeaseGuard + def lease_key + "packages:helm:process_file_service:package_file:#{package_file.id}" + end + + # used by ExclusiveLeaseGuard + def lease_timeout + DEFAULT_LEASE_TIMEOUT + end + end + end +end |