dependabot-terraform 0.181.0 → 0.182.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7c0d446f299049426d66be7deb7922a72dbd751ea59e876ce08ae8208e2b6b6
4
- data.tar.gz: ee3d264b0c90e2af87427645ef0560c1901bb16755baead32b92906cb1e04fbf
3
+ metadata.gz: 74fdece7083163ed271c5f4b0ff5145ea87b934bd636a3701c511521cbad7b18
4
+ data.tar.gz: d7baa6837144c41943751d307b9b36db22dfd2ce63dbe8936a21b4734b3676f5
5
5
  SHA512:
6
- metadata.gz: 5420796c3ecbe8cd244b2afa8caf944406ccab83c89eee1d410729f138b09748b81004aaf71dfb2cd35bb24a117be2c396307405a3f7038b94f5568db2031ff8
7
- data.tar.gz: 11bb3603dba0551a170ec490500523d998d07c1cd9cf0595c6ef4180d911bab64a7eee734f78ee4190ae9665ce445dc098000b74fa8af52d5250ba2ec4da8dbe
6
+ metadata.gz: 28e794e53f62c43cb89a543ec3f9702cd9a4efdc3ce72ac81cb0426ad0e3faa9abfd2094545514325092216716cbcfbe4ca6646c83d05fe39ed5c4159063e680
7
+ data.tar.gz: d5e81c178ead5f6dff60d54b4e814cf1514ed638eb8777cfc2a19c3ce6f44a11f8591c6f6a808d820623f74ff99e9673e9ddd7797179ce5c32322ba1df03cf9a
@@ -94,25 +94,110 @@ module Dependabot
94
94
  end
95
95
  end
96
96
 
97
- def update_lockfile_declaration(updated_manifest_files) # rubocop:disable Metrics/AbcSize
97
+ def extract_provider_h1_hashes(content, declaration_regex)
98
+ content.match(declaration_regex).to_s.
99
+ match(hashes_object_regex).to_s.
100
+ split("\n").map { |hash| hash.match(hashes_string_regex).to_s }.
101
+ select { |h| h&.match?(/^h1:/) }
102
+ end
103
+
104
+ def lockfile_details(new_req)
105
+ content = lock_file.content.dup
106
+ provider_source = new_req[:source][:registry_hostname] + "/" + new_req[:source][:module_identifier]
107
+ declaration_regex = lockfile_declaration_regex(provider_source)
108
+
109
+ [content, provider_source, declaration_regex]
110
+ end
111
+
112
+ def lookup_hash_architecture # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
113
+ new_req = dependency.requirements.first
114
+
115
+ # NOTE: Only providers are inlcuded in the lockfile, modules are not
116
+ return unless new_req[:source][:type] == "provider"
117
+
118
+ architectures = []
119
+ content, provider_source, declaration_regex = lockfile_details(new_req)
120
+ hashes = extract_provider_h1_hashes(content, declaration_regex)
121
+
122
+ # These are ordered in assumed popularity
123
+ possible_architectures = %w(
124
+ linux_amd64
125
+ darwin_amd64
126
+ windows_amd64
127
+ darwin_arm64
128
+ linux_arm64
129
+ )
130
+
131
+ base_dir = dependency_files.first.directory
132
+ lockfile_hash_removed = content.sub(hashes_object_regex, "")
133
+
134
+ # This runs in the same directory as the actual lockfile update so
135
+ # the platform must be determined before the updated manifest files
136
+ # are written to disk
137
+ SharedHelpers.in_a_temporary_repo_directory(base_dir, repo_contents_path) do
138
+ possible_architectures.each do |arch|
139
+ # Exit early if we have detected all of the architectures present
140
+ break if architectures.count == hashes.count
141
+
142
+ # Terraform will update the lockfile in place so we use a fresh lockfile for each lookup
143
+ File.write(".terraform.lock.hcl", lockfile_hash_removed)
144
+
145
+ SharedHelpers.run_shell_command("terraform providers lock -platform=#{arch} #{provider_source} -no-color")
146
+
147
+ updated_lockfile = File.read(".terraform.lock.hcl")
148
+ updated_hashes = extract_provider_h1_hashes(updated_lockfile, declaration_regex)
149
+ next if updated_hashes.nil?
150
+
151
+ # Check if the architecture is present in the original lockfile
152
+ hashes.each do |hash|
153
+ updated_hashes.select { |h| h.match?(/^h1:/) }.each do |updated_hash|
154
+ architectures.append(arch.to_sym) if hash == updated_hash
155
+ end
156
+ end
157
+
158
+ File.delete(".terraform.lock.hcl")
159
+ end
160
+ rescue SharedHelpers::HelperSubprocessFailed => e
161
+ if @retrying_lock && e.message.match?(MODULE_NOT_INSTALLED_ERROR)
162
+ mod = e.message.match(MODULE_NOT_INSTALLED_ERROR).named_captures.fetch("mod")
163
+ raise Dependabot::DependencyFileNotResolvable, "Attempt to install module #{mod} failed"
164
+ end
165
+ raise if @retrying_lock || !e.message.include?("terraform init")
166
+
167
+ # NOTE: Modules need to be installed before terraform can update the lockfile
168
+ @retrying_lock = true
169
+ run_terraform_init
170
+ retry
171
+ end
172
+
173
+ architectures.to_a
174
+ end
175
+
176
+ def architecture_type
177
+ @architecture_type ||= lookup_hash_architecture.empty? ? [:linux_amd64] : lookup_hash_architecture
178
+ end
179
+
180
+ def update_lockfile_declaration(updated_manifest_files) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
98
181
  return if lock_file.nil?
