puppet 6.19.0 → 6.22.1

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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +50 -39
  5. data/ext/project_data.yaml +2 -2
  6. data/lib/puppet/application.rb +10 -6
  7. data/lib/puppet/application/agent.rb +1 -0
  8. data/lib/puppet/application/apply.rb +3 -2
  9. data/lib/puppet/application/device.rb +1 -0
  10. data/lib/puppet/application/filebucket.rb +2 -2
  11. data/lib/puppet/application/script.rb +1 -0
  12. data/lib/puppet/application/ssl.rb +11 -0
  13. data/lib/puppet/application_support.rb +7 -0
  14. data/lib/puppet/configurer.rb +28 -18
  15. data/lib/puppet/defaults.rb +46 -20
  16. data/lib/puppet/environments.rb +54 -55
  17. data/lib/puppet/face/config.rb +10 -0
  18. data/lib/puppet/face/epp.rb +12 -2
  19. data/lib/puppet/face/facts.rb +158 -0
  20. data/lib/puppet/ffi/posix.rb +10 -0
  21. data/lib/puppet/ffi/posix/constants.rb +14 -0
  22. data/lib/puppet/ffi/posix/functions.rb +24 -0
  23. data/lib/puppet/file_system/memory_file.rb +8 -1
  24. data/lib/puppet/file_system/windows.rb +2 -0
  25. data/lib/puppet/functions/epp.rb +1 -0
  26. data/lib/puppet/functions/inline_epp.rb +1 -0
  27. data/lib/puppet/functions/partition.rb +8 -0
  28. data/lib/puppet/indirector/fact_search.rb +60 -0
  29. data/lib/puppet/indirector/facts/facter.rb +24 -3
  30. data/lib/puppet/indirector/facts/json.rb +27 -0
  31. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  32. data/lib/puppet/indirector/json.rb +5 -1
  33. data/lib/puppet/indirector/node/json.rb +8 -0
  34. data/lib/puppet/indirector/report/json.rb +34 -0
  35. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  36. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  37. data/lib/puppet/network/formats.rb +69 -1
  38. data/lib/puppet/network/http/factory.rb +4 -0
  39. data/lib/puppet/pal/pal_impl.rb +70 -17
  40. data/lib/puppet/parser/ast/leaf.rb +3 -2
  41. data/lib/puppet/parser/templatewrapper.rb +1 -1
  42. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  43. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  44. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  45. data/lib/puppet/property/list.rb +1 -1
  46. data/lib/puppet/provider/group/groupadd.rb +13 -8
  47. data/lib/puppet/provider/package/apt.rb +34 -2
  48. data/lib/puppet/provider/package/aptitude.rb +6 -0
  49. data/lib/puppet/provider/package/dnfmodule.rb +1 -1
  50. data/lib/puppet/provider/service/debian.rb +2 -0
  51. data/lib/puppet/provider/service/systemd.rb +1 -1
  52. data/lib/puppet/provider/user/aix.rb +2 -2
  53. data/lib/puppet/provider/user/useradd.rb +62 -8
  54. data/lib/puppet/reference/configuration.rb +6 -5
  55. data/lib/puppet/settings.rb +43 -15
  56. data/lib/puppet/settings/alias_setting.rb +37 -0
  57. data/lib/puppet/settings/base_setting.rb +26 -2
  58. data/lib/puppet/settings/environment_conf.rb +1 -0
  59. data/lib/puppet/type/package.rb +3 -3
  60. data/lib/puppet/util/autoload.rb +1 -8
  61. data/lib/puppet/util/fact_dif.rb +81 -0
  62. data/lib/puppet/util/monkey_patches.rb +7 -0
  63. data/lib/puppet/util/posix.rb +54 -5
  64. data/lib/puppet/util/rubygems.rb +5 -1
  65. data/lib/puppet/util/windows/adsi.rb +46 -0
  66. data/lib/puppet/util/windows/api_types.rb +1 -1
  67. data/lib/puppet/util/windows/principal.rb +9 -2
  68. data/lib/puppet/util/windows/service.rb +1 -1
  69. data/lib/puppet/util/windows/sid.rb +4 -2
  70. data/lib/puppet/version.rb +1 -1
  71. data/locales/puppet.pot +295 -219
  72. data/man/man5/puppet.conf.5 +15 -7
  73. data/man/man8/puppet-agent.8 +2 -2
  74. data/man/man8/puppet-apply.8 +2 -2
  75. data/man/man8/puppet-catalog.8 +1 -1
  76. data/man/man8/puppet-config.8 +1 -1
  77. data/man/man8/puppet-describe.8 +1 -1
  78. data/man/man8/puppet-device.8 +2 -2
  79. data/man/man8/puppet-doc.8 +1 -1
  80. data/man/man8/puppet-epp.8 +1 -1
  81. data/man/man8/puppet-facts.8 +90 -1
  82. data/man/man8/puppet-filebucket.8 +3 -3
  83. data/man/man8/puppet-generate.8 +1 -1
  84. data/man/man8/puppet-help.8 +1 -1
  85. data/man/man8/puppet-key.8 +1 -1
  86. data/man/man8/puppet-lookup.8 +1 -1
  87. data/man/man8/puppet-man.8 +1 -1
  88. data/man/man8/puppet-module.8 +1 -1
  89. data/man/man8/puppet-node.8 +4 -1
  90. data/man/man8/puppet-parser.8 +1 -1
  91. data/man/man8/puppet-plugin.8 +1 -1
  92. data/man/man8/puppet-report.8 +4 -1
  93. data/man/man8/puppet-resource.8 +1 -1
  94. data/man/man8/puppet-script.8 +2 -2
  95. data/man/man8/puppet-ssl.8 +5 -1
  96. data/man/man8/puppet-status.8 +1 -1
  97. data/man/man8/puppet.8 +2 -2
  98. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  99. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  100. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  101. data/spec/integration/application/agent_spec.rb +160 -3
  102. data/spec/integration/application/apply_spec.rb +19 -0
  103. data/spec/integration/application/plugin_spec.rb +1 -1
  104. data/spec/integration/defaults_spec.rb +0 -7
  105. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  106. data/spec/integration/http/client_spec.rb +12 -0
  107. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  108. data/spec/integration/resource/type_collection_spec.rb +2 -6
  109. data/spec/integration/transaction_spec.rb +4 -9
  110. data/spec/integration/util/windows/adsi_spec.rb +21 -1
  111. data/spec/integration/util/windows/principal_spec.rb +21 -0
  112. data/spec/integration/util/windows/registry_spec.rb +6 -10
  113. data/spec/lib/puppet_spec/settings.rb +6 -1
  114. data/spec/spec_helper.rb +12 -5
  115. data/spec/unit/agent_spec.rb +8 -6
  116. data/spec/unit/application/agent_spec.rb +0 -1
  117. data/spec/unit/application/config_spec.rb +224 -4
  118. data/spec/unit/application/facts_spec.rb +482 -3
  119. data/spec/unit/application/filebucket_spec.rb +0 -2
  120. data/spec/unit/application/ssl_spec.rb +23 -0
  121. data/spec/unit/application_spec.rb +51 -9
  122. data/spec/unit/confine/feature_spec.rb +1 -1
  123. data/spec/unit/confine_spec.rb +8 -2
  124. data/spec/unit/defaults_spec.rb +36 -1
  125. data/spec/unit/environments_spec.rb +221 -68
  126. data/spec/unit/face/config_spec.rb +27 -32
  127. data/spec/unit/face/facts_spec.rb +4 -0
  128. data/spec/unit/face/node_spec.rb +0 -11
  129. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  130. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  131. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  132. data/spec/unit/file_system_spec.rb +9 -0
  133. data/spec/unit/forge/module_release_spec.rb +2 -7
  134. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  135. data/spec/unit/http/service/compiler_spec.rb +49 -0
  136. data/spec/unit/http/service_spec.rb +1 -1
  137. data/spec/unit/indirector/face_spec.rb +0 -1
  138. data/spec/unit/indirector/facts/facter_spec.rb +95 -1
  139. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  140. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  141. data/spec/unit/indirector/indirection_spec.rb +8 -12
  142. data/spec/unit/indirector/key/file_spec.rb +0 -1
  143. data/spec/unit/indirector/node/json_spec.rb +33 -0
  144. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  145. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  146. data/spec/unit/indirector_spec.rb +2 -2
  147. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  148. data/spec/unit/network/authconfig_spec.rb +0 -3
  149. data/spec/unit/network/formats_spec.rb +41 -0
  150. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  151. data/spec/unit/network/http/factory_spec.rb +19 -0
  152. data/spec/unit/network/http/handler_spec.rb +0 -5
  153. data/spec/unit/parser/compiler_spec.rb +3 -19
  154. data/spec/unit/parser/resource_spec.rb +14 -8
  155. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  156. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  157. data/spec/unit/property_spec.rb +1 -0
  158. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  159. data/spec/unit/provider/nameservice_spec.rb +66 -65
  160. data/spec/unit/provider/package/apt_spec.rb +28 -23
  161. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  162. data/spec/unit/provider/package/base_spec.rb +6 -5
  163. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  164. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  165. data/spec/unit/provider/package/pip_spec.rb +6 -11
  166. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  167. data/spec/unit/provider/service/systemd_spec.rb +11 -0
  168. data/spec/unit/provider/user/aix_spec.rb +5 -0
  169. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  170. data/spec/unit/provider/user/pw_spec.rb +2 -0
  171. data/spec/unit/provider/user/useradd_spec.rb +71 -3
  172. data/spec/unit/provider_spec.rb +8 -10
  173. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  174. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  175. data/spec/unit/resource/catalog_spec.rb +1 -1
  176. data/spec/unit/resource/type_spec.rb +1 -1
  177. data/spec/unit/resource_spec.rb +11 -10
  178. data/spec/unit/settings_spec.rb +543 -228
  179. data/spec/unit/ssl/base_spec.rb +0 -1
  180. data/spec/unit/ssl/host_spec.rb +0 -5
  181. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  182. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  183. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  184. data/spec/unit/transaction_spec.rb +13 -4
  185. data/spec/unit/type/file/content_spec.rb +0 -1
  186. data/spec/unit/type/file/selinux_spec.rb +0 -2
  187. data/spec/unit/type/file_spec.rb +0 -6
  188. data/spec/unit/type/group_spec.rb +13 -6
  189. data/spec/unit/type/resources_spec.rb +7 -7
  190. data/spec/unit/type/service_spec.rb +1 -1
  191. data/spec/unit/type/tidy_spec.rb +0 -1
  192. data/spec/unit/type_spec.rb +2 -2
  193. data/spec/unit/util/at_fork_spec.rb +2 -2
  194. data/spec/unit/util/autoload_spec.rb +5 -1
  195. data/spec/unit/util/backups_spec.rb +1 -2
  196. data/spec/unit/util/execution_spec.rb +15 -11
  197. data/spec/unit/util/inifile_spec.rb +6 -14
  198. data/spec/unit/util/log_spec.rb +8 -7
  199. data/spec/unit/util/logging_spec.rb +3 -3
  200. data/spec/unit/util/posix_spec.rb +363 -15
  201. data/spec/unit/util/rubygems_spec.rb +2 -2
  202. data/spec/unit/util/selinux_spec.rb +76 -52
  203. data/spec/unit/util/storage_spec.rb +3 -1
  204. data/spec/unit/util/suidmanager_spec.rb +44 -41
  205. data/spec/unit/util/windows/sid_spec.rb +6 -0
  206. data/spec/unit/util_spec.rb +13 -6
  207. metadata +23 -14
  208. data/spec/integration/application/config_spec.rb +0 -74
  209. data/spec/lib/matchers/include.rb +0 -27
  210. data/spec/lib/matchers/include_spec.rb +0 -32
  211. data/spec/unit/face/catalog_spec.rb +0 -6
  212. data/spec/unit/face/module_spec.rb +0 -3
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'puppet_spec/compiler'
3
+
4
+ describe Puppet::Pops::Evaluator::DeferredResolver do
5
+ include PuppetSpec::Compiler
6
+
7
+ let(:environment) { Puppet::Node::Environment.create(:testing, []) }
8
+ let(:facts) { Puppet::Node::Facts.new('node.example.com') }
9
+
10
+ it 'resolves deferred values in a catalog' do
11
+ catalog = compile_to_catalog(<<~END)
12
+ notify { "deferred":
13
+ message => Deferred("join", [[1,2,3], ":"])
14
+ }
15
+ END
16
+ described_class.resolve_and_replace(facts, catalog)
17
+
18
+ expect(catalog.resource(:notify, 'deferred')[:message]).to eq('1:2:3')
19
+ end
20
+ end
@@ -5,6 +5,7 @@ Puppet::Type.newtype(:property_test) do
5
5
  newparam(:name, isnamevar: true)
