puppet-retrospec 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,140 @@
1
+ Puppet::Type.type(:bmcuser).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
+ PRIV = {
19
+ :ADMINISTRATOR => 4,
20
+ :ADMIN => 4,
21
+ :USER => 2,
22
+ :CALLBACK => 1,
23
+ :OPERATOR => 3,
24
+ :NOACCESS => 15,
25
+ }
26
+
27
+ def initialize(value={})
28
+ super(value)
29
+ @property_flush = {}
30
+ end
31
+
32
+ def create
33
+ set_username resource[:username]
34
+ set_userpass resource[:userpass]
35
+ set_privlevel PRIV[resource[:privlevel]]
36
+ set_enable id # finds an unused id
37
+ end
38
+
39
+ # get the user id supplied by the resource or find out the current user id
40
+ # if a user id cannot be found, try and create a new user id by looking for empty slots
41
+ def id
42
+ @id ||= @property_hash[:id] || user_id(resource[:username])
43
+ end
44
+
45
+ def destroy
46
+ set_username '(Empty User)'
47
+ set_privlevel PRIV[:NOACCESS]
48
+ set_disable id
49
+ end
50
+
51
+ def exists?
52
+ @property_hash[:ensure] == :present
53
+ end
54
+
55
+ def set_username(value)
56
+ ipmitoolcmd([ "user", "set", "name", id, value] )
57
+ end
58
+
59
+ def set_userpass(value)
60
+ ipmitoolcmd([ "user", "set", "password", id, value ])
61
+
62
+ end
63
+
64
+ def set_privlevel(value)
65
+ ipmitoolcmd([ "user", "priv", id, value, channel ])
66
+
67
+ end
68
+
69
+ def set_enable(value)
70
+ ipmitoolcmd([ "user", "enable", value ])
71
+ end
72
+
73
+ def set_disable(value)
74
+ ipmitoolcmd([ "user", "disable", value ])
75
+ end
76
+
77
+ def users
78
+ unless @users
79
+ userdata = ipmitoolcmd([ "user", "list", CHANNEL_LOOKUP.fetch(Facter.value(:manufacturer), '1')])
80
+ @users = []
81
+ userdata.lines.each do | line|
82
+ # skip the header
83
+ next if line.match(/^ID/)
84
+ id, name, callin, linkauth, enabled, priv = line.chomp.split(' ', 6)
85
+ # create the resource
86
+ users << {:name => name, :username => name, :id => id, :enabled => enabled,
87
+ :callin => callin, :linkauth => linkauth , :privlevel => priv, :userpass => '**Not*Available****' }
88
+ end
89
+ end
90
+ @users
91
+ end
92
+
93
+ def new_user_id
94
+ begin
95
+ user = users.find {|user| user[:name] =~ /Empty/i } || users.find {|user| !user[:enabled] }
96
+ user[:id]
97
+ rescue
98
+ fail('Cannot allocate a user id, all ipmi users are taken already')
99
+ end
100
+ end
101
+
102
+ def user_id(user)
103
+ if ! found_user = users.find {|u| u[:name] == user }
104
+ new_user_id
105
+ else
106
+ found_user[:id]
107
+ end
108
+ end
109
+
110
+ def self.instances
111
+ userdata = ipmitoolcmd([ "user", "list", CHANNEL_LOOKUP.fetch(Facter.value(:manufacturer), '1')])
112
+ users = []
113
+ userdata.lines.each do | line|
114
+ # skip the header
115
+ next if line.match(/^ID/)
116
+ next if line.match(/Empty/i)
117
+ id, name, callin, linkauth, enabled, priv = line.chomp.split(' ', 6)
118
+ # create the resource
119
+ users << new(:name => name, :username => name, :id => id, :ensure => :present,
120
+ :privlevel => priv, :userpass => '**Hidden**' )
121
+ end
122
+ users
123
+ end
124
+
125
+ def self.prefetch(resources)
126
+ users = instances
127
+ if users
128
+ resources.keys.each do | name|
129
+ if provider = users.find{|user| user.username == name }
130
+ resources[name].provider = provider
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ def channel
137
+ CHANNEL_LOOKUP.fetch(Facter.value(:manufacturer), '1')
138
+ end
139
+ end
140
+
@@ -0,0 +1,102 @@
1
+ Puppet::Type.newtype(:bmc) do
2
+ @doc = "Manage BMC devices"
3
+
4
+ ensurable do
5
+ newvalue(:present) do
6
+ provider.install
7
+ end
8
+
9
+ newvalue(:absent) do
10
+ provider.remove
11
+ end
12
+ end
13
+
14
+ newparam(:name, :namevar=>true) do
15
+ desc "The name of the bmc device."
16
+ end
17
+
18
+ # This is just a simple verification to valid ip related sources
19
+ def validaddr?(source)
20
+ valid = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/.match("#{source}")
21
+ ! valid.nil?
22
+
23
+ end
24
+ #
25
+ # defaultto do
26
+ #
27
+ # provider = resource[:provider].downcase
28
+ # if provider =~ /freeipmi|impitool/
29
+ # # check to see that openipmi driver is loaded and ipmi device exists
30
+ # opendriver = File.exists?('/dev/ipmi0') || File.exists?('/dev/ipmi/0') || File.exists?('/dev/ipmidev/0')
31
+ # if not opendriver
32
+ # raise ArgumentError , "The openipmi driver cannot be found, is openipmi installed and loaded correctly?"
33
+ # end
34
+ # :ipmitool
35
+ # elsif provider == "oem"
36
+ # case $manufacturer.downcase!
37
+ # when "hp", "hewlett packard"
38
+ # # check if hp's ilo driver is installed
39
+ # if not File.exists?('/dev/hpilo/dXccbN')
40
+ # raise ArgumentError , "The hp ilo driver cannot be found, is the ilo driver installed and loaded?"
41
+ # else
42
+ # return :hp
43
+ # end
44
+ # else
45
+ # raise ArgumentError , "The manufacturer \"#{$manufacturer}\" is currently not
46
+ # supported under the oem provider, please try freeipmi or ipmitool"
47
+ # end
48
+ #
49
+ # end
50
+ # end
51
+ #end
52
+
53
+
54
+ newproperty(:ipsource) do
55
+ desc "The type of ip address to use static or dhcp"
56
+ newvalues(:static, :dhcp)
57
+ defaultto{:dhcp}
58
+
59
+ end
60
+
61
+ newproperty(:ip) do
62
+ desc "The ip address of the bmc device"
63
+ validate do |value|
64
+ valid = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/.match("#{value}")
65
+ if valid.nil?
66
+ raise ArgumentError , "%s is not a valid ip" % value
67
+ end
68
+ end
69
+ end
70
+
71
+ newproperty(:netmask) do
72
+ desc "The netmask address of the bmc device"
73
+ validate do |value|
74
+ valid = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/.match("#{value}")
75
+ if valid.nil?
76
+ raise ArgumentError , "%s is not a valid netmask" % value
77
+ end
78
+ end
79
+ end
80
+
81
+ newproperty(:gateway) do
82
+ desc "The gateway address of the bmc device"
83
+ validate do |value|
84
+ valid = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/.match("#{value}")
85
+ if valid.nil?
86
+ raise ArgumentError , "%s is not a valid gateway" % value
87
+ end
88
+ end
89
+ end
90
+
91
+ newproperty(:vlanid) do
92
+ defaultto {"off"}
93
+ validate do |value|
94
+ unless (1..4094).include?(value.to_i) or value == "off"
95
+ raise ArgumentError , "%s is not a valid vlan id, must be 1-4094" % value
96
+ end
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+
@@ -0,0 +1,46 @@
1
+ Puppet::Type.newtype(:bmcuser) do
2
+ @doc = "Manage BMC devices"
3
+
4
+
5
+ ensurable do
6
+ newvalue(:present) do
7
+ provider.create
8
+ end
9
+
10
+ newvalue(:absent) do
11
+ provider.destroy
12
+ end
13
+ end
14
+
15
+ newproperty(:id) do
16
+ desc 'The id of the user, gathered from the bmc user list'
17
+ end
18
+
19
+ newparam(:name) do
20
+ desc 'The name of the resource'
21
+ end
22
+
23
+ newproperty(:username, :namevar => true) do
24
+ desc "The username to be added"
25
+
26
+ end
27
+
28
+ newproperty(:userpass) do
29
+ desc "The password of the user to create"
30
+ def change_to_s(current, desire)
31
+ "userpass is different, changing to specified password"
32
+ end
33
+ end
34
+
35
+ newparam(:force) do
36
+ desc "The force parameter will set the password of the user with every puppet run"
37
+ newvalues(true, false)
38
+ end
39
+
40
+ newproperty(:privlevel) do
41
+ desc "The privilege level type for the user"
42
+ defaultto :ADMIN
43
+ newvalues(:ADMIN, :USER, :OPERATOR, :CALLBACK, :ADMINISTRATOR, :NOACCESS)
44
+ end
45
+
46
+ end
@@ -0,0 +1,93 @@
1
+ Puppet::Type.newtype(:db_opatch) do
2
+ desc 'This is the Oracle Patch process called OPatch'
3
+
4
+ newproperty(:ensure) do
5
+ desc 'Whether a patch should be applied.'
6
+
7
+ newvalue(:present, :event => :opatch_installed) do
8
+ provider.present
9
+ end
10
+
11
+ newvalue(:absent, :event => :opatch_absent) do
12
+ provider.absent
13
+ end
14
+
15
+ aliasvalue(:installed, :present)
16
+ aliasvalue(:purged, :absent)
17
+
18
+ def retrieve
19
+ provider.status
20
+ end
21
+
22
+ def sync
23
+ event = super()
24
+
25
+ if property = @resource.property(:enable)
26
+ val = property.retrieve
27
+ property.sync unless property.safe_insync?(val)
28
+ end
29
+
30
+ event
31
+ end
32
+ end
33
+
34
+ newparam(:name) do
35
+ desc <<-EOT
36
+ The name of the OPatch.
37
+ EOT
38
+ isnamevar
39
+ end
40
+
41
+ newproperty(:test_boolean) do
42
+ #newvalue :true
43
+ newvalue :false
44
+ defaultto true
45
+ end
46
+ newparam(:patch_id) do
47
+ desc <<-EOT
48
+ The patchId of the OPatch.
49
+ EOT
50
+ end
51
+
52
+ newparam(:os_user) do
53
+ desc <<-EOT
54
+ The weblogic operating system user.
55
+ EOT
56
+ end
57
+
58
+ newparam(:oracle_product_home_dir) do
59
+ desc <<-EOT
60
+ The oracle product home folder.
61
+ EOT
62
+ end
63
+
64
+ newparam(:orainst_dir) do
65
+ desc <<-EOT
66
+ The orainst folder.
67
+ EOT
68
+ end
69
+
70
+ newparam(:extracted_patch_dir) do
71
+ desc <<-EOT
72
+ The extracted patch folder.
73
+ EOT
74
+ end
75
+
76
+ newparam(:ocmrf_file) do
77
+ desc <<-EOT
78
+ The ocmrf file.
79
+ EOT
80
+ end
81
+
82
+ newparam(:opatch_auto) do
83
+ desc <<-EOT
84
+ opatch auto bundle patch
85
+ EOT
86
+ end
87
+
88
+ newparam(:bundle_sub_patch_id) do
89
+ desc <<-EOT
90
+ One of the Sub patch number of the bundle patch
91
+ EOT
92
+ end
93
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "variable_store" do
4
-
3
+ describe 'variable_store' do
5
4
  # after :all do
