r10k 3.2.0 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -7
- data/CHANGELOG.mkd +55 -31
- data/doc/dynamic-environments/configuration.mkd +7 -0
- data/doc/dynamic-environments/usage.mkd +12 -0
- data/integration/Rakefile +0 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +2 -12
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +2 -11
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +2 -12
- data/lib/r10k/action/deploy/environment.rb +7 -2
- data/lib/r10k/cli/deploy.rb +1 -0
- data/lib/r10k/initializers.rb +1 -0
- data/lib/r10k/module/git.rb +5 -0
- data/lib/r10k/puppetfile.rb +51 -4
- data/lib/r10k/settings.rb +13 -0
- data/lib/r10k/settings/container.rb +5 -1
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +32 -24
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
- data/spec/unit/action/deploy/environment_spec.rb +4 -0
- data/spec/unit/puppetfile_spec.rb +44 -0
- data/spec/unit/settings_spec.rb +35 -0
- metadata +3 -3
- data/integration/pre-suite/30_test_utils.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 975a72d1fc4846986b4cb47f8f3a1b2e1a74d69e
|
4
|
+
data.tar.gz: 2ff84a7c70d6282b83b48400299507532f57c520
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64e6faee87cc61490d08d197c2f96b5c2f700027e83de9383c628b2fe77fa12fc2717d6b9dfa8c1e239c89ad2530d88e675bb421efaff308f384a499fb11cb28
|
7
|
+
data.tar.gz: a74bc080bfe5e61eb0f36ee5da57937fd667ef909a35f582bab5d101ae1b252abf1241d0f23957690277ec7200b037f27f2de72800ee26eb0ee08c47a7bb8c01
|
data/.travis.yml
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
---
|
2
2
|
language: ruby
|
3
|
-
services:
|
4
|
-
- docker
|
5
3
|
bundler_args: "--without system"
|
6
4
|
script: "bundle exec rspec --color --format documentation spec/unit"
|
7
5
|
notifications:
|
8
6
|
email: false
|
9
7
|
sudo: false
|
10
8
|
jdk:
|
11
|
-
|
9
|
+
- openjdk8
|
12
10
|
before_install: gem install bundler -v '< 2' --no-document
|
13
11
|
matrix:
|
14
12
|
include:
|
@@ -20,7 +18,3 @@ matrix:
|
|
20
18
|
rvm: 2.3.0
|
21
19
|
- stage: r10k tests
|
22
20
|
rvm: jruby
|
23
|
-
- stage: r10k container tests
|
24
|
-
language: generic
|
25
|
-
script:
|
26
|
-
- cd docker && make lint && make build && make test
|
data/CHANGELOG.mkd
CHANGED
@@ -1,86 +1,101 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
+
3.2.1
|
5
|
+
----
|
6
|
+
|
7
|
+
### Changes
|
8
|
+
- Flag for overriding default branch configuration in Puppetfile
|
9
|
+
- Plumbing for internationalization
|
10
|
+
- Numerous test fixes and legacy docker work
|
11
|
+
|
4
12
|
3.2.0
|
5
13
|
-----
|
6
14
|
|
7
|
-
|
15
|
+
### Changes
|
8
16
|
|
9
|
-
Add support for running `puppet generate types`
|
17
|
+
- Add support for running `puppet generate types`
|
10
18
|
|
11
19
|
3.1.1
|
12
20
|
-----
|
13
21
|
|
14
|
-
|
22
|
+
### Changes
|
15
23
|
|
16
|
-
(RK-335) Postrun `modifiedenvs` doesn't include environment prefixes
|
24
|
+
- (RK-335) Postrun `modifiedenvs` doesn't include environment prefixes
|
17
25
|
|
18
26
|
3.1.0
|
19
27
|
-----
|
20
28
|
|
21
|
-
|
29
|
+
### Changes
|
22
30
|
|
23
|
-
Substitute environments acted on in postrun command.
|
31
|
+
- Substitute environments acted on in postrun command.
|
24
32
|
|
25
|
-
Now post run commands that contain the string "$modifiedenvs"
|
26
|
-
(eg. ["/usr/local/bin/my-postrun-cmd", "--verbose", "$modifiedenvs"])
|
27
|
-
will have the string substituted with a space separated list
|
28
|
-
of environments acted upon (either a single environment if
|
29
|
-
specified on the command line or all environments).
|
33
|
+
Now post run commands that contain the string "$modifiedenvs"
|
34
|
+
(eg. ["/usr/local/bin/my-postrun-cmd", "--verbose", "$modifiedenvs"])
|
35
|
+
will have the string substituted with a space separated list
|
36
|
+
of environments acted upon (either a single environment if
|
37
|
+
specified on the command line or all environments).
|
30
38
|
|
31
|
-
Specifically this should allow users to easily wrap
|
32
|
-
`puppet generate types` and matches the terminology used
|
33
|
-
in g10k.
|
39
|
+
Specifically this should allow users to easily wrap
|
40
|
+
`puppet generate types` and matches the terminology used
|
41
|
+
in g10k.
|
34
42
|
|
35
|
-
Many thanks to @raphink for the contribution.
|
43
|
+
Many thanks to @raphink for the contribution.
|
36
44
|
|
45
|
+
3.0.4
|
46
|
+
----
|
47
|
+
|
48
|
+
### Changes
|
49
|
+
- Flag for overriding default branch configuration in Puppetfile
|
50
|
+
- Plumbing for internationalization
|
51
|
+
- Numerous test fixes and legacy docker work
|
37
52
|
|
38
53
|
3.0.3
|
39
54
|
----
|
40
55
|
|
41
|
-
|
56
|
+
### Changes
|
42
57
|
|
43
|
-
(RK-324) Fix Ruby pipe bug affecting Ubuntu
|
58
|
+
- (RK-324) Fix Ruby pipe bug affecting Ubuntu
|
44
59
|
|
45
60
|
3.0.2
|
46
61
|
----
|
47
62
|
|
48
|
-
|
63
|
+
### Changes
|
49
64
|
|
50
|
-
Minor test fixes.
|
65
|
+
- Minor test fixes.
|
51
66
|
|
52
67
|
3.0.1
|
53
68
|
----
|
54
69
|
|
55
|
-
|
70
|
+
### Changes
|
56
71
|
|
57
72
|
Because of dependency issues R10K 3.0.0 required Ruby >= 2.3
|
58
73
|
rather than the reported 2.0. This release makes the requirement of
|
59
74
|
Ruby >= 2.3 official and documented.
|
60
75
|
|
61
|
-
(#853) ([RK-327](https://tickets.puppetlabs.com/browse/RK-327) Uninitialized Constant Cri::Error
|
62
|
-
|
63
|
-
|
64
|
-
|
76
|
+
- (#853) ([RK-327](https://tickets.puppetlabs.com/browse/RK-327) Uninitialized Constant Cri::Error
|
77
|
+
When resolving the Cri dependency >= 2.13 R10K would fail with an
|
78
|
+
uninitialized constant error. Thanks to @ostavnaas for the bug report,
|
79
|
+
@ddfreyne for the fix, and @baurmatt for the review.
|
65
80
|
|
66
81
|
|
67
82
|
3.0.0
|
68
83
|
----
|
69
84
|
|
70
|
-
|
85
|
+
### Changes
|
71
86
|
|
72
|
-
|
87
|
+
#### Known issues
|
73
88
|
- Child processes may die unexpectedly when deploying many environments
|
74
89
|
on Ubuntu Bionic. See
|
75
90
|
[RK-324](https://tickets.puppetlabs.com/browse/RK-324).
|
76
91
|
|
77
|
-
|
92
|
+
#### Backwards breaking changes
|
78
93
|
- Drop support for Ruby < 2.0
|
79
94
|
- Remove support for PUPPETFILE and PUPPETFILE_DIR environment variables
|
80
95
|
when running the `puppetfile` action, please use flags instead.
|
81
96
|
- Fail when duplicate module definitions in Puppetfile
|
82
97
|
|
83
|
-
|
98
|
+
#### Bug fixes
|
84
99
|
- More reliable pruning of refs on fetch
|
85
100
|
- Improved error messaging when:
|
86
101
|
- Unable to connect to a proxy
|
@@ -88,24 +103,32 @@ Ruby >= 2.3 official and documented.
|
|
88
103
|
- Unable to parse Puppetfile
|
89
104
|
- Various perfomance improvements
|
90
105
|
|
106
|
+
2.6.6
|
107
|
+
----
|
108
|
+
|
109
|
+
### Changes
|
110
|
+
- Flag for overriding default branch configuration in Puppetfile
|
111
|
+
- Plumbing for internationalization
|
112
|
+
- Numerous test fixes and legacy docker work
|
91
113
|
|
92
114
|
2.6.5
|
93
115
|
----
|
94
116
|
|
95
|
-
|
117
|
+
### Bug Fix
|
96
118
|
|
97
119
|
(RK-324) Fix Ruby pipe bug affecting Ubuntu
|
98
120
|
|
99
121
|
2.6.4
|
100
122
|
----
|
101
123
|
|
102
|
-
|
124
|
+
### Changes
|
103
125
|
|
104
126
|
Numerous test fixes.
|
105
127
|
|
106
128
|
2.6.3
|
107
129
|
----
|
108
|
-
|
130
|
+
|
131
|
+
### Changes
|
109
132
|
|
110
133
|
Update specs with new error string.
|
111
134
|
|
@@ -114,6 +137,7 @@ when a release is made on that branch.
|
|
114
137
|
|
115
138
|
2.6.2
|
116
139
|
-----
|
140
|
+
|
117
141
|
### Changes
|
118
142
|
|
119
143
|
(RK-311) Yard dependency updated for security fix.
|
@@ -73,6 +73,13 @@ proxy: 'http://user:password@proxy.example.com:3128'
|
|
73
73
|
|
74
74
|
The proxy server being used will be logged at the "debug" level when r10k runs.
|
75
75
|
|
76
|
+
### pool_size
|
77
|
+
|
78
|
+
The pool_size setting is a number to determine how many threads should be spawn
|
79
|
+
while updating modules. The default value is 1, which means the default behaviour
|
80
|
+
is to update modules in a serial manner. Increasing this number should bring
|
81
|
+
some performance gains.
|
82
|
+
|
76
83
|
### git
|
77
84
|
|
78
85
|
The 'git' setting is a hash that contains Git specific settings.
|
@@ -60,6 +60,18 @@ Update a single environment and force an update of modules:
|
|
60
60
|
This will update the given environment and update all contained modules. This is
|
61
61
|
useful if you want to make sure that a given environment is fully up to date.
|
62
62
|
|
63
|
+
- - -
|
64
|
+
|
65
|
+
Update a single environment and specify a default branch override:
|
66
|
+
|
67
|
+
r10k deploy environment my_working_environment --puppetfile --default-branch-override default_branch_override
|
68
|
+
|
69
|
+
This will update the given environment and update all contained modules, overrideing
|
70
|
+
the :default_branch entry in the Puppetfile of each module. This is used primarily to allow
|
71
|
+
automated r10k solutions using the control_branch pattern with a temporary branch deployment to
|
72
|
+
ensure the deployment is pushed to the correct module repository branch. Note that the :default_branch
|
73
|
+
is only ever utilized if the desired ref cannot be located.
|
74
|
+
|
63
75
|
### Deploying modules
|
64
76
|
|
65
77
|
Update a single module across all environments:
|
data/integration/Rakefile
CHANGED
@@ -20,17 +20,6 @@ r10k_config_bak_path = "#{r10k_config_path}.bak"
|
|
20
20
|
|
21
21
|
tmpfs_path = '/mnt/tmpfs'
|
22
22
|
|
23
|
-
if on(master, 'which python', :acceptable_exit_codes => [0, 1]).exit_code == 1
|
24
|
-
python_bin = 'python3'
|
25
|
-
else
|
26
|
-
python_bin = 'python'
|
27
|
-
end
|
28
|
-
|
29
|
-
file_bucket_path = '/opt/filebucket'
|
30
|
-
file_bucket_command_path = File.join(file_bucket_path, 'filebucketapp.py')
|
31
|
-
file_bucket_command = "#{python_bin} #{file_bucket_command_path}"
|
32
|
-
pattern_file_path = File.join(file_bucket_path, 'psuedo_random_128k.pat')
|
33
|
-
|
34
23
|
test_files_path = File.join(git_environments_path, 'test_files')
|
35
24
|
|
36
25
|
#In-line files
|
@@ -73,7 +62,8 @@ on(master, "mount -osize=10m tmpfs #{tmpfs_path} -t tmpfs")
|
|
73
62
|
step 'Create Large Binary File'
|
74
63
|
create_remote_file(master, File.join(git_environments_path, '.gitattributes'), '*.file binary')
|
75
64
|
on(master, "mkdir -p #{test_files_path}")
|
76
|
-
|
65
|
+
# create a 11 mb file to fill the mount
|
66
|
+
on(master, "dd if=/dev/urandom of=#{test_files_path}.test.file bs=1048576 count=11")
|
77
67
|
|
78
68
|
step 'Push Changes'
|
79
69
|
git_add_commit_push(master, 'production', 'Add large file.', git_environments_path)
|
@@ -21,16 +21,6 @@ helloworld_module_path = File.join(local_files_root_path, 'modules', 'helloworld
|
|
21
21
|
test_files = 'test_files'
|
22
22
|
test_files_path = File.join(git_environments_path, test_files)
|
23
23
|
|
24
|
-
if on(master, 'which python', :acceptable_exit_codes => [0, 1]).exit_code == 1
|
25
|
-
python_bin = 'python3'
|
26
|
-
else
|
27
|
-
python_bin = 'python'
|
28
|
-
end
|
29
|
-
|
30
|
-
file_bucket_path = '/opt/filebucket'
|
31
|
-
file_bucket_command_path = File.join(file_bucket_path, 'filebucketapp.py')
|
32
|
-
file_bucket_command = "#{python_bin} #{file_bucket_command_path}"
|
33
|
-
|
34
24
|
#Manifest
|
35
25
|
site_pp_path = File.join(git_environments_path, 'manifests', 'site.pp')
|
36
26
|
site_pp = create_site_pp(master_certname, ' include helloworld')
|
@@ -60,7 +50,8 @@ inject_site_pp(master, site_pp_path, site_pp)
|
|
60
50
|
step 'Create 10,000 Files'
|
61
51
|
create_remote_file(master, File.join(git_environments_path, '.gitattributes'), '*.file binary')
|
62
52
|
on(master, "mkdir -p #{test_files_path}")
|
63
|
-
|
53
|
+
# create 10000 1k files with random text
|
54
|
+
on(master, "for n in {1..10000}; do dd if=/dev/urandom of=#{test_files_path}/test$( printf %03d \"$n\" ).file bs=1024 count=1; done")
|
64
55
|
|
65
56
|
step 'Create MD5 Checksum of Files'
|
66
57
|
on(master, "cd #{test_files_path};md5sum *.file > #{checksum_file_name}")
|
@@ -21,17 +21,6 @@ helloworld_module_path = File.join(local_files_root_path, 'modules', 'helloworld
|
|
21
21
|
test_files = 'test_files'
|
22
22
|
test_files_path = File.join(git_environments_path, 'test_files')
|
23
23
|
|
24
|
-
if on(master, 'which python', :acceptable_exit_codes => [0, 1]).exit_code == 1
|
25
|
-
python_bin = 'python3'
|
26
|
-
else
|
27
|
-
python_bin = 'python'
|
28
|
-
end
|
29
|
-
|
30
|
-
file_bucket_path = '/opt/filebucket'
|
31
|
-
file_bucket_command_path = File.join(file_bucket_path, 'filebucketapp.py')
|
32
|
-
pattern_file_path = File.join(file_bucket_path, 'psuedo_random_128k.pat')
|
33
|
-
file_bucket_command = "#{python_bin} #{file_bucket_command_path}"
|
34
|
-
|
35
24
|
#Manifest
|
36
25
|
site_pp_path = File.join(git_environments_path, 'manifests', 'site.pp')
|
37
26
|
site_pp = create_site_pp(master_certname, ' include helloworld')
|
@@ -61,7 +50,8 @@ inject_site_pp(master, site_pp_path, site_pp)
|
|
61
50
|
step 'Create Large Binary Files'
|
62
51
|
create_remote_file(master, File.join(git_environments_path, '.gitattributes'), '*.file binary')
|
63
52
|
on(master, "mkdir -p #{test_files_path}")
|
64
|
-
|
53
|
+
# create 10 25 MB files with random characters
|
54
|
+
on(master, "for n in {1..10}; do dd if=/dev/urandom of=#{test_files_path}/test$( printf %03d \"$n\" ).file bs=1048576 count=25; done")
|
65
55
|
|
66
56
|
step 'Create MD5 Checksum of Files'
|
67
57
|
on(master, "cd #{test_files_path};md5sum *.file > #{checksum_file_name}")
|
@@ -129,7 +129,7 @@ module R10K
|
|
129
129
|
end
|
130
130
|
|
131
131
|
def visit_puppetfile(puppetfile)
|
132
|
-
puppetfile.load
|
132
|
+
puppetfile.load(@opts[:'default-branch-override'])
|
133
133
|
|
134
134
|
yield
|
135
135
|
|
@@ -166,7 +166,12 @@ module R10K
|
|
166
166
|
end
|
167
167
|
|
168
168
|
def allowed_initialize_opts
|
169
|
-
super.merge(puppetfile: :self,
|
169
|
+
super.merge(puppetfile: :self,
|
170
|
+
cachedir: :self,
|
171
|
+
'no-force': :self,
|
172
|
+
'generate-types': :self,
|
173
|
+
'puppet-path': :self,
|
174
|
+
'default-branch-override': :self)
|
170
175
|
end
|
171
176
|
end
|
172
177
|
end
|
data/lib/r10k/cli/deploy.rb
CHANGED
@@ -61,6 +61,7 @@ scheduled. On subsequent deployments, Puppetfile deployment will default to off.
|
|
61
61
|
DESCRIPTION
|
62
62
|
|
63
63
|
flag :p, :puppetfile, 'Deploy modules from a puppetfile'
|
64
|
+
required nil, :'default-branch-override', 'Specify a branchname to override the default branch in the puppetfile'
|
64
65
|
|
65
66
|
runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Environment)
|
66
67
|
end
|
data/lib/r10k/initializers.rb
CHANGED
@@ -34,6 +34,7 @@ module R10K
|
|
34
34
|
|
35
35
|
with_setting(:cachedir) { |value| R10K::Git::Cache.settings[:cache_root] = value }
|
36
36
|
with_setting(:cachedir) { |value| R10K::Forge::ModuleRelease.settings[:cache_root] = value }
|
37
|
+
with_setting(:pool_size) { |value| R10K::Puppetfile.settings[:pool_size] = value }
|
37
38
|
|
38
39
|
with_setting(:git) { |value| GitInitializer.new(value).call }
|
39
40
|
with_setting(:forge) { |value| ForgeInitializer.new(value).call }
|
data/lib/r10k/module/git.rb
CHANGED
@@ -23,6 +23,11 @@ class R10K::Module::Git < R10K::Module::Base
|
|
23
23
|
# @return [String]
|
24
24
|
attr_reader :desired_ref
|
25
25
|
|
26
|
+
# @!attribute [r] default_ref
|
27
|
+
# @api private
|
28
|
+
# @return [String]
|
29
|
+
attr_reader :default_ref
|
30
|
+
|
26
31
|
def initialize(title, dirname, args, environment=nil)
|
27
32
|
super
|
28
33
|
|
data/lib/r10k/puppetfile.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'thread'
|
1
2
|
require 'pathname'
|
2
3
|
require 'r10k/module'
|
3
4
|
require 'r10k/util/purgeable'
|
@@ -7,6 +8,10 @@ module R10K
|
|
7
8
|
class Puppetfile
|
8
9
|
# Defines the data members of a Puppetfile
|
9
10
|
|
11
|
+
include R10K::Settings::Mixin
|
12
|
+
|
13
|
+
def_setting_attr :pool_size, 1
|
14
|
+
|
10
15
|
include R10K::Logging
|
11
16
|
|
12
17
|
# @!attribute [r] forge
|
@@ -58,17 +63,20 @@ class Puppetfile
|
|
58
63
|
@loaded = false
|
59
64
|
end
|
60
65
|
|
61
|
-
def load
|
66
|
+
def load(default_branch_override = nil)
|
62
67
|
if File.readable? @puppetfile_path
|
63
|
-
self.load!
|
68
|
+
self.load!(default_branch_override)
|
64
69
|
else
|
65
70
|
logger.debug _("Puppetfile %{path} missing or unreadable") % {path: @puppetfile_path.inspect}
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
69
|
-
def load!
|
74
|
+
def load!(default_branch_override = nil)
|
75
|
+
@default_branch_override = default_branch_override
|
76
|
+
|
70
77
|
dsl = R10K::Puppetfile::DSL.new(self)
|
71
78
|
dsl.instance_eval(puppetfile_contents, @puppetfile_path)
|
79
|
+
|
72
80
|
validate_no_duplicate_names(@modules)
|
73
81
|
@loaded = true
|
74
82
|
rescue SyntaxError, LoadError, ArgumentError, NameError => e
|
@@ -113,6 +121,10 @@ class Puppetfile
|
|
113
121
|
install_path = @moduledir
|
114
122
|
end
|
115
123
|
|
124
|
+
if args.is_a?(Hash) && @default_branch_override != nil
|
125
|
+
args[:default_branch] = @default_branch_override
|
126
|
+
end
|
127
|
+
|
116
128
|
# Keep track of all the content this Puppetfile is managing to enable purging.
|
117
129
|
@managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
|
118
130
|
|
@@ -152,6 +164,17 @@ class Puppetfile
|
|
152
164
|
end
|
153
165
|
|
154
166
|
def accept(visitor)
|
167
|
+
pool_size = self.settings[:pool_size]
|
168
|
+
if pool_size > 1
|
169
|
+
concurrent_accept(visitor, pool_size)
|
170
|
+
else
|
171
|
+
serial_accept(visitor)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
def serial_accept(visitor)
|
155
178
|
visitor.visit(:puppetfile, self) do
|
156
179
|
modules.each do |mod|
|
157
180
|
mod.accept(visitor)
|
@@ -159,7 +182,31 @@ class Puppetfile
|
|
159
182
|
end
|
160
183
|
end
|
161
184
|
|
162
|
-
|
185
|
+
def concurrent_accept(visitor, pool_size)
|
186
|
+
logger.debug _("Updating modules with %{pool_size} threads") % {pool_size: pool_size}
|
187
|
+
mods_queue = modules_queue(visitor)
|
188
|
+
thread_pool = pool_size.times.map { visitor_thread(visitor, mods_queue) }
|
189
|
+
thread_pool.each(&:join)
|
190
|
+
end
|
191
|
+
|
192
|
+
def modules_queue(visitor)
|
193
|
+
Queue.new.tap do |queue|
|
194
|
+
visitor.visit(:puppetfile, self) do
|
195
|
+
modules.each { |mod| queue << mod }
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def visitor_thread(visitor, mods_queue)
|
201
|
+
Thread.new do
|
202
|
+
begin
|
203
|
+
while mod = mods_queue.pop(true) do mod.accept(visitor) end
|
204
|
+
rescue ThreadError => e
|
205
|
+
logger.error _("Thread error during concurrent module deploy: %{message}") % {message: e.message}
|
206
|
+
Thread.exit
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
163
210
|
|
164
211
|
def puppetfile_contents
|
165
212
|
File.read(@puppetfile_path)
|
data/lib/r10k/settings.rb
CHANGED
@@ -158,6 +158,19 @@ module R10K
|
|
158
158
|
end
|
159
159
|
}),
|
160
160
|
|
161
|
+
Definition.new(:pool_size, {
|
162
|
+
:desc => "The amount of threads used to concurrently install modules. The default value is 1: install one module at a time.",
|
163
|
+
:default => 1,
|
164
|
+
:validate => lambda do |value|
|
165
|
+
if !value.is_a?(Integer)
|
166
|
+
raise ArgumentError, "The pool_size setting should be an integer, not a #{value.class}"
|
167
|
+
end
|
168
|
+
if !(value > 0)
|
169
|
+
raise ArgumentError, "The pool_size setting should be greater than zero."
|
170
|
+
end
|
171
|
+
end
|
172
|
+
}),
|
173
|
+
|
161
174
|
URIDefinition.new(:proxy, {
|
162
175
|
:desc => "Proxy to use for all r10k operations which occur over HTTP(S).",
|
163
176
|
:default => lambda {
|
@@ -32,7 +32,11 @@ class R10K::Settings::Container
|
|
32
32
|
if @settings[key]
|
33
33
|
@settings[key]
|
34
34
|
elsif @parent && (pkey = @parent[key])
|
35
|
-
|
35
|
+
begin
|
36
|
+
@settings[key] = pkey.dup
|
37
|
+
rescue TypeError
|
38
|
+
@settings[key] = pkey
|
39
|
+
end
|
36
40
|
@settings[key]
|
37
41
|
end
|
38
42
|
end
|
data/lib/r10k/version.rb
CHANGED
data/locales/r10k.pot
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# SOME DESCRIPTIVE TITLE.
|
2
|
-
# Copyright (C)
|
2
|
+
# Copyright (C) 2019 Puppet, Inc.
|
3
3
|
# This file is distributed under the same license as the r10k package.
|
4
|
-
# FIRST AUTHOR <EMAIL@ADDRESS>,
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
5
5
|
#
|
6
6
|
#, fuzzy
|
7
7
|
msgid ""
|
8
8
|
msgstr ""
|
9
|
-
"Project-Id-Version: r10k 3.0
|
9
|
+
"Project-Id-Version: r10k 3.2.0-7-g213f14b\n"
|
10
10
|
"\n"
|
11
11
|
"Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
|
12
|
-
"POT-Creation-Date:
|
13
|
-
"PO-Revision-Date:
|
12
|
+
"POT-Creation-Date: 2019-04-18 21:10+0000\n"
|
13
|
+
"PO-Revision-Date: 2019-04-18 21:10+0000\n"
|
14
14
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
15
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
16
|
"Language: \n"
|
@@ -31,27 +31,27 @@ msgstr ""
|
|
31
31
|
msgid "Reason: %{write_lock}"
|
32
32
|
msgstr ""
|
33
33
|
|
34
|
-
#: ../lib/r10k/action/deploy/environment.rb:
|
34
|
+
#: ../lib/r10k/action/deploy/environment.rb:57
|
35
35
|
msgid "Environment(s) \\'%{environments}\\' cannot be found in any source and will not be deployed."
|
36
36
|
msgstr ""
|
37
37
|
|
38
|
-
#: ../lib/r10k/action/deploy/environment.rb:
|
38
|
+
#: ../lib/r10k/action/deploy/environment.rb:85
|
39
39
|
msgid "Environment %{env_dir} does not match environment name filter, skipping"
|
40
40
|
msgstr ""
|
41
41
|
|
42
|
-
#: ../lib/r10k/action/deploy/environment.rb:
|
42
|
+
#: ../lib/r10k/action/deploy/environment.rb:93
|
43
43
|
msgid "Deploying environment %{env_path}"
|
44
44
|
msgstr ""
|
45
45
|
|
46
|
-
#: ../lib/r10k/action/deploy/environment.rb:
|
46
|
+
#: ../lib/r10k/action/deploy/environment.rb:96
|
47
47
|
msgid "Environment %{env_dir} is now at %{env_signature}"
|
48
48
|
msgstr ""
|
49
49
|
|
50
|
-
#: ../lib/r10k/action/deploy/environment.rb:
|
50
|
+
#: ../lib/r10k/action/deploy/environment.rb:100
|
51
51
|
msgid "Environment %{env_dir} is new, updating all modules"
|
52
52
|
msgstr ""
|
53
53
|
|
54
|
-
#: ../lib/r10k/action/deploy/environment.rb:
|
54
|
+
#: ../lib/r10k/action/deploy/environment.rb:143
|
55
55
|
msgid "Deploying Puppetfile content %{mod_path}"
|
56
56
|
msgstr ""
|
57
57
|
|
@@ -67,7 +67,7 @@ msgstr ""
|
|
67
67
|
msgid "Deploying module %{mod_path}"
|
68
68
|
msgstr ""
|
69
69
|
|
70
|
-
#: ../lib/r10k/action/deploy/module.rb:
|
70
|
+
#: ../lib/r10k/action/deploy/module.rb:70
|
71
71
|
msgid "Only updating modules %{modules}, skipping module %{mod_name}"
|
72
72
|
msgstr ""
|
73
73
|
|
@@ -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:
|
86
|
+
#: ../lib/r10k/action/runner.rb:53 ../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:
|
90
|
+
#: ../lib/r10k/action/runner.rb:86
|
91
91
|
msgid "Reading configuration from %{config_path}"
|
92
92
|
msgstr ""
|
93
93
|
|
94
|
-
#: ../lib/r10k/action/runner.rb:
|
94
|
+
#: ../lib/r10k/action/runner.rb:89
|
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
|
|
@@ -103,7 +103,7 @@ msgstr ""
|
|
103
103
|
msgid "Unable to load sources; the supplied configuration does not define the 'sources' key"
|
104
104
|
msgstr ""
|
105
105
|
|
106
|
-
#: ../lib/r10k/environment/base.rb:
|
106
|
+
#: ../lib/r10k/environment/base.rb:61 ../lib/r10k/environment/base.rb:77 ../lib/r10k/environment/base.rb:86 ../lib/r10k/source/base.rb:64
|
107
107
|
msgid "%{class} has not implemented method %{method}"
|
108
108
|
msgstr ""
|
109
109
|
|
@@ -295,7 +295,7 @@ msgstr ""
|
|
295
295
|
msgid "Module %{name} with args %{args} doesn't have an implementation. (Are you using the right arguments?)"
|
296
296
|
msgstr ""
|
297
297
|
|
298
|
-
#: ../lib/r10k/module/base.rb:
|
298
|
+
#: ../lib/r10k/module/base.rb:105
|
299
299
|
msgid "Module name (%{title}) must match either 'modulename' or 'owner/modulename'"
|
300
300
|
msgstr ""
|
301
301
|
|
@@ -319,27 +319,35 @@ msgstr ""
|
|
319
319
|
msgid "Could not read metadata.json"
|
320
320
|
msgstr ""
|
321
321
|
|
322
|
-
#: ../lib/r10k/puppetfile.rb:
|
322
|
+
#: ../lib/r10k/puppetfile.rb:57
|
323
323
|
msgid "Using Puppetfile '%{puppetfile}'"
|
324
324
|
msgstr ""
|
325
325
|
|
326
|
-
#: ../lib/r10k/puppetfile.rb:
|
326
|
+
#: ../lib/r10k/puppetfile.rb:70
|
327
327
|
msgid "Puppetfile %{path} missing or unreadable"
|
328
328
|
msgstr ""
|
329
329
|
|
330
|
-
#: ../lib/r10k/puppetfile.rb:
|
330
|
+
#: ../lib/r10k/puppetfile.rb:80
|
331
331
|
msgid "Failed to evaluate %{path}"
|
332
332
|
msgstr ""
|
333
333
|
|
334
|
-
#: ../lib/r10k/puppetfile.rb:
|
334
|
+
#: ../lib/r10k/puppetfile.rb:90
|
335
335
|
msgid "Puppetfiles cannot contain duplicate module names."
|
336
336
|
msgstr ""
|
337
337
|
|
338
|
-
#: ../lib/r10k/puppetfile.rb:
|
338
|
+
#: ../lib/r10k/puppetfile.rb:92
|
339
339
|
msgid "Remove the duplicates of the following modules: %{dupes}"
|
340
340
|
msgstr ""
|
341
341
|
|
342
|
-
#: ../lib/r10k/puppetfile.rb:
|
342
|
+
#: ../lib/r10k/puppetfile.rb:179
|
343
|
+
msgid "Updating modules with %{pool_size} threads"
|
344
|
+
msgstr ""
|
345
|
+
|
346
|
+
#: ../lib/r10k/puppetfile.rb:198
|
347
|
+
msgid "Thread error during concurrent module deploy: %{message}"
|
348
|
+
msgstr ""
|
349
|
+
|
350
|
+
#: ../lib/r10k/puppetfile.rb:253
|
343
351
|
msgid "unrecognized declaration '%{method}'"
|
344
352
|
msgstr ""
|
345
353
|
|
@@ -351,7 +359,7 @@ msgstr ""
|
|
351
359
|
msgid "Validation failed for settings group"
|
352
360
|
msgstr ""
|
353
361
|
|
354
|
-
#: ../lib/r10k/settings/container.rb:
|
362
|
+
#: ../lib/r10k/settings/container.rb:91
|
355
363
|
msgid "Key %{key} is not a valid key"
|
356
364
|
msgstr ""
|
357
365
|
|
@@ -19,6 +19,10 @@ describe R10K::Action::Deploy::Environment do
|
|
19
19
|
described_class.new({puppetfile: true}, [])
|
20
20
|
end
|
21
21
|
|
22
|
+
it "can accept a default_branch_override option" do
|
23
|
+
described_class.new({:'default-branch-override' => 'default_branch_override_name'}, [])
|
24
|
+
end
|
25
|
+
|
22
26
|
it "can accept a no-force option" do
|
23
27
|
described_class.new({:'no-force' => true}, [])
|
24
28
|
end
|
@@ -227,6 +227,25 @@ describe R10K::Puppetfile do
|
|
227
227
|
subject = described_class.new(path)
|
228
228
|
expect { subject.load! }.not_to raise_error
|
229
229
|
end
|
230
|
+
|
231
|
+
it "creates a git module and applies the default branch sepcified in the Puppetfile" do
|
232
|
+
path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'default-branch-override')
|
233
|
+
pf_path = File.join(path, 'Puppetfile')
|
234
|
+
subject = described_class.new(path)
|
235
|
+
expect { subject.load! }.not_to raise_error
|
236
|
+
git_module = subject.modules[0]
|
237
|
+
expect(git_module.default_ref).to eq 'here_lies_the_default_branch'
|
238
|
+
end
|
239
|
+
|
240
|
+
it "creates a git module and applies the provided default_branch_override" do
|
241
|
+
path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'default-branch-override')
|
242
|
+
pf_path = File.join(path, 'Puppetfile')
|
243
|
+
subject = described_class.new(path)
|
244
|
+
default_branch_override = 'default_branch_override_name'
|
245
|
+
expect { subject.load!(default_branch_override) }.not_to raise_error
|
246
|
+
git_module = subject.modules[0]
|
247
|
+
expect(git_module.default_ref).to eq default_branch_override
|
248
|
+
end
|
230
249
|
end
|
231
250
|
|
232
251
|
describe "accepting a visitor" do
|
@@ -252,5 +271,30 @@ describe R10K::Puppetfile do
|
|
252
271
|
expect(subject).to receive(:modules).and_return([mod1, mod2])
|
253
272
|
subject.accept(visitor)
|
254
273
|
end
|
274
|
+
|
275
|
+
it "creates a thread pool to visit concurrently if pool_size setting is greater than one" do
|
276
|
+
pool_size = 3
|
277
|
+
|
278
|
+
subject.settings[:pool_size] = pool_size
|
279
|
+
|
280
|
+
visitor = spy('visitor')
|
281
|
+
expect(visitor).to receive(:visit) do |type, other, &block|
|
282
|
+
expect(type).to eq :puppetfile
|
283
|
+
expect(other).to eq subject
|
284
|
+
block.call
|
285
|
+
end
|
286
|
+
|
287
|
+
mod1 = spy('module')
|
288
|
+
expect(mod1).to receive(:accept).with(visitor)
|
289
|
+
mod2 = spy('module')
|
290
|
+
expect(mod2).to receive(:accept).with(visitor)
|
291
|
+
|
292
|
+
expect(subject).to receive(:modules).and_return([mod1, mod2])
|
293
|
+
|
294
|
+
expect(Thread).to receive(:new).exactly(pool_size).and_call_original
|
295
|
+
expect(Queue).to receive(:new).and_call_original
|
296
|
+
|
297
|
+
subject.accept(visitor)
|
298
|
+
end
|
255
299
|
end
|
256
300
|
end
|
data/spec/unit/settings_spec.rb
CHANGED
@@ -165,6 +165,41 @@ describe R10K::Settings do
|
|
165
165
|
end
|
166
166
|
end
|
167
167
|
|
168
|
+
describe "pool_size" do
|
169
|
+
it "accepts integers greater than zero" do
|
170
|
+
output = subject.evaluate("pool_size" => 5)
|
171
|
+
expect(output[:pool_size]).to eq 5
|
172
|
+
end
|
173
|
+
|
174
|
+
it "rejects non integer values" do
|
175
|
+
expect {
|
176
|
+
subject.evaluate("pool_size" => "5")
|
177
|
+
}.to raise_error do |err|
|
178
|
+
expect(err.errors.size).to eq 1
|
179
|
+
expect(err.errors[:pool_size]).to be_a_kind_of(ArgumentError)
|
180
|
+
expect(err.errors[:pool_size].message).to match(/The pool_size setting should be an integer/)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
it "rejects integers smaller than one" do
|
185
|
+
expect {
|
186
|
+
subject.evaluate("pool_size" => 0)
|
187
|
+
}.to raise_error do |err|
|
188
|
+
expect(err.errors.size).to eq 1
|
189
|
+
expect(err.errors[:pool_size]).to be_a_kind_of(ArgumentError)
|
190
|
+
expect(err.errors[:pool_size].message).to match(/The pool_size setting should be greater than zero/)
|
191
|
+
end
|
192
|
+
|
193
|
+
expect {
|
194
|
+
subject.evaluate("pool_size" => -3)
|
195
|
+
}.to raise_error do |err|
|
196
|
+
expect(err.errors.size).to eq 1
|
197
|
+
expect(err.errors[:pool_size]).to be_a_kind_of(ArgumentError)
|
198
|
+
expect(err.errors[:pool_size].message).to match(/The pool_size setting should be greater than zero/)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
168
203
|
describe "proxy" do
|
169
204
|
it "accepts valid URIs" do
|
170
205
|
output = subject.evaluate("proxy" => "http://proxy.tessier-ashpool.freeside:3128")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r10k
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrien Thebo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colored
|
@@ -221,7 +221,6 @@ files:
|
|
221
221
|
- integration/pre-suite/00_pe_install.rb
|
222
222
|
- integration/pre-suite/10_git_config.rb
|
223
223
|
- integration/pre-suite/20_pe_r10k.rb
|
224
|
-
- integration/pre-suite/30_test_utils.rb
|
225
224
|
- integration/pre-suite/README.mkd
|
226
225
|
- integration/scripts/README.mkd
|
227
226
|
- integration/scripts/setup_r10k_env_centos5.sh
|
@@ -412,6 +411,7 @@ files:
|
|
412
411
|
- spec/fixtures/unit/action/r10k_generate_types.yaml
|
413
412
|
- spec/fixtures/unit/action/r10k_puppet_path.yaml
|
414
413
|
- spec/fixtures/unit/puppetfile/argument-error/Puppetfile
|
414
|
+
- spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile
|
415
415
|
- spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile
|
416
416
|
- spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile
|
417
417
|
- spec/fixtures/unit/puppetfile/load-error/Puppetfile
|
@@ -1,17 +0,0 @@
|
|
1
|
-
test_name 'CODEMGMT-62 - C63199 - Install Utilities for r10k Integration Testing'
|
2
|
-
|
3
|
-
#Init
|
4
|
-
filebucket_path = '/opt/filebucket'
|
5
|
-
filebucket_script_path = '/etc/profile.d/filebucket_path.sh'
|
6
|
-
|
7
|
-
filebucket_script = <<-SCRIPT
|
8
|
-
#!/bin/bash
|
9
|
-
export PATH="${PATH}:#{filebucket_path}"
|
10
|
-
SCRIPT
|
11
|
-
|
12
|
-
step 'Install "filebucket" File Generator'
|
13
|
-
create_remote_file(master, filebucket_script_path, filebucket_script)
|
14
|
-
on(master, "git clone git://github.com/puppetlabs/filebucket.git #{filebucket_path}")
|
15
|
-
|
16
|
-
on(master, "chmod 755 #{filebucket_script_path}")
|
17
|
-
on(master, "chmod 755 #{filebucket_path}/filebucketapp.py")
|