6
6
  end
7
7
  Puppet::Type.type(:property_test).provide(:property_test) do
8
+ attr_accessor :foo
8
9
  end
9
10
 
10
11
  describe Puppet::Property do
@@ -198,7 +198,10 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
198
198
  end
199
199
 
200
200
  describe "#findgroup" do
201
- before { allow(File).to receive(:read).with('/etc/group').and_return(content) }
201
+ before do
202
+ allow(Puppet::FileSystem).to receive(:exist?).with('/etc/group').and_return(true)
203
+ allow(Puppet::FileSystem).to receive(:each_line).with('/etc/group').and_yield(content)
204
+ end
202
205
 
203
206
  let(:content) { "sample_group_name:sample_password:sample_gid:sample_user_list" }
204
207
  let(:output) do
@@ -221,7 +224,7 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
221
224
  end
222
225
 
223
226
  it "reads the group file only once per resource" do
224
- expect(File).to receive(:read).with('/etc/group').once
227
+ expect(Puppet::FileSystem).to receive(:each_line).with('/etc/group').once
225
228
  5.times { provider.send(:findgroup, :group_name, 'sample_group_name') }
226
229
  end
227
230
  end
@@ -3,11 +3,28 @@ require 'puppet/provider/nameservice'
3
3
  require 'puppet/etc'
