r10k 3.7.0 → 3.8.0

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.
@@ -42,11 +42,6 @@ class Puppetfile
42
42
  # @return [Boolean] Overwrite any locally made changes
43
43
  attr_accessor :force
44
44
 
45
- # @!attribute [r] modules_by_vcs_cachedir
46
- # @api private Only exposed for testing purposes
47
- # @return [Hash{:none, String => Array<R10K::Module>}]
48
- attr_reader :modules_by_vcs_cachedir
49
-
50
45
  # @param [String] basedir
51
46
  # @param [String] moduledir The directory to install the modules, default to #{basedir}/modules
52
47
  # @param [String] puppetfile_path The path to the Puppetfile, default to #{basedir}/Puppetfile
@@ -63,7 +58,6 @@ class Puppetfile
63
58
 
64
59
  @modules = []
65
60
  @managed_content = {}
66
- @modules_by_vcs_cachedir = {}
67
61
  @forge = 'forgeapi.puppetlabs.com'
68
62
 
69
63
  @loaded = false
@@ -83,7 +77,7 @@ class Puppetfile
83
77
 
84
78
  dsl = R10K::Puppetfile::DSL.new(self)
85
79
  dsl.instance_eval(puppetfile_contents, @puppetfile_path)
86
-
80
+
87
81
  validate_no_duplicate_names(@modules)
88
82
  @loaded = true
89
83
  rescue SyntaxError, LoadError, ArgumentError, NameError => e
@@ -133,19 +127,23 @@ class Puppetfile
133
127
  end
134
128
 
135
129
  if args.is_a?(Hash) && @default_branch_override != nil
136
- args[:default_branch] = @default_branch_override
130
+ args[:default_branch_override] = @default_branch_override
137
131
  end
138
132
 
139
- # Keep track of all the content this Puppetfile is managing to enable purging.
140
- @managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
141
-
142
133
  mod = R10K::Module.new(name, install_path, args, @environment)
143
- mod.origin = 'Puppetfile'
134
+ mod.origin = :puppetfile
144
135
 
136
+ # Do not load modules if they would conflict with the attached
137
+ # environment
138
+ if environment && environment.module_conflicts?(mod)
139
+ mod = nil
140
+ return @modules
141
+ end
142
+
143
+ # Keep track of all the content this Puppetfile is managing to enable purging.
144
+ @managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
145
145
  @managed_content[install_path] << mod.name
146
- cachedir = mod.cachedir
147
- @modules_by_vcs_cachedir[cachedir] ||= []
148
- @modules_by_vcs_cachedir[cachedir] << mod
146
+
149
147
  @modules << mod
150
148
  end
151
149
 
@@ -223,7 +221,7 @@ class Puppetfile
223
221
  def modules_queue(visitor)
224
222
  Queue.new.tap do |queue|
225
223
  visitor.visit(:puppetfile, self) do
226
- modules_by_cachedir = modules_by_vcs_cachedir.clone
224
+ modules_by_cachedir = modules.group_by { |mod| mod.cachedir }
227
225
  modules_without_vcs_cachedir = modules_by_cachedir.delete(:none) || []
228
226
 
229
227
  modules_without_vcs_cachedir.each {|mod| queue << Array(mod) }
data/lib/r10k/settings.rb CHANGED
@@ -37,6 +37,11 @@ module R10K
37
37
  Only used by the 'rugged' Git provider.",
38
38
  }),
39
39
 
40
+ Definition.new(:oauth_token, {
41
+ :desc => "The path to a token file for Git OAuth remotes.
42
+ Only used by the 'rugged' Git provider."
43
+ }),
44
+
40
45
  URIDefinition.new(:proxy, {
41
46
  :desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
42
47
  :default => :inherit,
@@ -54,11 +59,17 @@ module R10K
54
59
  :default => :inherit,
55
60
  }),
56
61
 
