r10k 3.14.1 → 5.0.1

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.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +17 -0
  3. data/.github/workflows/docker.yml +9 -4
  4. data/.github/workflows/release.yml +3 -2
  5. data/.github/workflows/rspec_tests.yml +8 -10
  6. data/CHANGELOG.mkd +100 -0
  7. data/CODEOWNERS +1 -2
  8. data/Gemfile +2 -2
  9. data/README.mkd +18 -19
  10. data/doc/common-patterns.mkd +1 -2
  11. data/doc/dynamic-environments/configuration.mkd +91 -12
  12. data/doc/dynamic-environments/usage.mkd +4 -0
  13. data/doc/dynamic-environments/workflow-guide.mkd +3 -3
  14. data/doc/faq.mkd +1 -1
  15. data/doc/puppetfile.mkd +9 -3
  16. data/integration/Gemfile +3 -4
  17. data/integration/Rakefile +58 -23
  18. data/integration/files/pre-suite/git_config.pp.erb +1 -1
  19. data/integration/pre-suite/00_pe_install.rb +3 -0
  20. data/integration/pre-suite/10_git_config.rb +1 -3
  21. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
  22. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
  23. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
  24. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
  25. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
  26. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
  27. data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
  28. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
  29. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
  30. data/integration/tests/git_source/git_source_git.rb +1 -4
  31. data/integration/tests/git_source/git_source_repeated_remote.rb +2 -5
  32. data/integration/tests/git_source/git_source_submodule.rb +1 -1
  33. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
  34. data/integration/tests/purging/content_not_purged_at_root.rb +2 -5
  35. data/integration/tests/purging/default_purging.rb +0 -3
  36. data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
  37. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -4
  38. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -4
  39. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -4
  40. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
  41. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
  42. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
  43. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
  44. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
  45. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
  46. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
  47. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
  48. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -4
  49. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
  50. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
  51. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
  52. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
  53. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -4
  54. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
  55. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
  56. data/lib/r10k/action/deploy/environment.rb +2 -19
  57. data/lib/r10k/action/deploy/module.rb +1 -0
  58. data/lib/r10k/action/puppetfile/check.rb +7 -0
  59. data/lib/r10k/action/puppetfile/install.rb +3 -1
  60. data/lib/r10k/cli/deploy.rb +15 -1
  61. data/lib/r10k/cli/puppetfile.rb +1 -0
  62. data/lib/r10k/content_synchronizer.rb +7 -2
  63. data/lib/r10k/environment/with_modules.rb +24 -1
  64. data/lib/r10k/environment.rb +0 -1
  65. data/lib/r10k/git/rugged/bare_repository.rb +5 -4
  66. data/lib/r10k/git/rugged/thin_repository.rb +7 -0
  67. data/lib/r10k/git/rugged/working_repository.rb +13 -7
  68. data/lib/r10k/git/shellgit/thin_repository.rb +5 -1
  69. data/lib/r10k/git/shellgit/working_repository.rb +5 -4
  70. data/lib/r10k/git/stateful_repository.rb +4 -4
  71. data/lib/r10k/module/base.rb +3 -3
  72. data/lib/r10k/module/git.rb +19 -5
  73. data/lib/r10k/module_loader/puppetfile/dsl.rb +4 -0
  74. data/lib/r10k/module_loader/puppetfile.rb +22 -14
  75. data/lib/r10k/puppetfile.rb +1 -1
  76. data/lib/r10k/settings/container.rb +1 -0
  77. data/lib/r10k/settings.rb +6 -7
  78. data/lib/r10k/tarball.rb +1 -1
  79. data/lib/r10k/version.rb +1 -1
  80. data/locales/r10k.pot +34 -82
  81. data/r10k.gemspec +8 -18
  82. metadata +40 -213
  83. data/.github/workflows/stale.yml +0 -21
  84. data/.travis.yml +0 -42
  85. data/docker/.gitignore +0 -1
  86. data/docker/.rspec +0 -4
  87. data/docker/Gemfile +0 -11
  88. data/docker/Makefile +0 -92
  89. data/docker/README.md +0 -28
  90. data/docker/docker-compose.yml +0 -18
  91. data/docker/r10k/Dockerfile +0 -68
  92. data/docker/r10k/adduser.sh +0 -13
  93. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
  94. data/docker/r10k/docker-entrypoint.sh +0 -10
  95. data/docker/r10k/release.Dockerfile +0 -55
  96. data/docker/spec/dockerfile_spec.rb +0 -37
  97. data/docker/spec/fixtures/Puppetfile +0 -2
  98. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
  99. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
  100. data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
  102. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
  103. data/lib/r10k/environment/bare.rb +0 -13
  104. data/spec/fixtures/empty/.empty +0 -0
  105. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  106. data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
  107. data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
  108. data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
  109. data/spec/fixtures/tarball/tarball.tar.gz +0 -0
  110. data/spec/fixtures/unit/action/r10k.yaml +0 -5
  111. data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
  112. data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
  113. data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
  114. data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
  115. data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
  116. data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
  117. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
  118. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
  119. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
  120. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
  121. data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
  122. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
  123. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
  124. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
  125. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
  126. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
  127. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
  128. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
  129. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  130. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
  131. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
  132. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  133. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  134. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
  135. data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
  136. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  137. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
  138. data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
  139. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  140. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  141. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
  142. data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
  143. data/spec/integration/git/rugged/cache_spec.rb +0 -33
  144. data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
  145. data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
  146. data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
  147. data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
  148. data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
  149. data/spec/integration/git/stateful_repository_spec.rb +0 -159
  150. data/spec/integration/util/purageable_spec.rb +0 -41
  151. data/spec/matchers/exit_with.rb +0 -28
  152. data/spec/matchers/match_realpath.rb +0 -18
  153. data/spec/r10k-mocks/mock_config.rb +0 -33
  154. data/spec/r10k-mocks/mock_env.rb +0 -18
  155. data/spec/r10k-mocks/mock_source.rb +0 -17
  156. data/spec/r10k-mocks.rb +0 -3
  157. data/spec/shared-contexts/git-fixtures.rb +0 -55
  158. data/spec/shared-contexts/tarball.rb +0 -32
  159. data/spec/shared-examples/deploy-actions.rb +0 -69
  160. data/spec/shared-examples/git/bare_repository.rb +0 -132
  161. data/spec/shared-examples/git/thin_repository.rb +0 -26
  162. data/spec/shared-examples/git/working_repository.rb +0 -207
  163. data/spec/shared-examples/git-repository.rb +0 -38
  164. data/spec/shared-examples/puppetfile-action.rb +0 -39
  165. data/spec/shared-examples/settings/ancestry.rb +0 -44
  166. data/spec/shared-examples/subprocess-runner.rb +0 -89
  167. data/spec/spec_helper.rb +0 -41
  168. data/spec/unit/action/cri_runner_spec.rb +0 -72
  169. data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
  170. data/spec/unit/action/deploy/display_spec.rb +0 -61
  171. data/spec/unit/action/deploy/environment_spec.rb +0 -640
  172. data/spec/unit/action/deploy/module_spec.rb +0 -476
  173. data/spec/unit/action/puppetfile/check_spec.rb +0 -53
  174. data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
  175. data/spec/unit/action/puppetfile/install_spec.rb +0 -112
  176. data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
  177. data/spec/unit/action/runner_spec.rb +0 -407
  178. data/spec/unit/action/visitor_spec.rb +0 -39
  179. data/spec/unit/cli_spec.rb +0 -9
  180. data/spec/unit/deployment/config_spec.rb +0 -33
  181. data/spec/unit/deployment_spec.rb +0 -162
  182. data/spec/unit/environment/bare_spec.rb +0 -13
  183. data/spec/unit/environment/base_spec.rb +0 -122
  184. data/spec/unit/environment/git_spec.rb +0 -114
  185. data/spec/unit/environment/name_spec.rb +0 -181
  186. data/spec/unit/environment/plain_spec.rb +0 -8
  187. data/spec/unit/environment/svn_spec.rb +0 -146
  188. data/spec/unit/environment/tarball_spec.rb +0 -45
  189. data/spec/unit/environment/with_modules_spec.rb +0 -75
  190. data/spec/unit/errors/formatting_spec.rb +0 -84
  191. data/spec/unit/feature_spec.rb +0 -50
  192. data/spec/unit/forge/module_release_spec.rb +0 -213
  193. data/spec/unit/git/alternates_spec.rb +0 -116
  194. data/spec/unit/git/cache_spec.rb +0 -66
  195. data/spec/unit/git/rugged/cache_spec.rb +0 -48
  196. data/spec/unit/git/rugged/credentials_spec.rb +0 -215
  197. data/spec/unit/git/shellgit/cache_spec.rb +0 -27
  198. data/spec/unit/git/stateful_repository_spec.rb +0 -45
  199. data/spec/unit/git_spec.rb +0 -102
  200. data/spec/unit/initializers_spec.rb +0 -68
  201. data/spec/unit/instance_cache_spec.rb +0 -78
  202. data/spec/unit/keyed_factory_spec.rb +0 -51
  203. data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
  204. data/spec/unit/logging_spec.rb +0 -68
  205. data/spec/unit/module/base_spec.rb +0 -118
  206. data/spec/unit/module/forge_spec.rb +0 -271
  207. data/spec/unit/module/git_spec.rb +0 -387
  208. data/spec/unit/module/metadata_file_spec.rb +0 -68
  209. data/spec/unit/module/svn_spec.rb +0 -208
  210. data/spec/unit/module/tarball_spec.rb +0 -70
  211. data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
  212. data/spec/unit/module_spec.rb +0 -114
  213. data/spec/unit/puppetfile_spec.rb +0 -304
  214. data/spec/unit/settings/collection_spec.rb +0 -123
  215. data/spec/unit/settings/container_spec.rb +0 -92
  216. data/spec/unit/settings/definition_spec.rb +0 -79
  217. data/spec/unit/settings/enum_definition_spec.rb +0 -20
  218. data/spec/unit/settings/inheritance_spec.rb +0 -38
  219. data/spec/unit/settings/list_spec.rb +0 -88
  220. data/spec/unit/settings/loader_spec.rb +0 -110
  221. data/spec/unit/settings/uri_definition_spec.rb +0 -23
  222. data/spec/unit/settings_spec.rb +0 -303
  223. data/spec/unit/source/base_spec.rb +0 -31
  224. data/spec/unit/source/exec_spec.rb +0 -81
  225. data/spec/unit/source/git_spec.rb +0 -233
  226. data/spec/unit/source/hash_spec.rb +0 -54
  227. data/spec/unit/source/svn_spec.rb +0 -196
  228. data/spec/unit/source/yaml_spec.rb +0 -42
  229. data/spec/unit/source_spec.rb +0 -10
  230. data/spec/unit/svn/remote_spec.rb +0 -21
  231. data/spec/unit/svn/working_dir_spec.rb +0 -56
  232. data/spec/unit/tarball_spec.rb +0 -57
  233. data/spec/unit/util/attempt_spec.rb +0 -82
  234. data/spec/unit/util/cacheable_spec.rb +0 -23
  235. data/spec/unit/util/commands_spec.rb +0 -61
  236. data/spec/unit/util/downloader_spec.rb +0 -98
  237. data/spec/unit/util/exec_env_spec.rb +0 -56
  238. data/spec/unit/util/purgeable_spec.rb +0 -267
  239. data/spec/unit/util/setopts_spec.rb +0 -83
  240. data/spec/unit/util/subprocess/result_spec.rb +0 -36
  241. data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
  242. data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
  243. data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
  244. data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
  245. data/spec/unit/util/subprocess_spec.rb +0 -65
  246. data/spec/unit/util/symbolize_keys_spec.rb +0 -67