4
4
  require 'puppet_spec/character_encoding'
5
5
 
6
+ Puppet::Type.newtype(:nameservice_dummytype) do
7
+ newparam(:name)
8
+ ensurable
9
+ newproperty(:foo)
10
+ newproperty(:bar)
11
+ end
12
+
13
+ Puppet::Type.type(:nameservice_dummytype).provide(:nameservice_dummyprovider, parent: Puppet::Provider::NameService) do
14
+ def posixmethod(param)
15
+ param
16
+ end
17
+
18
+ def modifycmd(param, value)
19
+ []
20
+ end
21
+ end
22
+
6
23
  describe Puppet::Provider::NameService do
7
24
 
8
25
  before :each do
9
- described_class.initvars
10
- described_class.resource_type = faketype
26
+ provider.class.initvars
27
+ provider.class.resource_type = faketype
11
28
  end
12
29
 
13
30
  # These are values getpwent might give you
@@ -41,16 +58,12 @@ describe Puppet::Provider::NameService do
41
58
  # The provider sometimes relies on @resource for valid properties so let's
42
59
  # create a fake type with properties that match our fake struct.
43
60
  let :faketype do
44
- Puppet::Type.newtype(:nameservice_dummytype) do
45
- newparam(:name)
46
- ensurable
47
- newproperty(:foo)
48
- newproperty(:bar)
49
- end
61
+ Puppet::Type.type(:nameservice_dummytype)
50
62
  end