99
182
 
100
183
  new_req = dependency.requirements.first
101
184
  # NOTE: Only providers are inlcuded in the lockfile, modules are not
102
185
  return unless new_req[:source][:type] == "provider"
103
186
 
104
- content = lock_file.content.dup
105
- provider_source = new_req[:source][:registry_hostname] + "/" + new_req[:source][:module_identifier]
106
- declaration_regex = lockfile_declaration_regex(provider_source)
187
+ content, provider_source, declaration_regex = lockfile_details(new_req)
107
188
  lockfile_dependency_removed = content.sub(declaration_regex, "")
108
189
 
109
190
  base_dir = dependency_files.first.directory
110
191
  SharedHelpers.in_a_temporary_repo_directory(base_dir, repo_contents_path) do
192
+ # Determine the provider using the original manifest files
193
+ platforms = architecture_type.map { |arch| "-platform=#{arch}" }.join(" ")
194
+
111
195
  # Update the provider requirements in case the previous requirement doesn't allow the new version
112
196
  updated_manifest_files.each { |f| File.write(f.name, f.content) }
113
197
 
114
198
  File.write(".terraform.lock.hcl", lockfile_dependency_removed)
115
- SharedHelpers.run_shell_command("terraform providers lock #{provider_source} -no-color")
199
+
200
+ SharedHelpers.run_shell_command("terraform providers lock #{platforms} #{provider_source}")
116
201
 
117
202
  updated_lockfile = File.read(".terraform.lock.hcl")
118
203
  updated_dependency = updated_lockfile.scan(declaration_regex).first
@@ -130,8 +215,7 @@ module Dependabot
130
215
  end
131
216
  raise if @retrying_lock || !e.message.include?("terraform init")
132
217
 
133
- # NOTE: Modules need to be installed before terraform can update the
134
- # lockfile
218
+ # NOTE: Modules need to be installed before terraform can update the lockfile
135
219
  @retrying_lock = true
136
220
  run_terraform_init
137
221
  retry
@@ -178,6 +262,14 @@ module Dependabot
178
262
  raise "No Terraform configuration file!"
179
263
  end
180
264
 
265
+ def hashes_object_regex
266
+ /hashes\s*=\s*.*\]/m
267
+ end
268
+
269
+ def hashes_string_regex
270
+ /(?<=\").*(?=\")/
271
+ end
272
+
181
273
  def provider_declaration_regex
182
274
  name = Regexp.escape(dependency.name)
183
275
  %r{
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.181.0
4
+ version: 0.182.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-19 00:00:00.000000000 Z
11
+ date: 2022-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.181.0
19
+ version: 0.182.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.181.0
26
+ version: 0.182.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: debase
29
29
  requirement: !ruby/object:Gem::Requirement