puppet 4.4.2 → 4.5.0

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 (218) hide show
  1. data/CONTRIBUTING.md +5 -5
  2. data/Gemfile +2 -2
  3. data/LICENSE +2 -2
  4. data/README.md +5 -0
  5. data/ext/project_data.yaml +2 -0
  6. data/lib/hiera_puppet.rb +6 -14
  7. data/lib/puppet/application/agent.rb +2 -3
  8. data/lib/puppet/data_providers/hiera_config.rb +2 -4
  9. data/lib/puppet/data_providers/hiera_interpolate.rb +12 -154
  10. data/lib/puppet/data_providers/json_data_provider_factory.rb +0 -7
  11. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -8
  12. data/lib/puppet/defaults.rb +70 -7
  13. data/lib/puppet/functions.rb +69 -0
  14. data/lib/puppet/functions/dig.rb +39 -0
  15. data/lib/puppet/functions/lest.rb +53 -0
  16. data/lib/puppet/functions/lookup.rb +40 -27
  17. data/lib/puppet/functions/new.rb +502 -0
  18. data/lib/puppet/functions/regsubst.rb +11 -10
  19. data/lib/puppet/functions/then.rb +74 -0
  20. data/lib/puppet/functions/type.rb +4 -4
  21. data/lib/puppet/functions/with.rb +1 -1
  22. data/lib/puppet/indirector/catalog/compiler.rb +2 -0
  23. data/lib/puppet/indirector/resource_type/parser.rb +5 -0
  24. data/lib/puppet/indirector/rest.rb +5 -1
  25. data/lib/puppet/loaders.rb +2 -0
  26. data/lib/puppet/metatype/manager.rb +19 -2
  27. data/lib/puppet/module_tool/applications/application.rb +1 -1
  28. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +6 -2
  29. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  30. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +1 -1
  31. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -1
  32. data/lib/puppet/network/http/api/master/v3/environment.rb +6 -2
  33. data/lib/puppet/parser/ast/pops_bridge.rb +20 -3
  34. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +24 -2
  35. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  36. data/lib/puppet/parser/environment_compiler.rb +2 -2
  37. data/lib/puppet/parser/resource.rb +14 -5
  38. data/lib/puppet/parser/scope.rb +18 -15
  39. data/lib/puppet/plugins/data_providers/data_provider.rb +19 -8
  40. data/lib/puppet/pops.rb +6 -0
  41. data/lib/puppet/pops/adapters.rb +5 -1
  42. data/lib/puppet/pops/evaluator/access_operator.rb +52 -14
  43. data/lib/puppet/pops/evaluator/compare_operator.rb +34 -4
  44. data/lib/puppet/pops/evaluator/evaluator_impl.rb +75 -22
  45. data/lib/puppet/pops/evaluator/literal_evaluator.rb +7 -6
  46. data/lib/puppet/pops/evaluator/runtime3_converter.rb +13 -1
  47. data/lib/puppet/pops/evaluator/runtime3_support.rb +14 -4
  48. data/lib/puppet/pops/functions/dispatcher.rb +1 -1
  49. data/lib/puppet/pops/issues.rb +18 -2
  50. data/lib/puppet/pops/loader/base_loader.rb +48 -7
  51. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  52. data/lib/puppet/pops/loader/loader.rb +12 -0
  53. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  54. data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
  55. data/lib/puppet/pops/loader/static_loader.rb +92 -5
  56. data/lib/puppet/pops/loader/type_definition_instantiator.rb +25 -3
  57. data/lib/puppet/pops/loaders.rb +84 -14
  58. data/lib/puppet/pops/lookup/explainer.rb +38 -1
  59. data/lib/puppet/pops/lookup/interpolation.rb +115 -0
  60. data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
  61. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  62. data/lib/puppet/pops/model/factory.rb +31 -8
  63. data/lib/puppet/pops/model/model.rb +8 -0
  64. data/lib/puppet/pops/model/model_label_provider.rb +1 -0
  65. data/lib/puppet/pops/model/model_meta.rb +7 -1
  66. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  67. data/lib/puppet/pops/parser/egrammar.ra +24 -7
  68. data/lib/puppet/pops/parser/eparser.rb +863 -798
  69. data/lib/puppet/pops/parser/evaluating_parser.rb +4 -0
  70. data/lib/puppet/pops/parser/locator.rb +8 -4
  71. data/lib/puppet/pops/pcore.rb +30 -0
  72. data/lib/puppet/pops/types/class_loader.rb +2 -4
  73. data/lib/puppet/pops/types/implementation_registry.rb +146 -0
  74. data/lib/puppet/pops/types/iterable.rb +4 -4
  75. data/lib/puppet/pops/types/p_object_type.rb +846 -0
  76. data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
  77. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
  78. data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
  79. data/lib/puppet/pops/types/puppet_object.rb +21 -0
  80. data/lib/puppet/pops/types/ruby_generator.rb +258 -0
  81. data/lib/puppet/pops/types/string_converter.rb +922 -0
  82. data/lib/puppet/pops/types/type_calculator.rb +29 -5
  83. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  84. data/lib/puppet/pops/types/type_factory.rb +49 -16
  85. data/lib/puppet/pops/types/type_formatter.rb +335 -112
  86. data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -29
  87. data/lib/puppet/pops/types/type_parser.rb +205 -197
  88. data/lib/puppet/pops/types/types.rb +481 -103
  89. data/lib/puppet/pops/validation.rb +1 -1
  90. data/lib/puppet/pops/validation/checker4_0.rb +66 -4
  91. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  92. data/lib/puppet/pops/visitor.rb +3 -1
  93. data/lib/puppet/property.rb +1 -1
  94. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  95. data/lib/puppet/provider/package/pip.rb +64 -20
  96. data/lib/puppet/provider/package/rpm.rb +112 -0
  97. data/lib/puppet/provider/package/yum.rb +7 -68
  98. data/lib/puppet/provider/service/daemontools.rb +3 -3
  99. data/lib/puppet/provider/service/init.rb +4 -2
  100. data/lib/puppet/provider/service/runit.rb +3 -3
  101. data/lib/puppet/provider/service/smf.rb +6 -3
  102. data/lib/puppet/provider/service/systemd.rb +59 -73
  103. data/lib/puppet/reference/providers.rb +1 -2
  104. data/lib/puppet/resource.rb +54 -37
  105. data/lib/puppet/resource/catalog.rb +31 -29
  106. data/lib/puppet/resource/type_collection.rb +23 -8
  107. data/lib/puppet/settings.rb +4 -2
  108. data/lib/puppet/settings/base_setting.rb +9 -3
  109. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  110. data/lib/puppet/test/test_helper.rb +0 -1
  111. data/lib/puppet/type.rb +9 -3
  112. data/lib/puppet/type/exec.rb +17 -17
  113. data/lib/puppet/type/file.rb +12 -0
  114. data/lib/puppet/type/file/content.rb +6 -6
  115. data/lib/puppet/type/file/ensure.rb +4 -4
  116. data/lib/puppet/type/file/source.rb +4 -4
  117. data/lib/puppet/type/file/target.rb +2 -2
  118. data/lib/puppet/type/mount.rb +18 -1
  119. data/lib/puppet/type/package.rb +3 -3
  120. data/lib/puppet/type/schedule.rb +4 -4
  121. data/lib/puppet/type/service.rb +15 -0
  122. data/lib/puppet/type/sshkey.rb +5 -3
  123. data/lib/puppet/type/tidy.rb +3 -3
  124. data/lib/puppet/type/zone.rb +5 -5
  125. data/lib/puppet/util/feature.rb +1 -1
  126. data/lib/puppet/util/monkey_patches.rb +8 -0
  127. data/lib/puppet/util/network_device/cisco/device.rb +16 -6
  128. data/lib/puppet/util/network_device/cisco/interface.rb +5 -6
  129. data/lib/puppet/util/plist.rb +3 -3
  130. data/lib/puppet/version.rb +1 -1
  131. data/spec/fixtures/unit/application/environments/production/data/common.yaml +13 -0
  132. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  133. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  134. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  135. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  136. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  137. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
  138. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  139. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  140. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  141. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  142. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  143. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  144. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -0
  145. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  146. data/spec/integration/module_tool/tar/mini_spec.rb +27 -27
  147. data/spec/integration/parser/catalog_spec.rb +14 -2
  148. data/spec/integration/parser/compiler_spec.rb +94 -3
  149. data/spec/integration/parser/resource_expressions_spec.rb +1 -1
  150. data/spec/integration/resource/type_collection_spec.rb +8 -0
  151. data/spec/lib/puppet_spec/compiler.rb +11 -4
  152. data/spec/shared_contexts/types_setup.rb +4 -0
  153. data/spec/unit/application/lookup_spec.rb +91 -9
  154. data/spec/unit/appmgmt_spec.rb +44 -35
  155. data/spec/unit/capability_spec.rb +33 -53
  156. data/spec/unit/data_providers/function_data_provider_spec.rb +19 -1
  157. data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -1
  158. data/spec/unit/defaults_spec.rb +18 -0
  159. data/spec/unit/functions/assert_type_spec.rb +1 -1
  160. data/spec/unit/functions/dig_spec.rb +58 -0
  161. data/spec/unit/functions/lest_spec.rb +34 -0
  162. data/spec/unit/functions/lookup_spec.rb +108 -2
  163. data/spec/unit/functions/new_spec.rb +543 -0
  164. data/spec/unit/functions/regsubst_spec.rb +8 -0
  165. data/spec/unit/functions/then_spec.rb +40 -0
  166. data/spec/unit/functions4_spec.rb +78 -10
  167. data/spec/unit/hiera_puppet_spec.rb +49 -8
  168. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  169. data/spec/unit/indirector/rest_spec.rb +12 -0
  170. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  171. data/spec/unit/node/environment_spec.rb +10 -0
  172. data/spec/unit/parser/compiler_spec.rb +20 -1
  173. data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
  174. data/spec/unit/parser/functions/shared.rb +1 -1
  175. data/spec/unit/parser/resource_spec.rb +8 -1
  176. data/spec/unit/parser/scope_spec.rb +45 -0
  177. data/spec/unit/pops/evaluator/access_ops_spec.rb +14 -0
  178. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +13 -5
  179. data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
  180. data/spec/unit/{data_providers/hiera_interpolation_spec.rb → pops/lookup/interpolation_spec.rb} +7 -5
  181. data/spec/unit/pops/parser/lexer2_spec.rb +2 -9
  182. data/spec/unit/pops/parser/parse_application_spec.rb +3 -8
  183. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +19 -0
  184. data/spec/unit/pops/parser/parse_capabilities_spec.rb +3 -10
  185. data/spec/unit/pops/parser/parse_site_spec.rb +19 -10
  186. data/spec/unit/pops/parser/parser_rspec_helper.rb +0 -4
  187. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  188. data/spec/unit/pops/types/iterable_spec.rb +2 -2
  189. data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
  190. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
  191. data/spec/unit/pops/types/recursion_guard_spec.rb +19 -17
  192. data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
  193. data/spec/unit/pops/types/string_converter_spec.rb +904 -0
  194. data/spec/unit/pops/types/type_calculator_spec.rb +430 -406
  195. data/spec/unit/pops/types/type_factory_spec.rb +119 -104
  196. data/spec/unit/pops/types/type_formatter_spec.rb +73 -6
  197. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  198. data/spec/unit/pops/types/type_parser_spec.rb +54 -15
  199. data/spec/unit/pops/types/types_spec.rb +113 -8
  200. data/spec/unit/pops/validator/validator_spec.rb +84 -10
  201. data/spec/unit/provider/package/pip3_spec.rb +9 -270
  202. data/spec/unit/provider/package/pip_spec.rb +85 -30
  203. data/spec/unit/provider/package/rpm_spec.rb +160 -3
  204. data/spec/unit/provider/package/yum_spec.rb +23 -134
  205. data/spec/unit/provider/service/smf_spec.rb +14 -2
  206. data/spec/unit/provider/service/systemd_spec.rb +33 -41
  207. data/spec/unit/resource/capability_finder_spec.rb +10 -2
  208. data/spec/unit/settings/file_setting_spec.rb +6 -0
  209. data/spec/unit/transaction/additional_resource_generator_spec.rb +80 -65
  210. data/spec/unit/type/mount_spec.rb +51 -10
  211. data/spec/unit/type/service_spec.rb +16 -0
  212. data/spec/unit/type_spec.rb +14 -0
  213. data/spec/unit/util/feature_spec.rb +1 -1
  214. data/spec/unit/util/monkey_patches_spec.rb +60 -0
  215. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  216. metadata +63 -11
  217. data/lib/puppet/pops/types/types_meta.rb +0 -0
  218. data/spec/integration/provider/package_spec.rb +0 -35
