puppet 5.5.16-universal-darwin → 5.5.17-universal-darwin

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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +9 -9
  3. data/Gemfile.lock +18 -18
  4. data/ext/project_data.yaml +2 -2
  5. data/install.rb +3 -21
  6. data/lib/puppet/application/agent.rb +12 -0
  7. data/lib/puppet/application/device.rb +4 -4
  8. data/lib/puppet/application/resource.rb +4 -4
  9. data/lib/puppet/defaults.rb +4 -0
  10. data/lib/puppet/face/config.rb +10 -48
  11. data/lib/puppet/face/facts.rb +1 -1
  12. data/lib/puppet/face/plugin.rb +9 -2
  13. data/lib/puppet/module_tool/tar/mini.rb +11 -1
  14. data/lib/puppet/network/http/factory.rb +1 -11
  15. data/lib/puppet/parameter.rb +8 -0
  16. data/lib/puppet/provider/file/posix.rb +5 -0
  17. data/lib/puppet/provider/nameservice.rb +10 -3
  18. data/lib/puppet/provider/package/dnf.rb +1 -1
  19. data/lib/puppet/provider/package/rpm.rb +51 -13
  20. data/lib/puppet/provider/package/yum.rb +8 -4
  21. data/lib/puppet/provider/service/launchd.rb +20 -5
  22. data/lib/puppet/provider/service/systemd.rb +4 -9
  23. data/lib/puppet/provider/service/windows.rb +8 -0
  24. data/lib/puppet/provider/user/pw.rb +12 -3
  25. data/lib/puppet/provider/user/user_role_add.rb +4 -0
  26. data/lib/puppet/provider/user/useradd.rb +23 -7
  27. data/lib/puppet/resource.rb +17 -0
  28. data/lib/puppet/settings.rb +40 -0
  29. data/lib/puppet/type.rb +7 -0
  30. data/lib/puppet/type/exec.rb +14 -6
  31. data/lib/puppet/type/package.rb +10 -0
  32. data/lib/puppet/type/service.rb +7 -2
  33. data/lib/puppet/type/user.rb +1 -15
  34. data/lib/puppet/type/yumrepo.rb +3 -7
  35. data/lib/puppet/util/execution.rb +4 -3
  36. data/lib/puppet/util/http_proxy.rb +16 -2
  37. data/lib/puppet/util/selinux.rb +5 -1
  38. data/lib/puppet/util/windows/security.rb +2 -0
  39. data/lib/puppet/util/windows/service.rb +149 -4
  40. data/lib/puppet/util/windows/sid.rb +1 -0
  41. data/lib/puppet/version.rb +1 -1
  42. data/locales/puppet.pot +189 -193
  43. data/man/man5/puppet.conf.5 +10 -2
  44. data/man/man8/puppet-agent.8 +1 -1
  45. data/man/man8/puppet-apply.8 +1 -1
  46. data/man/man8/puppet-ca.8 +1 -1
  47. data/man/man8/puppet-catalog.8 +1 -1
  48. data/man/man8/puppet-cert.8 +1 -1
  49. data/man/man8/puppet-certificate.8 +1 -1
  50. data/man/man8/puppet-certificate_request.8 +1 -1
  51. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  52. data/man/man8/puppet-config.8 +1 -1
  53. data/man/man8/puppet-describe.8 +1 -1
  54. data/man/man8/puppet-device.8 +1 -1
  55. data/man/man8/puppet-doc.8 +1 -1
  56. data/man/man8/puppet-epp.8 +1 -1
  57. data/man/man8/puppet-facts.8 +1 -1
  58. data/man/man8/puppet-filebucket.8 +1 -1
  59. data/man/man8/puppet-generate.8 +1 -1
  60. data/man/man8/puppet-help.8 +1 -1
  61. data/man/man8/puppet-key.8 +1 -1
  62. data/man/man8/puppet-lookup.8 +1 -1
  63. data/man/man8/puppet-man.8 +1 -1
  64. data/man/man8/puppet-master.8 +1 -1
  65. data/man/man8/puppet-module.8 +1 -1
  66. data/man/man8/puppet-node.8 +1 -1
  67. data/man/man8/puppet-parser.8 +1 -1
  68. data/man/man8/puppet-plugin.8 +1 -1
  69. data/man/man8/puppet-report.8 +1 -1
  70. data/man/man8/puppet-resource.8 +1 -1
  71. data/man/man8/puppet-script.8 +1 -1
  72. data/man/man8/puppet-status.8 +1 -1
  73. data/man/man8/puppet.8 +2 -2
  74. data/spec/integration/provider/service/systemd_spec.rb +8 -5
  75. data/spec/integration/type/file_spec.rb +28 -0
  76. data/spec/integration/util/execution_spec.rb +27 -0
  77. data/spec/unit/application/agent_spec.rb +18 -0
  78. data/spec/unit/application/device_spec.rb +1 -1
  79. data/spec/unit/face/facts_spec.rb +9 -0
  80. data/spec/unit/face/plugin_spec.rb +8 -0
  81. data/spec/unit/module_tool/tar/mini_spec.rb +1 -1
  82. data/spec/unit/network/http/api/indirected_routes_spec.rb +26 -10
  83. data/spec/unit/network/http/factory_spec.rb +27 -5
  84. data/spec/unit/pops/validator/validator_spec.rb +7 -0
  85. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  86. data/spec/unit/provider/package/dnf_spec.rb +7 -0
  87. data/spec/unit/provider/package/rpm_spec.rb +150 -16
  88. data/spec/unit/provider/package/yum_spec.rb +7 -0
  89. data/spec/unit/provider/service/launchd_spec.rb +28 -0
  90. data/spec/unit/provider/service/windows_spec.rb +20 -0
  91. data/spec/unit/provider/user/pw_spec.rb +37 -0
  92. data/spec/unit/provider/user/useradd_spec.rb +42 -0
  93. data/spec/unit/resource_spec.rb +26 -1
  94. data/spec/unit/transaction_spec.rb +18 -0
  95. data/spec/unit/type/exec_spec.rb +9 -0
  96. data/spec/unit/type/file/source_spec.rb +4 -4
  97. data/spec/unit/type/schedule_spec.rb +3 -1
  98. data/spec/unit/type/service_spec.rb +16 -0
  99. data/spec/unit/type/user_spec.rb +13 -13
  100. data/spec/unit/type/yumrepo_spec.rb +30 -0
  101. data/spec/unit/type_spec.rb +40 -0
  102. data/spec/unit/util/http_proxy_spec.rb +24 -1
  103. data/spec/unit/util/log_spec.rb +27 -1
  104. data/spec/unit/util/windows/service_spec.rb +9 -0
  105. metadata +3 -7
  106. data/ext/windows/eventlog/Rakefile +0 -32
  107. data/ext/windows/eventlog/puppetres.dll +0 -0
  108. data/ext/windows/eventlog/puppetres.mc +0 -18
