puppet 6.18.0-x64-mingw32 → 6.21.1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (276) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +37 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +3 -2
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +5 -5
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/defaults.rb +67 -35
  19. data/lib/puppet/environments.rb +84 -59
  20. data/lib/puppet/face/catalog.rb +1 -1
  21. data/lib/puppet/face/config.rb +56 -16
  22. data/lib/puppet/face/epp.rb +12 -2
  23. data/lib/puppet/face/facts.rb +60 -0
  24. data/lib/puppet/face/node.rb +3 -3
  25. data/lib/puppet/face/node/clean.rb +2 -2
  26. data/lib/puppet/face/status.rb +1 -1
  27. data/lib/puppet/ffi/posix.rb +10 -0
  28. data/lib/puppet/ffi/posix/constants.rb +14 -0
  29. data/lib/puppet/ffi/posix/functions.rb +24 -0
  30. data/lib/puppet/file_bucket/dipper.rb +1 -1
  31. data/lib/puppet/functions/epp.rb +1 -0
  32. data/lib/puppet/functions/inline_epp.rb +1 -0
  33. data/lib/puppet/functions/new.rb +8 -3
  34. data/lib/puppet/http.rb +1 -0
  35. data/lib/puppet/http/client.rb +1 -1
  36. data/lib/puppet/http/resolver.rb +5 -8
  37. data/lib/puppet/http/resolver/server_list.rb +18 -36
  38. data/lib/puppet/http/resolver/settings.rb +4 -4
  39. data/lib/puppet/http/resolver/srv.rb +5 -5
  40. data/lib/puppet/http/service.rb +3 -1
  41. data/lib/puppet/http/service/compiler.rb +1 -1
  42. data/lib/puppet/http/service/file_server.rb +1 -1
  43. data/lib/puppet/http/service/puppetserver.rb +39 -0
  44. data/lib/puppet/http/session.rb +5 -4
  45. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  46. data/lib/puppet/indirector/fact_search.rb +60 -0
  47. data/lib/puppet/indirector/facts/json.rb +27 -0
  48. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  49. data/lib/puppet/indirector/json.rb +5 -1
  50. data/lib/puppet/indirector/msgpack.rb +1 -1
  51. data/lib/puppet/indirector/node/json.rb +8 -0
  52. data/lib/puppet/indirector/report/json.rb +34 -0
  53. data/lib/puppet/indirector/request.rb +4 -4
  54. data/lib/puppet/indirector/yaml.rb +1 -1
  55. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  56. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  57. data/lib/puppet/network/formats.rb +2 -1
  58. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  59. data/lib/puppet/node/facts.rb +17 -0
  60. data/lib/puppet/pal/pal_impl.rb +70 -17
  61. data/lib/puppet/parser/ast/leaf.rb +3 -2
  62. data/lib/puppet/parser/templatewrapper.rb +1 -1
  63. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  64. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  65. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  66. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  67. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  68. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  69. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  70. data/lib/puppet/property/list.rb +1 -1
  71. data/lib/puppet/provider/group/groupadd.rb +13 -8
  72. data/lib/puppet/provider/package/apt.rb +34 -2
  73. data/lib/puppet/provider/package/aptitude.rb +6 -0
  74. data/lib/puppet/provider/package/dpkg.rb +1 -1
  75. data/lib/puppet/provider/package/pip2.rb +17 -0
  76. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  77. data/lib/puppet/provider/package/yum.rb +1 -0
  78. data/lib/puppet/provider/service/debian.rb +2 -0
  79. data/lib/puppet/provider/user/aix.rb +2 -2
  80. data/lib/puppet/provider/user/useradd.rb +62 -8
  81. data/lib/puppet/reference/configuration.rb +6 -5
  82. data/lib/puppet/resource/type.rb +2 -1
  83. data/lib/puppet/rest/route.rb +2 -2
  84. data/lib/puppet/settings.rb +62 -20
  85. data/lib/puppet/settings/alias_setting.rb +37 -0
  86. data/lib/puppet/settings/base_setting.rb +26 -2
  87. data/lib/puppet/transaction/report.rb +11 -7
  88. data/lib/puppet/type/file/source.rb +1 -1
  89. data/lib/puppet/type/filebucket.rb +1 -1
  90. data/lib/puppet/type/package.rb +3 -3
  91. data/lib/puppet/util/autoload.rb +1 -8
  92. data/lib/puppet/util/connection.rb +8 -8
  93. data/lib/puppet/util/fact_dif.rb +62 -0
  94. data/lib/puppet/util/posix.rb +54 -5
  95. data/lib/puppet/util/rubygems.rb +5 -1
  96. data/lib/puppet/util/run_mode.rb +5 -1
  97. data/lib/puppet/util/windows/service.rb +1 -1
  98. data/lib/puppet/version.rb +1 -1
  99. data/locales/puppet.pot +289 -268
  100. data/man/man5/puppet.conf.5 +33 -17
  101. data/man/man8/puppet-agent.8 +7 -4
  102. data/man/man8/puppet-apply.8 +2 -2
  103. data/man/man8/puppet-catalog.8 +1 -1
  104. data/man/man8/puppet-config.8 +6 -6
  105. data/man/man8/puppet-describe.8 +1 -1
  106. data/man/man8/puppet-device.8 +2 -2
  107. data/man/man8/puppet-doc.8 +1 -1
  108. data/man/man8/puppet-epp.8 +1 -1
  109. data/man/man8/puppet-facts.8 +32 -1
  110. data/man/man8/puppet-filebucket.8 +3 -3
  111. data/man/man8/puppet-generate.8 +1 -1
  112. data/man/man8/puppet-help.8 +1 -1
  113. data/man/man8/puppet-key.8 +1 -1
  114. data/man/man8/puppet-lookup.8 +1 -1
  115. data/man/man8/puppet-man.8 +1 -1
  116. data/man/man8/puppet-module.8 +1 -1
  117. data/man/man8/puppet-node.8 +7 -4
  118. data/man/man8/puppet-parser.8 +1 -1
  119. data/man/man8/puppet-plugin.8 +1 -1
  120. data/man/man8/puppet-report.8 +4 -1
  121. data/man/man8/puppet-resource.8 +1 -1
  122. data/man/man8/puppet-script.8 +2 -2
  123. data/man/man8/puppet-ssl.8 +1 -1
  124. data/man/man8/puppet-status.8 +2 -2
  125. data/man/man8/puppet.8 +2 -2
  126. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  127. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  128. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  129. data/spec/integration/application/agent_spec.rb +183 -22
  130. data/spec/integration/application/apply_spec.rb +19 -0
  131. data/spec/integration/application/filebucket_spec.rb +7 -7
  132. data/spec/integration/application/plugin_spec.rb +3 -3
  133. data/spec/integration/configurer_spec.rb +14 -0
  134. data/spec/integration/defaults_spec.rb +19 -1
  135. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  136. data/spec/integration/resource/type_collection_spec.rb +2 -6
  137. data/spec/integration/transaction_spec.rb +4 -9
  138. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  139. data/spec/integration/util/windows/registry_spec.rb +0 -10
  140. data/spec/lib/puppet_spec/settings.rb +6 -1
  141. data/spec/shared_contexts/types_setup.rb +2 -0
  142. data/spec/spec_helper.rb +1 -4
  143. data/spec/unit/agent_spec.rb +8 -6
  144. data/spec/unit/application/agent_spec.rb +0 -1
  145. data/spec/unit/application/config_spec.rb +224 -4
  146. data/spec/unit/application/doc_spec.rb +2 -2
  147. data/spec/unit/application/facts_spec.rb +3 -1
  148. data/spec/unit/application/filebucket_spec.rb +0 -2
  149. data/spec/unit/application_spec.rb +60 -13
  150. data/spec/unit/configurer_spec.rb +39 -6
  151. data/spec/unit/confine/feature_spec.rb +1 -1
  152. data/spec/unit/confine_spec.rb +8 -2
  153. data/spec/unit/defaults_spec.rb +20 -1
  154. data/spec/unit/environments_spec.rb +176 -32
  155. data/spec/unit/face/config_spec.rb +62 -11
  156. data/spec/unit/face/node_spec.rb +2 -13
  157. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  158. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  159. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  160. data/spec/unit/file_system_spec.rb +1 -2
  161. data/spec/unit/forge/module_release_spec.rb +2 -7
  162. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  163. data/spec/unit/http/resolver_spec.rb +24 -4
  164. data/spec/unit/http/service/ca_spec.rb +2 -2
  165. data/spec/unit/http/service/compiler_spec.rb +51 -2
  166. data/spec/unit/http/service/file_server_spec.rb +2 -2
  167. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  168. data/spec/unit/http/service/report_spec.rb +2 -2
  169. data/spec/unit/http/service_spec.rb +1 -1
  170. data/spec/unit/http/session_spec.rb +8 -20
  171. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  172. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  173. data/spec/unit/indirector/face_spec.rb +0 -1
  174. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  175. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  176. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  177. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  178. data/spec/unit/indirector/indirection_spec.rb +8 -12
  179. data/spec/unit/indirector/json_spec.rb +8 -8
  180. data/spec/unit/indirector/key/file_spec.rb +0 -1
  181. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  182. data/spec/unit/indirector/node/json_spec.rb +33 -0
  183. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  184. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  185. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  186. data/spec/unit/indirector/request_spec.rb +4 -4
  187. data/spec/unit/indirector/rest_spec.rb +1 -1
  188. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  189. data/spec/unit/indirector/yaml_spec.rb +7 -7
  190. data/spec/unit/indirector_spec.rb +2 -2
  191. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  192. data/spec/unit/network/authconfig_spec.rb +0 -3
  193. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  194. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  195. data/spec/unit/network/http/handler_spec.rb +0 -5
  196. data/spec/unit/parser/compiler_spec.rb +3 -19
  197. data/spec/unit/parser/resource_spec.rb +14 -8
  198. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  199. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  200. data/spec/unit/property_spec.rb +1 -0
  201. data/spec/unit/provider/exec_spec.rb +4 -3
  202. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  203. data/spec/unit/provider/nameservice_spec.rb +66 -65
  204. data/spec/unit/provider/package/apt_spec.rb +28 -23
  205. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  206. data/spec/unit/provider/package/base_spec.rb +6 -5
  207. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  208. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  209. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  210. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  211. data/spec/unit/provider/package/pip_spec.rb +6 -11
  212. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  213. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  214. data/spec/unit/provider/package/yum_spec.rb +31 -0
  215. data/spec/unit/provider/service/base_spec.rb +2 -4
  216. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  217. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  218. data/spec/unit/provider/service/debian_spec.rb +3 -5
  219. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  220. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  221. data/spec/unit/provider/service/init_spec.rb +4 -5
  222. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  223. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  224. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  225. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  226. data/spec/unit/provider/service/runit_spec.rb +2 -1
  227. data/spec/unit/provider/service/smf_spec.rb +1 -1
  228. data/spec/unit/provider/service/src_spec.rb +3 -5
  229. data/spec/unit/provider/service/systemd_spec.rb +3 -1
  230. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  231. data/spec/unit/provider/user/aix_spec.rb +5 -0
  232. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  233. data/spec/unit/provider/user/pw_spec.rb +2 -0
  234. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  235. data/spec/unit/provider_spec.rb +8 -10
  236. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  237. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  238. data/spec/unit/resource/type_spec.rb +1 -1
  239. data/spec/unit/resource_spec.rb +11 -10
  240. data/spec/unit/rest/route_spec.rb +4 -4
  241. data/spec/unit/settings_spec.rb +576 -239
  242. data/spec/unit/ssl/base_spec.rb +0 -1
  243. data/spec/unit/ssl/host_spec.rb +0 -5
  244. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  245. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  246. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  247. data/spec/unit/transaction/report_spec.rb +2 -0
  248. data/spec/unit/transaction_spec.rb +13 -4
  249. data/spec/unit/type/file/content_spec.rb +0 -1
  250. data/spec/unit/type/file/selinux_spec.rb +0 -2
  251. data/spec/unit/type/file/source_spec.rb +1 -1
  252. data/spec/unit/type/file_spec.rb +0 -6
  253. data/spec/unit/type/filebucket_spec.rb +1 -1
  254. data/spec/unit/type/group_spec.rb +13 -6
  255. data/spec/unit/type/resources_spec.rb +7 -7
  256. data/spec/unit/type/service_spec.rb +1 -1
  257. data/spec/unit/type/tidy_spec.rb +0 -1
  258. data/spec/unit/type_spec.rb +2 -2
  259. data/spec/unit/util/at_fork_spec.rb +2 -2
  260. data/spec/unit/util/autoload_spec.rb +5 -1
  261. data/spec/unit/util/backups_spec.rb +1 -2
  262. data/spec/unit/util/execution_spec.rb +15 -11
  263. data/spec/unit/util/inifile_spec.rb +6 -14
  264. data/spec/unit/util/log_spec.rb +8 -7
  265. data/spec/unit/util/logging_spec.rb +3 -3
  266. data/spec/unit/util/posix_spec.rb +363 -15
  267. data/spec/unit/util/rubygems_spec.rb +2 -2
  268. data/spec/unit/util/run_mode_spec.rb +6 -6
  269. data/spec/unit/util/selinux_spec.rb +76 -52
  270. data/spec/unit/util/storage_spec.rb +3 -1
  271. data/spec/unit/util/suidmanager_spec.rb +44 -41
  272. data/spec/unit/util_spec.rb +13 -6
  273. metadata +32 -10
  274. data/spec/integration/application/config_spec.rb +0 -74
  275. data/spec/unit/face/catalog_spec.rb +0 -6
  276. data/spec/unit/face/module_spec.rb +0 -3