62
+ Definition.new(:oauth_token, {
63
+ :desc => "The path to a token file for Git OAuth remotes.
64
+ Only used by the 'rugged' Git provider.",
65
+ :default => :inherit
66
+ }),
67
+
57
68
  URIDefinition.new(:proxy, {
58
69
  :desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
59
70
  :default => :inherit,
60
71
  }),
61
-
72
+
62
73
  Definition.new(:ignore_branch_prefixes, {
63
74
  :desc => "Array of strings used to prefix branch names that will not be deployed as environments.",
64
75
  }),
data/lib/r10k/version.rb CHANGED
@@ -2,5 +2,5 @@ module R10K
2
2
  # When updating to a new major (X) or minor (Y) version, include `#major` or
3
3
  # `#minor` (respectively) in your commit message to trigger the appropriate
4
4
  # release. Otherwise, a new patch (Z) version will be released.
5
- VERSION = '3.7.0'
5
+ VERSION = '3.8.0'
6
6
  end
data/locales/r10k.pot CHANGED
@@ -1,16 +1,16 @@
1
1
  # SOME DESCRIPTIVE TITLE.
2
- # Copyright (C) 2020 Puppet, Inc.
2
+ # Copyright (C) 2021 Puppet, Inc.
3
3
  # This file is distributed under the same license as the r10k package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
5
5
  #
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: r10k 3.4.1-57-g2eb088a\n"
9
+ "Project-Id-Version: r10k 3.4.1-133-g2007a86\n"
10
10
  "\n"
11
11
  "Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
12
- "POT-Creation-Date: 2020-07-22 16:41+0000\n"
13
- "PO-Revision-Date: 2020-07-22 16:41+0000\n"
12
+ "POT-Creation-Date: 2021-02-12 02:00+0000\n"
13
+ "PO-Revision-Date: 2021-02-12 02:00+0000\n"
14
14
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
15
15
  "Language-Team: LANGUAGE <LL@li.org>\n"
16
16
  "Language: \n"
@@ -83,15 +83,15 @@ msgstr ""
83
83
  msgid "Cannot track control repo branch for content '%{name}' when not part of a 'deploy' action, will use default if available."
84
84
  msgstr ""
85
85
 
86
- #: ../lib/r10k/action/runner.rb:53 ../lib/r10k/deployment/config.rb:42
86
+ #: ../lib/r10k/action/runner.rb:54 ../lib/r10k/deployment/config.rb:42
87
87
  msgid "Overriding config file setting '%{key}': '%{old_val}' -> '%{new_val}'"
88
88
  msgstr ""
89
89
 
90
- #: ../lib/r10k/action/runner.rb:86
90
+ #: ../lib/r10k/action/runner.rb:91
91
91
  msgid "Reading configuration from %{config_path}"
92
92
  msgstr ""
93
93
 
94
- #: ../lib/r10k/action/runner.rb:89
94
+ #: ../lib/r10k/action/runner.rb:94
95
95
  msgid "No config file explicitly given and no default config file could be found, default settings will be used."
96
96
  msgstr ""
97
97
 
@@ -107,12 +107,16 @@ msgstr ""
107
107
  msgid "%{class} has not implemented method %{method}"
108
108
  msgstr ""
109
109
 
110
- #: ../lib/r10k/environment/with_modules.rb:104
111
- msgid "Puppetfile cannot contain module names defined by environment %{name}"
110
+ #: ../lib/r10k/environment/with_modules.rb:60
111
+ msgid "Environment and %{src} both define the \"%{name}\" module"
112
112
  msgstr ""
113
113
 
114
- #: ../lib/r10k/environment/with_modules.rb:106
115
- msgid "Remove the conflicting definitions of the following modules: %{conflicts}"
114
+ #: ../lib/r10k/environment/with_modules.rb:61
115
+ msgid "#{msg_error}. The %{src} definition will be ignored"
116
+ msgstr ""
117
+
118
+ #: ../lib/r10k/environment/with_modules.rb:71
119
+ msgid "Unexpected value for `module_conflicts` setting in %{env} environment: %{val}"
116
120
  msgstr ""