51
63
 
52
64
  let :provider do
53
- described_class.new(:name => 'bob', :foo => 'fooval', :bar => 'barval')
65
+ Puppet::Type.type(:nameservice_dummytype).provider(:nameservice_dummyprovider)
66
+ .new(:name => 'bob', :foo => 'fooval', :bar => 'barval')
54
67
  end
55
68
 
56
69
  let :resource do
@@ -91,61 +104,61 @@ describe Puppet::Provider::NameService do
91
104
 
92
105
  describe "#options" do
93
106
  it "should add options for a valid property" do
94
- described_class.options :foo, :key1 => 'val1', :key2 => 'val2'
95
- described_class.options :bar, :key3 => 'val3'
96
- expect(described_class.option(:foo, :key1)).to eq('val1')
97
- expect(described_class.option(:foo, :key2)).to eq('val2')
98
- expect(described_class.option(:bar, :key3)).to eq('val3')
107
+ provider.class.options :foo, :key1 => 'val1', :key2 => 'val2'
108
+ provider.class.options :bar, :key3 => 'val3'
109
+ expect(provider.class.option(:foo, :key1)).to eq('val1')
110
+ expect(provider.class.option(:foo, :key2)).to eq('val2')
111
+ expect(provider.class.option(:bar, :key3)).to eq('val3')
99
112
  end
100
113
 
101
114
  it "should raise an error for an invalid property" do