@@ -11,9 +11,7 @@ describe Puppet::Type.type(:package).provider(:apt) do
11
11
  end
12
12
 
13
13
  let(:provider) do
14
- provider = subject()
15
- provider.resource = resource
16
- provider
14
+ resource.provider
17
15
  end
18
16
 
19
17
  it "should be the default provider on :osfamily => Debian" do
@@ -88,7 +86,7 @@ Version table:
88
86
 
89
87
  describe ".instances" do
90
88
  before do
91
- allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([resource])
89
+ allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([provider])
92
90
  end
93
91
 
94
92
  context "when package is manual marked" do
@@ -97,8 +95,7 @@ Version table:
97
95
  end
98
96
 
99
97
  it 'sets mark to manual' do
100
- expect(resource).to receive(:mark=).with(:manual)
101
- described_class.instances
98
+ expect(described_class.instances.map(&:mark)).to eq([:manual])
102
99
  end
103
100
  end
104
101
 
@@ -108,8 +105,7 @@ Version table:
108
105
  end
109
106
 
110
107
  it 'does not set mark to manual' do
111
- expect(resource).not_to receive(:mark=).with(:manual)
112
- described_class.instances
108
+ expect(described_class.instances.map(&:mark)).to eq([nil])
113
109
  end
114
110
  end