6
5
  # # enabling the removal slows down tests, but from time to time we may need to
7
6
  # FileUtils.rm_rf(fixture_modules_path) if ENV['RETROSPEC_CLEAN_UP_TEST_MODULES'] =~ /true/
@@ -32,5 +31,4 @@ describe "variable_store" do
32
31
  # #clean_up_spec_dir(@path)
33
32
  #
34
33
  # end
35
-
36
34
  end
data/spec/spec_helper.rb CHANGED
@@ -7,6 +7,18 @@ def fixture_modules_path
7
7
  @fixture_module_path ||= File.expand_path(File.join(fixtures_path, 'modules'))
8
8
  end
9
9
 
10
+ def fake_fixture_modules
11
+ @fake_fixture_modules ||= File.expand_path(File.join(fixtures_path, 'fixture_modules'))
12
+ end
13
+
14
+ def gem_template_path
15
+ @gem_template_path ||= File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'lib', 'retrospec', 'plugins', 'v1', 'plugin', 'templates'))
16
+ end
17
+
18
+ def sample_module_path
19
+ File.join(fixtures_path, 'fixture_modules', 'sample_module')
20
+ end
21
+
10
22
  def fixtures_path
11
23
  @fixtures_path ||= File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
12
24
  end
@@ -15,22 +27,37 @@ def fixtures_facts_path
15
27
  @fixtures_facts_path ||= File.expand_path(File.join(fixtures_path, 'facts'))