@@ -12,6 +12,7 @@ describe provider_class do
12
12
  chkconfig 0 1.3.30.2 2.el5 x86_64
13
13
  myresource 0 1.2.3.4 5.el4 noarch
14
14
  mysummaryless 0 1.2.3.4 5.el4 noarch
15
+ tomcat 1 1.2.3.4 5.el4 x86_64
15
16
  RPM_OUTPUT
16
17
  end
17
18
 
@@ -116,7 +117,18 @@ describe provider_class do
116
117
  :ensure => "1.3.30.2-2.el5",
117
118
  }
118
119
  )
119
- expect(installed_packages.last.properties).to eq(
120
+ expect(installed_packages[3].properties).to eq(
121
+ {
122
+ :provider => :rpm,
123
+ :name => "myresource",
124
+ :epoch => "0",
125
+ :version => "1.2.3.4",
126
+ :release => "5.el4",
127
+ :arch => "noarch",
128
+ :ensure => "1.2.3.4-5.el4",
129
+ }
130
+ )
131
+ expect(installed_packages[4].properties).to eq(
120
132
  {
121
133
  :provider => :rpm,
122
134
  :name => "mysummaryless",
@@ -127,6 +139,17 @@ describe provider_class do
127
139
  :ensure => "1.2.3.4-5.el4",
128
140
  }
129
141
  )
142
+ expect(installed_packages[5].properties).to eq(
143
+ {
144
+ :provider => :rpm,
145
+ :name => "tomcat",
146
+ :epoch => "1",
147
+ :version => "1.2.3.4",
148
+ :release => "5.el4",
149
+ :arch => "x86_64",
150
+ :ensure => "1:1.2.3.4-5.el4",
151
+ }
152
+ )
130
153
  end
131
154
  end
132
155
 
@@ -257,7 +280,7 @@ describe provider_class do
257
280
  :release => 'release',
258
281
  :arch => 'arch',
259
282
  :provider => :rpm,
260
- :ensure => 'version-release',
283
+ :ensure => 'epoch:version-release',
261
284
  }
