r10k 3.5.0 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/pull_request_template.md +4 -1
- data/.github/workflows/docker.yml +25 -1
- data/.github/workflows/rspec_tests.yml +81 -0
- data/.travis.yml +14 -11
- data/CHANGELOG.mkd +42 -6
- data/CODEOWNERS +1 -1
- data/Gemfile +1 -1
- data/README.mkd +13 -4
- data/azure-pipelines.yml +2 -1
- data/doc/dynamic-environments/configuration.mkd +60 -3
- data/doc/dynamic-environments/usage.mkd +5 -4
- data/doc/faq.mkd +6 -1
- data/doc/puppetfile.mkd +2 -0
- data/docker/Makefile +16 -2
- data/docker/r10k/Dockerfile +17 -6
- data/docker/r10k/release.Dockerfile +23 -4
- data/integration/tests/git_source/git_source_repeated_remote.rb +68 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +1 -1
- data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +1 -1
- data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +1 -1
- data/lib/r10k/action/deploy/environment.rb +3 -0
- data/lib/r10k/action/deploy/module.rb +4 -1
- data/lib/r10k/action/runner.rb +34 -0
- data/lib/r10k/cli/deploy.rb +9 -4
- data/lib/r10k/cli/puppetfile.rb +5 -5
- data/lib/r10k/environment/base.rb +8 -1
- data/lib/r10k/environment/with_modules.rb +27 -19
- data/lib/r10k/forge/module_release.rb +2 -2
- data/lib/r10k/git.rb +1 -0
- data/lib/r10k/git/cache.rb +12 -4
- data/lib/r10k/git/rugged/credentials.rb +32 -2
- data/lib/r10k/git/stateful_repository.rb +4 -0
- data/lib/r10k/initializers.rb +2 -0
- data/lib/r10k/module/base.rb +8 -0
- data/lib/r10k/module/forge.rb +1 -1
- data/lib/r10k/module/git.rb +20 -3
- data/lib/r10k/puppetfile.rb +30 -12
- data/lib/r10k/settings.rb +24 -2
- data/lib/r10k/source/git.rb +22 -2
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +60 -36
- data/spec/fixtures/unit/action/r10k_creds.yaml +9 -0
- data/spec/shared-examples/subprocess-runner.rb +11 -5
- data/spec/unit/action/deploy/environment_spec.rb +43 -2
- data/spec/unit/action/deploy/module_spec.rb +40 -1
- data/spec/unit/action/puppetfile/install_spec.rb +1 -0
- data/spec/unit/action/runner_spec.rb +48 -1
- data/spec/unit/environment/git_spec.rb +3 -2
- data/spec/unit/environment/with_modules_spec.rb +74 -0
- data/spec/unit/forge/module_release_spec.rb +14 -10
- data/spec/unit/git/cache_spec.rb +10 -0
- data/spec/unit/git/rugged/credentials_spec.rb +69 -2
- data/spec/unit/git_spec.rb +3 -3
- data/spec/unit/module/git_spec.rb +55 -0
- data/spec/unit/puppetfile_spec.rb +61 -7
- data/spec/unit/settings_spec.rb +12 -0
- data/spec/unit/source/git_spec.rb +49 -1
- metadata +6 -2
@@ -103,6 +103,13 @@ class R10K::Environment::Base
|
|
103
103
|
@puppetfile.modules
|
104
104
|
end
|
105
105
|
|
106
|
+
# @return [Array<R10K::Module::Base>] Whether or not the given module
|
107
|
+
# conflicts with any modules already defined in the r10k environment
|
108
|
+
# object.
|
109
|
+
def module_conflicts?(mod)
|
110
|
+
false
|
111
|
+
end
|
112
|
+
|
106
113
|
def accept(visitor)
|
107
114
|
visitor.visit(:environment, self) do
|
108
115
|
puppetfile.accept(visitor)
|
@@ -137,7 +144,7 @@ class R10K::Environment::Base
|
|
137
144
|
end
|
138
145
|
|
139
146
|
def generate_types!
|
140
|
-
argv = [R10K::Settings.puppet_path, 'generate', 'types', '--environment', dirname, '--environmentpath', basedir]
|
147
|
+
argv = [R10K::Settings.puppet_path, 'generate', 'types', '--environment', dirname, '--environmentpath', basedir, '--config', R10K::Settings.puppet_conf]
|
141
148
|
subproc = R10K::Util::Subprocess.new(argv)
|
142
149
|
subproc.raise_on_fail = true
|
143
150
|
subproc.logger = logger
|
@@ -46,10 +46,33 @@ class R10K::Environment::WithModules < R10K::Environment::Base
|
|
46
46
|
# - The r10k environment object
|
47
47
|
# - A Puppetfile in the environment's content
|
48
48
|
def modules
|
49
|
-
return @modules if
|
49
|
+
return @modules if puppetfile.nil?
|
50
50
|
|
51
|
-
|
52
|
-
@modules +
|
51
|
+
puppetfile.load unless puppetfile.loaded?
|
52
|
+
@modules + puppetfile.modules
|
53
|
+
end
|
54
|
+
|
55
|
+
def module_conflicts?(mod_b)
|
56
|
+
conflict = @modules.any? { |mod_a| mod_a.name == mod_b.name }
|
57
|
+
return false unless conflict
|
58
|
+
|
59
|
+
msg_vars = {src: mod_b.origin, name: mod_b.name}
|
60
|
+
msg_error = _('Environment and %{src} both define the "%{name}" module' % msg_vars)
|
61
|
+
msg_continue = _("#{msg_error}. The %{src} definition will be ignored" % msg_vars)
|
62
|
+
|
63
|
+
case conflict_opt = @options[:module_conflicts]
|
64
|
+
when 'override_and_warn', nil
|
65
|
+
logger.warn msg_continue
|
66
|
+
when 'override'
|
67
|
+
logger.debug msg_continue
|
68
|
+
when 'error'
|
69
|
+
raise R10K::Error, msg_error
|
70
|
+
else
|
71
|
+
raise R10K::Error, _('Unexpected value for `module_conflicts` setting in %{env} ' \
|
72
|
+
'environment: %{val}' % {env: self.name, val: conflict_opt})
|
73
|
+
end
|
74
|
+
|
75
|
+
true
|
53
76
|
end
|
54
77
|
|
55
78
|
def accept(visitor)
|
@@ -59,7 +82,6 @@ class R10K::Environment::WithModules < R10K::Environment::Base
|
|
59
82
|
end
|
60
83
|
|
61
84
|
puppetfile.accept(visitor)
|
62
|
-
validate_no_module_conflicts
|
63
85
|
end
|
64
86
|
end
|
65
87
|
|
@@ -88,26 +110,12 @@ class R10K::Environment::WithModules < R10K::Environment::Base
|
|
88
110
|
@managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
|
89
111
|
|
90
112
|
mod = R10K::Module.new(name, install_path, args, self.name)
|
91
|
-
mod.origin =
|
113
|
+
mod.origin = :environment
|
92
114
|
|
93
115
|
@managed_content[install_path] << mod.name
|
94
116
|
@modules << mod
|
95
117
|
end
|
96
118
|
|
97
|
-
def validate_no_module_conflicts
|
98
|
-
@puppetfile.load unless @puppetfile.loaded?
|
99
|
-
conflicts = (@modules + @puppetfile.modules)
|
100
|
-
.group_by { |mod| mod.name }
|
101
|
-
.select { |_, v| v.size > 1 }
|
102
|
-
.map(&:first)
|
103
|
-
unless conflicts.empty?
|
104
|
-
msg = _('Puppetfile cannot contain module names defined by environment %{name}') % {name: self.name}
|
105
|
-
msg += ' '
|
106
|
-
msg += _("Remove the conflicting definitions of the following modules: %{conflicts}" % { conflicts: conflicts.join(' ') })
|
107
|
-
raise R10K::Error.new(msg)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
119
|
include R10K::Util::Purgeable
|
112
120
|
|
113
121
|
# Returns an array of the full paths that can be purged.
|
@@ -212,14 +212,14 @@ module R10K
|
|
212
212
|
|
213
213
|
# Remove the temporary directory used for unpacking the module.
|
214
214
|
def cleanup_unpack_path
|
215
|
-
if unpack_path.exist?
|
215
|
+
if unpack_path.parent.exist?
|
216
216
|
unpack_path.parent.rmtree
|
217
217
|
end
|
218
218
|
end
|
219
219
|
|
220
220
|
# Remove the downloaded module release.
|
221
221
|
def cleanup_download_path
|
222
|
-
if download_path.exist?
|
222
|
+
if download_path.parent.exist?
|
223
223
|
download_path.parent.rmtree
|
224
224
|
end
|
225
225
|
end
|
data/lib/r10k/git.rb
CHANGED
data/lib/r10k/git/cache.rb
CHANGED
@@ -16,7 +16,17 @@ class R10K::Git::Cache
|
|
16
16
|
|
17
17
|
include R10K::Settings::Mixin
|
18
18
|
|
19
|
-
|
19
|
+
#@api private
|
20
|
+
def self.determine_cache_root
|
21
|
+
if R10K::Util::Platform.windows?
|
22
|
+
File.join(ENV['LOCALAPPDATA'], 'r10k', 'git')
|
23
|
+
else
|
24
|
+
File.expand_path(ENV['HOME'] ? '~/.r10k/git': '/root/.r10k/git')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
private_class_method :determine_cache_root
|
28
|
+
|
29
|
+
def_setting_attr :cache_root, determine_cache_root
|
20
30
|
|
21
31
|
@instance_cache = R10K::InstanceCache.new(self)
|
22
32
|
|
@@ -99,10 +109,8 @@ class R10K::Git::Cache
|
|
99
109
|
|
100
110
|
alias cached? exist?
|
101
111
|
|
102
|
-
private
|
103
|
-
|
104
112
|
# Reformat the remote name into something that can be used as a directory
|
105
113
|
def sanitized_dirname
|
106
|
-
@remote.gsub(/[^@\w\.-]/, '-')
|
114
|
+
@sanitized_dirname ||= @remote.gsub(/[^@\w\.-]/, '-')
|
107
115
|
end
|
108
116
|
end
|
@@ -61,11 +61,41 @@ class R10K::Git::Rugged::Credentials
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def get_plaintext_credentials(url, username_from_url)
|
64
|
-
|
65
|
-
|
64
|
+
per_repo_oauth_token = nil
|
65
|
+
if per_repo_settings = R10K::Git.get_repo_settings(url)
|
66
|
+
per_repo_oauth_token = per_repo_settings[:oauth_token]
|
67
|
+
end
|
68
|
+
|
69
|
+
if token_path = per_repo_oauth_token || R10K::Git.settings[:oauth_token]
|
70
|
+
if token_path == '-'
|
71
|
+
token = $stdin.read.strip
|
72
|
+
logger.debug2 _("Using OAuth token from stdin for URL %{url}") % { url: url }
|
73
|
+
elsif File.readable?(token_path)
|
74
|
+
token = File.read(token_path).strip
|
75
|
+
logger.debug2 _("Using OAuth token from %{token_path} for URL %{url}") % { token_path: token_path, url: url }
|
76
|
+
else
|
77
|
+
raise R10K::Git::GitError, _("%{path} is missing or unreadable, cannot load OAuth token") % { path: token_path }
|
78
|
+
end
|
79
|
+
|
80
|
+
unless valid_token?(token)
|
81
|
+
raise R10K::Git::GitError, _("Supplied OAuth token contains invalid characters.")
|
82
|
+
end
|
83
|
+
|
84
|
+
user = 'x-oauth-token'
|
85
|
+
password = token
|
86
|
+
else
|
87
|
+
user = get_git_username(url, username_from_url)
|
88
|
+
password = URI.parse(url).password || ''
|
89
|
+
end
|
66
90
|
Rugged::Credentials::UserPassword.new(username: user, password: password)
|
67
91
|
end
|
68
92
|
|
93
|
+
# This regex is the only real requirement for OAuth token format,
|
94
|
+
# per https://www.oauth.com/oauth2-servers/access-tokens/access-token-response/
|
95
|
+
def valid_token?(token)
|
96
|
+
return token =~ /^[\w\-\.~\+\/]+$/
|
97
|
+
end
|
98
|
+
|
69
99
|
def get_default_credentials(url, username_from_url)
|
70
100
|
Rugged::Credentials::Default.new
|
71
101
|
end
|
data/lib/r10k/initializers.rb
CHANGED
@@ -44,6 +44,7 @@ module R10K
|
|
44
44
|
class DeployInitializer < BaseInitializer
|
45
45
|
def call
|
46
46
|
with_setting(:puppet_path) { |value| R10K::Settings.puppet_path = value }
|
47
|
+
with_setting(:puppet_conf) { |value| R10K::Settings.puppet_conf = value }
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
@@ -54,6 +55,7 @@ module R10K
|
|
54
55
|
with_setting(:private_key) { |value| R10K::Git.settings[:private_key] = value }
|
55
56
|
with_setting(:proxy) { |value| R10K::Git.settings[:proxy] = value }
|
56
57
|
with_setting(:repositories) { |value| R10K::Git.settings[:repositories] = value }
|
58
|
+
with_setting(:oauth_token) { |value| R10K::Git.settings[:oauth_token] = value }
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
data/lib/r10k/module/base.rb
CHANGED
@@ -99,6 +99,14 @@ class R10K::Module::Base
|
|
99
99
|
raise NotImplementedError
|
100
100
|
end
|
101
101
|
|
102
|
+
# Return the module's cachedir. Subclasses that implement a cache
|
103
|
+
# will override this to return a real directory location.
|
104
|
+
#
|
105
|
+
# @return [String, :none]
|
106
|
+
def cachedir
|
107
|
+
:none
|
108
|
+
end
|
109
|
+
|
102
110
|
private
|
103
111
|
|
104
112
|
def parse_title(title)
|
data/lib/r10k/module/forge.rb
CHANGED
@@ -171,7 +171,7 @@ class R10K::Module::Forge < R10K::Module::Base
|
|
171
171
|
if (match = title.match(/\A(\w+)[-\/](\w+)\Z/))
|
172
172
|
[match[1], match[2]]
|
173
173
|
else
|
174
|
-
raise ArgumentError, _("Forge module names must match 'owner/modulename'")
|
174
|
+
raise ArgumentError, _("Forge module names must match 'owner/modulename', instead got #{title}")
|
175
175
|
end
|
176
176
|
end
|
177
177
|
end
|
data/lib/r10k/module/git.rb
CHANGED
@@ -28,6 +28,11 @@ class R10K::Module::Git < R10K::Module::Base
|
|
28
28
|
# @return [String]
|
29
29
|
attr_reader :default_ref
|
30
30
|
|
31
|
+
# @!attribute [r] default_override_ref
|
32
|
+
# @api private
|
33
|
+
# @return [String]
|
34
|
+
attr_reader :default_override_ref
|
35
|
+
|
31
36
|
def initialize(title, dirname, args, environment=nil)
|
32
37
|
super
|
33
38
|
|
@@ -37,7 +42,7 @@ class R10K::Module::Git < R10K::Module::Base
|
|
37
42
|
end
|
38
43
|
|
39
44
|
def version
|
40
|
-
validate_ref(@desired_ref, @default_ref)
|
45
|
+
validate_ref(@desired_ref, @default_ref, @default_override_ref)
|
41
46
|
end
|
42
47
|
|
43
48
|
def properties
|
@@ -57,11 +62,17 @@ class R10K::Module::Git < R10K::Module::Base
|
|
57
62
|
@repo.status(version)
|
58
63
|
end
|
59
64
|
|
65
|
+
def cachedir
|
66
|
+
@repo.cache.sanitized_dirname
|
67
|
+
end
|
68
|
+
|
60
69
|
private
|
61
70
|
|
62
|
-
def validate_ref(desired, default)
|
71
|
+
def validate_ref(desired, default, default_override)
|
63
72
|
if desired && desired != :control_branch && @repo.resolve(desired)
|
64
73
|
return desired
|
74
|
+
elsif default_override && @repo.resolve(default_override)
|
75
|
+
return default_override
|
65
76
|
elsif default && @repo.resolve(default)
|
66
77
|
return default
|
67
78
|
else
|
@@ -77,6 +88,11 @@ class R10K::Module::Git < R10K::Module::Base
|
|
77
88
|
msg << "Could not determine desired ref"
|
78
89
|
end
|
79
90
|
|
91
|
+
if default_override
|
92
|
+
msg << "or resolve the default branch override '%{default_override}',"
|
93
|
+
vars[:default_override] = default_override
|
94
|
+
end
|
95
|
+
|
80
96
|
if default
|
81
97
|
msg << "or resolve default ref '%{default}'"
|
82
98
|
vars[:default] = default
|
@@ -90,7 +106,7 @@ class R10K::Module::Git < R10K::Module::Base
|
|
90
106
|
|
91
107
|
def parse_options(options)
|
92
108
|
ref_opts = [:branch, :tag, :commit, :ref]
|
93
|
-
known_opts = [:git, :default_branch] + ref_opts
|
109
|
+
known_opts = [:git, :default_branch, :default_branch_override] + ref_opts
|
94
110
|
|
95
111
|
unhandled = options.keys - known_opts
|
96
112
|
unless unhandled.empty?
|
@@ -101,6 +117,7 @@ class R10K::Module::Git < R10K::Module::Base
|
|
101
117
|
|
102
118
|
@desired_ref = ref_opts.find { |key| break options[key] if options.has_key?(key) } || 'master'
|
103
119
|
@default_ref = options[:default_branch]
|
120
|
+
@default_override_ref = options[:default_branch_override]
|
104
121
|
|
105
122
|
if @desired_ref == :control_branch && @environment && @environment.respond_to?(:ref)
|
106
123
|
@desired_ref = @environment.ref
|
data/lib/r10k/puppetfile.rb
CHANGED
@@ -10,7 +10,7 @@ class Puppetfile
|
|
10
10
|
|
11
11
|
include R10K::Settings::Mixin
|
12
12
|
|
13
|
-
def_setting_attr :pool_size,
|
13
|
+
def_setting_attr :pool_size, 4
|
14
14
|
|
15
15
|
include R10K::Logging
|
16
16
|
|
@@ -77,7 +77,7 @@ class Puppetfile
|
|
77
77
|
|
78
78
|
dsl = R10K::Puppetfile::DSL.new(self)
|
79
79
|
dsl.instance_eval(puppetfile_contents, @puppetfile_path)
|
80
|
-
|
80
|
+
|
81
81
|
validate_no_duplicate_names(@modules)
|
82
82
|
@loaded = true
|
83
83
|
rescue SyntaxError, LoadError, ArgumentError, NameError => e
|
@@ -127,16 +127,23 @@ class Puppetfile
|
|
127
127
|
end
|
128
128
|
|
129
129
|
if args.is_a?(Hash) && @default_branch_override != nil
|
130
|
-
args[:
|
130
|
+
args[:default_branch_override] = @default_branch_override
|
131
131
|
end
|
132
132
|
|
133
|
-
# Keep track of all the content this Puppetfile is managing to enable purging.
|
134
|
-
@managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
|
135
|
-
|
136
133
|
mod = R10K::Module.new(name, install_path, args, @environment)
|
137
|
-
mod.origin =
|
134
|
+
mod.origin = :puppetfile
|
138
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)
|
139
145
|
@managed_content[install_path] << mod.name
|
146
|
+
|
140
147
|
@modules << mod
|
141
148
|
end
|
142
149
|
|
@@ -145,7 +152,9 @@ class Puppetfile
|
|
145
152
|
def managed_directories
|
146
153
|
self.load unless @loaded
|
147
154
|
|
148
|
-
@managed_content.keys
|
155
|
+
dirs = @managed_content.keys
|
156
|
+
dirs.delete(real_basedir)
|
157
|
+
dirs
|
149
158
|
end
|
150
159
|
|
151
160
|
# Returns an array of the full paths to all the content being managed.
|
@@ -212,15 +221,22 @@ class Puppetfile
|
|
212
221
|
def modules_queue(visitor)
|
213
222
|
Queue.new.tap do |queue|
|
214
223
|
visitor.visit(:puppetfile, self) do
|
215
|
-
modules.
|
224
|
+
modules_by_cachedir = modules.group_by { |mod| mod.cachedir }
|
225
|
+
modules_without_vcs_cachedir = modules_by_cachedir.delete(:none) || []
|
226
|
+
|
227
|
+
modules_without_vcs_cachedir.each {|mod| queue << Array(mod) }
|
228
|
+
modules_by_cachedir.values.each {|mods| queue << mods }
|
216
229
|
end
|
217
230
|
end
|
218
231
|
end
|
232
|
+
public :modules_queue
|
219
233
|
|
220
234
|
def visitor_thread(visitor, mods_queue)
|
221
235
|
Thread.new do
|
222
236
|
begin
|
223
|
-
while
|
237
|
+
while mods = mods_queue.pop(true) do
|
238
|
+
mods.each {|mod| mod.accept(visitor) }
|
239
|
+
end
|
224
240
|
rescue ThreadError => e
|
225
241
|
logger.debug _("Module thread %{id} exiting: %{message}") % {message: e.message, id: Thread.current.object_id}
|
226
242
|
Thread.exit
|
@@ -248,8 +264,6 @@ class Puppetfile
|
|
248
264
|
end
|
249
265
|
|
250
266
|
def validate_install_path(path, modname)
|
251
|
-
real_basedir = Pathname.new(basedir).cleanpath.to_s
|
252
|
-
|
253
267
|
unless /^#{Regexp.escape(real_basedir)}.*/ =~ path
|
254
268
|
raise R10K::Error.new("Puppetfile cannot manage content '#{modname}' outside of containing environment: #{path} is not within #{real_basedir}")
|
255
269
|
end
|
@@ -257,6 +271,10 @@ class Puppetfile
|
|
257
271
|
true
|
258
272
|
end
|
259
273
|
|
274
|
+
def real_basedir
|
275
|
+
Pathname.new(basedir).cleanpath.to_s
|
276
|
+
end
|
277
|
+
|
260
278
|
class DSL
|
261
279
|
# A barebones implementation of the Puppetfile DSL
|
262
280
|
#
|
data/lib/r10k/settings.rb
CHANGED
@@ -12,6 +12,8 @@ module R10K
|
|
12
12
|
class << self
|
13
13
|
# Path to puppet executable
|
14
14
|
attr_accessor :puppet_path
|
15
|
+
# Path to puppet.conf
|
16
|
+
attr_accessor :puppet_conf
|
15
17
|
end
|
16
18
|
|
17
19
|
def self.git_settings
|
@@ -35,6 +37,11 @@ module R10K
|
|
35
37
|
Only used by the 'rugged' Git provider.",
|
36
38
|
}),
|
37
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
|
+
|
38
45
|
URIDefinition.new(:proxy, {
|
39
46
|
:desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
|
40
47
|
:default => :inherit,
|
@@ -52,11 +59,17 @@ module R10K
|
|
52
59
|
:default => :inherit,
|
53
60
|
}),
|
54
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
|
+
|
55
68
|
URIDefinition.new(:proxy, {
|
56
69
|
:desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
|
57
70
|
:default => :inherit,
|
58
71
|
}),
|
59
|
-
|
72
|
+
|
60
73
|
Definition.new(:ignore_branch_prefixes, {
|
61
74
|
:desc => "Array of strings used to prefix branch names that will not be deployed as environments.",
|
62
75
|
}),
|
@@ -131,6 +144,15 @@ module R10K
|
|
131
144
|
end
|
132
145
|
end
|
133
146
|
}),
|
147
|
+
Definition.new(:puppet_conf, {
|
148
|
+
:desc => "Path to puppet.conf. Defaults to /etc/puppetlabs/puppet/puppet.conf.",
|
149
|
+
:default => '/etc/puppetlabs/puppet/puppet.conf',
|
150
|
+
:validate => lambda do |value|
|
151
|
+
unless File.readable? value
|
152
|
+
raise ArgumentError, "The specified puppet.conf #{value} is not readable"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
}),
|
134
156
|
])
|
135
157
|
end
|
136
158
|
|
@@ -160,7 +182,7 @@ module R10K
|
|
160
182
|
|
161
183
|
Definition.new(:pool_size, {
|
162
184
|
:desc => "The amount of threads used to concurrently install modules. The default value is 1: install one module at a time.",
|
163
|
-
:default =>
|
185
|
+
:default => 4,
|
164
186
|
:validate => lambda do |value|
|
165
187
|
if !value.is_a?(Integer)
|
166
188
|
raise ArgumentError, "The pool_size setting should be an integer, not a #{value.class}"
|