@@ -590,6 +590,24 @@ describe Puppet::Application::Agent do
590
590
  end
591
591
  end
592
592
 
593
+ describe "when starting in daemon mode on non-windows", :unless => Puppet.features.microsoft_windows? do
594
+ before :each do
595
+ allow(Puppet).to receive(:notice)
596
+ Puppet[:daemonize] = true
597
+ end
598
+
599
+ it "should not print config in default mode" do
600
+ execute_agent
601
+ expect(@logs).to be_empty
602
+ end
603
+
604
+ it "should print config in debug mode" do
605
+ @puppetd.options[:debug] = true
606
+ execute_agent
607
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: /agent_catalog_run_lockfile=/))
608
+ end
609
+ end
610
+
593
611
  def execute_agent
594
612
  @puppetd.setup
595
613
  @puppetd.run_command
@@ -481,7 +481,7 @@ describe Puppet::Application::Device do
481
481
  allow(@device.options).to receive(:[]).with(:to_yaml).and_return(true)
482
482
  allow(@device.command_line).to receive(:args).and_return(['user'])
483
483
  expect(Puppet::Resource.indirection).to receive(:search).with('user/', {}).and_return(resources)
484
- expect(@device).to receive(:puts).with("user:\n title:\n")
484
+ expect(@device).to receive(:puts).with("---\nuser:\n title: {}\n")
485
485
  expect { @device.main }.to exit_with 0
486
486
  end
487
487
 
@@ -45,6 +45,15 @@ CONF
45
45
  subject.upload
46
46
  end
47
47
 
48
+ it "passes the current environment" do
49
+ env = Puppet::Node::Environment.remote('qa')
50
+ expect(model.indirection).to receive(:save).with(anything, nil, :environment => env)
51
+
52
+ Puppet.override(:current_environment => env) do
53
+ subject.upload
54
+ end
55
+ end
56
+
48
57
  it "uses settings from the agent section of puppet.conf" do
49
58
  expect(facter_terminus).to receive(:find).with(have_attributes(key: 'puppet.node.test')).and_return(test_data)
50
59
 
@@ -50,6 +50,14 @@ describe Puppet::Face[:plugin, :current] do
50
50
  expect(receive_count).to eq(3)