117
121
 
118
122
  #: ../lib/r10k/feature.rb:27
@@ -187,11 +191,11 @@ msgstr ""
187
191
  msgid "Cannot write %{file}; parent directory does not exist"
188
192
  msgstr ""
189
193
 
190
- #: ../lib/r10k/git/cache.rb:55
194
+ #: ../lib/r10k/git/cache.rb:65
191
195
  msgid "%{class}#path is deprecated; use #git_dir"
192
196
  msgstr ""
193
197
 
194
- #: ../lib/r10k/git/cache.rb:84
198
+ #: ../lib/r10k/git/cache.rb:94
195
199
  msgid "Creating new git cache for %{remote}"
196
200
  msgstr ""
197
201
 
@@ -227,15 +231,31 @@ msgstr ""
227
231
  msgid "Unable to use SSH key auth for %{url}: private key %{private_key} is missing or unreadable"
228
232
  msgstr ""
229
233
 
230
- #: ../lib/r10k/git/rugged/credentials.rb:80
234
+ #: ../lib/r10k/git/rugged/credentials.rb:72
235
+ msgid "Using OAuth token from stdin for URL %{url}"
236
+ msgstr ""
237
+
238
+ #: ../lib/r10k/git/rugged/credentials.rb:75
239
+ msgid "Using OAuth token from %{token_path} for URL %{url}"
240
+ msgstr ""
241
+
242
+ #: ../lib/r10k/git/rugged/credentials.rb:77
243
+ msgid "%{path} is missing or unreadable, cannot load OAuth token"
244
+ msgstr ""
245
+
246
+ #: ../lib/r10k/git/rugged/credentials.rb:81
247
+ msgid "Supplied OAuth token contains invalid characters."
248
+ msgstr ""
249
+
250
+ #: ../lib/r10k/git/rugged/credentials.rb:110
231
251
  msgid "URL %{url} includes the username %{username}, using that user for authentication."
232
252
  msgstr ""
233
253
 
234
- #: ../lib/r10k/git/rugged/credentials.rb:83
254
+ #: ../lib/r10k/git/rugged/credentials.rb:113
235
255
  msgid "URL %{url} did not specify a user, using %{user} from configuration"
236
256
  msgstr ""
237
257
 
238
- #: ../lib/r10k/git/rugged/credentials.rb:86
258
+ #: ../lib/r10k/git/rugged/credentials.rb:116
239
259
  msgid "URL %{url} did not specify a user, using current user %{user}"
240
260
  msgstr ""
241
261
 
@@ -255,31 +275,31 @@ msgstr ""
255
275
  msgid "Found local modifications in %{file_path}"
256
276
  msgstr ""
257
277
 
258
- #: ../lib/r10k/git/stateful_repository.rb:40
278
+ #: ../lib/r10k/git/stateful_repository.rb:44
259
279
  msgid "Unable to sync repo to unresolvable ref '%{ref}'"
260
280
  msgstr ""
261
281
 
262
- #: ../lib/r10k/git/stateful_repository.rb:47
282
+ #: ../lib/r10k/git/stateful_repository.rb:51
263
283
  msgid "Cloning %{repo_path} and checking out %{ref}"
264
284
  msgstr ""
265
285
 
266
- #: ../lib/r10k/git/stateful_repository.rb:50
286
+ #: ../lib/r10k/git/stateful_repository.rb:54
267
287
  msgid "Replacing %{repo_path} and checking out %{ref}"
268
288
  msgstr ""
269
289
 
270
- #: ../lib/r10k/git/stateful_repository.rb:54 ../lib/r10k/git/stateful_repository.rb:59
290
+ #: ../lib/r10k/git/stateful_repository.rb:58 ../lib/r10k/git/stateful_repository.rb:63
271
291
  msgid "Updating %{repo_path} to %{ref}"