262
285
  end
263
286
  let(:line) { 'name epoch version release arch' }
@@ -269,7 +292,7 @@ describe provider_class do
269
292
  line.gsub(field, delimiter),
270
293
  package_hash.merge(
271
294
  field.to_sym => delimiter,
272
- :ensure => 'version-release'.gsub(field, delimiter)
295
+ :ensure => 'epoch:version-release'.gsub(field, delimiter)
273
296
  )
274
297
  )
275
298
  end
@@ -481,4 +504,138 @@ describe provider_class do
481
504
  it { expect(provider.rpmvercmp("1", "0")).to eq(1) }
482
505
  end
483
506
 
507
+ describe 'package evr parsing' do
508
+
509
+ it 'should parse full simple evr' do
510
+ v = provider.rpm_parse_evr('0:1.2.3-4.el5')
511
+ expect(v[:epoch]).to eq('0')
512
+ expect(v[:version]).to eq('1.2.3')
513
+ expect(v[:release]).to eq('4.el5')
514
+ end
515
+
516
+ it 'should parse version only' do
517
+ v = provider.rpm_parse_evr('1.2.3')
518
+ expect(v[:epoch]).to eq(nil)
519
+ expect(v[:version]).to eq('1.2.3')
520
+ expect(v[:release]).to eq(nil)
521
+ end
522
+
523
+ it 'should parse version-release' do
524
+ v = provider.rpm_parse_evr('1.2.3-4.5.el6')
525
+ expect(v[:epoch]).to eq(nil)
526
+ expect(v[:version]).to eq('1.2.3')
527
+ expect(v[:release]).to eq('4.5.el6')
528
+ end
529
+
530
+ it 'should parse release with git hash' do
531
+ v = provider.rpm_parse_evr('1.2.3-4.1234aefd')
532
+ expect(v[:epoch]).to eq(nil)
533
+ expect(v[:version]).to eq('1.2.3')
534
+ expect(v[:release]).to eq('4.1234aefd')
535
+ end
536
+
537
+ it 'should parse single integer versions' do
538
+ v = provider.rpm_parse_evr('12345')
539
+ expect(v[:epoch]).to eq(nil)
540
+ expect(v[:version]).to eq('12345')
541
+ expect(v[:release]).to eq(nil)
542
+ end
543
+
544
+ it 'should parse text in the epoch to 0' do
545
+ v = provider.rpm_parse_evr('foo0:1.2.3-4')
546
+ expect(v[:epoch]).to eq(nil)
547
+ expect(v[:version]).to eq('1.2.3')
548
+ expect(v[:release]).to eq('4')
549
+ end
550
+
551
+ it 'should parse revisions with text' do
552
+ v = provider.rpm_parse_evr('1.2.3-SNAPSHOT20140107')
553
+ expect(v[:epoch]).to eq(nil)
554
+ expect(v[:version]).to eq('1.2.3')
555
+ expect(v[:release]).to eq('SNAPSHOT20140107')
556
+ end
557
+
558
+ # test cases for PUP-682
559
+ it 'should parse revisions with text and numbers' do
560
+ v = provider.rpm_parse_evr('2.2-SNAPSHOT20121119105647')
561
+ expect(v[:epoch]).to eq(nil)
562
+ expect(v[:version]).to eq('2.2')
563
+ expect(v[:release]).to eq('SNAPSHOT20121119105647')
564
+ end
565
+
566
+ end
567
+
568
+ describe 'rpm evr comparison' do
569
+
570
+ # currently passing tests
571
+ it 'should evaluate identical version-release as equal' do
572
+ v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => '1.el5'},
573
+ {:epoch => '0', :version => '1.2.3', :release => '1.el5'})
574
+ expect(v).to eq(0)
575
+ end
576
+
577
+ it 'should evaluate identical version as equal' do
578
+ v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => nil},
579
+ {:epoch => '0', :version => '1.2.3', :release => nil})
580
+ expect(v).to eq(0)
581
+ end
582
+
583
+ it 'should evaluate identical version but older release as less' do
584
+ v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => '1.el5'},
585
+ {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
586
+ expect(v).to eq(-1)
587
+ end
588
+
589
+ it 'should evaluate identical version but newer release as greater' do
590
+ v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => '3.el5'},
591
+ {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
592
+ expect(v).to eq(1)
593
+ end
594
+
595
+ it 'should evaluate a newer epoch as greater' do
596
+ v = provider.rpm_compareEVR({:epoch => '1', :version => '1.2.3', :release => '4.5'},
597
+ {:epoch => '0', :version => '1.2.3', :release => '4.5'})
598
+ expect(v).to eq(1)
599
+ end
600
+
601
+ # these tests describe PUP-1244 logic yet to be implemented
602
+ it 'should evaluate any version as equal to the same version followed by release' do
603
+ v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => nil},
604
+ {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
605
+ expect(v).to eq(0)
606
+ end
607
+
608
+ # test cases for PUP-682
609
+ it 'should evaluate same-length numeric revisions numerically' do
610
+ expect(provider.rpm_compareEVR({:epoch => '0', :version => '2.2', :release => '405'},
611
+ {:epoch => '0', :version => '2.2', :release => '406'})).to eq(-1)
612
+ end
613
+
614
+ end
615
+
616
+ describe 'version segment comparison' do
617
+
618
+ it 'should treat two nil values as equal' do
619
+ v = provider.compare_values(nil, nil)
620
+ expect(v).to eq(0)
621
+ end
622
+
623
+ it 'should treat a nil value as less than a non-nil value' do
624
+ v = provider.compare_values(nil, '0')
625
+ expect(v).to eq(-1)
626
+ end
627
+
628
+ it 'should treat a non-nil value as greater than a nil value' do
629
+ v = provider.compare_values('0', nil)
630
+ expect(v).to eq(1)
631
+ end
632
+
633
+ it 'should pass two non-nil values on to rpmvercmp' do
634
+ provider.stubs(:rpmvercmp) { 0 }
635
+ provider.expects(:rpmvercmp).with('s1', 's2')
636
+ provider.compare_values('s1', 's2')
637
+ end
638
+
639
+ end
640
+
484
641
  end
@@ -21,6 +21,21 @@ describe provider_class do
21
21
  provider
22
22
  end
23
23
 
24
+ let(:arch) { 'x86_64' }
25
+ let(:arch_resource) do
26
+ Puppet::Type.type(:package).new(
27
+ :name => "#{name}.#{arch}",
28
+ :ensure => :installed,
29
+ :provider => 'yum'
30
+ )
31
+ end
32
+
33
+ let(:arch_provider) do
34
+ provider = provider_class.new
35
+ provider.resource = arch_resource
36
+ provider
37
+ end
38
+
24
39
  before do
25
40
  provider_class.stubs(:command).with(:cmd).returns('/usr/bin/yum')
26
41
  provider.stubs(:rpm).returns 'rpm'
@@ -42,140 +57,6 @@ describe provider_class do
42
57
  end
43
58
  end
44
59
 
45
- describe 'package evr parsing' do
46
-
47
- it 'should parse full simple evr' do
48
- v = provider.yum_parse_evr('0:1.2.3-4.el5')
49
- expect(v[:epoch]).to eq('0')
50
- expect(v[:version]).to eq('1.2.3')
51
- expect(v[:release]).to eq('4.el5')
52
- end
53
-
54
- it 'should parse version only' do
55
- v = provider.yum_parse_evr('1.2.3')
56
- expect(v[:epoch]).to eq('0')
57
- expect(v[:version]).to eq('1.2.3')
58
- expect(v[:release]).to eq(nil)
59
- end
60
-
61
- it 'should parse version-release' do
62
- v = provider.yum_parse_evr('1.2.3-4.5.el6')
63
- expect(v[:epoch]).to eq('0')
64
- expect(v[:version]).to eq('1.2.3')
65
- expect(v[:release]).to eq('4.5.el6')
66
- end
67
-
68
- it 'should parse release with git hash' do
69
- v = provider.yum_parse_evr('1.2.3-4.1234aefd')
70
- expect(v[:epoch]).to eq('0')
71
- expect(v[:version]).to eq('1.2.3')
72
- expect(v[:release]).to eq('4.1234aefd')
73
- end
74
-
75
- it 'should parse single integer versions' do
76
- v = provider.yum_parse_evr('12345')
77
- expect(v[:epoch]).to eq('0')
78
- expect(v[:version]).to eq('12345')
79
- expect(v[:release]).to eq(nil)
80
- end
81
-
82
- it 'should parse text in the epoch to 0' do
83
- v = provider.yum_parse_evr('foo0:1.2.3-4')
84
- expect(v[:epoch]).to eq('0')
85
- expect(v[:version]).to eq('1.2.3')
86
- expect(v[:release]).to eq('4')
87
- end
88
-
89
- it 'should parse revisions with text' do
90
- v = provider.yum_parse_evr('1.2.3-SNAPSHOT20140107')
91
- expect(v[:epoch]).to eq('0')
92
- expect(v[:version]).to eq('1.2.3')
93
- expect(v[:release]).to eq('SNAPSHOT20140107')
94
- end
95
-
96
- # test cases for PUP-682
97
- it 'should parse revisions with text and numbers' do
98
- v = provider.yum_parse_evr('2.2-SNAPSHOT20121119105647')
99
- expect(v[:epoch]).to eq('0')
100
- expect(v[:version]).to eq('2.2')
101
- expect(v[:release]).to eq('SNAPSHOT20121119105647')
102
- end
103
-
104
- end
105
-
106
- describe 'yum evr comparison' do
107
-
108
- # currently passing tests
109
- it 'should evaluate identical version-release as equal' do
110
- v = provider.yum_compareEVR({:epoch => '0', :version => '1.2.3', :release => '1.el5'},
111
- {:epoch => '0', :version => '1.2.3', :release => '1.el5'})
112
- expect(v).to eq(0)
113
- end
114
-
115
- it 'should evaluate identical version as equal' do
116
- v = provider.yum_compareEVR({:epoch => '0', :version => '1.2.3', :release => nil},
117
- {:epoch => '0', :version => '1.2.3', :release => nil})
118
- expect(v).to eq(0)
119
- end
120
-
121
- it 'should evaluate identical version but older release as less' do
122
- v = provider.yum_compareEVR({:epoch => '0', :version => '1.2.3', :release => '1.el5'},
123
- {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
124
- expect(v).to eq(-1)
125
- end
126
-
127
- it 'should evaluate identical version but newer release as greater' do
128
- v = provider.yum_compareEVR({:epoch => '0', :version => '1.2.3', :release => '3.el5'},
129
- {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
130
- expect(v).to eq(1)
131
- end
132
-
133
- it 'should evaluate a newer epoch as greater' do
134
- v = provider.yum_compareEVR({:epoch => '1', :version => '1.2.3', :release => '4.5'},
135
- {:epoch => '0', :version => '1.2.3', :release => '4.5'})
136
- expect(v).to eq(1)
137
- end
138
-
139
- # these tests describe PUP-1244 logic yet to be implemented
140
- it 'should evaluate any version as equal to the same version followed by release' do
141
- v = provider.yum_compareEVR({:epoch => '0', :version => '1.2.3', :release => nil},
142
- {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
143
- expect(v).to eq(0)
144
- end
145
-
146
- # test cases for PUP-682
147
- it 'should evaluate same-length numeric revisions numerically' do
148
- expect(provider.yum_compareEVR({:epoch => '0', :version => '2.2', :release => '405'},
149
- {:epoch => '0', :version => '2.2', :release => '406'})).to eq(-1)
150
- end
151
-
152
- end
153
-
154
- describe 'yum version segment comparison' do
155
-
156
- it 'should treat two nil values as equal' do
157
- v = provider.compare_values(nil, nil)
158
- expect(v).to eq(0)
159
- end
160
-
161
- it 'should treat a nil value as less than a non-nil value' do
162
- v = provider.compare_values(nil, '0')
163
- expect(v).to eq(-1)
164
- end
165
-
166
- it 'should treat a non-nil value as greater than a nil value' do
167
- v = provider.compare_values('0', nil)
168
- expect(v).to eq(1)
169
- end
170
-
171
- it 'should pass two non-nil values on to rpmvercmp' do
172
- provider.stubs(:rpmvercmp) { 0 }
173
- provider.expects(:rpmvercmp).with('s1', 's2')
174
- provider.compare_values('s1', 's2')
175
- end
176
-
177
- end
178
-
179
60
  describe 'when installing' do
180
61
  before(:each) do
181
62
  Puppet::Util.stubs(:which).with("rpm").returns("/bin/rpm")
@@ -249,6 +130,14 @@ describe provider_class do
249
130
  Puppet::Util::Execution.expects(:execute).with(['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, name])
250
131
  provider.install
251
132
  end
133
+
134
+ it 'moves architecture to end of version' do
135
+ version = '1.2.3'
136
+ arch_resource[:ensure] = version
137
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "#{name}-#{version}.#{arch}"])
138
+ arch_provider.stubs(:query).returns :ensure => version
139
+ arch_provider.install
140
+ end
252
141
  end
253
142
 
254
143
  describe 'when uninstalling' do
@@ -28,12 +28,13 @@ describe provider_class, :if => Puppet.features.posix? do
28
28
  end
29
29
 
30
30
  it "should get a list of services (excluding legacy)" do
31
- provider_class.expects(:svcs).with('-H').returns File.read(my_fixture('svcs.out'))
31
+ provider_class.expects(:svcs).with('-H', '-o', 'state,fmri').returns File.read(my_fixture('svcs.out'))
32
32
  instances = provider_class.instances.map { |p| {:name => p.get(:name), :ensure => p.get(:ensure)} }
33
33
  # we dont manage legacy
34
- expect(instances.size).to eq(2)
34
+ expect(instances.size).to eq(3)
35
35
  expect(instances[0]).to eq({:name => 'svc:/system/svc/restarter:default', :ensure => :running })
36
36
  expect(instances[1]).to eq({:name => 'svc:/network/cswrsyncd:default', :ensure => :maintenance })
37
+ expect(instances[2]).to eq({:name => 'svc:/network/dns/client:default', :ensure => :degraded })
37
38
  end
38
39
  end
39
40
 
@@ -86,6 +87,10 @@ describe provider_class, :if => Puppet.features.posix? do
86
87
  @provider.stubs(:svcs).returns("maintenance\t-")
87
88
  expect(@provider.status).to eq(:maintenance)
88
89
  end
90
+ it "should return degraded if in degraded in svcs output" do
91
+ @provider.stubs(:svcs).returns("degraded\t-")
92
+ expect(@provider.status).to eq(:degraded)
93
+ end
89
94
  it "should return target state if transitioning in svcs output" do
90
95
  @provider.stubs(:svcs).returns("online\tdisabled")
91
96
  expect(@provider.status).to eq(:stopped)
@@ -118,6 +123,13 @@ describe provider_class, :if => Puppet.features.posix? do
118
123
  @provider.start
119
124
  end
120
125
 
126
+ it "should execute external command 'svcadm clear /system/myservice' if in degraded" do
127
+ @provider.stubs(:status).returns :degraded
128
+ @provider.expects(:texecute).with(:start, ["/usr/sbin/svcadm", :clear, "/system/myservice"], true)
129
+ @provider.expects(:wait).with('online')
130
+ @provider.start
131
+ end
132
+
121
133
  it "should error if timeout occurs while starting the service" do
122
134
  @provider.expects(:status).returns :stopped
123
135
  @provider.expects(:texecute).with(:start, ["/usr/sbin/svcadm", :enable, "-s", "/system/myservice"], true)
@@ -151,7 +151,7 @@ describe Puppet::Type.type(:service).provider(:systemd) do
151
151
 
152
152
  it "should start the service with systemctl start otherwise" do
153
153
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
154
- provider.expects(:systemctl).with('unmask', 'sshd.service')
154
+ provider.expects(:systemctl).with(:unmask, 'sshd.service')
155
155
  provider.expects(:execute).with(['/bin/systemctl','start','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
156
156
  provider.start
157
157
  end
@@ -174,49 +174,31 @@ describe Puppet::Type.type(:service).provider(:systemd) do
174
174
  describe "#enabled?" do
175
175
  it "should return :true if the service is enabled" do
176
176
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
177
- provider.expects(:systemctl).with(
178
- 'show',
179
- 'sshd.service',
180
- '--property', 'LoadState',
181
- '--property', 'UnitFileState',
182
- '--no-pager'
183
- ).returns "LoadState=loaded\nUnitFileState=enabled\n"
177
+ provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "enabled\n"
178
+ expect(provider.enabled?).to eq(:true)
179
+ end
180
+
181
+ it "should return :true if the service is static" do
182
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
183
+ provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "static\n"
184
184
  expect(provider.enabled?).to eq(:true)
185
185
  end
186
186
 
187
187
  it "should return :false if the service is disabled" do
188
188
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
189
- provider.expects(:systemctl).with(
190
- 'show',
191
- 'sshd.service',
192
- '--property', 'LoadState',
193
- '--property', 'UnitFileState',
194
- '--no-pager'
195
- ).returns "LoadState=loaded\nUnitFileState=disabled\n"
189
+ provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "disabled\n"
196
190
  expect(provider.enabled?).to eq(:false)
197
191
  end
198
192
 
199
193
  it "should return :false if the service is masked and the resource is attempting to be disabled" do
200
194
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
201
- provider.expects(:systemctl).with(
202
- 'show',
203
- 'sshd.service',
204
- '--property', 'LoadState',
205
- '--property', 'UnitFileState',
206
- '--no-pager'
207
- ).returns "LoadState=masked\nUnitFileState=\n"
195
+ provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "masked\n"
208
196
  expect(provider.enabled?).to eq(:false)
209
197
  end
210
198
 
211
199
  it "should return :mask if the service is masked and the resource is attempting to be masked" do
212
200
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
213
- provider.expects(:systemctl).with(
214
- 'show',
215
- 'sshd.service',
216
- '--property', 'LoadState',
217
- '--property', 'UnitFileState',
218
- '--no-pager'
219
- ).returns "LoadState=masked\nUnitFileState=\n"
201
+ provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "masked\n"
220
202
  expect(provider.enabled?).to eq(:mask)
221
203
  end
222
204
  end
@@ -224,8 +206,8 @@ describe Puppet::Type.type(:service).provider(:systemd) do
224
206
  describe "#enable" do
225
207
  it "should run systemctl enable to enable a service" do
226
208
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
227
- provider.expects(:systemctl).with('unmask', 'sshd.service')
228
- provider.expects(:systemctl).with('enable', 'sshd.service')
209
+ provider.expects(:systemctl).with(:unmask, 'sshd.service')
210
+ provider.expects(:systemctl).with(:enable, 'sshd.service')
229
211
  provider.enable
230
212
  end
231
213
  end
@@ -245,7 +227,7 @@ describe Puppet::Type.type(:service).provider(:systemd) do
245
227
  # a string.
246
228
  # This should be made consistent in the future and all tests updated.
247
229
  provider.expects(:systemctl).with(:disable, 'sshd.service')
248
- provider.expects(:systemctl).with('mask', 'sshd.service')
230
+ provider.expects(:systemctl).with(:mask, 'sshd.service')
249
231
  provider.mask
250
232
  end
251
233
  end
@@ -253,16 +235,26 @@ describe Puppet::Type.type(:service).provider(:systemd) do
253
235
  # Note: systemd provider does not care about hasstatus or a custom status
254
236
  # command. I just assume that it does not make sense for systemd.
255
237
  describe "#status" do
256
- it "should return running if active" do
238
+ it "should return running if if the command returns 0" do
257
239
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
258
- provider.expects(:systemctl).with('is-active', 'sshd.service').returns 'active'
240
+ provider.expects(:execute).with(['/bin/systemctl','is-active','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).returns "active\n"
241
+ $CHILD_STATUS.stubs(:exitstatus).returns(0)
259
242
  expect(provider.status).to eq(:running)
260
243
  end
261
244
 
262
- it "should return stopped if inactive" do
263
- provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
264
- provider.expects(:systemctl).with('is-active', 'sshd.service').raises Puppet::ExecutionFailure, "Execution of '/bin/systemctl is-active sshd.service' returned 3: inactive"
265
- expect(provider.status).to eq(:stopped)
245
+ [-10,-1,3,10].each { |ec|
246
+ it "should return stopped if the command returns something non-0" do
247
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
248
+ provider.expects(:execute).with(['/bin/systemctl','is-active','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).returns "inactive\n"
249
+ $CHILD_STATUS.stubs(:exitstatus).returns(ec)
250
+ expect(provider.status).to eq(:stopped)
251
+ end
252
+ }
253
+
254
+ it "should use the supplied status command if specified" do
255
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :status => '/bin/foo'))
256
+ provider.expects(:execute).with(['/bin/foo'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true)
257
+ provider.status
266
258
  end
267
259
  end
268
260
 
@@ -289,7 +281,7 @@ describe Puppet::Type.type(:service).provider(:systemd) do
289
281
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
290
282
  provider.stubs(:system)
291
283
  $CHILD_STATUS.expects(:exitstatus).returns(status)
292
- expect(provider.debian_enabled?({:LoadState => "loaded", :UnitFileState => "UnitFileState"})).to eq(:true)
284
+ expect(provider.debian_enabled?).to eq(:true)
293
285
  end
294
286
  end
295
287
 
@@ -299,7 +291,7 @@ describe Puppet::Type.type(:service).provider(:systemd) do
299
291
  provider.stubs(:system)
300
292
  provider.expects(:get_start_link_count).returns(4)
301
293
  $CHILD_STATUS.expects(:exitstatus).twice.returns(status)
302
- expect(provider.debian_enabled?({:LoadState => "loaded", :UnitFileState => "UnitFileState"})).to eq(:true)
294
+ expect(provider.debian_enabled?).to eq(:true)
303
295
  end
304
296
 
305
297
  it "should return false when status is #{status} and there are less than 4 start links" do
@@ -307,7 +299,7 @@ describe Puppet::Type.type(:service).provider(:systemd) do
307
299
  provider.stubs(:system)
308
300
  provider.expects(:get_start_link_count).returns(1)
309
301
  $CHILD_STATUS.expects(:exitstatus).twice.returns(status)
310
- expect(provider.debian_enabled?({:LoadState => "loaded", :UnitFileState => "UnitFileState"})).to eq(:false)
302
+ expect(provider.debian_enabled?).to eq(:false)
311
303
  end
312
304
  end
313
305
  end