51
51
  expect(render(result)).to eq('Downloaded these plugins: /a, /b, /c')
52
52
  end
53
+
54
+ it "uses persistent HTTP pool" do
55
+ allow_any_instance_of(Puppet::Configurer::Downloader).to receive(:evaluate) do
56
+ expect(Puppet.lookup(:http_pool)).to be_instance_of(Puppet::Network::HTTP::Pool)
57
+ end.and_return([])
58
+
59
+ pluginface.download
60
+ end
53
61
  end
54
62
 
55
63
  context "download when server_agent_version is 5.3.3" do
@@ -82,7 +82,7 @@ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Pup
82
82
  expect(Zlib::GzipReader).to receive(:open).with(sourcefile).and_yield(reader)
83
83
  expect(minitar).to receive(:find_valid_files).with(reader).and_return([name])
84
84
  entry = MockFileStatEntry.new(mode)
85
- expect(Archive::Tar::Minitar).to receive(:unpack).with(reader, destdir, [name]).
85
+ expect(Archive::Tar::Minitar).to receive(:unpack).with(reader, destdir, [name], :fsync => false).
86
86
  and_yield(type, name, {:entry => entry})
87
87
  entry
88
88
  end
@@ -38,19 +38,27 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
38
38
  end
39
39
 
40
40
  it "should fail if there is no environment specified" do
41
- expect(lambda { handler.uri2indirection("GET", "#{master_url_prefix}/node/bar", {}) }).to raise_error(bad_request_error)
41
+ expect {
42
+ handler.uri2indirection("GET", "#{master_url_prefix}/node/bar", {})
43
+ }.to raise_error(bad_request_error)
42
44
  end
43
45
 
44
46
  it "should fail if the environment is not alphanumeric" do
45
- expect(lambda { handler.uri2indirection("GET", "#{master_url_prefix}/node/bar", {:environment => "env ness"}) }).to raise_error(bad_request_error)
47
+ expect {
48
+ handler.uri2indirection("GET", "#{master_url_prefix}/node/bar", {:environment => "env ness"})
49
+ }.to raise_error(bad_request_error)
46
50
  end
47
51
 
48
52
  it "should fail if the indirection does not match the prefix" do
49
- expect(lambda { handler.uri2indirection("GET", "#{master_url_prefix}/certificate/foo", params) }).to raise_error(bad_request_error)
53
+ expect {
54
+ handler.uri2indirection("GET", "#{master_url_prefix}/certificate/foo", params)
55
+ }.to raise_error(bad_request_error)
50
56
  end
51
57
 
52
58
  it "should fail if the indirection does not have the correct version" do
53
- expect(lambda { handler.uri2indirection("GET", "#{Puppet::Network::HTTP::CA_URL_PREFIX}/v3/certificate/foo", params) }).to raise_error(bad_request_error)
59
+ expect {
60
+ handler.uri2indirection("GET", "#{Puppet::Network::HTTP::CA_URL_PREFIX}/v3/certificate/foo", params)
61
+ }.to raise_error(bad_request_error)
54
62
  end
55
63
 
56
64
  it "should not pass a buck_path parameter through (See Bugs #13553, #13518, #13511)" do
@@ -74,7 +82,9 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
74
82
  end
75
83
 
76
84
  it "should fail if the indirection name is not alphanumeric" do
77
- expect(lambda { handler.uri2indirection("GET", "#{master_url_prefix}/foo ness/bar", params) }).to raise_error(bad_request_error)
85
+ expect {
86
+ handler.uri2indirection("GET", "#{master_url_prefix}/foo ness/bar", params)
87
+ }.to raise_error(bad_request_error)
78
88
  end
79
89
 
80
90
  it "should use the remainder of the URI as the indirection key" do
@@ -86,7 +96,9 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
86
96
  end
87
97
 
88
98
  it "should fail if no indirection key is specified" do
89
- expect(lambda { handler.uri2indirection("GET", "#{master_url_prefix}/node", params) }).to raise_error(bad_request_error)
99
+ expect {
100
+ handler.uri2indirection("GET", "#{master_url_prefix}/node", params)
101
+ }.to raise_error(bad_request_error)
90
102
  end
91
103
 
92
104
  it "should choose 'find' as the indirection method if the http method is a GET and the indirection name is singular" do
@@ -126,7 +138,9 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
126
138
  end
127
139
 
128
140
  it "should fail if an indirection method cannot be picked" do