@@ -1,476 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'r10k/action/deploy/module'
4
-
5
- describe R10K::Action::Deploy::Module do
6
-
7
- subject { described_class.new({config: "/some/nonexistent/path"}, [], {}) }
8
-
9
- it_behaves_like "a deploy action that requires a config file"
10
- it_behaves_like "a deploy action that can be write locked"
11
-
12
- describe "initializing" do
13
- it "accepts an environment option" do
14
- described_class.new({environment: "production"}, [], {})
15
- end
16
-
17
- it "can accept a no-force option" do
18
- described_class.new({:'no-force' => true}, [], {})
19
- end
20
-
21
- it 'can accept a generate-types option' do
22
- described_class.new({ 'generate-types': true }, [], {})
23
- end
24
-
25
- it 'can accept a puppet-path option' do
26
- described_class.new({ 'puppet-path': '/nonexistent' }, [], {})
27
- end
28
-
29
- it 'can accept a puppet-conf option' do
30
- described_class.new({ 'puppet-conf': '/nonexistent' }, [], {})
31
- end
32
-
33
- it 'can accept a cachedir option' do
34
- described_class.new({ cachedir: '/nonexistent' }, [], {})
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
44
-
45
- it 'can accept an app id option' do
46
- described_class.new({ 'github-app-id': '/nonexistent' }, [], {})
47
- end
48
-
49
- it 'can accept a ttl option' do
50
- described_class.new({ 'github-app-ttl': '/nonexistent' }, [], {})
51
- end
52
-
53
- it 'can accept a ssl private key option' do
54
- described_class.new({ 'github-app-key': '/nonexistent' }, [], {})
55
- end
56
-
57
- it 'can accept a exclude-spec option' do
58
- described_class.new({ :'exclude-spec' => true }, [], {})
59
- end
60
- end
61
-
62
- describe "with no-force" do
63
-
64
- subject { described_class.new({ config: "/some/nonexistent/path", :'no-force' => true}, [], {}) }
65
-
66
- it "tries to preserve local modifications" do
67
- expect(subject.settings[:overrides][:modules][:force]).to equal(false)
68
- end
69
- end
70
-
71
- describe 'generate-types' do
72
- let(:deployment) do
73
- R10K::Deployment.new(
74
- sources: {
75
- control: {
76
- type: :mock,
77
- basedir: '/some/nonexistent/path/control',
78
- environments: %w[first second]
79
- }
80
- },
81
- overrides: {
82
- modules: {
83
- pool_size: 4
84
- }
85
- }
86
- )
87
- end
88
-
89
- before do
90
- allow(R10K::Deployment).to receive(:new).and_return(deployment)
91
- end
92
-
93
- context 'with generate-types enabled' do
94
- subject do
95
- described_class.new(
96
- {
97
- config: '/some/nonexistent/path',
98
- 'generate-types': true
99
- },
100
- %w[first],
101
- {}
102
- )
103
- end
104
-
105
- it 'generate_types is true' do
106
- expect(subject.settings[:overrides][:environments][:generate_types]).to eq(true)
107
- end
108
-
109
- it 'only calls puppet generate types on environments where the specified module was updated' do
110
- allow(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
111
- if environment.name == 'first'
112
- expect(environment).to receive(:deploy).and_return(['first'])
113
- expect(environment).to receive(:generate_types!)
114
- else
115
- expect(environment).to receive(:deploy).and_return([])
116
- expect(environment).not_to receive(:generate_types!)
117
- end
118
- original.call(environment, &block)
119
- end
120
- subject.call
121
- end
122
- end
123
-
124
- context 'with generate-types disabled' do
125
- subject do
126
- described_class.new(
127
- {
128
- config: '/some/nonexistent/path',
129
- 'generate-types': false
130
- },
131
- %w[first],
132
- {}
133
- )
134
- end
135
-
136
- it 'generate_types is false' do
137
- expect(subject.settings[:overrides][:environments][:generate_types]).to eq(false)
138
- end
139
-
140
- it 'does not call puppet generate types' do |it|
141
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
142
- expect(environment).not_to receive(:generate_types!)
143
- original.call(environment, &block)
144
- end.twice
145
- subject.call
146
- end
147
- end
148
- end
149
-
150
- describe 'with puppet-path' do
151
-
152
- subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-path': '/nonexistent' }, [], {}) }
153
-
154
- it 'sets puppet_path' do
155
- expect(subject.instance_variable_get(:@puppet_path)).to eq('/nonexistent')
156
- end
157
- end
158
-
159
- describe 'with puppet-conf' do
160
-
161
- subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-conf': '/nonexistent' }, [], {}) }
162
-
163
- it 'sets puppet_conf' do
164
- expect(subject.instance_variable_get(:@puppet_conf)).to eq('/nonexistent')
165
- end
166
- end
167
-
168
- describe 'with cachedir' do
169
-
170
- subject { described_class.new({ config: '/some/nonexistent/path', cachedir: '/nonexistent' }, [], {}) }
171
-
172
- it 'sets cachedir' do
173
- expect(subject.instance_variable_get(:@cachedir)).to eq('/nonexistent')
174
- end
175
- end
176
-
177
- describe 'with private-key' do
178
-
179
- subject { described_class.new({ config: '/some/nonexistent/path', 'private-key': '/nonexistent' }, [], {}) }
180
-
181
- it 'sets private_key' do
182
- expect(subject.instance_variable_get(:@private_key)).to eq('/nonexistent')
183
- end
184
- end
185
-
186
- describe 'with oauth-token' do
187
-
188
- subject { described_class.new({ config: '/some/nonexistent/path', 'oauth-token': '/nonexistent' }, [], {}) }
189
-
190
- it 'sets token_path' do
191
- expect(subject.instance_variable_get(:@oauth_token)).to eq('/nonexistent')
192
- end
193
- end
194
-
195
- describe 'with github-app-id' do
196
-
197
- subject { described_class.new({ config: '/some/nonexistent/path', 'github-app-id': '/nonexistent' }, [], {}) }
198
-
199
- it 'sets github-app-id' do
200
- expect(subject.instance_variable_get(:@github_app_id)).to eq('/nonexistent')
201
- end
202
- end
203
-
204
- describe 'with github-app-key' do
205
-
206
- subject { described_class.new({ config: '/some/nonexistent/path', 'github-app-key': '/nonexistent' }, [], {}) }
207
-
208
- it 'sets github-app-key' do
209
- expect(subject.instance_variable_get(:@github_app_key)).to eq('/nonexistent')
210
- end
211
- end
212
-
213
- describe 'with github-app-ttl' do
214
-
215
- subject { described_class.new({ config: '/some/nonexistent/path', 'github-app-ttl': '/nonexistent' }, [], {}) }
216
-
217
- it 'sets github-app-ttl' do
218
- expect(subject.instance_variable_get(:@github_app_ttl)).to eq('/nonexistent')
219
- end
220
- end
221
-
222
- describe 'with modules' do
223
-
224
- subject { described_class.new({ config: '/some/nonexistent/path' }, ['mod1', 'mod2'], {}) }
225
-
226
- let(:cache) { instance_double("R10K::Git::Cache", 'sanitized_dirname' => 'foo', 'cached?' => true, 'sync' => true) }
227
- let(:repo) { instance_double("R10K::Git::StatefulRepository", cache: cache, resolve: 'main', tracked_paths: []) }
228
-
229
- it 'does not sync modules not given' do
230
- allow(R10K::Deployment).to receive(:new).and_wrap_original do |original, settings, &block|
231
- original.call(settings.merge({
232
- sources: {
233
- main: {
234
- remote: 'git://not/a/remote',
235
- basedir: '/not/a/basedir',
236
- type: 'git'
237
- }
238
- }
239
- }))
240
- end
241
-
242
- allow(R10K::Git::StatefulRepository).to receive(:new).and_return(repo)
243
- allow(R10K::Git).to receive_message_chain(:cache, :generate).and_return(cache)
244
- allow_any_instance_of(R10K::Source::Git).to receive(:environment_names).and_return([R10K::Environment::Name.new('first', {})])
245
-
246
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
247
- # For this test we want to have realistic Modules and access to
248
- # their internal Repos to validate the sync. Unfortunately, to
249
- # do so we do some invasive mocking, effectively implementing
250
- # our own R10K::ModuleLoader::Puppetfile#load. We directly update
251
- # the Environment's internal ModuleLoader and then call `load` on
252
- # it so it will create the correct loaded_content.
253
- loader = environment.loader
254
- allow(loader).to receive(:puppetfile_content).and_return('')
255
- expect(loader).to receive(:load) do
256
- loader.add_module('mod1', { git: 'git://remote' })
257
- loader.add_module('mod2', { git: 'git://remote' })
258
- loader.add_module('mod3', { git: 'git://remote' })
259
-
260
- loaded_content = loader.load!
261
- loaded_content[:modules].each do |mod|
262
- if ['mod1', 'mod2'].include?(mod.name)
263
- expect(mod.should_sync?).to be(true)
264
- else
265
- expect(mod.should_sync?).to be(false)
266
- end
267
- expect(mod).to receive(:sync).and_call_original
268
- end
269
-
270
- loaded_content
271
- end
272
-
273
- original.call(environment, &block)
274
- end
275
-
276
- expect(repo).to receive(:sync).twice
277
-
278
- subject.call
279
- end
280
- end
281
-
282
- describe 'with environments' do
283
- subject { described_class.new({ config: '/some/nonexistent/path', environment: 'first' }, ['mod1'], {}) }
284
-
285
- let(:cache) { instance_double("R10K::Git::Cache", 'sanitized_dirname' => 'foo', 'cached?' => true, 'sync' => true) }
286
- let(:repo) { instance_double("R10K::Git::StatefulRepository", cache: cache, resolve: 'main', tracked_paths: []) }
287
-
288
- it 'only syncs to the given environments' do
289
- allow(R10K::Deployment).to receive(:new).and_wrap_original do |original, settings, &block|
290
- original.call(settings.merge({
291
- sources: {
292
- main: {
293
- remote: 'git://not/a/remote',
294
- basedir: '/not/a/basedir',
295
- type: 'git'
296
- }
297
- }
298
- }))
299
- end
300
-
301
- allow(R10K::Git::StatefulRepository).to receive(:new).and_return(repo)
302
- allow(R10K::Git).to receive_message_chain(:cache, :generate).and_return(cache)
303
- allow_any_instance_of(R10K::Source::Git).to receive(:environment_names).and_return([R10K::Environment::Name.new('first', {}),
304
- R10K::Environment::Name.new('second', {})])
305
-
306
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
307
- loader = environment.loader
308
-
309
- if environment.name == 'first'
310
- # For this test we want to have realistic Modules and access to
311
- # their internal Repos to validate the sync. Unfortunately, to
312
- # do so we do some invasive mocking, effectively implementing
313
- # our own R10K::ModuleLoader::Puppetfile#load. We directly update
314
- # the Environment's internal ModuleLoader and then call `load` on
315
- # it so it will create the correct loaded_content.
316
- allow(loader).to receive(:puppetfile_content).and_return('')
317
- expect(loader).to receive(:load) do
318
- loader.add_module('mod1', { git: 'git://remote' })
319
- loader.add_module('mod2', { git: 'git://remote' })
320
-
321
- loaded_content = loader.load!
322
- loaded_content[:modules].each do |mod|
323
- if mod.name == 'mod1'
324
- expect(mod.should_sync?).to be(true)
325
- else
326
- expect(mod.should_sync?).to be(false)
327
- end
328
- expect(mod).to receive(:sync).and_call_original
329
- end
330
-
331
- loaded_content
332
- end
333
-
334
- else
335
- expect(loader).not_to receive(:load)
336
- end
337
-
338
- original.call(environment, &block)
339
- end.twice
340
-
341
- expect(repo).to receive(:sync).once
342
- expect(subject.logger).to receive(:debug1).with(/Updating modules.*in environment.*first/i)
343
- expect(subject.logger).to receive(:debug1).with(/skipping environment.*second/i)
344
-
345
- subject.call
346
- end
347
- end
348
-
349
-
350
- describe "postrun" do
351
- let(:mock_config) do
352
- R10K::Deployment::MockConfig.new(
353
- :sources => {
354
- :control => {
355
- :type => :mock,
356
- :basedir => '/some/nonexistent/path/control',
357
- :environments => %w[first second third],
358
- }
359
- }
360
- )
361
- end
362
-
363
- context "basic postrun hook" do
364
- let(:settings) { { postrun: ["/path/to/executable", "arg1", "arg2"] } }
365
- let(:deployment) { R10K::Deployment.new(mock_config.merge(settings)) }
366
-
367
- before do
368
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
369
- end
370
-
371
- subject do
372
- described_class.new({config: "/some/nonexistent/path" },
373
- ['mod1'], settings)
374
- end
375
-
376
- it "is passed to Subprocess" do
377
- mock_subprocess = double
378
- allow(mock_subprocess).to receive(:logger=)
379
- expect(mock_subprocess).to receive(:execute)
380
-
381
- expect(R10K::Util::Subprocess).to receive(:new).
382
- with(["/path/to/executable", "arg1", "arg2"]).
383
- and_return(mock_subprocess)
384
-
385
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
386
- modified = subject.instance_variable_get(:@modified_envs) << environment
387
- subject.instance_variable_set(:modified_envs, modified)
388
- end.exactly(3).times
389
-
390
- subject.call
391
- end
392
- end
393
-
394
- context "supports environments" do
395
- context "with one environment" do
396
- let(:settings) { { postrun: ["/generate/types/wrapper", "$modifiedenvs"] } }
397
- let(:deployment) { R10K::Deployment.new(mock_config.merge(settings)) }
398
-
399
- before do
400
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
401
- end
402
-
403
- subject do
404
- described_class.new({ config: '/some/nonexistent/path',
405
- environment: 'first' },
406
- ['mod1'], settings)
407
- end
408
-
409
- it "properly substitutes the environment" do
410
- mock_subprocess = double
411
- allow(mock_subprocess).to receive(:logger=)
412
- expect(mock_subprocess).to receive(:execute)
413
-
414
- expect(R10K::Util::Subprocess).to receive(:new).
415
- with(["/generate/types/wrapper", "first"]).
416
- and_return(mock_subprocess)
417
-
418
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
419
- if environment.name == 'first'
420
- expect(environment).to receive(:deploy).and_return(['first'])
421
- end
422
- original.call(environment, &block)
423
- end.exactly(3).times
424
-
425
- subject.call
426
- end
427
- end
428
-
429
- context "with all environments" do
430
- let(:settings) { { postrun: ["/generate/types/wrapper", "$modifiedenvs"] } }
431
- let(:deployment) { R10K::Deployment.new(mock_config.merge(settings)) }
432
-
433
- before do
434
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
435
- end
436
-
437
- subject do
438
- described_class.new({ config: '/some/nonexistent/path' },
439
- ['mod1'], settings)
440
- end
441
-
442
- it "properly substitutes the environment where modules were deployed" do
443
- mock_subprocess = double
444
- allow(mock_subprocess).to receive(:logger=)
445
- expect(mock_subprocess).to receive(:execute)
446
-
447
- expect(R10K::Util::Subprocess).to receive(:new).
448
- with(["/generate/types/wrapper", "first third"]).
449
- and_return(mock_subprocess)
450
-
451
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
452
- if ['first', 'third'].include?(environment.name)
453
- expect(environment).to receive(:deploy).and_return(['mod1'])
454
- end
455
- original.call(environment, &block)
456
- end.exactly(3).times
457
-
458
- subject.call
459
- end
460
-
461
- it "does not execute the command if no envs had the module" do
462
- expect(R10K::Util::Subprocess).not_to receive(:new)
463
-
464
- mock_mod2 = double('mock_mod', name: 'mod2')
465
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
466
- expect(environment).to receive(:deploy).and_return([])
467
- original.call(environment, &block)
468
- end.exactly(3).times
469
-
470
- subject.call
471
- end
472
- end
473
- end
474
- end
475
- end
476
-
@@ -1,53 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/action/puppetfile/check'
3
-
4
- describe R10K::Action::Puppetfile::Check do
5
- let(:default_opts) { {root: "/some/nonexistent/path"} }
6
- let(:loader) { instance_double('R10K::ModuleLoader::Puppetfile', :load! => {}) }
7
-
8
- def checker(opts = {}, argv = [], settings = {})
9
- opts = default_opts.merge(opts)
10
- return described_class.new(opts, argv, settings)
11
- end
12
-
13
- before(:each) do
14
- allow(R10K::ModuleLoader::Puppetfile).
15
- to receive(:new).
16
- with({
17
- basedir: "/some/nonexistent/path",
18
- }).and_return(loader)
19
- end
20
-
21
- it_behaves_like "a puppetfile action"
22
-
23
- it "prints 'Syntax OK' when the Puppetfile syntax could be validated" do
24
- expect($stderr).to receive(:puts).with("Syntax OK")
25
-
26
- checker.call
27
- end
28
-
29
- it "prints an error message when validating the Puppetfile syntax raised an error" do
30
- allow(loader).to receive(:load!).and_raise(R10K::Error.new("Boom!"))
31
- allow(R10K::Errors::Formatting).
32
- to receive(:format_exception).
33
- with(instance_of(R10K::Error), anything).
34
- and_return("Formatted error message")
35
-
36
- expect($stderr).to receive(:puts).with("Formatted error message")
37
-
38
- checker.call
39
- end
40
-
41
- it "respects --puppetfile option" do
42
- allow($stderr).to receive(:puts)
43
-
44
- expect(R10K::ModuleLoader::Puppetfile).
45
- to receive(:new).
46
- with({
47
- basedir: "/some/nonexistent/path",
48
- puppetfile: "/custom/puppetfile/path"
49
- }).and_return(loader)
50
-
51
- checker({puppetfile: "/custom/puppetfile/path"}).call
52
- end
53
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/action/puppetfile/cri_runner'
3
-
4
- describe R10K::Action::Puppetfile::CriRunner do
5
-
6
- let(:action_class) do
7
- Class.new do
8
- attr_reader :opts
9
- attr_reader :argv
10
-
11
- def initialize(opts, argv)
12
- @opts = opts
13
- @argv = argv
14
- end
15
-
16
- def call
17
- @opts[:runok]
18
- end
19
- end
20
- end
21
-
22
- subject(:cri_runner) { described_class.wrap(action_class) }
23
-
24
- let(:opts) { {:value => :yep} }
25
- let(:argv) { %w[value yes] }
26
-
27
- describe "handling options" do
28
- it "sets the root to the current wd" do
29
- expect(cri_runner).to receive(:wd).and_return('/some/nonexistent')
30
- expect(cri_runner.handle_opts({})).to include(:root => '/some/nonexistent')
31
- end
32
-
33
- describe "for the moduledir" do
34
- it "sets the option from the cli option if given" do
35
- opts = {:moduledir => '/some/other/nonexistent/modules'}
36
- expect(cri_runner.handle_opts(opts)).to include(:moduledir => '/some/other/nonexistent/modules')
37
- end
38
- end
39
-
40
- describe "for the puppetfile path" do
41
- it "sets the option from the cli option if given" do
42
- opts = {:puppetfile => '/some/other/nonexistent/modules'}
43
- expect(cri_runner.handle_opts(opts)).to include(:puppetfile => '/some/other/nonexistent/modules')
44
- end
45
- end
46
- end
47
- end
@@ -1,112 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/action/puppetfile/install'
3
-
4
- describe R10K::Action::Puppetfile::Install do
5
- let(:default_opts) { { root: "/some/nonexistent/path" } }
6
- let(:loader) {
7
- R10K::ModuleLoader::Puppetfile.new(
8
- basedir: '/some/nonexistent/path',
9
- overrides: {force: false})
10
- }
11
-
12
- def installer(opts = {}, argv = [], settings = {})
13
- opts = default_opts.merge(opts)
14
- return described_class.new(opts, argv, settings)
15
- end
16
-
17
- before(:each) do
18
- allow(loader).to receive(:load!).and_return({})
19
- allow(R10K::ModuleLoader::Puppetfile).to receive(:new).
20
- with({basedir: "/some/nonexistent/path",
21
- overrides: {force: false}}).
22
- and_return(loader)
23
- end
24
-
25
- it_behaves_like "a puppetfile install action"
26
-
27
- describe "installing modules" do
28
- let(:modules) do
29
- (1..4).map do |idx|
30
- R10K::Module::Base.new("author/modname#{idx}",
31
- "/some/nonexistent/path/modname#{idx}",
32
- {})
33
- end
34
- end
35
-
36
- before do
37
- allow(loader).to receive(:load!).and_return({
38
- modules: modules,
39
- managed_directories: [],
40
- desired_contents: [],
41
- purge_exclusions: []
42
- })
43
- end
44
-
45
- it "syncs each module in the Puppetfile" do
46
- modules.each { |m| expect(m).to receive(:sync) }
47
-
48
- expect(installer.call).to eq true
49
- end
50
-
51
- it "returns false if a module failed to install" do
52
- modules[0..2].each { |m| expect(m).to receive(:sync) }
53
- expect(modules[3]).to receive(:sync).and_raise
54
-
55
- expect(installer.call).to eq false
56
- end
57
- end
58
-
59
- describe "purging" do
60
- it "purges the moduledir after installation" do
61
- allow(loader).to receive(:load!).and_return({
62
- modules: [],
63
- desired_contents: [ 'root/foo' ],
64
- managed_directories: [ 'root' ],
65
- purge_exclusions: [ 'root/**/**.rb' ]
66
- })
67
-
68
- mock_cleaner = double("cleaner")
69
-
70
- expect(R10K::Util::Cleaner).to receive(:new).
71
- with(["root"], ["root/foo"], ["root/**/**.rb"]).
72
- and_return(mock_cleaner)
73
- expect(mock_cleaner).to receive(:purge!)
74
-
75
- installer.call
76
- end
77
- end
78
-
79
- describe "using custom paths" do
80
- it "can use a custom moduledir path" do
81
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
82
- with({basedir: "/some/nonexistent/path",
83
- overrides: { force: false },
84
- puppetfile: "/some/other/path/Puppetfile"}).
85
- and_return(loader)
86
-
87
- installer({puppetfile: "/some/other/path/Puppetfile"}).call
88
-
89
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
90
- with({basedir: "/some/nonexistent/path",
91
- overrides: { force: false },
92
- moduledir: "/some/other/path/site-modules"}).
93
- and_return(loader)
94
-
95
- installer({moduledir: "/some/other/path/site-modules"}).call
96
- end
97
- end
98
-
99
- describe "forcing to overwrite local changes" do
100
- it "can use the force overwrite option" do
101
- allow(loader).to receive(:load!).and_return({ modules: [] })
102
-
103
- subject = described_class.new({root: "/some/nonexistent/path", force: true}, [], {})
104
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
105
- with({basedir: "/some/nonexistent/path",
106
- overrides: { force: true }}).
107
- and_return(loader)
108
- subject.call
109
- end
110
-
111
- end
112
- end