puppet-retrospec 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -0
  3. data/CHANGELOG.md +11 -0
  4. data/DEVELOPMENT.md +3 -0
  5. data/Gemfile +10 -9
  6. data/Gemfile.lock +2 -0
  7. data/README.md +211 -273
  8. data/Rakefile +8 -8
  9. data/VERSION +1 -1
  10. data/lib/retrospec-puppet.rb +3 -3
  11. data/lib/retrospec/plugins/v1/plugin/conditional.rb +5 -6
  12. data/lib/retrospec/plugins/v1/plugin/exceptions.rb +17 -0
  13. data/lib/retrospec/plugins/v1/plugin/generators.rb +7 -0
  14. data/lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb +18 -10
  15. data/lib/retrospec/plugins/v1/plugin/generators/function_generator.rb +187 -0
  16. data/lib/retrospec/plugins/v1/plugin/generators/module_generator.rb +25 -26
  17. data/lib/retrospec/plugins/v1/plugin/generators/{facter.rb → parsers/facter.rb} +28 -35
  18. data/lib/retrospec/plugins/v1/plugin/generators/parsers/function.rb +91 -0
  19. data/lib/retrospec/plugins/v1/plugin/generators/parsers/type.rb +79 -0
  20. data/lib/retrospec/plugins/v1/plugin/generators/provider_generator.rb +107 -0
  21. data/lib/retrospec/plugins/v1/plugin/generators/schema_generator.rb +221 -0
  22. data/lib/retrospec/plugins/v1/plugin/generators/type_generator.rb +118 -0
  23. data/lib/retrospec/plugins/v1/plugin/helpers.rb +3 -7
  24. data/lib/retrospec/plugins/v1/plugin/puppet.rb +141 -60
  25. data/lib/retrospec/plugins/v1/plugin/puppet_module.rb +29 -26
  26. data/lib/retrospec/plugins/v1/plugin/resource.rb +6 -7
  27. data/lib/retrospec/plugins/v1/plugin/spec_object.rb +5 -8
  28. data/lib/retrospec/plugins/v1/plugin/template_helpers.rb +9 -10
  29. data/lib/retrospec/plugins/v1/plugin/templates/clone-hook +15 -8
  30. data/lib/retrospec/plugins/v1/plugin/type_code.rb +4 -4
  31. data/lib/retrospec/plugins/v1/plugin/variable_store.rb +26 -30
  32. data/lib/retrospec/plugins/v1/plugin/version.rb +1 -1
  33. data/puppet-retrospec.gemspec +43 -4
  34. data/spec/fixtures/facts/oracle_controls.rb +38 -0
  35. data/spec/fixtures/fixture_modules/required_parameters/manifests/init.pp +8 -0
  36. data/spec/fixtures/fixture_modules/sample_module/lib/facter/fix_installed.rb +11 -0
  37. data/spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/awesome_parser.rb +13 -0
  38. data/spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/reduce.rb +31 -0
  39. data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/bad_sha1.rb +6 -0
  40. data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/defined.rb +94 -0
  41. data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/sha1.rb +6 -0
  42. data/spec/fixtures/fixture_modules/sample_module/spec/unit/facter/fix_installed_spec.rb +21 -0
  43. data/spec/fixtures/modules/tomcat/files/.gitkeep +0 -0
  44. data/spec/fixtures/modules/tomcat/templates/.gitkeep +0 -0
  45. data/spec/fixtures/modules/tomcat/tests/.gitkeep +0 -0
  46. data/spec/fixtures/providers/bmc/ipmitool.rb +188 -0
  47. data/spec/fixtures/providers/bmcuser/ipmitool.rb +140 -0
  48. data/spec/fixtures/types/bmc.rb +102 -0
  49. data/spec/fixtures/types/bmcuser.rb +46 -0
  50. data/spec/fixtures/types/db_opatch.rb +93 -0
  51. data/spec/integration/retrospec_spec.rb +1 -3
  52. data/spec/spec_helper.rb +33 -6
  53. data/spec/unit/conditional_spec.rb +12 -15
  54. data/spec/unit/generators/fact_generater_spec.rb +49 -17
  55. data/spec/unit/generators/function_generator_spec.rb +301 -0
  56. data/spec/unit/generators/function_spec.rb +67 -0
  57. data/spec/unit/generators/parsers/fact_spec.rb +62 -0
  58. data/spec/unit/generators/parsers/provider_spec.rb +44 -0
  59. data/spec/unit/generators/parsers/type_spec.rb +93 -0
  60. data/spec/unit/generators/provider_generator_spec.rb +120 -0
  61. data/spec/unit/generators/schema_generator_spec.rb +122 -0
  62. data/spec/unit/generators/type_generator_spec.rb +173 -0
  63. data/spec/unit/module_spec.rb +7 -10
  64. data/spec/unit/plugin_spec.rb +213 -15
  65. data/spec/unit/puppet-retrospec_spec.rb +81 -100
  66. data/spec/unit/resource_spec.rb +16 -17
  67. data/spec/unit/spec_object_spec.rb +46 -0
  68. data/spec/unit/type_code_spec.rb +9 -11
  69. data/spec/unit/variable_store_spec.rb +41 -43
  70. metadata +54 -4
  71. data/spec/unit/generators/fact_spec.rb +0 -58