129
- expect(lambda { handler.uri2indirection("UPDATE", "#{master_url_prefix}/node/bar", params) }).to raise_error(method_not_allowed_error)
141
+ expect {
142
+ handler.uri2indirection("UPDATE", "#{master_url_prefix}/node/bar", params)
143
+ }.to raise_error(method_not_allowed_error)
130
144
  end
131
145
 
132
146
  it "should not URI unescape the indirection key" do
@@ -146,9 +160,11 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
146
160
  expect(handler).to receive(:check_authorization) do |_, _, arg|
147
161
  expect(arg).not_to include(:environment)
148
162
  end
149
- expect(lambda { handler.uri2indirection("GET",
150
- "#{master_url_prefix}/node/bar",
151
- {:environment => 'bogus'}) }).to raise_error(not_found_error)
163
+ expect {
164
+ handler.uri2indirection("GET",
165
+ "#{master_url_prefix}/node/bar",
166
+ {:environment => 'bogus'})
167
+ }.to raise_error(not_found_error)
152
168
  end
153
169
 
154
170
  it "should not URI unescape the indirection key as passed through to a call to check_authorization" do
@@ -42,10 +42,11 @@ describe Puppet::Network::HTTP::Factory do
42
42
  context "proxy settings" do
43
43
  let(:proxy_host) { 'myhost' }
44
44
  let(:proxy_port) { 432 }
45
+ let(:proxy_user) { 'mo' }
46
+ let(:proxy_pass) { 'password' }
45
47
 
46
- it "should not set a proxy if the value is 'none'" do
48
+ it "should not set a proxy if the http_proxy_host setting is 'none'" do
47
49
  Puppet[:http_proxy_host] = 'none'
48
- expect(Puppet::Util::HttpProxy).to receive(:no_proxy?).and_return(false)
49
50
  conn = create_connection(site)
50
51
 
51
52
  expect(conn.proxy_address).to be_nil
@@ -54,7 +55,18 @@ describe Puppet::Network::HTTP::Factory do
54
55
  it 'should not set a proxy if a no_proxy env var matches the destination' do
55
56
  Puppet[:http_proxy_host] = proxy_host
56
57
  Puppet[:http_proxy_port] = proxy_port
57
- expect(Puppet::Util::HttpProxy).to receive(:no_proxy?).and_return(true)
58
+ Puppet::Util.withenv('NO_PROXY' => site.host) do
59
+ conn = create_connection(site)
60
+
61
+ expect(conn.proxy_address).to be_nil
62
+ expect(conn.proxy_port).to be_nil
63
+ end
64
+ end
65
+
66
+ it 'should not set a proxy if the no_proxy setting matches the destination' do
67
+ Puppet[:http_proxy_host] = proxy_host
68
+ Puppet[:http_proxy_port] = proxy_port
69
+ Puppet[:no_proxy] = site.host
58
70
  conn = create_connection(site)
59
71
 
60
72
  expect(conn.proxy_address).to be_nil
@@ -63,7 +75,6 @@ describe Puppet::Network::HTTP::Factory do
63
75
 
64
76
  it 'sets proxy_address' do
65
77
  Puppet[:http_proxy_host] = proxy_host
66
- expect(Puppet::Util::HttpProxy).to receive(:no_proxy?).and_return(false)
67
78
  conn = create_connection(site)
68
79
 
69
80
  expect(conn.proxy_address).to eq(proxy_host)
@@ -72,11 +83,22 @@ describe Puppet::Network::HTTP::Factory do
72
83
  it 'sets proxy address and port' do
73
84
  Puppet[:http_proxy_host] = proxy_host
74
85
  Puppet[:http_proxy_port] = proxy_port
75
- expect(Puppet::Util::HttpProxy).to receive(:no_proxy?).and_return(false)
76
86
  conn = create_connection(site)
77
87
 
78
88
  expect(conn.proxy_port).to eq(proxy_port)
79
89
  end
90
+
91
+ it 'sets proxy user and password' do
92
+ Puppet[:http_proxy_host] = proxy_host
93
+ Puppet[:http_proxy_port] = proxy_port
94
+ Puppet[:http_proxy_user] = proxy_user
95
+ Puppet[:http_proxy_password] = proxy_pass
96
+
97
+ conn = create_connection(site)
98
+
99
+ expect(conn.proxy_user).to eq(proxy_user)
100
+ expect(conn.proxy_pass).to eq(proxy_pass)
101
+ end
80
102
  end
81
103
 
82
104
  context 'socket timeouts' do
@@ -599,6 +599,13 @@ describe "validating 4x" do
599
599
  end
600
600
  end
601
601
 