115
111
  end
@@ -119,24 +115,12 @@ Version table:
119
115
  allow(provider).to receive(:dpkgquery).and_return("name: #{resource.name}" )
120
116
  end
121
117
 
122
- context "when package is manual marked" do
123
- before do
124
- allow(described_class).to receive(:aptmark).with('showmanual').and_return("#{resource.name}\n")
125
- end
126
-
127
- it 'sets mark to manual' do
128
- result = provider.query
129
- expect(result[:mark]).to eql(:manual)
130
- end
131
- end
132
-
133
- context 'when package is not manual marked ' do
134
- before do
135
- allow(described_class).to receive(:aptmark).with('showmanual').and_return('')
136
- end
137
118
 
119
+ context 'when package is not installed on the system' do
138
120
  it 'does not set mark to manual' do
139
121
  result = provider.query
122
+
123
+ expect(described_class).not_to receive(:aptmark)
140
124
  expect(result[:mark]).to be_nil
141
125
  end
142
126
  end
@@ -293,5 +277,26 @@ Version table:
293
277
 
294
278
  provider.install
295
279
  end
280
+
281
+ it "should install using the source attribute if present" do
282
+ resource[:ensure] = :installed
283
+ resource[:source] = '/my/local/package/file'
284
+
285
+ expect(provider).to receive(:aptget).with(any_args, :install, resource[:source])
286
+ expect(provider).to receive(:properties).and_return({:mark => :none})
287
+
288
+ provider.install
289
+ end
290
+
291
+ it "should install specific version using the source attribute if present" do
292
+ resource[:ensure] = '1.2.3'
293
+ resource[:source] = '/my/local/package/file'
294
+
295
+ expect(provider).to receive(:aptget).with(any_args, :install, resource[:source])
296
+ expect(provider).to receive(:properties).and_return({:mark => :none})
297
+ expect(provider).to receive(:query).and_return({:ensure => '1.2.3'})
298
+
299
+ provider.install
300
+ end
296
301
  end