272
292
  msgstr ""
273
293
 
274
- #: ../lib/r10k/git/stateful_repository.rb:58
294
+ #: ../lib/r10k/git/stateful_repository.rb:62
275
295
  msgid "Overwriting local modifications to %{repo_path}"
276
296
  msgstr ""
277
297
 
278
- #: ../lib/r10k/git/stateful_repository.rb:62
298
+ #: ../lib/r10k/git/stateful_repository.rb:66
279
299
  msgid "Skipping %{repo_path} due to local modifications"
280
300
  msgstr ""
281
301
 
282
- #: ../lib/r10k/git/stateful_repository.rb:65
302
+ #: ../lib/r10k/git/stateful_repository.rb:69
283
303
  msgid "%{repo_path} is already at Git ref %{ref}"
284
304
  msgstr ""
285
305
 
@@ -303,7 +323,7 @@ msgstr ""
303
323
  msgid "Module %{name} with args %{args} doesn't have an implementation. (Are you using the right arguments?)"
304
324
  msgstr ""
305
325
 
306
- #: ../lib/r10k/module/base.rb:110
326
+ #: ../lib/r10k/module/base.rb:118
307
327
  msgid "Module name (%{title}) must match either 'modulename' or 'owner/modulename'"
308
328
  msgstr ""
309
329
 
@@ -312,10 +332,10 @@ msgid "The module %{title} does not exist on %{url}."
312
332
  msgstr ""
313
333
 
314
334
  #: ../lib/r10k/module/forge.rb:174
315
- msgid "Forge module names must match 'owner/modulename'"
335
+ msgid "Forge module names must match 'owner/modulename', instead got #{title}"
316
336
  msgstr ""
317
337
 
318
- #: ../lib/r10k/module/git.rb:97
338
+ #: ../lib/r10k/module/git.rb:113
319
339
  msgid "Unhandled options %{unhandled} specified for %{class}"
320
340
  msgstr ""
321
341
 
@@ -347,19 +367,19 @@ msgstr ""
347
367
  msgid "Remove the duplicates of the following modules: %{dupes}"
348
368
  msgstr ""
349
369
 
350
- #: ../lib/r10k/puppetfile.rb:192
370
+ #: ../lib/r10k/puppetfile.rb:201
351
371
  msgid "Updating modules with %{pool_size} threads"
352
372
  msgstr ""
353
373
 
354
- #: ../lib/r10k/puppetfile.rb:203
374
+ #: ../lib/r10k/puppetfile.rb:212
355
375
  msgid "Error during concurrent deploy of a module: %{message}"
356
376
  msgstr ""
357
377
 
358
- #: ../lib/r10k/puppetfile.rb:225
378
+ #: ../lib/r10k/puppetfile.rb:241
359
379
  msgid "Module thread %{id} exiting: %{message}"
360
380
  msgstr ""
361
381
 
362
- #: ../lib/r10k/puppetfile.rb:282
382
+ #: ../lib/r10k/puppetfile.rb:300
363
383
  msgid "unrecognized declaration '%{method}'"
364
384
  msgstr ""
365
385
 
@@ -0,0 +1,9 @@
1
+ ---
2
+ git:
3
+ private_key: '/global/config/private/key'
4
+ oauth_token: '/global/config/oauth/token'
5
+ repositories:
6
+ - remote: 'git@myfakegitserver.com:user/repo.git'
7
+ private_key: '/config/private/key'
8
+ - remote: 'https://myfakegitserver.com/user/repo.git'
9
+ oauth_token: '/config/oauth/token'
@@ -27,8 +27,6 @@ describe R10K::Action::Deploy::Environment do
27
27
  described_class.new({:'no-force' => true}, [])
28
28
  end
29
29
 
30
- it "normalizes environment names in the arg vector"
31
-
32
30
  it 'can accept a generate-types option' do