602
+ context 'for hash keys' do
603
+ it "should not allow reassignment of hash keys" do
604
+ source = "$my_hash = {'one' => '1', 'two' => '2' }; $my_hash['one']='1.5'"
605
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::ILLEGAL_INDEXED_ASSIGNMENT)
606
+ end
607
+ end
608
+
602
609
  context 'for parameter names' do
603
610
  ['class', 'define'].each do |word|
604
611
  it "should require that #{word} parameter names are unique" do
@@ -16,7 +16,7 @@ describe Puppet::Type.type(:package).provider(:aptrpm) do
16
16
  end
17
17
 
18
18
  def rpm_args
19
- ['-q', 'faff', '--nosignature', '--nodigest', '--qf', "'%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\\n'"]
19
+ ['-q', 'faff', '--nosignature', '--nodigest', '--qf', "%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\\n"]
20
20
  end
21
21
 
22
22
  it "should report purged packages" do
@@ -37,5 +37,12 @@ describe Puppet::Type.type(:package).provider(:dnf) do
37
37
  end
38
38
  end
39
39
 
40
+ describe 'provider features' do
41
+ it { is_expected.to be_versionable }
42
+ it { is_expected.to be_install_options }
43
+ it { is_expected.to be_virtual_packages }
44
+ it { is_expected.to be_install_only }
45
+ end
46
+
40
47
  it_behaves_like 'RHEL package provider', described_class, 'dnf'
41
48
  end
@@ -9,6 +9,8 @@ describe Puppet::Type.type(:package).provider(:rpm) do
9
9
  myresource 0 1.2.3.4 5.el4 noarch
10
10
  mysummaryless 0 1.2.3.4 5.el4 noarch
11
11
  tomcat 1 1.2.3.4 5.el4 x86_64
12
+ kernel 1 1.2.3.4 5.el4 x86_64
13
+ kernel 1 1.2.3.6 5.el4 x86_64
12
14
  '
13
15
  RPM_OUTPUT
14
16
  end
@@ -57,7 +59,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
57
59
  describe "with a modern version of RPM" do
58
60
  it "includes all the modern flags" do
59
61
  expect(Puppet::Util::Execution).to receive(:execpipe)
60
- .with("/bin/rpm -qa --nosignature --nodigest --qf '#{nevra_format}'")
62
+ .with("/bin/rpm -qa --nosignature --nodigest --qf '#{nevra_format}' | sort")
61
63
  .and_yield(packages)
62
64
 
63
65
  described_class.instances
@@ -69,7 +71,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
69
71
 
70
72
  it "excludes the --nosignature flag" do
71
73
  expect(Puppet::Util::Execution).to receive(:execpipe)
72
- .with("/bin/rpm -qa --nodigest --qf '#{nevra_format}'")
74
+ .with("/bin/rpm -qa --nodigest --qf '#{nevra_format}' | sort")
73
75
  .and_yield(packages)
74
76
 
75
77
  described_class.instances
@@ -81,7 +83,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
81
83
 
82
84
  it "excludes the --nodigest flag" do
83
85
  expect(Puppet::Util::Execution).to receive(:execpipe)
84
- .with("/bin/rpm -qa --qf '#{nevra_format}'")
86
+ .with("/bin/rpm -qa --qf '#{nevra_format}' | sort")
85
87
  .and_yield(packages)
86
88
 
87
89
  described_class.instances
@@ -90,7 +92,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
90
92
 
91
93
  it "returns an array of packages" do
92
94
  expect(Puppet::Util::Execution).to receive(:execpipe)
93
- .with("/bin/rpm -qa --nosignature --nodigest --qf '#{nevra_format}'")
95
+ .with("/bin/rpm -qa --nosignature --nodigest --qf '#{nevra_format}' | sort")
94
96
  .and_yield(packages)
95
97
 
96
98
  installed_packages = described_class.instances
@@ -161,6 +163,17 @@ describe Puppet::Type.type(:package).provider(:rpm) do
161
163
  :ensure => "1:1.2.3.4-5.el4",
162
164
  }
163
165
  )
166
+ expect(installed_packages[6].properties).to eq(
167
+ {
168
+ :provider => :rpm,
169
+ :name => "kernel",
170
+ :epoch => "1",
171
+ :version => "1.2.3.4",
172
+ :release => "5.el4",
173
+ :arch => "x86_64",
174
+ :ensure => "1:1.2.3.4-5.el4; 1:1.2.3.6-5.el4",
175
+ }
176
+ )
164
177
  end
165
178
  end
166
179
 
@@ -218,7 +231,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
218
231
  it "retrieves version string after querying rpm for version from source file" do
