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,640 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'r10k/deployment'
4
- require 'r10k/action/deploy/environment'
5
-
6
- describe R10K::Action::Deploy::Environment do
7
-
8
- subject { described_class.new({config: "/some/nonexistent/path"}, [], {}) }
9
-
10
- it_behaves_like "a deploy action that can be write locked"
11
- it_behaves_like "a deploy action that requires a config file"
12
-
13
- describe "initializing" do
14
- it "can accept a cachedir option" do
15
- described_class.new({cachedir: "/some/nonexistent/cachedir"}, [], {})
16
- end
17
-
18
- it "can accept a puppetfile option" do
19
- described_class.new({puppetfile: true}, [], {})
20
- end
21
-
22
- it "can accept a modules option" do
23
- described_class.new({modules: true}, [], {})
24
- end
25
-
26
- it "can accept a default_branch_override option" do
27
- described_class.new({:'default-branch-override' => 'default_branch_override_name'}, [], {})
28
- end
29
-
30
- it "can accept a no-force option" do
31
- described_class.new({:'no-force' => true}, [], {})
32
- end
33
-
34
- it 'can accept a generate-types option' do
35
- described_class.new({ 'generate-types': true }, [], {})
36
- end
37
-
38
- it 'can accept a puppet-path option' do
39
- described_class.new({ 'puppet-path': '/nonexistent' }, [], {})
40
- end
41
-
42
- it 'can accept a private-key option' do
43
- described_class.new({ 'private-key': '/nonexistent' }, [], {})
44
- end
45
-
46
- it 'can accept a token option' do
47
- described_class.new({ 'oauth-token': '/nonexistent' }, [], {})
48
- end
49
-
50
- it 'can accept an app id option' do
51
- described_class.new({ 'github-app-id': '/nonexistent' }, [], {})
52
- end
53
-
54
- it 'can accept a ttl option' do
55
- described_class.new({ 'github-app-ttl': '/nonexistent' }, [], {})
56
- end
57
-
58
- it 'can accept a ssl private key option' do
59
- described_class.new({ 'github-app-key': '/nonexistent' }, [], {})
60
- end
61
-
62
- it 'can accept a exclude-spec option' do
63
- described_class.new({ :'exclude-spec' => true }, [], {})
64
- end
65
-
66
- it 'can accept an incremental option' do
67
- described_class.new({ :incremental => true }, [], {})
68
- end
69
-
70
- describe "initializing errors" do
71
- let (:settings) { { deploy: { purge_levels: [:environment],
72
- purge_whitelist: ['coolfile', 'coolfile2'],
73
- purge_allowlist: ['anothercoolfile']}}}
74
-
75
- subject { described_class.new({config: "/some/nonexistent/path"}, [], settings)}
76
- it 'errors out when both purge_whitelist and purge_allowlist are set' do
77
- expect{subject}.to raise_error(R10K::Error, /Values found for both purge_whitelist and purge_allowlist./)
78
- end
79
- end
80
- end
81
-
82
- describe "when called" do
83
- let(:mock_config) do
84
- R10K::Deployment::MockConfig.new(
85
- :sources => {
86
- :control => {
87
- :type => :mock,
88
- :basedir => '/some/nonexistent/path/control',
89
- :environments => %w[first second third env-that/will-be-corrected],
90
- :prefix => 'PREFIX'
91
- }
92
- }
93
- )
94
- end
95
-
96
- describe "with puppetfile or modules flag" do
97
- let(:deployment) { R10K::Deployment.new(mock_config) }
98
- let(:loader) do
99
- instance_double("R10K::ModuleLoader::Puppetfile",
100
- :load => {
101
- :modules => ['foo'],
102
- :purge_exclusions => [],
103
- :managed_directories => [],
104
- :desired_contents => []
105
- }
106
- ).as_null_object
107
- end
108
-
109
- before do
110
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
111
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
112
- and_return(loader).at_least(:once)
113
- end
114
-
115
- it "syncs the puppetfile content when given the puppetfile flag" do
116
- expect(loader).to receive(:load).exactly(4).times
117
- expect(R10K::ContentSynchronizer).to receive(:concurrent_sync).exactly(4).times
118
- action = described_class.new({config: "/some/nonexistent/path", puppetfile: true}, [], {})
119
- action.call
120
- end
121
-
122
- it "syncs the puppetfile when given the modules flag" do
123
- expect(loader).to receive(:load).exactly(4).times
124
- expect(R10K::ContentSynchronizer).to receive(:concurrent_sync).exactly(4).times
125
- action = described_class.new({config: "/some/nonexistent/path", modules: true}, [], {})
126
- action.call
127
- end
128
- end
129
-
130
- describe "with incremental flag" do
131
- let(:loader) do
132
- instance_double("R10K::ModuleLoader::Puppetfile",
133
- :load => {
134
- :modules => ['foo'],
135
- :purge_exclusions => [],
136
- :managed_directories => [],
137
- :desired_contents => []
138
- }
139
- ).as_null_object
140
- end
141
-
142
- before do
143
- expect(R10K::Deployment).to receive(:new).and_wrap_original do |original, settings|
144
- original.call(mock_config.merge(settings))
145
- end
146
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
147
- and_return(loader).at_least(:once)
148
- end
149
-
150
- it "incremental flag causes the module definitons to be preloaded by the loader" do
151
- expect(loader).to receive(:load_metadata).exactly(4).times
152
- action = described_class.new({:config => "/some/nonexistent/path",
153
- :modules => true,
154
- :incremental => true},
155
- [],
156
- {})
157
- action.call
158
- end
159
- end
160
-
161
-
162
- describe "with an environment that doesn't exist" do
163
- let(:deployment) do
164
- R10K::Deployment.new(mock_config)
165
- end
166
-
167
- before do
168
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
169
- end
170
-
171
- subject { described_class.new({config: "/some/nonexistent/path"}, %w[not_an_environment], {}) }
172
-
173
- it "logs that the environments can't be deployed and returns false" do
174
- expect(subject.logger).to receive(:error).with("Environment(s) 'not_an_environment' cannot be found in any source and will not be deployed.")
175
- logger = subject.logger
176
- expect(subject.call).to eq false
177
- end
178
- end
179
-
180
- describe "with no-force" do
181
- subject { described_class.new({ config: "/some/nonexistent/path", modules: true, :'no-force' => true}, %w[first], {}) }
182
-
183
- it "tries to preserve local modifications" do
184
- expect(subject.settings[:overrides][:modules][:force]).to equal(false)
185
- end
186
- end
187
-
188
- describe "postrun" do
189
- context "basic postrun hook" do
190
- let(:settings) { { postrun: ["/path/to/executable", "arg1", "arg2"] } }
191
- let(:deployment) { R10K::Deployment.new(mock_config.merge(settings)) }
192
-
193
- before do
194
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
195
- end
196
-
197
- subject do
198
- described_class.new( {config: "/some/nonexistent/path" },
199
- %w[PREFIX_first],
200
- settings )
201
- end
202
-
203
- it "is passed to Subprocess" do
204
- mock_subprocess = double
205
- allow(mock_subprocess).to receive(:logger=)
206
- expect(mock_subprocess).to receive(:execute)
207
-
208
- expect(R10K::Util::Subprocess).to receive(:new).
209
- with(["/path/to/executable", "arg1", "arg2"]).
210
- and_return(mock_subprocess)
211
-
212
- subject.call
213
- end
214
- end
215
-
216
- context "supports environments" do
217
- context "when one environment" do
218
- let(:settings) { { postrun: ["/generate/types/wrapper", "$modifiedenvs"] } }
219
- let(:deployment) { R10K::Deployment.new(mock_config.merge(settings)) }
220
-
221
- before do
222
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
223
- end
224
-
225
- subject do
226
- described_class.new( {config: "/some/nonexistent/path" },
227
- %w[PREFIX_first],
228
- settings )
229
- end
230
-
231
- it "properly substitutes the environment" do
232
- mock_subprocess = double
233
- allow(mock_subprocess).to receive(:logger=)
234
- expect(mock_subprocess).to receive(:execute)
235
-
236
- expect(R10K::Util::Subprocess).to receive(:new).
237
- with(["/generate/types/wrapper", "PREFIX_first"]).
238
- and_return(mock_subprocess)
239
-
240
- subject.call
241
- end
242
- end
243
- context "when many environments" do
244
- let(:settings) { { postrun: ["/generate/types/wrapper", "$modifiedenvs"] } }
245
- let(:deployment) { R10K::Deployment.new(mock_config.merge(settings)) }
246
-
247
- before do
248
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
249
- end
250
-
251
- subject do
252
- described_class.new( {config: "/some/nonexistent/path" },
253
- [],
254
- settings )
255
- end
256
-
257
- it "properly substitutes the environment" do
258
- mock_subprocess = double
259
- allow(mock_subprocess).to receive(:logger=)
260
- expect(mock_subprocess).to receive(:execute)
261
-
262
- expect(R10K::Util::Subprocess).to receive(:new).
263
- with(["/generate/types/wrapper", "PREFIX_first PREFIX_second PREFIX_third PREFIX_env_that_will_be_corrected"]).
264
- and_return(mock_subprocess)
265
-
266
- subject.call
267
- end
268
- end
269
- end
270
- end
271
-
272
- describe "Purging white/allowlist" do
273
-
274
- let(:settings) { { pool_size: 4, deploy: { purge_levels: [:environment], purge_allowlist: ['coolfile', 'coolfile2'] } } }
275
- let(:overrides) { { environments: {}, modules: { pool_size: 4 }, purging: { purge_levels: [:environment], purge_allowlist: ['coolfile', 'coolfile2'] } } }
276
- let(:deployment) do
277
- R10K::Deployment.new(mock_config.merge({overrides: overrides}))
278
- end
279
- before do
280
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
281
- allow_any_instance_of(R10K::Environment::Base).to receive(:purge!)
282
- end
283
-
284
- subject { described_class.new({ config: "/some/nonexistent/path", modules: true }, %w[PREFIX_first], settings) }
285
-
286
- it "reads in the purge_allowlist setting and purges accordingly" do
287
- expect(subject.logger).to receive(:debug).with(/Purging unmanaged content for environment/)
288
- expect(subject.settings[:overrides][:purging][:purge_allowlist]).to eq(['coolfile', 'coolfile2'])
289
- subject.call
290
- end
291
-
292
- describe "purge_whitelist" do
293
- let (:settings) { { deploy: { purge_levels: [:environment], purge_whitelist: ['coolfile', 'coolfile2'] } } }
294
-
295
- it "reads in the purge_whitelist setting and still sets it to purge_allowlist and purges accordingly" do
296
- expect(subject.logger).to receive(:debug).with(/Purging unmanaged content for environment/)
297
- expect(subject.settings[:overrides][:purging][:purge_allowlist]).to eq(['coolfile', 'coolfile2'])
298
- subject.call
299
- end
300
- end
301
- end
302
-
303
- describe "purge_levels" do
304
- let(:settings) { { deploy: { purge_levels: purge_levels } } }
305
- let(:overrides) do
306
- {
307
- environments: {
308
- requested_environments: ['PREFIX_first']
309
- },
310
- modules: {
311
- deploy_modules: true,
312
- pool_size: 4
313
- },
314
- purging: {
315
- purge_levels: purge_levels
316
- }
317
- }
318
- end
319
-
320
- let(:deployment) do
321
- R10K::Deployment.new(mock_config.merge({ overrides: overrides }))
322
- end
323
-
324
- before do
325
- expect(R10K::Deployment).to receive(:new).and_return(deployment)
326
- allow_any_instance_of(R10K::Environment::Base).to receive(:purge!)
327
- end
328
-
329
- subject { described_class.new({ config: "/some/nonexistent/path", modules: true }, %w[PREFIX_first], settings) }
330
-
331
- describe "deployment purge level" do
332
- let(:purge_levels) { [:deployment] }
333
-
334
-
335
- it "updates the source's cache before it purges environments" do
336
- deployment.sources.each do |source|
337
- expect(source).to receive(:reload!).ordered
338
- end
339
- expect(deployment).to receive(:purge!).ordered
340
- subject.call
341
- end
342
-
343
- it "only logs about purging deployment" do
344
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, env, &block|
345
- expect(env.logger).to_not receive(:debug).with(/Purging unmanaged puppetfile content/)
346
- original.call(env)
347
- end.at_least(:once)
348
-
349
- expect(subject.logger).to receive(:debug).with(/Purging unmanaged environments for deployment/)
350
- expect(subject.logger).to_not receive(:debug).with(/Purging unmanaged content for environment/)
351
-
352
- subject.call
353
- end
354
- end
355
-
356
- describe "environment purge level" do
357
- let(:purge_levels) { [:environment] }
358
-
359
- it "only logs about purging environment" do
360
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, env, &block|
361
- expect(env.logger).to_not receive(:debug).with(/Purging unmanaged puppetfile content/)
362
- original.call(env)
363
- end.at_least(:once)
364
- expect(subject.logger).to receive(:debug).with(/Purging unmanaged content for environment/)
365
- expect(subject.logger).to_not receive(:debug).with(/Purging unmanaged environments for deployment/)
366
-
367
- subject.call
368
- end
369
-
370
- it "logs that environment was not purged if deploy failed" do
371
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, env, &block|
372
- if env.name =~ /first/
373
- expect(env).to receive(:deploy) { subject.instance_variable_set(:@visit_ok, false) }
374
- end
375
- original.call(env)
376
- end.at_least(:once)
377
-
378
- expect(subject.logger).to receive(:debug).with(/Not purging unmanaged content for environment/)
379
-
380
- subject.call
381
- end
382
- end
383
-
384
- describe "puppetfile purge level" do
385
- let(:purge_levels) { [:puppetfile] }
386
-
387
- it "only logs about purging puppetfile" do
388
- allow(R10K::ContentSynchronizer).to receive(:concurrent_sync)
389
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, env, &block|
390
- if env.name =~ /first/
391
- expect(env.logger).to receive(:debug).with(/Purging unmanaged Puppetfile content/)
392
- end
393
- original.call(env)
394
- end.at_least(:once)
395
-
396
- expect(subject.logger).to_not receive(:debug).with(/Purging unmanaged environments for deployment/)
397
- expect(subject.logger).to_not receive(:debug).with(/Purging unmanaged content for environment/)
398
-
399
- subject.call
400
- end
401
- end
402
- end
403
-
404
- describe "generate-types" do
405
- let(:deployment) do
406
- R10K::Deployment.new(
407
- R10K::Deployment::MockConfig.new(
408
- sources: {
409
- control: {
410
- type: :mock,
411
- basedir: '/some/nonexistent/path/control',
412
- environments: %w[first second]
413
- }
414
- },
415
- overrides: {
416
- modules: {
417
- pool_size: 4
418
- }
419
- }
420
- )
421
- )
422
- end
423
-
424
- before do
425
- allow(R10K::Deployment).to receive(:new).and_return(deployment)
426
- allow_any_instance_of(R10K::Environment::Base).to receive(:purge!)
427
-
428
- allow(subject).to receive(:write_environment_info!)
429
- expect(subject.logger).not_to receive(:error)
430
- end
431
-
432
- context 'with generate-types enabled' do
433
- subject do
434
- described_class.new(
435
- {
436
- config: '/some/nonexistent/path',
437
- modules: true,
438
- 'generate-types': true
439
- },
440
- %w[first second],
441
- {}
442
- )
443
- end
444
-
445
- it 'generate_types is true' do
446
- expect(subject.settings[:overrides][:environments][:generate_types]).to eq(true)
447
- end
448
-
449
- it 'only calls puppet generate types on specified environment' do
450
- settings = subject.instance_variable_get(:@settings)
451
- settings[:overrides][:environments][:requested_environments] = %w{first}
452
- subject.instance_variable_set(:@settings, settings)
453
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
454
- if environment.dirname == 'first'
455
- expect(environment).to receive(:generate_types!)
456
- else
457
- expect(environment).not_to receive(:generate_types!)
458
- end
459
- original.call(environment, &block)
460
- end.twice
461
- subject.call
462
- end
463
-
464
- it 'does not call puppet generate types on puppetfile failure' do
465
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
466
- allow(environment).to receive(:deploy) { subject.instance_variable_set(:@visit_ok, false) }
467
- expect(environment).not_to receive(:generate_types!)
468
- original.call(environment, &block)
469
- end.twice
470
- subject.call
471
- end
472
-
473
- it 'calls puppet generate types on previous puppetfile failure' do
474
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
475
- allow(environment).to receive(:deploy) do
476
- subject.instance_variable_set(:@visit_ok, false) if environment.dirname == 'first'
477
- end
478
-
479
- if environment.dirname == 'second'
480
- expect(environment).to receive(:generate_types!)
481
- else
482
- expect(environment).not_to receive(:generate_types!)
483
- end
484
- original.call(environment, &block)
485
- end.twice
486
- subject.call
487
- end
488
- end
489
-
490
- context 'with generate-types disabled' do
491
- subject do
492
- described_class.new(
493
- {
494
- config: '/some/nonexistent/path',
495
- modules: true,
496
- 'generate-types': false
497
- },
498
- %w[first],
499
- {}
500
- )
501
- end
502
-
503
- it 'generate_types is false' do
504
- expect(subject.settings[:overrides][:environments][:generate_types]).to eq(false)
505
- end
506
-
507
- it 'does not call puppet generate types' do
508
- expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
509
- expect(environment).not_to receive(:generate_types!)
510
- original.call(environment, &block)
511
- end.twice
512
- subject.call
513
- end
514
- end
515
- end
516
-
517
- describe 'with puppet-path' do
518
-
519
- subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-path': '/nonexistent' }, [], {}) }
520
-
521
- it 'sets puppet_path' do
522
- expect(subject.instance_variable_get(:@puppet_path)).to eq('/nonexistent')
523
- end
524
- end
525
-
526
- describe 'with puppet-conf' do
527
-
528
- subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-conf': '/nonexistent' }, [], {}) }
529
-
530
- it 'sets puppet_conf' do
531
- expect(subject.instance_variable_get(:@puppet_conf)).to eq('/nonexistent')
532
- end
533
- end
534
-
535
- describe 'with private-key' do
536
-
537
- subject { described_class.new({ config: '/some/nonexistent/path', 'private-key': '/nonexistent' }, [], {}) }
538
-
539
- it 'sets private_key' do
540
- expect(subject.instance_variable_get(:@private_key)).to eq('/nonexistent')
541
- end
542
- end
543
-
544
- describe 'with oauth-token' do
545
-
546
- subject { described_class.new({ config: '/some/nonexistent/path', 'oauth-token': '/nonexistent' }, [], {}) }
547
-
548
- it 'sets oauth_token' do
549
- expect(subject.instance_variable_get(:@oauth_token)).to eq('/nonexistent')
550
- end
551
- end
552
- end
553
-
554
- describe "write_environment_info!" do
555
-
556
- class Fake_Environment
557
- attr_accessor :path
558
- attr_accessor :puppetfile
559
- attr_accessor :info
560
-
561
- def initialize(path, info)
562
- @path = path
563
- @info = info
564
- @puppetfile = R10K::Puppetfile.new("", {})
565
- end
566
- end
567
-
568
- let(:mock_stateful_repo_1) { instance_double("R10K::Git::StatefulRepository", :head => "123456") }
569
- let(:mock_stateful_repo_2) { instance_double("R10K::Git::StatefulRepository", :head => "654321") }
570
- let(:mock_git_module_1) do
571
- instance_double("R10K::Module::Git",
572
- :name => "my_cool_module",
573
- :properties => {
574
- :type => :git,
575
- :expected => "1.0",
576
- :actual => mock_stateful_repo_1.head
577
- })
578
- end
579
- let(:mock_git_module_2) do
580
- instance_double("R10K::Module::Git",
581
- :name => "my_uncool_module",
582
- :properties => {
583
- :type => :git,
584
- :expected => "0.0.1",
585
- :actual => mock_stateful_repo_2.head
586
- })
587
- end
588
- let(:mock_forge_module_1) { double(:name => "their_shiny_module", :properties => { :expected => "2.0.0" }) }
589
-
590
- before(:all) do
591
- @tmp_path = "./tmp-r10k-test-dir/"
592
- Dir.mkdir(@tmp_path) unless File.exists?(@tmp_path)
593
- end
594
-
595
- after(:all) do
596
- File.delete("#{@tmp_path}/.r10k-deploy.json")
597
- Dir.delete(@tmp_path)
598
- end
599
-
600
- it "writes the .r10k-deploy file correctly if all goes well" do
601
- fake_env = Fake_Environment.new(@tmp_path, {:name => "my_cool_environment", :signature => "pablo picasso"})
602
- allow(fake_env).to receive(:modules).and_return([mock_git_module_1, mock_git_module_2, mock_forge_module_1])
603
- subject.send(:write_environment_info!, fake_env, "2019-01-01 23:23:22 +0000", true)
604
-
605
- file_contents = File.read("#{@tmp_path}/.r10k-deploy.json")
606
- r10k_deploy = JSON.parse(file_contents)
607
-
608
- expect(r10k_deploy['name']).to eq("my_cool_environment")
609
- expect(r10k_deploy['signature']).to eq("pablo picasso")
610
- expect(r10k_deploy['started_at']).to eq("2019-01-01 23:23:22 +0000")
611
- expect(r10k_deploy['deploy_success']).to eq(true)
612
- expect(r10k_deploy['module_deploys'].length).to eq(3)
613
- expect(r10k_deploy['module_deploys'][0]['name']).to eq("my_cool_module")
614
- expect(r10k_deploy['module_deploys'][0]['version']).to eq("1.0")
615
- expect(r10k_deploy['module_deploys'][0]['sha']).to eq("123456")
616
- expect(r10k_deploy['module_deploys'][1]['name']).to eq("my_uncool_module")
617
- expect(r10k_deploy['module_deploys'][1]['version']).to eq("0.0.1")
618
- expect(r10k_deploy['module_deploys'][1]['sha']).to eq("654321")
619
- expect(r10k_deploy['module_deploys'][2]['name']).to eq("their_shiny_module")
620
- expect(r10k_deploy['module_deploys'][2]['version']).to eq("2.0.0")
621
- expect(r10k_deploy['module_deploys'][2]['sha']).to eq(nil)
622
- end
623
-
624
- it "writes the .r10k-deploy file correctly if there's a failure" do
625
- fake_env = Fake_Environment.new(@tmp_path, {:name => "my_cool_environment", :signature => "pablo picasso"})
626
- allow(fake_env).to receive(:modules).and_return([mock_git_module_1, mock_git_module_2, mock_forge_module_1])
627
- allow(mock_forge_module_1).to receive(:properties).and_raise(StandardError)
628
- subject.send(:write_environment_info!, fake_env, "2019-01-01 23:23:22 +0000", true)
629
-
630
- file_contents = File.read("#{@tmp_path}/.r10k-deploy.json")
631
- r10k_deploy = JSON.parse(file_contents)
632
-
633
- expect(r10k_deploy['name']).to eq("my_cool_environment")
634
- expect(r10k_deploy['signature']).to eq("pablo picasso")
635
- expect(r10k_deploy['started_at']).to eq("2019-01-01 23:23:22 +0000")
636
- expect(r10k_deploy['deploy_success']).to eq(true)
637
- expect(r10k_deploy['module_deploys'].length).to eq(0)
638
- end
639
- end
640
- end