102
- expect { described_class.options :baz, :key1 => 'val1' }.to raise_error(
115
+ expect { provider.class.options :baz, :key1 => 'val1' }.to raise_error(
103
116
  Puppet::Error, 'baz is not a valid attribute for nameservice_dummytype')
104
117
  end
105
118
  end
106
119
 
107
120
  describe "#option" do
108
121
  it "should return the correct value" do
109
- described_class.options :foo, :key1 => 'val1', :key2 => 'val2'
110
- expect(described_class.option(:foo, :key2)).to eq('val2')
122
+ provider.class.options :foo, :key1 => 'val1', :key2 => 'val2'
123
+ expect(provider.class.option(:foo, :key2)).to eq('val2')
111
124
  end
112
125
 
113
126
  it "should symbolize the name first" do
114
- described_class.options :foo, :key1 => 'val1', :key2 => 'val2'
115
- expect(described_class.option('foo', :key2)).to eq('val2')
127
+ provider.class.options :foo, :key1 => 'val1', :key2 => 'val2'
128
+ expect(provider.class.option('foo', :key2)).to eq('val2')
116
129
  end
117
130
 
118
131
  it "should return nil if no option has been specified earlier" do
119
- expect(described_class.option(:foo, :key2)).to be_nil
132
+ expect(provider.class.option(:foo, :key2)).to be_nil
120
133
  end
121
134
 
122
135
  it "should return nil if no option for that property has been specified earlier" do
123
- described_class.options :bar, :key2 => 'val2'
124
- expect(described_class.option(:foo, :key2)).to be_nil
136
+ provider.class.options :bar, :key2 => 'val2'
137
+ expect(provider.class.option(:foo, :key2)).to be_nil
125
138
  end
126
139
 
127
140
  it "should return nil if no matching key can be found for that property" do
128
- described_class.options :foo, :key3 => 'val2'
129
- expect(described_class.option(:foo, :key2)).to be_nil
141
+ provider.class.options :foo, :key3 => 'val2'
142
+ expect(provider.class.option(:foo, :key2)).to be_nil
130
143
  end
131
144
  end
132
145
 
133
146
  describe "#section" do
134
147
  it "should raise an error if resource_type has not been set" do
135
- expect(described_class).to receive(:resource_type).and_return(nil)
136
- expect { described_class.section }.to raise_error Puppet::Error, 'Cannot determine Etc section without a resource type'
148
+ expect(provider.class).to receive(:resource_type).and_return(nil)
149
+ expect { provider.class.section }.to raise_error Puppet::Error, 'Cannot determine Etc section without a resource type'
137
150
  end
138
151
 
139
152
  # the return values are hard coded so I am using types that actually make
140
153
  # use of the nameservice provider
141
154
  it "should return pw for users" do
142
- described_class.resource_type = Puppet::Type.type(:user)
143
- expect(described_class.section).to eq('pw')
155
+ provider.class.resource_type = Puppet::Type.type(:user)
156
+ expect(provider.class.section).to eq('pw')
144
157
  end
145
158
 
146
159
  it "should return gr for groups" do
147
- described_class.resource_type = Puppet::Type.type(:group)
148
- expect(described_class.section).to eq('gr')
160
+ provider.class.resource_type = Puppet::Type.type(:group)
161
+ expect(provider.class.section).to eq('gr')
149
162
  end
150
163
  end
151
164
 
@@ -213,7 +226,7 @@ describe Puppet::Provider::NameService do
213
226
  # encoding
214
227
  allow(Etc).to receive(:getpwent).and_return(*utf_8_mixed_users)
215
228
  result = PuppetSpec::CharacterEncoding.with_external_encoding(Encoding::UTF_8) do
216
- described_class.instances
229
+ provider.class.instances
217
230
  end
218
231
  expect(result.map(&:name)).to eq(
219
232
  [
@@ -228,7 +241,7 @@ describe Puppet::Provider::NameService do
228
241
  it "should have object names in their original encoding/bytes if they would not be valid UTF-8" do
229
242
  allow(Etc).to receive(:getpwent).and_return(*latin_1_mixed_users)
230
243
  result = PuppetSpec::CharacterEncoding.with_external_encoding(Encoding::ISO_8859_1) do
231
- described_class.instances
244
+ provider.class.instances
232
245
  end
233
246
  expect(result.map(&:name)).to eq(
234
247
  [
@@ -243,40 +256,40 @@ describe Puppet::Provider::NameService do
243
256
  it "should pass the Puppet::Etc :canonical_name Struct member to the constructor" do
244
257
  users = [ Struct::Passwd.new(invalid_utf_8_jose, invalid_utf_8_jose, 1002, 2000), nil ]
245
258
  allow(Etc).to receive(:getpwent).and_return(*users)
246
- expect(described_class).to receive(:new).with(:name => escaped_utf_8_jose, :canonical_name => invalid_utf_8_jose, :ensure => :present)
247
- described_class.instances
259
+ expect(provider.class).to receive(:new).with(:name => escaped_utf_8_jose, :canonical_name => invalid_utf_8_jose, :ensure => :present)
260
+ provider.class.instances
248
261
  end
249
262
  end
250
263
 
251
264
  describe "validate" do
252
265
  it "should pass if no check is registered at all" do
253
- expect { described_class.validate(:foo, 300) }.to_not raise_error
254
- expect { described_class.validate('foo', 300) }.to_not raise_error
266
+ expect { provider.class.validate(:foo, 300) }.to_not raise_error
267
+ expect { provider.class.validate('foo', 300) }.to_not raise_error
255
268
  end
256
269
 
257
270
  it "should pass if no check for that property is registered" do
258
- described_class.verify(:bar, 'Must be 100') { |val| val == 100 }
259
- expect { described_class.validate(:foo, 300) }.to_not raise_error
260
- expect { described_class.validate('foo', 300) }.to_not raise_error
271
+ provider.class.verify(:bar, 'Must be 100') { |val| val == 100 }
272
+ expect { provider.class.validate(:foo, 300) }.to_not raise_error
273
+ expect { provider.class.validate('foo', 300) }.to_not raise_error
261
274
  end
262
275
 
263
276
  it "should pass if the value is valid" do
264
- described_class.verify(:foo, 'Must be 100') { |val| val == 100 }
265
- expect { described_class.validate(:foo, 100) }.to_not raise_error
266
- expect { described_class.validate('foo', 100) }.to_not raise_error
277
+ provider.class.verify(:foo, 'Must be 100') { |val| val == 100 }
278
+ expect { provider.class.validate(:foo, 100) }.to_not raise_error
279
+ expect { provider.class.validate('foo', 100) }.to_not raise_error
267
280
  end
268
281
 
269
282
  it "should raise an error if the value is invalid" do
270
- described_class.verify(:foo, 'Must be 100') { |val| val == 100 }
271
- expect { described_class.validate(:foo, 200) }.to raise_error(ArgumentError, 'Invalid value 200: Must be 100')
272
- expect { described_class.validate('foo', 200) }.to raise_error(ArgumentError, 'Invalid value 200: Must be 100')
283
+ provider.class.verify(:foo, 'Must be 100') { |val| val == 100 }
284
+ expect { provider.class.validate(:foo, 200) }.to raise_error(ArgumentError, 'Invalid value 200: Must be 100')
285
+ expect { provider.class.validate('foo', 200) }.to raise_error(ArgumentError, 'Invalid value 200: Must be 100')
273
286
  end
274
287
  end
275
288
 
276
289
  describe "getinfo" do
277
290
  before :each do
278
291
  # with section=foo we'll call Etc.getfoonam instead of getpwnam or getgrnam
279
- allow(described_class).to receive(:section).and_return('foo')
292
+ allow(provider.class).to receive(:section).and_return('foo')
280
293
  resource # initialize the resource so our provider has a @resource instance variable
281
294
  end
282
295
 
@@ -296,13 +309,13 @@ describe Puppet::Provider::NameService do
296
309
  # overriding to UTF-8, in @canonical_name for querying that state on disk
297
310
  # again if needed
298
311
  it "should use the instance's @canonical_name to query the system" do
299
- provider_instance = described_class.new(:name => 'foo', :canonical_name => 'original_foo', :ensure => :present)
312
+ provider_instance = provider.class.new(:name => 'foo', :canonical_name => 'original_foo', :ensure => :present)
300
313
  expect(Puppet::Etc).to receive(:send).with(:getfoonam, 'original_foo')
301
314
  provider_instance.getinfo(true)
302
315
  end
303
316
 
304
317
  it "should use the instance's name instead of canonical_name if not supplied during instantiation" do
305
- provider_instance = described_class.new(:name => 'foo', :ensure => :present)
318
+ provider_instance = provider.class.new(:name => 'foo', :ensure => :present)
306
319
  expect(Puppet::Etc).to receive(:send).with(:getfoonam, 'foo')
307
320
  provider_instance.getinfo(true)
308
321
  end
@@ -310,16 +323,6 @@ describe Puppet::Provider::NameService do
310
323
 
311
324
  describe "info2hash" do
312
325
  it "should return a hash with all properties" do
313
- # we have to have an implementation of posixmethod which has to
314
- # convert a propertyname (e.g. comment) into a fieldname of our
315
- # Struct (e.g. gecos). I do not want to test posixmethod here so
316
- # let's fake an implementation which does not do any translation. We
317
- # expect two method invocations because info2hash calls the method
318
- # twice if the Struct responds to the propertyname (our fake Struct
319
- # provides values for :foo and :bar) TODO: Fix that
320
- expect(provider).to receive(:posixmethod).with(:foo).and_return(:foo).twice
321
- expect(provider).to receive(:posixmethod).with(:bar).and_return(:bar).twice
322
- expect(provider).to receive(:posixmethod).with(:ensure).and_return(:ensure)
323
326
  expect(provider.info2hash(fakeetcobject)).to eq({ :foo => 'fooval', :bar => 'barval' })
324
327
  end
325
328
  end
@@ -330,7 +333,7 @@ describe Puppet::Provider::NameService do
330
333
  end
331
334
 
332
335
  it "should return the munged value otherwise" do
333
- described_class.options(:foo, :munge => proc { |x| x*2 })
336
+ provider.class.options(:foo, :munge => proc { |x| x*2 })
334
337
  expect(provider.munge(:foo, 100)).to eq(200)
335
338
  end
336
339
  end
@@ -341,7 +344,7 @@ describe Puppet::Provider::NameService do
341
344
  end
342
345
 
343
346
  it "should return the unmunged value otherwise" do
344
- described_class.options(:foo, :unmunge => proc { |x| x/2 })
347
+ provider.class.options(:foo, :unmunge => proc { |x| x/2 })
345
348
  expect(provider.unmunge(:foo, 200)).to eq(100)
346
349
  end
347
350
  end
@@ -359,15 +362,13 @@ describe Puppet::Provider::NameService do
359
362
  end
360
363
 
361
364
  describe "get" do
362
- before(:each) {described_class.resource_type = faketype }
363
-
364
365
  it "should return the correct getinfo value" do
365
366
  expect(provider).to receive(:getinfo).with(false).and_return(:foo => 'fooval', :bar => 'barval')
366
367
  expect(provider.get(:bar)).to eq('barval')
367
368
  end
368
369
 
369
370
  it "should unmunge the value first" do
370
- described_class.options(:bar, :munge => proc { |x| x*2}, :unmunge => proc {|x| x/2})
371
+ provider.class.options(:bar, :munge => proc { |x| x*2}, :unmunge => proc {|x| x/2})
371
372
  expect(provider).to receive(:getinfo).with(false).and_return(:foo => 200, :bar => 500)
372
373
  expect(provider.get(:bar)).to eq(250)
373
374
  end
@@ -382,7 +383,7 @@ describe Puppet::Provider::NameService do
382
383
  describe "set" do
383
384
  before :each do
384
385
  resource # initialize resource so our provider has a @resource object
385
- described_class.verify(:foo, 'Must be 100') { |val| val == 100 }
386
+ provider.class.verify(:foo, 'Must be 100') { |val| val == 100 }
386
387
  end
387
388
 
388
389
  it "should raise an error on invalid values" do
@@ -396,7 +397,7 @@ describe Puppet::Provider::NameService do
396
397
  end
397
398
 
398
399
  it "should munge the value first" do
399
- described_class.options(:foo, :munge => proc { |x| x*2}, :unmunge => proc {|x| x/2})
400
+ provider.class.options(:foo, :munge => proc { |x| x*2}, :unmunge => proc {|x| x/2})
400
401
  expect(provider).to receive(:modifycmd).with(:foo, 200).and_return(['/bin/modify', '-f', '200' ])
401
402
  expect(provider).to receive(:execute).with(['/bin/modify', '-f', '200'], hash_including(custom_environment: {}))
402
403
  provider.set(:foo, 100)
@@ -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