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
@@ -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
-