297
302
  end
@@ -13,7 +13,7 @@ describe Puppet::Type.type(:package).provider(:aptitude) do
13
13
 
14
14
  before do
15
15
  allow(Puppet::Util).to receive(:which).with('/usr/bin/dpkg-query').and_return(dpkgquery_path)
16
- allow(described_class).to receive(:aptmark).with('showmanual').and_return("")
16
+ allow(described_class).to receive(:aptmark).with('showmanual', 'faff').and_return("")
17
17
  end
18
18
 
19
19
  { :absent => "deinstall ok config-files faff 1.2.3-1\n",
@@ -1,17 +1,18 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/provider/package'
3
3
 
4
+ Puppet::Type.type(:package).provide(:test_base_provider, parent: Puppet::Provider::Package) do
5
+ def query; end
6
+ end
7
+
4
8
  describe Puppet::Provider::Package do
9
+ let(:provider) { Puppet::Type.type(:package).provider(:test_base_provider).new }
10
+
5
11
  it 'returns absent for uninstalled packages when not purgeable' do
6
- provider = Puppet::Provider::Package.new
7
- expect(provider).to receive(:query).and_return(nil)
8
- expect(provider.class).to receive(:feature?).with(:purgeable).and_return(false)
9
12
  expect(provider.properties[:ensure]).to eq(:absent)
10
13
  end
11
14
 
12
15
  it 'returns purged for uninstalled packages when purgeable' do
13
- provider = Puppet::Provider::Package.new
14
- expect(provider).to receive(:query).and_return(nil)
15
16
  expect(provider.class).to receive(:feature?).with(:purgeable).and_return(true)
16
17
  expect(provider.properties[:ensure]).to eq(:purged)
17
18
  end
@@ -32,7 +32,7 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
32
32
  expect(Puppet::Util::Execution).to receive(:execpipe).with(execpipe_args).and_yield(bash_installed_io)
33
33
 
34
34
  installed = double('bash')
35
- expect(described_class).to receive(:new).with(:ensure => "4.2-5ubuntu3", :error => "ok", :desired => "install", :name => "bash", :status => "installed", :provider => :dpkg).and_return(installed)
35
+ expect(described_class).to receive(:new).with(:ensure => "4.2-5ubuntu3", :error => "ok", :desired => "install", :name => "bash", :mark => :none, :status => "installed", :provider => :dpkg).and_return(installed)
36
36
 
37
37
  expect(described_class.instances).to eq([installed])
38
38
  end
@@ -41,9 +41,9 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
41
41
  expect(Puppet::Util::Execution).to receive(:execpipe).with(execpipe_args).and_yield(all_installed_io)
42
42
 
43
43
  bash = double('bash')
44
- expect(described_class).to receive(:new).with(:ensure => "4.2-5ubuntu3", :error => "ok", :desired => "install", :name => "bash", :status => "installed", :provider => :dpkg).and_return(bash)
44
+ expect(described_class).to receive(:new).with(:ensure => "4.2-5ubuntu3", :error => "ok", :desired => "install", :name => "bash", :mark => :none, :status => "installed", :provider => :dpkg).and_return(bash)
45
45
  vim = double('vim')
46
- expect(described_class).to receive(:new).with(:ensure => "2:7.3.547-6ubuntu5", :error => "ok", :desired => "install", :name => "vim", :status => "installed", :provider => :dpkg).and_return(vim)
46
+ expect(described_class).to receive(:new).with(:ensure => "2:7.3.547-6ubuntu5", :error => "ok", :desired => "install", :name => "vim", :mark => :none, :status => "installed", :provider => :dpkg).and_return(vim)
47
47
 
48
48
  expect(described_class.instances).to eq([bash, vim])
49
49
  end
@@ -107,7 +107,7 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
107
107
  it "returns a hash of the found package status for an installed package" do
108
108
  dpkg_query_execution_with_multiple_args_returns(query_output, args_with_provides,virtual_packages_query_args)
109
109
  dpkg_query_execution_with_multiple_args_returns(dpkg_query_result, args, query_args)
110
- expect(provider.query).to eq(:ensure => "2.7.13", :error => "ok", :desired => "install", :name => "python", :status => "installed", :provider => :dpkg)
110
+ expect(provider.query).to eq(:ensure => "2.7.13", :error => "ok", :desired => "install", :name => "python", :mark => :none, :status => "installed", :provider => :dpkg)
111
111
  end
112
112
 
113
113
  it "considers the package absent if the dpkg-query result cannot be interpreted" do
@@ -160,6 +160,20 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
160
160
  expect(provider.query[:mark]).to eq(:hold)
161
161
  end
162
162
 
163
+ it "considers the package held if its state is 'hold'" do
164
+ dpkg_query_execution_with_multiple_args_returns(query_output.gsub("install","hold"),args_with_provides,virtual_packages_query_args)
165
+ dpkg_query_execution_with_multiple_args_returns(dpkg_query_result.gsub("install","hold"), args, query_args)
166
+ expect(provider.query[:ensure]).to eq("2.7.13")
167
+ expect(provider.query[:mark]).to eq(:hold)
168
+ end
169
+
170
+ it "considers mark status to be none if package is not held" do
171
+ dpkg_query_execution_with_multiple_args_returns(query_output.gsub("install","ok"),args_with_provides,virtual_packages_query_args)
172
+ dpkg_query_execution_with_multiple_args_returns(dpkg_query_result.gsub("install","ok"), args, query_args)
173
+ expect(provider.query[:ensure]).to eq("2.7.13")
174
+ expect(provider.query[:mark]).to eq(:none)
175
+ end
176
+
163
177
  context "regex check for query search" do
164
178
  let(:resource_name) { 'python-email' }
165
179
  let(:resource) { instance_double('Puppet::Type::Package') }
@@ -168,10 +182,10 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
168
182
  allow(resource).to receive(:[]=)
169
183
  end
170
184
 
171
- it "checks if virtual package regex for query is correctand phisical package is installed" do
185
+ it "checks if virtual package regex for query is correct and physical package is installed" do
172
186
  dpkg_query_execution_with_multiple_args_returns(query_output,args_with_provides,virtual_packages_query_args)
173
187
  dpkg_query_execution_with_multiple_args_returns(dpkg_query_result, args, query_args)
174
- expect(provider.query).to match({:desired=>"install", :ensure=>"2.7.13", :error=>"ok", :name=>"python", :provider=>:dpkg, :status=>"installed"})
188
+ expect(provider.query).to match({:desired => "install", :ensure => "2.7.13", :error => "ok", :name => "python", :mark => :none, :provider => :dpkg, :status => "installed"})
175
189
  end
176
190
 
177
191
  context "regex check with no partial matching" do
@@ -208,7 +222,7 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
208
222
  it "returns a hash of the found package status for an installed package" do
209
223
  dpkg_query_execution_returns(bash_installed_output)
210
224
 
211
- expect(provider.query).to eq({:ensure => "4.2-5ubuntu3", :error => "ok", :desired => "install", :name => "bash", :status => "installed", :provider => :dpkg})
225
+ expect(provider.query).to eq({:ensure => "4.2-5ubuntu3", :error => "ok", :desired => "install", :name => "bash", :mark => :none, :status => "installed", :provider => :dpkg})
212
226
  end
213
227
 
214
228
  it "considers the package absent if the dpkg-query result cannot be interpreted" do
@@ -271,6 +285,7 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
271
285
  :error => 'ok',
272
286
  :status => 'status',
273
287
  :name => resource_name,
288
+ :mark => :none,
274
289
  :ensure => 'ensure',
275
290
  :provider => :dpkg,
276
291
  }