33
31
  described_class.new({ 'generate-types': true }, [])
34
32
  end
@@ -36,6 +34,14 @@ describe R10K::Action::Deploy::Environment do
36
34
  it 'can accept a puppet-path option' do
37
35
  described_class.new({ 'puppet-path': '/nonexistent' }, [])
38
36
  end
37
+
38
+ it 'can accept a private-key option' do
39
+ described_class.new({ 'private-key': '/nonexistent' }, [])
40
+ end
41
+
42
+ it 'can accept a token option' do
43
+ described_class.new({ 'oauth-token': '/nonexistent' }, [])
44
+ end
39
45
  end
40
46
 
41
47
  describe "when called" do
@@ -162,6 +168,13 @@ describe R10K::Action::Deploy::Environment do
162
168
  end
163
169
  end
164
170
 
171
+ describe 'extracting credentials' do
172
+ let(:deployment) do
173
+ R10K::Deployment.new(mock_config)
174
+ end
175
+
176
+ end
177
+
165
178
  describe "purge_levels" do
166
179
  let(:settings) { { deploy: { purge_levels: purge_levels } } }
167
180
 
@@ -219,6 +232,7 @@ describe R10K::Action::Deploy::Environment do
219
232
  end
220
233
  end
221
234
  end
235
+
222
236
  describe "generate-types" do
223
237
  let(:deployment) do