16
28
  end
17
29
 
30
+ def fixtures_type_path
31
+ @fixtures_type_path ||= File.expand_path(File.join(fixtures_path, 'types'))
32
+ end
33
+
34
+ def fixtures_provider_path
35
+ @fixtures_provider_path ||= File.expand_path(File.join(fixtures_path, 'providers'))
36
+ end
37
+
38
+ def fixtures_functions_path
39
+ @fixtures_functions_path ||= File.expand_path(File.join(fixtures_path, 'functions'))
40
+ end
41
+
18
42
  def clean_up_spec_dir(dir)
19
- #puts "removing directory #{dir}"
43
+ # puts "removing directory #{dir}"
20
44
  FileUtils.rm_rf(File.join(dir, 'spec'))
21
45
  FileUtils.rm_f(File.join(dir, 'Gemfile'))
22
46
  FileUtils.rm_f(File.join(dir, '.fixtures.yml'))
23
47
  FileUtils.rm_f(File.join(dir, 'Rakefile'))
48
+ end
24
49
 
50
+ def retrospec_templates_path
51
+ # I like to develop the templates at the same time as this gem
52
+ # but I keep the templates in another repo
53
+ # as a side effect, puppet retrospec will pick up this environment variable as well
54
+ ENV['RETROSPEC_TEMPLATES_DIR'] ||= File.join(ENV['HOME'], 'github', 'retrospec-templates')
25
55
  end
26
56
 
27
57
  def install_module(module_name)
28
58
  FileUtils.mkdir_p(fixture_modules_path)
29
59
  puts `puppet module install -i #{fixture_modules_path} #{module_name}`
30
- Dir.glob(File.join(fixture_modules_path, '**','spec')).each do |dir|
31
- clean_up_spec_dir(dir)
60
+ Dir.glob(File.join(fixture_modules_path, '**', 'spec')).each do |dir|
61
+ clean_up_spec_dir(dir)
32
62
  end
33
63
  end
34
-
35
-
36
-