@@ -46,6 +46,8 @@ describe Puppet::Type.type(:package).provider(:openbsd) do
46
46
  allow(described_class).to receive(:command).with(:pkginfo).and_return('/bin/pkg_info')
47
47
  allow(described_class).to receive(:command).with(:pkgadd).and_return('/bin/pkg_add')
48
48
  allow(described_class).to receive(:command).with(:pkgdelete).and_return('/bin/pkg_delete')
49
+
50
+ allow(Puppet::FileSystem).to receive(:exist?)
49
51
  end
50
52
 
51
53
  context "#instances" do
@@ -32,10 +32,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
32
32
  end
33
33
 
34
34
  it "should call yaourt to install the right package quietly when yaourt is installed" do
35
- allow(described_class).to receive(:yaourt?).and_return(true)
36
- args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
37
- expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
38
- provider.install
35
+ without_partial_double_verification do
36
+ allow(described_class).to receive(:yaourt?).and_return(true)
37
+ args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
38
+ expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
39
+ provider.install
40
+ end
39
41
  end
40
42
 
41
43
  it "should raise an Puppet::Error if the installation failed" do
@@ -74,10 +76,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
74
76
  end
75
77
 
76
78
  it "should call yaourt to install the right package quietly when yaourt is installed" do
77
- expect(described_class).to receive(:yaourt?).and_return(true)
78
- args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
79
- expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
80
- provider.install
79
+ without_partial_double_verification do
80
+ expect(described_class).to receive(:yaourt?).and_return(true)
81
+ args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
82
+ expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
83
+ provider.install
84
+ end
81
85
  end
