blob: f53c63d2b012c0be18c56da00b290c3748fbe54f (
plain)
1
2
3
4
5
6
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# 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'])
.not_pending_destruction
.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
|