r10k 3.7.0 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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