82
86
  end
83
87
 
@@ -172,10 +176,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
172
176
  end
173
177
 
174
178
  it "should call yaourt to remove the right package quietly" do
175
- allow(described_class).to receive(:yaourt?).and_return(true)
176
- args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
177
- expect(provider).to receive(:yaourt).with(*args)
178
- provider.uninstall
179
+ without_partial_double_verification do
180
+ allow(described_class).to receive(:yaourt?).and_return(true)
181
+ args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
182
+ expect(provider).to receive(:yaourt).with(*args)
183
+ provider.uninstall
184
+ end
179
185
  end
180
186
 
181
187
  it "adds any uninstall_options" do
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Puppet::Type.type(:package).provider(:pip2) do
4
+
5
+ it { is_expected.to be_installable }
6
+ it { is_expected.to be_uninstallable }
7
+ it { is_expected.to be_upgradeable }
8
+ it { is_expected.to be_versionable }
9
+ it { is_expected.to be_install_options }
10
+ it { is_expected.to be_targetable }
11
+
12
+ it "should inherit most things from pip provider" do
13
+ expect(described_class < Puppet::Type.type(:package).provider(:pip))
14
+ end
15
+
16
+ it "should use pip2 command" do
17
+ expect(described_class.cmd).to eq(["pip2"])
18
+ end
19
+
20
+ context 'calculated specificity' do
21
+ context 'when is not defaultfor' do
22
+ subject { described_class.specificity }
23
+ it { is_expected.to eql 1 }
24
+ end
25
+
26
+ context 'when is defaultfor' do
27
+ let(:os) { Facter.value(:operatingsystem) }
28
+ subject do
29
+ described_class.defaultfor(operatingsystem: os)
30
+ described_class.specificity
31
+ end
32
+ it { is_expected.to be > 100 }
33
+ end
34
+ end
35
+
36
+ end
@@ -14,9 +14,8 @@ describe Puppet::Type.type(:package).provider(:pip) do
14
14
  it { is_expected.to be_version_ranges }
15
15
 
16
16
  before do