224
238
  R10K::Deployment.new(
@@ -340,6 +354,24 @@ describe R10K::Action::Deploy::Environment do
340
354
  expect(subject.instance_variable_get(:@puppet_conf)).to eq('/nonexistent')
341
355
  end
342
356
  end
357
+
358
+ describe 'with private-key' do
359
+
360
+ subject { described_class.new({ config: '/some/nonexistent/path', 'private-key': '/nonexistent' }, []) }
361
+
362
+ it 'sets private_key' do
363
+ expect(subject.instance_variable_get(:@private_key)).to eq('/nonexistent')
364
+ end
365
+ end
366
+
367
+ describe 'with oauth-token' do
368
+
369
+ subject { described_class.new({ config: '/some/nonexistent/path', 'oauth-token': '/nonexistent' }, []) }
370
+
371
+ it 'sets oauth_token' do
372
+ expect(subject.instance_variable_get(:@oauth_token)).to eq('/nonexistent')
373
+ end
374
+ end
343
375
  end
344
376
 
345
377
  describe "write_environment_info!" do
@@ -33,6 +33,14 @@ describe R10K::Action::Deploy::Module do
33
33
  it 'can accept a cachedir option' do
34
34
  described_class.new({ cachedir: '/nonexistent' }, [])
35
35
  end
36
+
37
+ it 'can accept a private-key option' do
38
+ described_class.new({ 'private-key': '/nonexistent' }, [])
39
+ end
40
+
41
+ it 'can accept a token option' do
42
+ described_class.new({ 'oauth-token': '/nonexistent' }, [])
43
+ end
36
44
  end
37
45
 
38
46
  describe "with no-force" do
@@ -74,8 +82,8 @@ describe R10K::Action::Deploy::Module do
74
82
 
75
83
  before do
76
84
  allow(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
77
- expect(environment.puppetfile).to receive(:modules_by_vcs_cachedir).and_return(
78
- {none: [R10K::Module::Local.new(environment.name, '/fakedir', [], environment)]}
85
+ expect(environment.puppetfile).to receive(:modules).and_return(
86
+ [R10K::Module::Local.new(environment.name, '/fakedir', [], environment)]
79
87
  )
80
88
  original.call(environment, &block)
81
89
  end
@@ -145,8 +153,26 @@ describe R10K::Action::Deploy::Module do
145
153
 
146
154
  subject { described_class.new({ config: '/some/nonexistent/path', cachedir: '/nonexistent' }, []) }
147
155
 
148
- it 'sets puppet_path' do
156
+ it 'sets cachedir' do
149
157
  expect(subject.instance_variable_get(:@cachedir)).to eq('/nonexistent')
150
158
  end
151
159
  end
160
+
161
+ describe 'with private-key' do
162
+
163
+ subject { described_class.new({ config: '/some/nonexistent/path', 'private-key': '/nonexistent' }, []) }
164
+
165
+ it 'sets private_key' do
166
+ expect(subject.instance_variable_get(:@private_key)).to eq('/nonexistent')
167
+ end
168
+ end
169
+
170
+ describe 'with oauth-token' do
171
+
172
+ subject { described_class.new({ config: '/some/nonexistent/path', 'oauth-token': '/nonexistent' }, []) }
173
+
174
+ it 'sets token_path' do
175
+ expect(subject.instance_variable_get(:@oauth_token)).to eq('/nonexistent')
176
+ end
177
+ end
152
178
  end
@@ -10,11 +10,12 @@ describe R10K::Action::Runner do
10
10
  Class.new do
11
11
  attr_reader :opts
12
12
  attr_reader :argv
13
+ attr_reader :settings
13
14
 
14
15
  def initialize(opts, argv, settings = {})
15
16
  @opts = opts
16
17
  @argv = argv
17
- @settings = {}
18
+ @settings = settings
18
19
  end
19
20
 
20
21
  def call
@@ -170,6 +171,52 @@ describe R10K::Action::Runner do
170
171
  end
171
172
  end
172
173
 
174
+ describe "configuring git credentials" do
175
+ it 'errors if both token and key paths are passed' do
176
+ runner = described_class.new({ 'oauth-token': '/nonexistent',
177
+ 'private-key': '/also/fake' }, %w[args yes], action_class)
178
+ expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
179
+ end
180
+
181
+ it 'saves the sshkey path in settings hash' do
182
+ runner = described_class.new({ 'private-key': '/my/ssh/key' }, %w[args yes], action_class)
183
+ runner.call
184
+ expect(runner.instance.settings[:git][:private_key]).to eq('/my/ssh/key')
185
+ end
186
+
187
+ it 'overrides per-repo sshkey in settings hash' do
188
+ runner = described_class.new({ config: "spec/fixtures/unit/action/r10k_creds.yaml",
189
+ 'private-key': '/my/ssh/key' },
190
+ %w[args yes],
191
+ action_class)
192
+ runner.call
193
+ expect(runner.instance.settings[:git][:private_key]).to eq('/my/ssh/key')
194
+ expect(runner.instance.settings[:git][:repositories].count).to eq(2)
195
+ runner.instance.settings[:git][:repositories].each do |repo_settings|
196
+ expect(repo_settings[:private_key]).to eq('/my/ssh/key')
197
+ end
198
+ end
199
+
200
+ it 'saves the token path in settings hash' do
201
+ runner = described_class.new({ 'oauth-token': '/my/token/path' }, %w[args yes], action_class)
202
+ runner.call
203
+ expect(runner.instance.settings[:git][:oauth_token]).to eq('/my/token/path')
204
+ end
205
+
206
+ it 'overrides per-repo oauth token in settings hash' do
207
+ runner = described_class.new({ config: "spec/fixtures/unit/action/r10k_creds.yaml",
208
+ 'oauth-token': '/my/token' },
209
+ %w[args yes],
210
+ action_class)
211
+ runner.call
212
+ expect(runner.instance.settings[:git][:oauth_token]).to eq('/my/token')
213
+ expect(runner.instance.settings[:git][:repositories].count).to eq(2)
214
+ runner.instance.settings[:git][:repositories].each do |repo_settings|
215
+ expect(repo_settings[:oauth_token]).to eq('/my/token')
216
+ end
217
+ end
218
+ end
219
+
173
220
  describe "configuration authorization" do
174
221
  context "when license is not present" do
175
222
  before(:each) do