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,146 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/environment'
3
-
4
- describe R10K::Environment::SVN do
5
-
6
- subject do
7
- described_class.new(
8
- 'myenv',
9
- '/some/nonexistent/environmentdir',
10
- 'svn-dirname',
11
- {
12
- :remote => 'https://svn-server.site/svn-repo/trunk'
13
- }
14
- )
15
- end
16
-
17
- let(:working_dir) { subject.working_dir }
18
-
19
- describe "initializing" do
20
- subject do
21
- described_class.new('name', '/dir', 'ref', {
22
- :puppetfile_name => 'Puppetfile',
23
- })
24
- end
25
-
26
- it "accepts valid base class initialization arguments" do
27
- expect(subject.name).to eq 'name'
28
- end
29
- end
30
-
31
- describe "storing attributes" do
32
- it "can return the environment name" do
33
- expect(subject.name).to eq 'myenv'
34
- end
35
-
36
- it "can return the environment basedir" do
37
- expect(subject.basedir).to eq '/some/nonexistent/environmentdir'
38
- end
39
-
40
- it "can return the environment dirname" do
41
- expect(subject.dirname).to eq 'svn-dirname'
42
- end
43
-
44
- it "can return the environment remote" do
45
- expect(subject.remote).to eq 'https://svn-server.site/svn-repo/trunk'
46
- end
47
- end
48
-
49
- describe "synchronizing the environment" do
50
- it "checks out the working directory when creating a new environment" do
51
- allow(working_dir).to receive(:is_svn?).and_return(false)
52
- expect(working_dir).to receive(:checkout)
53
- subject.sync
54
- end
55
-
56
- it "updates the working directory when updating an existing environment" do
57
- allow(working_dir).to receive(:is_svn?).and_return(true)
58
- expect(working_dir).to receive(:update)
59
- subject.sync
60
- end
61
- end
62
-
63
- describe "generating a puppetfile for the environment" do
64
- let(:puppetfile) { subject.puppetfile }
65
-
66
- it "creates a puppetfile at the full path to the environment" do
67
- expect(puppetfile.basedir).to eq '/some/nonexistent/environmentdir/svn-dirname'
68
- end
69
-
70
- it "sets the moduledir to 'modules' relative to the environment path" do
71
- expect(puppetfile.moduledir).to eq '/some/nonexistent/environmentdir/svn-dirname/modules'
72
- end
73
-
74
- it "sets the puppetfile path to 'Puppetfile' relative to the environment path" do
75
- expect(puppetfile.puppetfile_path).to eq '/some/nonexistent/environmentdir/svn-dirname/Puppetfile'
76
- end
77
- end
78
-
79
- describe "enumerating modules" do
80
- it "loads the Puppetfile and returns modules in that puppetfile" do
81
- loaded = { managed_directories: [], desired_contents: [], purge_exclusions: [] }
82
- mod = double('A module', :name => 'dbl')
83
- expect(subject.loader).to receive(:load).and_return(loaded.merge(modules: [mod]))
84
- expect(subject.modules).to eq([mod])
85
- end
86
- end
87
-
88
- describe "determining the status" do
89
- it "is absent if the working directory is absent" do
90
- expect(subject.path).to receive(:exist?).and_return(false)
91
- expect(subject.status).to eq :absent
92
- end
93
-
94
- it "is mismatched if the working directory is not an SVN repo" do
95
- expect(subject.path).to receive(:exist?).and_return(true)
96
- expect(working_dir).to receive(:is_svn?).and_return(false)
97
- expect(subject.status).to eq :mismatched
98
- end
99
-
100
- it "is mismatched if the working directory remote doesn't match the expected remote" do
101
- expect(subject.path).to receive(:exist?).and_return(true)
102
- expect(working_dir).to receive(:is_svn?).and_return(true)
103
- expect(working_dir).to receive(:url).and_return 'https://svn-server.site/another-svn-repo/trunk'
104
- expect(subject.status).to eq :mismatched
105
- end
106
-
107
- it "is outdated when the the working directory has not synced" do
108
- expect(subject.path).to receive(:exist?).and_return(true)
109
- expect(working_dir).to receive(:is_svn?).and_return(true)
110
- expect(working_dir).to receive(:url).and_return 'https://svn-server.site/svn-repo/trunk'
111
- expect(subject.status).to eq :outdated
112
- end
113
-
114
- it "is insync when the working directory has been synced" do
115
- expect(subject.path).to receive(:exist?).and_return(true)
116
- expect(working_dir).to receive(:is_svn?).twice.and_return(true)
117
- expect(working_dir).to receive(:url).and_return 'https://svn-server.site/svn-repo/trunk'
118
-
119
- expect(working_dir).to receive(:update)
120
-
121
- subject.sync
122
-
123
- expect(subject.status).to eq :insync
124
- end
125
- end
126
-
127
- describe "environment signature" do
128
- it "returns the svn revision of the branch" do
129
- expect(working_dir).to receive(:revision).and_return '1337'
130
- expect(subject.signature).to eq '1337'
131
- end
132
- end
133
-
134
- describe "info hash" do
135
- let(:info_hash) { subject.info }
136
-
137
- before(:each) do
138
- expect(working_dir).to receive(:revision).and_return '1337'
139
- end
140
-
141
- it "includes name and signature" do
142
- expect(info_hash.keys).to include :name, :signature
143
- expect(info_hash).not_to have_value(nil)
144
- end
145
- end
146
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/environment'
3
-
4
- describe R10K::Environment::Tarball do
5
- let(:tgz_path) do
6
- File.expand_path('spec/fixtures/tarball/tarball.tar.gz', PROJECT_ROOT)
7
- end
8
-
9
- let(:checksum) { '36afcfc2378b8235902d6e647fce7479da6898354d620388646c595a1155ed67' }
10
- let(:base_params) { { source: tgz_path, version: checksum, modules: { } } }
11
-
12
- subject { described_class.new('envname', '/some/imaginary/path', 'dirname', base_params) }
13
-
14
- describe "initializing" do
15
- it "accepts valid base class initialization arguments" do
16
- expect(subject.name).to eq 'envname'
17
- end
18
- end
19
-
20
- describe "storing attributes" do
21
- it "can return the environment name" do
22
- expect(subject.name).to eq 'envname'
23
- end
24
-
25
- it "can return the environment basedir" do
26
- expect(subject.basedir).to eq '/some/imaginary/path'
27
- end
28
-
29
- it "can return the environment dirname" do
30
- expect(subject.dirname).to eq 'dirname'
31
- end
32
-
33
- it "can return the environment path" do
34
- expect(subject.path.to_s).to eq '/some/imaginary/path/dirname'
35
- end
36
-
37
- it "can return the environment source" do
38
- expect(subject.tarball.source).to eq tgz_path
39
- end
40
-
41
- it "can return the environment version" do
42
- expect(subject.tarball.checksum).to eq checksum
43
- end
44
- end
45
- end
@@ -1,75 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/environment'
3
-
4
- describe R10K::Environment::WithModules do
5
- subject do
6
- described_class.new(
7
- 'release42',
8
- '/some/nonexistent/environmentdir',
9
- 'prefix_release42',
10
- {
11
- :type => 'plain',
12
- :modules => {
13
- 'puppetlabs-stdlib' => { local: true },
14
- 'puppetlabs-concat' => { local: true },
15
- 'puppetlabs-exec' => { local: true },
16
- }
17
- }.merge(subject_params)
18
- )
19
- end
20
-
21
- # Default no additional params
22
- let(:subject_params) { {} }
23
-
24
- describe "dealing with module conflicts" do
25
- context "with no module conflicts" do
26
- it "validates when there are no conflicts" do
27
- mod = instance_double('R10K::Module::Base', name: 'nonconflict', origin: :puppetfile)
28
- expect(subject.module_conflicts?(mod)).to eq false
29
- end
30
- end
31
-
32
- context "with module conflicts and default behavior" do
33
- it "does not raise an error" do
34
- mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
35
- expect(subject.logger).to receive(:warn).with(/Puppetfile.*both define.*ignored/i)
36
- expect(subject.module_conflicts?(mod)).to eq true
37
- end
38
- end
39
-
40
- context "with module conflicts and 'error' behavior" do
41
- let(:subject_params) {{ :module_conflicts => 'error' }}
42
- it "raises an error" do
43
- mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
44
- expect { subject.module_conflicts?(mod) }.to raise_error(R10K::Error, /Puppetfile.*both define.*/i)
45
- end
46
- end
47
-
48
- context "with module conflicts and 'override' behavior" do
49
- let(:subject_params) {{ :module_conflicts => 'override' }}
50
- it "does not raise an error" do
51
- mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
52
- expect(subject.logger).to receive(:debug).with(/Puppetfile.*both define.*ignored/i)
53
- expect(subject.module_conflicts?(mod)).to eq true
54
- end
55
- end
56
-
57
- context "with module conflicts and invalid configuration" do
58
- let(:subject_params) {{ :module_conflicts => 'batman' }}
59
- it "raises an error" do
60
- mod = instance_double('R10K::Module::Base', name: 'stdlib', origin: :puppetfile)
61
- expect { subject.module_conflicts?(mod) }.to raise_error(R10K::Error, /Unexpected value.*module_conflicts.*/i)
62
- end
63
- end
64
- end
65
-
66
- describe "modules method" do
67
- it "returns the configured modules, and Puppetfile modules" do
68
- loaded = { managed_directories: [], desired_contents: [], purge_exclusions: [] }
69
- puppetfile_mod = instance_double('R10K::Module::Base', name: 'zebra')
70
- expect(subject.loader).to receive(:load).and_return(loaded.merge(modules: [puppetfile_mod]))
71
- returned_modules = subject.modules
72
- expect(returned_modules.map(&:name).sort).to eq(%w[concat exec stdlib zebra])
73
- end
74
- end
75
- end
@@ -1,84 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/errors/formatting'
3
-
4
- describe R10K::Errors::Formatting do
5
-
6
- describe "without a nested exception" do
7
- let(:exc) do
8
- ArgumentError.new("ArgumentError message").tap do |a|
9
- a.set_backtrace(%w[/backtrace/line:1 /backtrace/line:2])
10
- end
11
- end
12
-
13
- describe "and without a backtrace" do
14
- subject do
15
- described_class.format_exception(exc, false)
16
- end
17
-
18
- it "formats the exception with the message" do
19
- expect(subject).to eq("ArgumentError message")
20
- end
21
- end
22
-
23
- describe "and with a backtrace" do
24
- subject do
25
- described_class.format_exception(exc, true)
26
- end
27
-
28
- it "formats the exception with the message and backtrace" do
29
- expect(subject).to eq([
30
- "ArgumentError message",
31
- "/backtrace/line:1",
32
- "/backtrace/line:2",
33
- ].join("\n"))
34
- end
35
- end
36
- end
37
-
38
- describe "with a nested exception" do
39
-
40
- let(:nestee) do
41
- ArgumentError.new("ArgumentError message").tap do |a|
42
- a.set_backtrace(%w[/backtrace/line:1 /backtrace/line:2])
43
- end
44
- end
45
-
46
- let(:exc) do
47
- R10K::Error.wrap(nestee, "R10K::Error message").tap do |r|
48
- r.set_backtrace(%w[/another/backtrace/line:1 /another/backtrace/line:2])
49
- end
50
- end
51
-
52
- describe "and without a backtrace" do
53
- subject do
54
- described_class.format_exception(exc, false)
55
- end
56
-
57
- it "formats the exception with the message and original message" do
58
- expect(subject).to eq([
59
- "R10K::Error message",
60
- "Original exception:",
61
- "ArgumentError message"
62
- ].join("\n"))
63
- end
64
- end
65
-
66
- describe "and with a backtrace" do
67
- subject do
68
- described_class.format_exception(exc, true)
69
- end
70
-
71
- it "formats the exception with the message, backtrace, original message, and original backtrace" do
72
- expect(subject).to eq([
73
- "R10K::Error message",
74
- "/another/backtrace/line:1",
75
- "/another/backtrace/line:2",
76
- "Original exception:",
77
- "ArgumentError message",
78
- "/backtrace/line:1",
79
- "/backtrace/line:2",
80
- ].join("\n"))
81
- end
82
- end
83
- end
84
- end
@@ -1,50 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/feature'
3
-
4
- describe R10K::Feature do
5
- describe "confining a feature to a library" do
6
- it "is available if the library can be loaded" do
7
- feature = described_class.new(:r10k, :libraries => 'r10k')
8
- expect(feature.available?).to be_truthy
9
- end
10
-
11
- it "is unavailable if the library cannot be loaded" do
12
- feature = described_class.new(:squidlibs, :libraries => 'squid/libs')
13
- expect(feature.available?).to be_falsey
14
- end
15
- end
16
-
17
- describe "confining a feature to a block" do
18
- it "is available if the block is true" do
19
- feature = described_class.new(:blockfeature) { true }
20
- expect(feature.available?).to be_truthy
21
- end
22
-
23
- it "is unavailable if the block is false" do
24
- feature = described_class.new(:blockfeature) { false }
25
- expect(feature.available?).to be_falsey
26
- end
27
- end
28
-
29
- describe "confining a feature to both a block and libraries" do
30
- it "is unavailable if the block returns false and libraries are absent" do
31
- feature = described_class.new(:nope, :libraries => 'nope/nope') { false }
32
- expect(feature.available?).to be_falsey
33
- end
34
-
35
- it "is unavailable if the block returns true and libraries are absent" do
36
- feature = described_class.new(:nope, :libraries => 'nope/nope') { true }
37
- expect(feature.available?).to be_falsey
38
- end
39
-
40
- it "is unavailable if the block returns false and libraries are present" do
41
- feature = described_class.new(:nope, :libraries => 'r10k') { false }
42
- expect(feature.available?).to be_falsey
43
- end
44
-
45
- it "is available if the block returns true and libraries are present" do
46
- feature = described_class.new(:yep, :libraries => 'r10k') { true }
47
- expect(feature.available?).to be_truthy
48
- end
49
- end
50
- end
@@ -1,213 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/forge/module_release'
3
- require 'r10k/util/exec_env'
4
- require 'puppet_forge'
5
-
6
- describe R10K::Forge::ModuleRelease do
7
- subject { described_class.new('branan-eight_hundred', '8.0.0') }
8
-
9
- let(:forge_release_class) { PuppetForge::V3::Release }
10
- let(:sha256_digest_class) { Digest::SHA256 }
11
- let(:md5_digest_class) { Digest::MD5 }
12
-
13
- let(:download_path) { instance_double('Pathname') }
14
- let(:tarball_cache_path) { instance_double('Pathname') }
15
- let(:tarball_cache_root) { instance_double('Pathname') }
16
- let(:unpack_path) { instance_double('Pathname') }
17
- let(:target_dir) { instance_double('Pathname') }
18
- let(:tarball_cache_path) { instance_double('Pathname') }
19
- let(:md5_file_path) { instance_double('Pathname') }
20
- let(:sha256_file_path) { instance_double('Pathname') }
21
-
22
- let(:file_lists) { {:valid=>['valid_ex'], :invalid=>[], :symlinks=>['symlink_ex']} }
23
-
24
- let(:file_contents) { "skeletor's closet" }
25
- let(:sha256_digest) { instance_double('Digest::SHA256') }
26
- let(:sha256_of_tarball) { "sha256_hash" }
27
- let(:md5_digest) { instance_double('Digest::MD5') }
28
- let(:md5_of_tarball) { "md5_hash" }
29
- let(:good_md5) { md5_of_tarball }
30
- let(:good_sha256) { sha256_of_tarball }
31
- let(:bad_sha256) { "bad_sha256_hash" }
32
- let(:bad_md5) { "bad_md5_hash" }
33
-
34
- before do
35
- subject.download_path = download_path
36
- subject.tarball_cache_path = tarball_cache_path
37
- subject.tarball_cache_root = tarball_cache_root
38
- subject.unpack_path = unpack_path
39
- subject.md5_file_path = md5_file_path
40
- subject.sha256_file_path = sha256_file_path
41
- end
42
-
43
- context "no cached tarball" do
44
- describe '#download' do
45
- it "downloads the module from the forge into `download_path`" do
46
- expect(tarball_cache_path).to receive(:exist?).and_return(false)
47
- expect(subject.forge_release).to receive(:download).with(download_path)
48
- allow(FileUtils).to receive(:mkdir_p).with(tarball_cache_root)
49
- expect(FileUtils).to receive(:mv).with(download_path, tarball_cache_path)
50
- subject.download
51
- end
52
- end
53
- end
54
-
55
- context "with cached tarball" do
56
- describe '#download' do
57
- it "does not download a new tarball" do
58
- expect(tarball_cache_path).to receive(:exist?).and_return(true)
59
- expect(subject.forge_release).not_to receive(:download).with(download_path)
60
- subject.download
61
- end
62
- end
63
- end
64
-
65
- describe '#verify' do
66
-
67
- it "verifies using the file SHA256, if that exists" do
68
- allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
69
- allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
70
- allow(sha256_file_path).to receive(:exist?).and_return(true)
71
- expect(subject).to receive(:verify_from_file).with(sha256_of_tarball, sha256_file_path)
72
- subject.verify
73
- end
74
-
75
- it "verifies using the forge file_sha256, if no sha256 file exists" do
76
- allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
77
- allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
78
- allow(sha256_file_path).to receive(:exist?).and_return(false)
79
- allow(subject.forge_release).to receive(:respond_to?).and_return(true)
80
- allow(subject.forge_release).to receive(:sha256_file).and_return(sha256_of_tarball)
81
- expect(subject).to receive(:verify_from_forge)
82
- subject.verify
83
- end
84
-
85
- it "falls back to md5 verification when not in FIPS mode and no sha256 available" do
86
- expect(R10K::Util::Platform).to receive(:fips?).and_return(false)
87
- # failed sha256 verification
88
- allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
89
- allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
90
- allow(sha256_file_path).to receive(:exist?).and_return(false)
91
- allow(subject.forge_release).to receive(:respond_to?).and_return(false)
92
- allow(subject).to receive(:verify_from_forge)
93
- # md5 verification
94
- allow(md5_digest_class).to receive(:file).and_return(md5_digest)
95
- allow(md5_digest).to receive(:hexdigest).and_return(md5_of_tarball)
96
- allow(md5_file_path).to receive(:exist?).and_return(true)
97
- expect(subject).to receive(:verify_from_file)
98
- subject.verify
99
- end
100
-
101
- it "errors when in FIPS mode and no sha256 is available" do
102
- expect(R10K::Util::Platform).to receive(:fips?).and_return(true)
103
- allow(sha256_digest_class).to receive(:file).and_return(sha256_digest)
104
- allow(sha256_digest).to receive(:hexdigest).and_return(sha256_of_tarball)
105
- allow(sha256_file_path).to receive(:exist?).and_return(false)
106
- allow(subject.forge_release).to receive(:respond_to?).and_return(false)
107
- allow(subject).to receive(:verify_from_forge)
108
- expect { subject.verify }.to raise_error(R10K::Error)
109
- end
110
- end
111
-
112
- describe '#verify_from_file' do
113
-
114
- it "does nothing when the checksums match" do
115
- expect(File).to receive(:read).with(sha256_file_path).and_return(good_sha256)
116
- expect(subject).not_to receive(:cleanup_cached_tarball_path)
117
- subject.verify_from_file(sha256_of_tarball, sha256_file_path)
118
- end
119
-
120
- it "raises an error and cleans up when the checksums do not match" do
121
- expect(File).to receive(:read).with(sha256_file_path).and_return(bad_sha256)
122
- expect(tarball_cache_path).to receive(:delete)
123
- expect(sha256_file_path).to receive(:delete)
124
- expect { subject.verify_from_file(sha256_of_tarball, sha256_file_path) }.to raise_error(PuppetForge::V3::Release::ChecksumMismatch)
125
- end
126
- end
127
-
128
- describe '#verify_from_forge' do
129
- it "write the checksum to file when the checksums match" do
130
- expect(tarball_cache_path).not_to receive(:delete)
131
- expect(File).to receive(:write).with(sha256_file_path, good_sha256)
132
- subject.verify_from_forge(sha256_of_tarball, good_sha256, sha256_file_path)
133
- end
134
-
135
- it "raises an error and cleans up when the checksums do not match" do
136
- expect(tarball_cache_path).to receive(:delete)
137
- expect { subject.verify_from_forge(sha256_of_tarball, bad_sha256, sha256_file_path) }
138
- .to raise_error(PuppetForge::V3::Release::ChecksumMismatch)
139
- end
140
- end
141
-
142
- describe '#unpack' do
143
- it "unpacks the module tarball in `tarball_cache_path` into the provided target path" do
144
- expect(PuppetForge::Unpacker).to receive(:unpack).with(tarball_cache_path.to_s, target_dir.to_s, unpack_path.to_s).\
145
- and_return({:valid=>["extractedmodule/metadata.json"], :invalid=>[], :symlinks=>[]})
146
- subject.unpack(target_dir)
147
- end
148
-
149
- it "logs a warning if symlinks are present during the unpacking process" do
150
- logger_dbl = double(Log4r::Logger, debug1: true, debug2: true)
151
- allow(subject).to receive(:logger).and_return(logger_dbl)
152
- allow(PuppetForge::Unpacker).to receive(:unpack).and_return(file_lists)
153
-
154
- expect(logger_dbl).to receive(:warn).with(/symlinks are unsupported.*#{Regexp.escape(subject.forge_release.slug)}/i)
155
-
156
- subject.unpack(target_dir)
157
- end
158
- end
159
-
160
- describe "#cleanup" do
161
- it "cleans up the unpack paths" do
162
- expect(subject).to receive(:cleanup_unpack_path)
163
- expect(subject).to receive(:cleanup_download_path)
164
- subject.cleanup
165
- end
166
- end
167
-
168
- describe "#cleanup_unpack_path" do
169
- it "ignores the unpack_path if the parent doesn't exist" do
170
- parent = instance_double('Pathname')
171
- expect(parent).to receive(:exist?).and_return false
172
- expect(parent).to_not receive(:rmtree)
173
- expect(unpack_path).to receive(:parent).and_return(parent)
174
- subject.cleanup_unpack_path
175
- end
176
-
177
- it "removes the containing directory of unpack_path if it exists" do
178
- parent = instance_double('Pathname')
179
- expect(parent).to receive(:rmtree)
180
- expect(parent).to receive(:exist?).and_return true
181
- expect(unpack_path).to receive(:parent).and_return(parent).exactly(2).times
182
- subject.cleanup_unpack_path
183
- end
184
- end
185
-
186
- describe "#cleanup_download_path" do
187
- it "ignores the download_path if the parent doesn't exist" do
188
- parent = instance_double('Pathname')
189
- expect(parent).to receive(:exist?).and_return false
190
- expect(parent).to_not receive(:rmtree)
191
- expect(download_path).to receive(:parent).and_return(parent)
192
- subject.cleanup_download_path
193
- end
194
-
195
- it "removes the containing directory of download_path if it exists" do
196
- parent = instance_double('Pathname')
197
- expect(parent).to receive(:rmtree)
198
- expect(parent).to receive(:exist?).and_return true
199
- expect(download_path).to receive(:parent).and_return(parent).exactly(2).times
200
- subject.cleanup_download_path
201
- end
202
- end
203
-
204
- describe '#install' do
205
- it "performs all steps needed to install the module" do
206
- expect(subject).to receive(:download)
207
- expect(subject).to receive(:verify)
208
- expect(subject).to receive(:unpack).with(target_dir)
209
- expect(subject).to receive(:cleanup)
210
- subject.install(target_dir)
211
- end
212
- end
213
- end