17
- @resource = Puppet::Resource.new(:package, "fake_package")
18
- allow(@resource).to receive(:original_parameters).and_return({})
19
- @provider = described_class.new(@resource)
17
+ @resource = Puppet::Type.type(:package).new(name: "fake_package", provider: :pip)
18
+ @provider = @resource.provider
20
19
  @client = double('client')
21
20
  allow(@client).to receive(:call).with('package_releases', 'real_package').and_return(["1.3", "1.2.5", "1.2.4"])
22
21
  allow(@client).to receive(:call).with('package_releases', 'fake_package').and_return([])
@@ -335,7 +334,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
335
334
 
336
335
  it "should install" do
337
336
  @resource[:ensure] = :installed
338
- @resource[:source] = nil
339
337
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package"]])
340
338
  @provider.install
341
339
  end
@@ -368,7 +366,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
368
366
 
369
367
  it "should install a particular version" do
370
368
  @resource[:ensure] = "0.0.0"
371
- @resource[:source] = nil
372
369
  # TJK
373
370
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package==0.0.0"]])
374
371
  @provider.install
@@ -376,7 +373,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
376
373
 
377
374
  it "should upgrade" do
378
375
  @resource[:ensure] = :latest
379
- @resource[:source] = nil
380
376
  # TJK
381
377
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--upgrade", "fake_package"]])
382
378
  @provider.install
@@ -384,7 +380,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
384
380
 
385
381
  it "should handle install options" do
386
382
  @resource[:ensure] = :installed
387
- @resource[:source] = nil
388
383
  @resource[:install_options] = [{"--timeout" => "10"}, "--no-index"]
389
384
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--timeout=10", "--no-index", "fake_package"]])
390
385
  @provider.install
@@ -415,7 +410,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
415
410
  let(:pip) { '/fake/bin/pip' }
416
411
 
417
412
  it "should look up version if pip is present" do
418
- allow(described_class).to receive(:pip_cmd).and_return(pip)
413
+ allow(described_class).to receive(:cmd).and_return(pip)
419
414
  process = ['pip 8.0.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)']
420
415
  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield(process)
421
416
 
@@ -423,7 +418,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
423
418
  end
424
419
 
425
420
  it "parses multiple lines of output" do
