r10k 3.15.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +17 -0
  3. data/.github/workflows/docker.yml +4 -4
  4. data/.github/workflows/release.yml +2 -2
  5. data/.github/workflows/rspec_tests.yml +10 -11
  6. data/.github/workflows/stale.yml +1 -1
  7. data/CHANGELOG.mkd +66 -0
  8. data/CODEOWNERS +1 -2
  9. data/Gemfile +2 -2
  10. data/README.mkd +16 -17
  11. data/doc/common-patterns.mkd +1 -2
  12. data/doc/dynamic-environments/configuration.mkd +78 -2
  13. data/doc/puppetfile.mkd +9 -3
  14. data/integration/Gemfile +1 -1
  15. data/integration/Rakefile +1 -1
  16. data/integration/files/pre-suite/git_config.pp.erb +1 -1
  17. data/integration/pre-suite/00_pe_install.rb +3 -0
  18. data/integration/pre-suite/10_git_config.rb +0 -3
  19. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
  20. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
  21. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
  22. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
  23. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
  24. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
  25. data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
  26. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
  27. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
  28. data/integration/tests/git_source/git_source_git.rb +1 -4
  29. data/integration/tests/git_source/git_source_repeated_remote.rb +0 -3
  30. data/integration/tests/git_source/git_source_submodule.rb +1 -1
  31. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
  32. data/integration/tests/purging/content_not_purged_at_root.rb +0 -3
  33. data/integration/tests/purging/default_purging.rb +0 -3
  34. data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
  35. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +0 -3
  36. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +0 -3
  37. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +0 -3
  38. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
  39. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
  40. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
  41. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
  42. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
  43. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
  44. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +0 -3
  45. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
  46. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
  47. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
  48. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
  49. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +0 -3
  50. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
  51. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
  52. data/lib/r10k/action/deploy/environment.rb +2 -19
  53. data/lib/r10k/action/deploy/module.rb +1 -0
  54. data/lib/r10k/action/puppetfile/check.rb +7 -0
  55. data/lib/r10k/action/puppetfile/install.rb +3 -1
  56. data/lib/r10k/cli/deploy.rb +15 -1
  57. data/lib/r10k/cli/puppetfile.rb +1 -0
  58. data/lib/r10k/content_synchronizer.rb +7 -2
  59. data/lib/r10k/environment.rb +0 -1
  60. data/lib/r10k/git/rugged/bare_repository.rb +4 -3
  61. data/lib/r10k/git/rugged/working_repository.rb +7 -5
  62. data/lib/r10k/git/shellgit/working_repository.rb +3 -3
  63. data/lib/r10k/git/stateful_repository.rb +2 -2
  64. data/lib/r10k/module/base.rb +3 -3
  65. data/lib/r10k/module/git.rb +18 -4
  66. data/lib/r10k/module_loader/puppetfile.rb +14 -9
  67. data/lib/r10k/puppetfile.rb +1 -1
  68. data/lib/r10k/settings.rb +6 -7
  69. data/lib/r10k/version.rb +1 -1
  70. data/locales/r10k.pot +34 -82
  71. data/r10k.gemspec +5 -7
  72. metadata +22 -211
  73. data/docker/.gitignore +0 -1
  74. data/docker/.rspec +0 -4
  75. data/docker/Gemfile +0 -11
  76. data/docker/Makefile +0 -99
  77. data/docker/README.md +0 -28
  78. data/docker/docker-compose.yml +0 -18
  79. data/docker/r10k/Dockerfile +0 -68
  80. data/docker/r10k/adduser.sh +0 -13
  81. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
  82. data/docker/r10k/docker-entrypoint.sh +0 -10
  83. data/docker/r10k/release.Dockerfile +0 -55
  84. data/docker/spec/dockerfile_spec.rb +0 -37
  85. data/docker/spec/fixtures/Puppetfile +0 -2
  86. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
  87. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
  88. data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
  89. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
  90. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
  91. data/lib/r10k/environment/bare.rb +0 -13
  92. data/spec/fixtures/empty/.empty +0 -0
  93. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  94. data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
  95. data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
  96. data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
  97. data/spec/fixtures/tarball/tarball.tar.gz +0 -0
  98. data/spec/fixtures/unit/action/r10k.yaml +0 -5
  99. data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
  100. data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
  101. data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
  102. data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
  103. data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
  104. data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
  105. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
  106. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
  107. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
  108. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
  109. data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
  110. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
  111. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
  112. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
  113. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
  114. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
  115. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
  116. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
  117. data/spec/fixtures/unit/puppetfile/various-modules/modules/apt/.gitkeep +0 -1
  118. data/spec/fixtures/unit/puppetfile/various-modules/modules/baz/.gitkeep +0 -1
  119. data/spec/fixtures/unit/puppetfile/various-modules/modules/buzz/.gitkeep +0 -1
  120. data/spec/fixtures/unit/puppetfile/various-modules/modules/canary/.gitkeep +0 -1
  121. data/spec/fixtures/unit/puppetfile/various-modules/modules/fizz/.gitkeep +0 -1
  122. data/spec/fixtures/unit/puppetfile/various-modules/modules/rpm/.gitkeep +0 -1
  123. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  124. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
  125. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
  126. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  127. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  128. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
  129. data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
  130. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  131. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
  132. data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
  133. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  134. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  135. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
  136. data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
  137. data/spec/integration/git/rugged/cache_spec.rb +0 -33
  138. data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
  139. data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
  140. data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
  141. data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
  142. data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
  143. data/spec/integration/git/stateful_repository_spec.rb +0 -175
  144. data/spec/integration/util/purageable_spec.rb +0 -41
  145. data/spec/matchers/exit_with.rb +0 -28
  146. data/spec/matchers/match_realpath.rb +0 -18
  147. data/spec/r10k-mocks/mock_config.rb +0 -33
  148. data/spec/r10k-mocks/mock_env.rb +0 -18
  149. data/spec/r10k-mocks/mock_source.rb +0 -17
  150. data/spec/r10k-mocks.rb +0 -3
  151. data/spec/shared-contexts/git-fixtures.rb +0 -55
  152. data/spec/shared-contexts/tarball.rb +0 -32
  153. data/spec/shared-examples/deploy-actions.rb +0 -69
  154. data/spec/shared-examples/git/bare_repository.rb +0 -132
  155. data/spec/shared-examples/git/thin_repository.rb +0 -26
  156. data/spec/shared-examples/git/working_repository.rb +0 -207
  157. data/spec/shared-examples/git-repository.rb +0 -38
  158. data/spec/shared-examples/puppetfile-action.rb +0 -39
  159. data/spec/shared-examples/settings/ancestry.rb +0 -44
  160. data/spec/shared-examples/subprocess-runner.rb +0 -89
  161. data/spec/spec_helper.rb +0 -41
  162. data/spec/unit/action/cri_runner_spec.rb +0 -72
  163. data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
  164. data/spec/unit/action/deploy/display_spec.rb +0 -61
  165. data/spec/unit/action/deploy/environment_spec.rb +0 -640
  166. data/spec/unit/action/deploy/module_spec.rb +0 -476
  167. data/spec/unit/action/puppetfile/check_spec.rb +0 -53
  168. data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
  169. data/spec/unit/action/puppetfile/install_spec.rb +0 -112
  170. data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
  171. data/spec/unit/action/runner_spec.rb +0 -407
  172. data/spec/unit/action/visitor_spec.rb +0 -39
  173. data/spec/unit/cli_spec.rb +0 -9
  174. data/spec/unit/deployment/config_spec.rb +0 -33
  175. data/spec/unit/deployment_spec.rb +0 -162
  176. data/spec/unit/environment/bare_spec.rb +0 -13
  177. data/spec/unit/environment/base_spec.rb +0 -122
  178. data/spec/unit/environment/git_spec.rb +0 -114
  179. data/spec/unit/environment/name_spec.rb +0 -181
  180. data/spec/unit/environment/plain_spec.rb +0 -8
  181. data/spec/unit/environment/svn_spec.rb +0 -146
  182. data/spec/unit/environment/tarball_spec.rb +0 -45
  183. data/spec/unit/environment/with_modules_spec.rb +0 -122
  184. data/spec/unit/errors/formatting_spec.rb +0 -84
  185. data/spec/unit/feature_spec.rb +0 -50
  186. data/spec/unit/forge/module_release_spec.rb +0 -213
  187. data/spec/unit/git/alternates_spec.rb +0 -116
  188. data/spec/unit/git/cache_spec.rb +0 -66
  189. data/spec/unit/git/rugged/cache_spec.rb +0 -48
  190. data/spec/unit/git/rugged/credentials_spec.rb +0 -215
  191. data/spec/unit/git/shellgit/cache_spec.rb +0 -27
  192. data/spec/unit/git/stateful_repository_spec.rb +0 -45
  193. data/spec/unit/git_spec.rb +0 -102
  194. data/spec/unit/initializers_spec.rb +0 -68
  195. data/spec/unit/instance_cache_spec.rb +0 -78
  196. data/spec/unit/keyed_factory_spec.rb +0 -51
  197. data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
  198. data/spec/unit/logging_spec.rb +0 -68
  199. data/spec/unit/module/base_spec.rb +0 -118
  200. data/spec/unit/module/forge_spec.rb +0 -271
  201. data/spec/unit/module/git_spec.rb +0 -387
  202. data/spec/unit/module/metadata_file_spec.rb +0 -68
  203. data/spec/unit/module/svn_spec.rb +0 -208
  204. data/spec/unit/module/tarball_spec.rb +0 -70
  205. data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
  206. data/spec/unit/module_spec.rb +0 -114
  207. data/spec/unit/puppetfile_spec.rb +0 -304
  208. data/spec/unit/settings/collection_spec.rb +0 -123
  209. data/spec/unit/settings/container_spec.rb +0 -92
  210. data/spec/unit/settings/definition_spec.rb +0 -79
  211. data/spec/unit/settings/enum_definition_spec.rb +0 -20
  212. data/spec/unit/settings/inheritance_spec.rb +0 -38
  213. data/spec/unit/settings/list_spec.rb +0 -88
  214. data/spec/unit/settings/loader_spec.rb +0 -110
  215. data/spec/unit/settings/uri_definition_spec.rb +0 -23
  216. data/spec/unit/settings_spec.rb +0 -303
  217. data/spec/unit/source/base_spec.rb +0 -31
  218. data/spec/unit/source/exec_spec.rb +0 -81
  219. data/spec/unit/source/git_spec.rb +0 -233
  220. data/spec/unit/source/hash_spec.rb +0 -54
  221. data/spec/unit/source/svn_spec.rb +0 -196
  222. data/spec/unit/source/yaml_spec.rb +0 -42
  223. data/spec/unit/source_spec.rb +0 -10
  224. data/spec/unit/svn/remote_spec.rb +0 -21
  225. data/spec/unit/svn/working_dir_spec.rb +0 -56
  226. data/spec/unit/tarball_spec.rb +0 -57
  227. data/spec/unit/util/attempt_spec.rb +0 -82
  228. data/spec/unit/util/cacheable_spec.rb +0 -23
  229. data/spec/unit/util/commands_spec.rb +0 -61
  230. data/spec/unit/util/downloader_spec.rb +0 -98
  231. data/spec/unit/util/exec_env_spec.rb +0 -56
  232. data/spec/unit/util/purgeable_spec.rb +0 -267
  233. data/spec/unit/util/setopts_spec.rb +0 -83
  234. data/spec/unit/util/subprocess/result_spec.rb +0 -36
  235. data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
  236. data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
  237. data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
  238. data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
  239. data/spec/unit/util/subprocess_spec.rb +0 -65
  240. 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