@@ -1,5 +1,5 @@
1
1
  module Retrospec
2
2
  module Puppet
3
- VERSION = '0.11.0'
3
+ VERSION = '0.12.0'
4
4
  end
5
5
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "puppet-retrospec"
8
- s.version = "0.11.0"
8
+ s.version = "0.12.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Corey Osman"]
12
- s.date = "2015-10-26"
12
+ s.date = "2016-01-26"
13
13
  s.description = "Retrofits and generates valid puppet rspec test code to existing modules"
14
14
  s.email = "corey@logicminds.biz"
15
15
  s.extra_rdoc_files = [
@@ -19,8 +19,10 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".rspec",
22
+ ".rubocop.yml",
22
23
  ".travis.yml",
23
24
  "CHANGELOG.md",
25
+ "DEVELOPMENT.md",
24
26
  "Gemfile",
25
27
  "Gemfile.lock",
26
28
  "LICENSE",
@@ -29,9 +31,17 @@ Gem::Specification.new do |s|
29
31
  "VERSION",
30
32
  "lib/retrospec-puppet.rb",
31
33
  "lib/retrospec/plugins/v1/plugin/conditional.rb",
34
+ "lib/retrospec/plugins/v1/plugin/exceptions.rb",
35
+ "lib/retrospec/plugins/v1/plugin/generators.rb",
32
36
  "lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb",
33
- "lib/retrospec/plugins/v1/plugin/generators/facter.rb",
37
+ "lib/retrospec/plugins/v1/plugin/generators/function_generator.rb",
34
38
  "lib/retrospec/plugins/v1/plugin/generators/module_generator.rb",
39
+ "lib/retrospec/plugins/v1/plugin/generators/parsers/facter.rb",
40
+ "lib/retrospec/plugins/v1/plugin/generators/parsers/function.rb",
41
+ "lib/retrospec/plugins/v1/plugin/generators/parsers/type.rb",
42
+ "lib/retrospec/plugins/v1/plugin/generators/provider_generator.rb",
43
+ "lib/retrospec/plugins/v1/plugin/generators/schema_generator.rb",
44
+ "lib/retrospec/plugins/v1/plugin/generators/type_generator.rb",
35
45
  "lib/retrospec/plugins/v1/plugin/helpers.rb",
36
46
  "lib/retrospec/plugins/v1/plugin/puppet.rb",
37
47
  "lib/retrospec/plugins/v1/plugin/puppet_module.rb",
@@ -46,10 +56,19 @@ Gem::Specification.new do |s|
46
56
  "spec/fixtures/facts/datacenter_facts.rb",
47
57
  "spec/fixtures/facts/facts_with_methods.rb",
48
58
  "spec/fixtures/facts/node_role.rb",
59
+ "spec/fixtures/facts/oracle_controls.rb",
49
60
  "spec/fixtures/fixture_modules/one_resource_module/manifests/another_resource.pp",
50
61
  "spec/fixtures/fixture_modules/one_resource_module/manifests/inherits_params.pp",
51
62
  "spec/fixtures/fixture_modules/one_resource_module/manifests/one_resource_class.pp",
52
63
  "spec/fixtures/fixture_modules/one_resource_module/manifests/params.pp",
64
+ "spec/fixtures/fixture_modules/required_parameters/manifests/init.pp",
65
+ "spec/fixtures/fixture_modules/sample_module/lib/facter/fix_installed.rb",
66
+ "spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/awesome_parser.rb",
67
+ "spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/reduce.rb",
68
+ "spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/bad_sha1.rb",
69
+ "spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/defined.rb",
70
+ "spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/sha1.rb",
71
+ "spec/fixtures/fixture_modules/sample_module/spec/unit/facter/fix_installed_spec.rb",
53
72
  "spec/fixtures/fixture_modules/zero_resource_module/manifests/empty_class.pp",
54
73
  "spec/fixtures/fixture_modules/zero_resource_module/manifests/not_a_resource_defination.pp",
55
74
  "spec/fixtures/fixture_modules/zero_resource_module/metadata.json",
@@ -525,6 +544,7 @@ Gem::Specification.new do |s|
525
544
  "spec/fixtures/modules/stdlib/tests/has_ip_address.pp",
526
545
  "spec/fixtures/modules/stdlib/tests/has_ip_network.pp",
527
546
  "spec/fixtures/modules/stdlib/tests/init.pp",
547
+ "spec/fixtures/modules/tomcat/.bundle/config",
528
548
  "spec/fixtures/modules/tomcat/.gitignore",
529
549
  "spec/fixtures/modules/tomcat/.puppet-lint.rc",
530
550
  "spec/fixtures/modules/tomcat/.travis.yml",
@@ -543,6 +563,7 @@ Gem::Specification.new do |s|
543
563
  "spec/fixtures/modules/tomcat/examples/instance_with_role_and_user.pp",
544
564
  "spec/fixtures/modules/tomcat/examples/jsvc_install_from_source.pp",
545
565
  "spec/fixtures/modules/tomcat/examples/multiple_instances.pp",
566
+ "spec/fixtures/modules/tomcat/files/.gitkeep",
546
567
  "spec/fixtures/modules/tomcat/manifests/config/server.pp",
547
568
  "spec/fixtures/modules/tomcat/manifests/config/server/connector.pp",
548
569
  "spec/fixtures/modules/tomcat/manifests/config/server/context.pp",
@@ -562,15 +583,30 @@ Gem::Specification.new do |s|
562
583
  "spec/fixtures/modules/tomcat/manifests/setenv/entry.pp",
563
584
  "spec/fixtures/modules/tomcat/manifests/war.pp",
564
585
  "spec/fixtures/modules/tomcat/metadata.json",
586
+ "spec/fixtures/modules/tomcat/templates/.gitkeep",
587
+ "spec/fixtures/modules/tomcat/tests/.gitkeep",
588
+ "spec/fixtures/providers/bmc/ipmitool.rb",
589
+ "spec/fixtures/providers/bmcuser/ipmitool.rb",
590
+ "spec/fixtures/types/bmc.rb",
591
+ "spec/fixtures/types/bmcuser.rb",
592
+ "spec/fixtures/types/db_opatch.rb",
565
593
  "spec/integration/retrospec_spec.rb",
566
594
  "spec/spec_helper.rb",
567
595
  "spec/unit/conditional_spec.rb",
568
596
  "spec/unit/generators/fact_generater_spec.rb",
569
- "spec/unit/generators/fact_spec.rb",
597
+ "spec/unit/generators/function_generator_spec.rb",
598
+ "spec/unit/generators/function_spec.rb",
599
+ "spec/unit/generators/parsers/fact_spec.rb",
600
+ "spec/unit/generators/parsers/provider_spec.rb",
601
+ "spec/unit/generators/parsers/type_spec.rb",
602
+ "spec/unit/generators/provider_generator_spec.rb",
603
+ "spec/unit/generators/schema_generator_spec.rb",
604
+ "spec/unit/generators/type_generator_spec.rb",
570
605
  "spec/unit/module_spec.rb",
571
606
  "spec/unit/plugin_spec.rb",
572
607
  "spec/unit/puppet-retrospec_spec.rb",
573
608
  "spec/unit/resource_spec.rb",
609
+ "spec/unit/spec_object_spec.rb",
574
610
  "spec/unit/type_code_spec.rb",
575
611
  "spec/unit/variable_store_spec.rb",
576
612
  "vendor/gems/puppet-3.7.3/Gemfile",
@@ -1832,6 +1868,7 @@ Gem::Specification.new do |s|
1832
1868
  s.add_runtime_dependency(%q<trollop>, [">= 0"])
1833
1869
  s.add_runtime_dependency(%q<retrospec>, ["~> 0.4"])
1834
1870
  s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
1871
+ s.add_runtime_dependency(%q<facets>, [">= 0"])
1835
1872
  s.add_development_dependency(%q<rspec>, ["~> 3.2"])
1836
1873
  s.add_development_dependency(%q<puppet>, ["= 3.7.3"])
1837
1874
  s.add_development_dependency(%q<yard>, ["~> 0.7"])
@@ -1844,6 +1881,7 @@ Gem::Specification.new do |s|
1844
1881
  s.add_dependency(%q<trollop>, [">= 0"])
1845
1882
  s.add_dependency(%q<retrospec>, ["~> 0.4"])
1846
1883
  s.add_dependency(%q<awesome_print>, [">= 0"])
1884
+ s.add_dependency(%q<facets>, [">= 0"])
1847
1885
  s.add_dependency(%q<rspec>, ["~> 3.2"])
1848
1886
  s.add_dependency(%q<puppet>, ["= 3.7.3"])
1849
1887
  s.add_dependency(%q<yard>, ["~> 0.7"])
@@ -1857,6 +1895,7 @@ Gem::Specification.new do |s|
1857
1895
  s.add_dependency(%q<trollop>, [">= 0"])
1858
1896
  s.add_dependency(%q<retrospec>, ["~> 0.4"])
1859
1897
  s.add_dependency(%q<awesome_print>, [">= 0"])
1898
+ s.add_dependency(%q<facets>, [">= 0"])
1860
1899
  s.add_dependency(%q<rspec>, ["~> 3.2"])
1861
1900
  s.add_dependency(%q<puppet>, ["= 3.7.3"])
1862
1901
  s.add_dependency(%q<yard>, ["~> 0.7"])
@@ -0,0 +1,38 @@
1
+ require 'json'
2
+
3
+ Facter.add(:oracle_controls) do
4
+ setcode do
5
+ confine :kernel => 'Linux'
6
+ confine :type => 'oracle'
7
+ script_data
8
+ end
9
+ end
10
+
11
+ # returns boolean true if all the checks pass
12
+ Facter.add(:oracle_security_status) do
13
+ setcode do
14
+ confine :kernel => 'Linux'
15
+ confine :type => 'oracle'
16
+ # check all items in the hash and return true/false if any of them have failed
17
+ if script_data
18
+ ! script_data.find { | item| item['status'] =~ /true/i }.empty? # negate because an empty array means all passing
19
+ end
20
+ end
21
+ end
22
+
23
+ # return the data by running the check db script and store in a variable for later caching
24
+ # return nil if script cannot be run
25
+ def script_data
26
+ unless @script_data
27
+ script = '/some/script.sh'
28
+ return nil unless File.exists?(script)
29
+ cmd = "#{script}"
30
+ json_data = Facter::Core::Execution.execute("/bin/su -c '#{cmd}' - oracle", :on_fail => nil)
31
+ if json_data
32
+ @script_data = JSON.parse(json_data)
33
+ else
34
+ @script_data = nil
35
+ end
36
+ end
37
+ @script_data
38
+ end
@@ -0,0 +1,8 @@
1
+ class required_parameters(
2
+ $required_parameter,
3
+ $not_required_parameter = undef,
4
+ $boolean_parameter = false,
5
+ $string_parameter = 'hello'
6
+ ) {
7
+ # do nothing
8
+ }
@@ -0,0 +1,11 @@
1
+ Facter.add(:fix_installed) do
2
+ confine :kernel => 'windows'
3
+ setcode do
4
+ puts client_executable
5
+ File.exists?(client_executable)
6
+ end
7
+ end
8
+
9
+ def client_executable
10
+ "C:\\Program Files (x86)\\some.exe"
11
+ end
@@ -0,0 +1,13 @@
1
+ # extremely helpful documentation
2
+ # https://github.com/puppetlabs/puppet-specifications/blob/master/language/func-api.md#the-4x-api
3
+ Puppet::Functions.create_function(:awesome_parser) do
4
+ # the function below is called by puppet and and must match
5
+ # the name of the puppet function above. You can set your
6
+ # required parameters below and puppet 4 will enforce these
7
+ # change x and y to suit your needs although only one parameter is required
8
+ def awesome_parser(x,y)
9
+ x >= y ? x : y
10
+ end
11
+
12
+ # you can define other helper methods in this code block as well
13
+ end
@@ -0,0 +1,31 @@
1
+ Puppet::Functions.create_function(:reduce) do
2
+
3
+ dispatch :reduce_without_memo do
4
+ param 'Any', :enumerable
5
+ block_param 'Callable[2,2]', :block
6
+ end
7
+
8
+ dispatch :reduce_with_memo do
9
+ param 'Any', :enumerable
10
+ param 'Any', :memo
11
+ block_param 'Callable[2,2]', :block
12
+ end
13
+
14
+ def reduce_without_memo(enumerable)
15
+ enum = asserted_enumerable(enumerable)
16
+ enum.reduce {|memo, x| yield(memo, x) }
17
+ end
18
+
19
+ def reduce_with_memo(enumerable, given_memo)
20
+ enum = asserted_enumerable(enumerable)
21
+ enum.reduce(given_memo) {|memo, x| yield(memo, x) }
22
+ end
23
+
24
+ def asserted_enumerable(obj)
25
+ unless enum = Puppet::Pops::Types::Enumeration.enumerator(obj)
26
+ raise ArgumentError, ("#{self.class.name}(): wrong argument type (#{obj.class}; must be something enumerable.")
27
+ end
28
+ enum
29
+ end
30
+
31
+ end
@@ -0,0 +1,6 @@
1
+ require 'digest/sha1'
2
+
3
+ Puppet::Parser::Functions::newfunction(:bad_sha1, :type => :rvalue, :arity => 1, :doc => "Returns a SHA1 hash value from a provided string.") do |args|
4
+ \crap
5
+ value = Digest::SHA1.hexdigest(args[0])
6
+ end
@@ -0,0 +1,94 @@
1
+ # Test whether a given class or definition is defined
2
+ Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :arity => -2,
3
+ :doc => "Determine whether
4
+ a given class or resource type is defined. This function can also determine whether a
5
+ specific resource has been defined, or whether a variable has been assigned a value
6
+ (including `undef` - as opposed to never having been assigned anything). Returns `true`
7
+ or `false`. Accepts class names, type names, resource references, and variable
8
+ reference strings of the form `'$name'`. When more than one argument is
9
+ supplied, `defined()` returns `true` if any are defined.
10
+
11
+ The `defined` function checks both native and defined types, including types
12
+ provided as plugins via modules. Types and classes are both checked using their names:
13
+
14
+ defined(\"file\")
15
+ defined(\"customtype\")
16
+ defined(\"foo\")
17
+ defined(\"foo::bar\")
18
+ defined(\'$name\')
19
+
20
+ Resource declarations are checked using resource references, e.g.
21
+ `defined( File['/tmp/myfile'] )`. Checking whether a given resource
22
+ has been declared is, unfortunately, dependent on the evaluation order of
23
+ the configuration, and the following code will not work:
24
+
25
+ if defined(File['/tmp/foo']) {
26
+ notify { \"This configuration includes the /tmp/foo file.\":}
27
+ }
28
+ file { \"/tmp/foo\":
29
+ ensure => present,
30
+ }
31
+
32
+ However, this order requirement refers to evaluation order only, and ordering of
33
+ resources in the configuration graph (e.g. with `before` or `require`) does not
34
+ affect the behavior of `defined`.
35
+
36
+ You may also search using types:
37
+
38
+ defined(Resource[\'file\',\'/some/file\'])
39
+ defined(File[\'/some/file\'])
40
+ defined(Class[\'foo\'])
41
+
42
+ The `defined` function does not answer if 4.x data types (e.g. `Integer`) are defined. If
43
+ given the string 'integer' the result is false, and if given a non CatalogEntry type,
44
+ an error is raised.
45
+
46
+ The rules for asking for undef, empty strings, and the main class are different from 3.x
47
+ (non future parser) and 4.x (with future parser or in Puppet 4.0.0 and later):
48
+
49
+ defined('') # 3.x => true, 4.x => false
50
+ defined(undef) # 3.x => true, 4.x => error
51
+ defined('main') # 3.x => false, 4.x => true
52
+
53
+ With the future parser, it is also possible to ask specifically if a name is
54
+ a resource type (built in or defined), or a class, by giving its type:
55
+
56
+ defined(Type[Class['foo']])
57
+ defined(Type[Resource['foo']])
58
+
59
+ Which is different from asking:
60
+
61
+ defined('foo')
62
+
63
+ Since the later returns true if 'foo' is either a class, a built-in resource type, or a user defined
64
+ resource type, and a specific request like `Type[Class['foo']]` only returns true if `'foo'` is a class.
65
+
66
+ - Since 2.7.0
67
+ - Since 3.6.0 variable reference and future parser types
68
+ - Since 3.8.1 type specific requests with future parser") do |vals|
69
+ vals = [vals] unless vals.is_a?(Array)
70
+ vals.any? do |val|
71
+ case val
72
+ when String
73
+ if m = /^\$(.+)$/.match(val)
74
+ exist?(m[1])
75
+ else
76
+ find_resource_type(val) || find_definition(val) || find_hostclass(val)
77
+ end
78
+ when Puppet::Resource
79
+ compiler.findresource(val.type, val.title)
80
+ when Puppet::Pops::Types::PResourceType
81
+ raise ArgumentError, "The given resource type is a reference to all kind of types" if val.type_name.nil?
82
+ if val.title.nil?
83
+ find_builtin_resource_type(val.type_name) || find_definition(val.type_name)
84
+ else
85
+ compiler.findresource(val.type_name, val.title)
86
+ end
87
+ when Puppet::Pops::Types::PHostClassType
88
+ raise ArgumentError, "The given class type is a reference to all classes" if val.class_name.nil?
89
+ find_hostclass(val.class_name)
90
+ else
91
+ raise ArgumentError, "Invalid argument of type '#{val.class}' to 'defined'"
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,6 @@
1
+ require 'digest/sha1'
2
+
3
+ Puppet::Parser::Functions::newfunction(:sha1, :type => :rvalue, :arity => 1, :doc => "Returns a SHA1 hash value from a provided string.") do |args|
4
+ value = Digest::SHA1.hexdigest(args[0])
5
+ end
6
+
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'facter'
3
+
4
+ describe :fix_installed, :type => :fact do
5
+
6
+ before :all do
7
+ # perform any action that should be run for the entire test suite
8
+ end
9
+
10
+ before :each do
11
+ # perform any action that should be run before every test
12
+ Facter.clear
13
+ # This will mock the facts that confine uses to limit facts running under certain conditions
14
+ allow(Facter.fact(:kernel)).to receive(:value).and_return("windows")
15
+
16
+ end
17
+
18
+ it 'should return a value' do
19
+ expect(Facter.fact(:fix_installed).value).to eq('value123') #<-- change the value to match your expectation
20
+ end
21
+ end
File without changes
File without changes
File without changes
@@ -0,0 +1,188 @@
1
+ Puppet::Type.type(:bmc).provide(:ipmitool) do
2
+ desc "Provides ipmitool support for the bmc type"
3
+
4
+ commands :ipmitoolcmd => 'ipmitool'
5
+ # if the open ipmi driver does not exist we can perform any of these configurations
6
+ # check to see that openipmi driver is loaded and ipmi device exists
7
+ confine :bmc_device_present => [:true, true]
8
+
9
+ mk_resource_methods
10
+
11
+ CHANNEL_LOOKUP = {
12
+ 'Dell Inc.' => '1',
13
+ 'FUJITSU' => '2',
14
+ 'FUJITSU SIEMENS' => '2',
15
+ 'HP' => '2',
16
+ 'Intel Corporation' => '3',
17
+ }
18
+ def initialize(value={})
19
+ super(value)
20
+ @property_flush = {}
21
+ end
22
+
23
+ # the flush method will be the last method called after applying all the other
24
+ # properties, by default nothing will be enabled or disabled unless the disable/enable are set to true
25
+ # if we ever move to a point were we can write all the settings via one big config file we
26
+ # would want to do that here.
27
+ def flush
28
+ if @property_flush
29
+ if @property_flush[:disable]
30
+ disable_channel #TODO is this needed?
31
+ elsif @property_flush[:enable]
32
+ enable_channel # TODO is this needed? what does this do ?
33
+ end
34
+ end
35
+ # resets the interface
36
+ Puppet.debug('rebooting the bmc device')
37
+ ipmitoolcmd(['bmc', 'reset', 'cold'])
38
+ end
39
+
40
+ ##### These are the default ensurable methods that must be implemented
41
+ def install
42
+ if resource[:ipsource] == :static
43
+ ip = resource[:ip]
44
+ netmask = resource[:netmask]
45
+ gateway = resource[:gateway]
46
+ end
47
+
48
+ ipsource = resource[:ipsource]
49
+ if resource[:vlanid]
50
+ vlanid = resource[:vlanid]
51
+ end
52
+ end
53
+
54
+ def remove
55
+ ipsource = "dhcp"
56
+
57
+ end
58
+
59
+ def exists?
60
+ @property_hash[:ensure] == :present
61
+ end
62
+
63
+ # return all instances of this resource which really should only be one instance
64
+ def self.instances
65
+ info = self.laninfo
66
+ inst = new(
67
+ :name => info["mac address"],
68
+ :ensure => :present,
69
+ :ip => info["ip address"],
70
+ :netmask => info["subnet mask"],
71
+ :gateway => info["default gateway ip"],
72
+ :vlanid => info["802.1q vlan id"],
73
+ :ipsource => info["ip address source"]
74
+ )
75
+ [inst]
76
+ end
77
+
78
+ def self.prefetch(resources)
79
+ devices = instances
80
+ if devices
81
+ resources.keys.each do | name|
82
+ if provider = devices.find{|device| device.name == name }
83
+ resources[name].provider = provider
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ #def snmp
90
+ # # TODO implement how to get the snmp string even when the device doesn't support snmp lookups
91
+ #end
92
+ #
93
+ #def snmp=(community)
94
+ # ipmitoolcmd 'lan set 1 snmp', community
95
+ #end
96
+
97
+ # end - bmc parameters
98
+
99
+ def self.laninfo
100
+ landata = ipmitoolcmd([ "lan", "print", CHANNEL_LOOKUP.fetch(Facter.value(:manufacturer), '1') ])
101
+ info = {}
102
+ landata.lines.each do |line|
103
+ # clean up the data from spaces
104
+ item = line.split(':', 2)
105
+ key = item.first.strip.downcase
106
+ value = item.last.strip
107
+ info[key] = value
108
+ end
109
+ info
110
+ info['ip address source'] = convert_ip_source(info['ip address source'])
111
+ info["802.1q vlan id"] = convert_vlanid(info["802.1q vlan id"])
112
+ info
113
+ end
114
+
115
+ def gateway=(address)
116
+ ipmitoolcmd([ "lan", "set", channel, "defgw", "ipaddr", address ])
117
+ end
118
+
119
+ def ipsource=(source)
120
+ ipmitoolcmd([ "lan", "set", channel, "ipsrc", source.to_s ])
121
+ end
122
+
123
+ def ip=(address)
124
+ ipmitoolcmd([ "lan", "set", channel, "ipaddr", address ])
125
+ end
126
+
127
+ def netmask=(subnet)
128
+ ipmitoolcmd([ "lan", "set", channel, "netmask", subnet ])
129
+ end
130
+
131
+ def vlanid=(vid)
132
+ ipmitoolcmd([ "lan", "set", channel, "vlan", "id", vid ])
133
+ end
134
+
135
+ def self.convert_vlanid(id)
136
+ if id =~ /Disabled/i
137
+ 'off'
138
+ else
139
+ id
140
+ end
141
+ end
142
+
143
+ def self.convert_ip_source(src)
144
+ case src
145
+ when /static/i
146
+ :static
147
+ when /dhcp/i
148
+ :dhcp
149
+ else
150
+ src
151
+ end
152
+ end
153
+
154
+ private
155
+
156
+ def mac
157
+ lanconfig["mac address"]
158
+ end
159
+
160
+ def dhcp?
161
+ lanconfig["ip address source"].match(/dhcp/i) != nil
162
+ end
163
+
164
+ def static?
165
+ lanconfig["ip address source"].match(/static/i) != nil
166
+ end
167
+
168
+ def channel_enabled?
169
+ # TODO implement how to look up this info
170
+ true
171
+ end
172
+
173
+ def channel
174
+ CHANNEL_LOOKUP.fetch(Facter.value(:manufacturer), '1')
175
+ end
176
+
177
+ def enable_channel
178
+ ipmitoolcmd([ "lan", "set", channel, "access", "on" ])
179
+ end
180
+
181
+ def disable_channel
182
+ ipmitoolcmd([ "lan", "set", channel, "access", "off" ])
183
+ end
184
+
185
+ def lanconfig
186
+ @lanconfig ||= self.class.laninfo
187
+ end
188
+ end