426
- allow(described_class).to receive(:pip_cmd).and_return(pip)
421
+ allow(described_class).to receive(:cmd).and_return(pip)
427
422
  process = [
428
423
  "/usr/local/lib/python2.7/dist-packages/urllib3/contrib/socks.py:37: DependencyWarning: SOCKS support in urllib3 requires the installation of optional dependencies: specifically, PySocks. For more information, see https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies",
429
424
  " DependencyWarning",
@@ -435,7 +430,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
435
430
  end
436
431
 
437
432
  it "raises if there isn't a version string" do
438
- allow(described_class).to receive(:pip_cmd).and_return(pip)
433
+ allow(described_class).to receive(:cmd).and_return(pip)
439
434
  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield([""])
440
435
  expect {
441
436
  described_class.pip_version(pip)
@@ -444,7 +439,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
444
439
 
445
440
  it "quotes commands with spaces" do
446
441
  pip = 'C:\Program Files\Python27\Scripts\pip.exe'
447
- allow(described_class).to receive(:pip_cmd).and_return(pip)
442
+ allow(described_class).to receive(:cmd).and_return(pip)
448
443
  process = ["pip 18.1 from c:\program files\python27\lib\site-packages\pip (python 2.7)\r\n"]
449
444
  allow(described_class).to receive(:execpipe).with(["\"#{pip}\"", '--version']).and_yield(process)
450
445
 
@@ -8,10 +8,6 @@ describe Puppet::Type.type(:package).provider(:pkgdmg) do
8
8
  it { is_expected.not_to be_uninstallable }
9
9
 
10
10
  describe "when installing it should fail when" do
11
- before :each do
12
- expect(Puppet::Util).not_to receive(:execute)
13
- end
14
-
15
11
  it "no source is specified" do
16
12
  expect { provider.install }.to raise_error(Puppet::Error, /must specify a package source/)
17
13
  end
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+
3
+ describe Puppet::Type.type(:package).provider(:puppetserver_gem) do
4
+ let(:resource) do
5
+ Puppet::Type.type(:package).new(
6
+ name: 'myresource',
7
+ ensure: :installed
8
+ )
9
+ end
10
+
11
+ let(:provider) do
12
+ provider = described_class.new
13
+ provider.resource = resource
14
+ provider
15
+ end
16
+
17
+ let(:provider_gem_cmd) { '/opt/puppetlabs/bin/puppetserver' }
18
+
19
+ custom_environment = { HOME: ENV['HOME'] }
20
+
21
+ let(:execute_options) { { failonfail: true, combine: true, custom_environment: custom_environment } }
22
+
23
+ before :each do
24
+ resource.provider = provider
25
+ allow(Puppet::Util).to receive(:which).with(provider_gem_cmd).and_return(provider_gem_cmd)
26
+ end
27
+
28
+ describe "#install" do
29
+ it "uses the path to the gem command" do
30
+ allow(described_class).to receive(:validate_command).with(provider_gem_cmd)
31
+ expect(Puppet::Util::Execution).to receive(:execute).with(be_a(Array), execute_options) { |args| expect(args[0]).to eq(provider_gem_cmd) }.and_return('')
32
+ provider.install
33
+ end
34
+
35
+ it "appends version if given" do
36
+ resource[:ensure] = ['1.2.1']
37
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem install -v 1.2.1 --no-document myresource}).and_return('')
38
+ provider.install
39
+ end
40
+
41
+ context "with install_options" do
42
+ it "does not append the parameter by default" do
43
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem install --no-document myresource}).and_return('')
44
+ provider.install
45
+ end
46
+
47
+ it "allows setting the parameter" do
48
+ resource[:install_options] = [ '--force', {'--bindir' => '/usr/bin' } ]
49
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem install --force --bindir=/usr/bin --no-document myresource}).and_return('')
50
+ provider.install
51
+ end
52
+ end
53
+
54
+ context "with source" do
55
+ it "correctly sets http source" do
56
+ resource[:source] = 'http://rubygems.com'
57
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem install --no-document --source http://rubygems.com myresource}).and_return('')
58
+ provider.install
59
+ end
60
+
61
+ it "correctly sets local file source" do
62
+ resource[:source] = 'paint-2.2.0.gem'
63
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem install --no-document paint-2.2.0.gem}).and_return('')
64
+ provider.install
65
+ end
66
+
67
+ it "correctly sets local file source with URI scheme" do
68
+ resource[:source] = 'file:///root/paint-2.2.0.gem'
69
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem install --no-document /root/paint-2.2.0.gem}).and_return('')
70
+ provider.install
71
+ end
72
+
73
+ it "raises if given a puppet URI scheme" do
74
+ resource[:source] = 'puppet:///paint-2.2.0.gem'
75
+ expect { provider.install }.to raise_error(Puppet::Error, 'puppet:// URLs are not supported as gem sources')
76
+ end
77
+
78
+ it "raises if given an invalid URI" do
79
+ resource[:source] = 'h;ttp://rubygems.com'
80
+ expect { provider.install }.to raise_error(Puppet::Error, /Invalid source '': bad URI\(is not URI\?\)/)
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#uninstall" do
86
+ it "uses the path to the gem command" do
87
+ allow(described_class).to receive(:validate_command).with(provider_gem_cmd)
88
+ expect(Puppet::Util::Execution).to receive(:execute).with(be_a(Array), execute_options) { |args| expect(args[0]).to eq(provider_gem_cmd) }.and_return('')
89
+ provider.uninstall
90
+ end
91
+
92
+ context "with uninstall_options" do
93
+ it "does not append the parameter by default" do
94
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem uninstall --executables --all myresource}).and_return('')
95
+ provider.uninstall
96
+ end
97
+
98
+ it "allows setting the parameter" do
99
+ resource[:uninstall_options] = [ '--force', {'--bindir' => '/usr/bin' } ]
100
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem uninstall --executables --all myresource --force --bindir=/usr/bin}).and_return('')
101
+ provider.uninstall
102
+ end
103
+ end
104
+ end
105
+
106
+ describe ".gemlist" do
107
+ context "listing installed packages" do
108
+ it "uses the puppet rubygems library to list local gems" do
109
+ expected = { name: 'world_airports', provider: :puppetserver_gem, ensure: ['1.1.3'] }
110
+ expect(described_class).to receive(:execute_rubygems_list_command).with(nil).and_return(File.read(my_fixture('gem-list-local-packages')))
111
+ expect(described_class.gemlist({ local: true })).to include(expected)
112
+ end
113
+ end
114
+
115
+ it "appends the gem source if given" do
116
+ expect(described_class).to receive(:puppetservercmd).with(%w{gem list --remote --source https://rubygems.com}).and_return('')
117
+ described_class.gemlist({ source: 'https://rubygems.com' })
118
+ end
119
+ end
120
+
121
+ context 'calculated specificity' do
122
+ context 'when is not defaultfor' do
123
+ subject { described_class.specificity }
124
+ it { is_expected.to eql 1 }
125
+ end
126
+
127
+ context 'when is defaultfor' do
128
+ let(:os) { Facter.value(:operatingsystem) }
129
+ subject do
130
+ described_class.defaultfor(operatingsystem: os)
131
+ described_class.specificity
132
+ end
133
+ it { is_expected.to be > 100 }
134
+ end
135
+ end
136
+
137
+ end