219
232
  expect(resource).to receive(:[]).with(:source).and_return('source-string')
220
233
  expect(Puppet::Util::Execution).to receive(:execute)
221
- .with(["/bin/rpm", "-q", "--qf", "'#{nevra_format}'", "-p", "source-string"])
234
+ .with(["/bin/rpm", "-q", "--qf", "#{nevra_format}", "-p", "source-string"])
222
235
  .and_return(Puppet::Util::Execution::ProcessOutput.new("myresource 0 1.2.3.4 5.el4 noarch\n", 0))
223
236
  expect(provider.latest).to eq("1.2.3.4-5.el4")
224
237
  end
@@ -226,7 +239,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
226
239
  it "raises an error if the rpm command fails" do
227
240
  expect(resource).to receive(:[]).with(:source).and_return('source-string')
228
241
  expect(Puppet::Util::Execution).to receive(:execute)
229
- .with(["/bin/rpm", "-q", "--qf", "'#{nevra_format}'", "-p", "source-string"])
242
+ .with(["/bin/rpm", "-q", "--qf", "#{nevra_format}", "-p", "source-string"])
230
243
  .and_raise(Puppet::ExecutionFailure, 'rpm command failed')
231
244
 
232
245
  expect {
@@ -248,7 +261,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
248
261
 
249
262
  before(:each) do
250
263
  expect(Puppet::Util::Execution).to receive(:execute)
251
- .with(["/bin/rpm", "-q", resource_name, '', '', '--qf', "'#{nevra_format}'"], execute_options)
264
+ .with(["/bin/rpm", "-q", resource_name, '', '', '--qf', "#{nevra_format}"], execute_options)
252
265
  .and_return(Puppet::Util::Execution::ProcessOutput.new("#{resource_name} 0 1.2.3.4 5.el4 noarch\n", 0))
253
266
  end
254
267
 
@@ -266,7 +279,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
266
279
 
267
280
  before(:each) do
268
281
  expect(Puppet::Util::Execution).to receive(:execute)
269
- .with(["/bin/rpm", "-q", resource_name, '--nosignature', '--nodigest', "--qf", "'#{nevra_format}'"], execute_options)
282
+ .with(["/bin/rpm", "-q", resource_name, '--nosignature', '--nodigest', "--qf", "#{nevra_format}"], execute_options)
270
283
  .and_return(Puppet::Util::Execution::ProcessOutput.new("#{resource_name} 0 1.2.3.4 5.el4 noarch\n", 0))
271
284
  end
272
285
 
@@ -290,7 +303,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
290
303
 
291
304
  before(:each) do
292
305
  expect(Puppet::Util::Execution).to receive(:execute)
293
- .with(["/bin/rpm", "-q", "#{resource_name}.noarch", '--nosignature', '--nodigest', "--qf", "'#{nevra_format}'"], execute_options)
306
+ .with(["/bin/rpm", "-q", "#{resource_name}.noarch", '--nosignature', '--nodigest', "--qf", "#{nevra_format}"], execute_options)
294
307
  .and_return(Puppet::Util::Execution::ProcessOutput.new("#{resource_name} 0 1.2.3.4 5.el4 noarch\n", 0))
295
308
  end
296
309
 
@@ -312,7 +325,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
312
325
 
313
326
  before(:each) do
314
327
  expect(Puppet::Util::Execution).to receive(:execute)
315
- .with(["/bin/rpm", "-q", "#{resource_name}-1.2.3.4-5.el4", '--nosignature', '--nodigest', "--qf", "'#{nevra_format}'"], execute_options)
328
+ .with(["/bin/rpm", "-q", "#{resource_name}-1.2.3.4-5.el4", '--nosignature', '--nodigest', "--qf", "#{nevra_format}"], execute_options)
316
329
  .and_return(Puppet::Util::Execution::ProcessOutput.new("#{resource_name} 0 1.2.3.4 5.el4 noarch\n", 0))
317
330
  end
318
331
 
@@ -334,7 +347,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
334
347
 
335
348
  before(:each) do
336
349
  expect(Puppet::Util::Execution).to receive(:execute)
337
- .with(["/bin/rpm", "-q", "#{resource_name}-1.2.3.4", '--nosignature', '--nodigest', "--qf", "'#{nevra_format}'"], execute_options)
350
+ .with(["/bin/rpm", "-q", "#{resource_name}-1.2.3.4", '--nosignature', '--nodigest', "--qf", "#{nevra_format}"], execute_options)
338
351
  .and_return(Puppet::Util::Execution::ProcessOutput.new("#{resource_name} 0 1.2.3.4 5.el4 noarch\n", 0))
339
352
  end
340
353
 
@@ -358,7 +371,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
358
371
 
359
372
  before(:each) do
360
373
  expect(Puppet::Util::Execution).to receive(:execute)
361
- .with(["/bin/rpm", "-q", resource_name, '--nosignature', '--nodigest', "--qf", "'#{nevra_format}'"], execute_options)
374
+ .with(["/bin/rpm", "-q", resource_name, '--nosignature', '--nodigest', "--qf", "#{nevra_format}"], execute_options)
362
375
  .and_return(Puppet::Util::Execution::ProcessOutput.new("#{resource_name} 0 1.2.3.4 5.el4 noarch\n", 0))
363
376
  end
364
377
 
@@ -374,7 +387,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
374
387
  def parser_test(rpm_output_string, gold_hash, number_of_debug_logs = 0)
375
388
  expect(Puppet).to receive(:debug).exactly(number_of_debug_logs).times()
376
389
  expect(Puppet::Util::Execution).to receive(:execute)
377
- .with(["/bin/rpm", "-q", resource_name, "--nosignature", "--nodigest", "--qf", "'#{nevra_format}'"], execute_options)
390
+ .with(["/bin/rpm", "-q", resource_name, "--nosignature", "--nodigest", "--qf", "#{nevra_format}"], execute_options)
378
391
  .and_return(Puppet::Util::Execution::ProcessOutput.new(rpm_output_string, 0))
379
392
  expect(provider.query).to eq(gold_hash)
380
393
  end
@@ -413,7 +426,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
413
426
  describe "when the package is not found" do
414
427
  before do
415
428
  expect(Puppet).not_to receive(:debug)
416
- expected_args = ["/bin/rpm", "-q", resource_name, "--nosignature", "--nodigest", "--qf", "'#{nevra_format}'"]
429
+ expected_args = ["/bin/rpm", "-q", resource_name, "--nosignature", "--nodigest", "--qf", "#{nevra_format}"]
417
430
  expect(Puppet::Util::Execution).to receive(:execute)
418
431
  .with(expected_args, execute_options)
419
432
  .and_raise(Puppet::ExecutionFailure.new("package #{resource_name} is not installed"))
@@ -426,7 +439,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
426
439
 
427
440
  it "does not log or fail if allow_virtual is true" do
428
441
  resource[:allow_virtual] = true
429
- expected_args = ['/bin/rpm', '-q', resource_name, '--nosignature', '--nodigest', '--qf', "'#{nevra_format}'", '--whatprovides']
442
+ expected_args = ['/bin/rpm', '-q', resource_name, '--nosignature', '--nodigest', '--qf', "#{nevra_format}", '--whatprovides']
430
443
  expect(Puppet::Util::Execution).to receive(:execute)
431
444
  .with(expected_args, execute_options)
432
445
  .and_raise(Puppet::ExecutionFailure.new("package #{resource_name} is not provided"))
@@ -436,7 +449,7 @@ describe Puppet::Type.type(:package).provider(:rpm) do
436
449
 
437
450
  it "parses virtual package" do
438
451
  provider.resource[:allow_virtual] = true
439
- expected_args = ["/bin/rpm", "-q", resource_name, "--nosignature", "--nodigest", "--qf", "'#{nevra_format}'"]
452
+ expected_args = ["/bin/rpm", "-q", resource_name, "--nosignature", "--nodigest", "--qf", "#{nevra_format}"]
440
453
  expect(Puppet::Util::Execution).to receive(:execute)
441
454
  .with(expected_args, execute_options)
442
455
  .and_raise(Puppet::ExecutionFailure.new("package #{resource_name} is not installed"))
@@ -749,4 +762,125 @@ describe Puppet::Type.type(:package).provider(:rpm) do
749
762
  provider.compare_values('s1', 's2')
750
763
  end
751
764
  end
765
+
766
+
767
+ describe 'insync?' do
768
+ context 'for multiple versions' do
769
+ let(:is) { '1:1.2.3.4-5.el4; 1:5.6.7.8-5.el4' }
770
+ it 'returns true if there is match and feature is enabled' do
771
+ resource[:install_only] = true
772
+ resource[:ensure] = '1:1.2.3.4-5.el4'
773
+ expect(provider).to be_insync(is)
774
+ end
775
+ it 'returns false if there is match and feature is not enabled' do
776
+ resource[:ensure] = '1:1.2.3.4-5.el4'
777
+ expect(provider).to_not be_insync(is)
778
+ end
779
+ it 'returns false if no match and feature is enabled' do
780
+ resource[:install_only] = true
781
+ resource[:ensure] = '1:1.2.3.6-5.el4'
782
+ expect(provider).to_not be_insync(is)
783
+ end
784
+ it 'returns false if no match and feature is not enabled' do
785
+ resource[:ensure] = '1:1.2.3.6-5.el4'
786
+ expect(provider).to_not be_insync(is)
787
+ end
788
+ end
789
+ context 'for simple versions' do
790
+ let(:is) { '1:1.2.3.4-5.el4' }
791
+ it 'returns true if there is match and feature is enabled' do
792
+ resource[:install_only] = true
793
+ resource[:ensure] = '1:1.2.3.4-5.el4'
794
+ expect(provider).to be_insync(is)
795
+ end
796
+ it 'returns true if there is match and feature is not enabled' do
797
+ resource[:ensure] = '1:1.2.3.4-5.el4'
798
+ expect(provider).to be_insync(is)
799
+ end
800
+ it 'returns false if no match and feature is enabled' do
801
+ resource[:install_only] = true
802
+ resource[:ensure] = '1:1.2.3.6-5.el4'
803
+ expect(provider).to_not be_insync(is)
804
+ end
805
+ it 'returns false if no match and feature is not enabled' do
806
+ resource[:ensure] = '1:1.2.3.6-5.el4'
807
+ expect(provider).to_not be_insync(is)
808
+ end
809
+ end
810
+ end
811
+
812
+ describe 'rpm multiversion to hash' do
813
+ it 'should return empty hash for empty imput' do
814
+ package_hash = described_class.nevra_to_multiversion_hash('')
815
+ expect(package_hash).to eq({})
816
+ end
817
+
818
+ it 'should return package hash for one package input' do
819
+ package_list = <<-RPM_OUTPUT
820
+ kernel-devel 1 1.2.3.4 5.el4 x86_64
821
+ RPM_OUTPUT
822
+ package_hash = described_class.nevra_to_multiversion_hash(package_list)
823
+ expect(package_hash).to eq(
824
+ {
825
+ :arch => "x86_64",
826
+ :ensure => "1:1.2.3.4-5.el4",
827
+ :epoch => "1",
828
+ :name => "kernel-devel",
829
+ :provider => :rpm,
830
+ :release => "5.el4",
831
+ :version => "1.2.3.4",
832
+ }
833
+ )
834
+ end
835
+
836
+ it 'should return package hash with versions concatenated in ensure for two package input' do
837
+ package_list = <<-RPM_OUTPUT
838
+ kernel-devel 1 1.2.3.4 5.el4 x86_64
839
+ kernel-devel 1 5.6.7.8 5.el4 x86_64
840
+ RPM_OUTPUT
841
+ package_hash = described_class.nevra_to_multiversion_hash(package_list)
842
+ expect(package_hash).to eq(
843
+ {
844
+ :arch => "x86_64",
845
+ :ensure => "1:1.2.3.4-5.el4; 1:5.6.7.8-5.el4",
846
+ :epoch => "1",
847
+ :name => "kernel-devel",
848
+ :provider => :rpm,
849
+ :release => "5.el4",
850
+ :version => "1.2.3.4",
851
+ }
852
+ )
853
+ end
854
+
855
+ it 'should return list of packages for one multiversion and one package input' do
856
+ package_list = <<-RPM_OUTPUT
857
+ kernel-devel 1 1.2.3.4 5.el4 x86_64
858
+ kernel-devel 1 5.6.7.8 5.el4 x86_64
859
+ basesystem 0 8.0 5.1.1.el5.centos noarch
860
+ RPM_OUTPUT
861
+ package_hash = described_class.nevra_to_multiversion_hash(package_list)
862
+ expect(package_hash).to eq(
863
+ [
864
+ {
865
+ :arch => "x86_64",
866
+ :ensure => "1:1.2.3.4-5.el4; 1:5.6.7.8-5.el4",
867
+ :epoch => "1",
868
+ :name => "kernel-devel",
869
+ :provider => :rpm,
870
+ :release => "5.el4",
871
+ :version => "1.2.3.4",
872
+ },
873
+ {
874
+ :provider => :rpm,
875
+ :name => "basesystem",
876
+ :epoch => "0",
877
+ :version => "8.0",
878
+ :release => "5.1.1.el5.centos",
879
+ :arch => "noarch",
880
+ :ensure => "8.0-5.1.1.el5.centos",
881
+ }
882
+ ]
883
+ )
884
+ end
885
+ end
752
886
  end