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.
- checksums.yaml +4 -4
- data/.rubocop.yml +17 -0
- data/CHANGELOG.md +11 -0
- data/DEVELOPMENT.md +3 -0
- data/Gemfile +10 -9
- data/Gemfile.lock +2 -0
- data/README.md +211 -273
- data/Rakefile +8 -8
- data/VERSION +1 -1
- data/lib/retrospec-puppet.rb +3 -3
- data/lib/retrospec/plugins/v1/plugin/conditional.rb +5 -6
- data/lib/retrospec/plugins/v1/plugin/exceptions.rb +17 -0
- data/lib/retrospec/plugins/v1/plugin/generators.rb +7 -0
- data/lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb +18 -10
- data/lib/retrospec/plugins/v1/plugin/generators/function_generator.rb +187 -0
- data/lib/retrospec/plugins/v1/plugin/generators/module_generator.rb +25 -26
- data/lib/retrospec/plugins/v1/plugin/generators/{facter.rb → parsers/facter.rb} +28 -35
- data/lib/retrospec/plugins/v1/plugin/generators/parsers/function.rb +91 -0
- data/lib/retrospec/plugins/v1/plugin/generators/parsers/type.rb +79 -0
- data/lib/retrospec/plugins/v1/plugin/generators/provider_generator.rb +107 -0
- data/lib/retrospec/plugins/v1/plugin/generators/schema_generator.rb +221 -0
- data/lib/retrospec/plugins/v1/plugin/generators/type_generator.rb +118 -0
- data/lib/retrospec/plugins/v1/plugin/helpers.rb +3 -7
- data/lib/retrospec/plugins/v1/plugin/puppet.rb +141 -60
- data/lib/retrospec/plugins/v1/plugin/puppet_module.rb +29 -26
- data/lib/retrospec/plugins/v1/plugin/resource.rb +6 -7
- data/lib/retrospec/plugins/v1/plugin/spec_object.rb +5 -8
- data/lib/retrospec/plugins/v1/plugin/template_helpers.rb +9 -10
- data/lib/retrospec/plugins/v1/plugin/templates/clone-hook +15 -8
- data/lib/retrospec/plugins/v1/plugin/type_code.rb +4 -4
- data/lib/retrospec/plugins/v1/plugin/variable_store.rb +26 -30
- data/lib/retrospec/plugins/v1/plugin/version.rb +1 -1
- data/puppet-retrospec.gemspec +43 -4
- data/spec/fixtures/facts/oracle_controls.rb +38 -0
- data/spec/fixtures/fixture_modules/required_parameters/manifests/init.pp +8 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/facter/fix_installed.rb +11 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/awesome_parser.rb +13 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/reduce.rb +31 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/bad_sha1.rb +6 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/defined.rb +94 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/sha1.rb +6 -0
- data/spec/fixtures/fixture_modules/sample_module/spec/unit/facter/fix_installed_spec.rb +21 -0
- data/spec/fixtures/modules/tomcat/files/.gitkeep +0 -0
- data/spec/fixtures/modules/tomcat/templates/.gitkeep +0 -0
- data/spec/fixtures/modules/tomcat/tests/.gitkeep +0 -0
- data/spec/fixtures/providers/bmc/ipmitool.rb +188 -0
- data/spec/fixtures/providers/bmcuser/ipmitool.rb +140 -0
- data/spec/fixtures/types/bmc.rb +102 -0
- data/spec/fixtures/types/bmcuser.rb +46 -0
- data/spec/fixtures/types/db_opatch.rb +93 -0
- data/spec/integration/retrospec_spec.rb +1 -3
- data/spec/spec_helper.rb +33 -6
- data/spec/unit/conditional_spec.rb +12 -15
- data/spec/unit/generators/fact_generater_spec.rb +49 -17
- data/spec/unit/generators/function_generator_spec.rb +301 -0
- data/spec/unit/generators/function_spec.rb +67 -0
- data/spec/unit/generators/parsers/fact_spec.rb +62 -0
- data/spec/unit/generators/parsers/provider_spec.rb +44 -0
- data/spec/unit/generators/parsers/type_spec.rb +93 -0
- data/spec/unit/generators/provider_generator_spec.rb +120 -0
- data/spec/unit/generators/schema_generator_spec.rb +122 -0
- data/spec/unit/generators/type_generator_spec.rb +173 -0
- data/spec/unit/module_spec.rb +7 -10
- data/spec/unit/plugin_spec.rb +213 -15
- data/spec/unit/puppet-retrospec_spec.rb +81 -100
- data/spec/unit/resource_spec.rb +16 -17
- data/spec/unit/spec_object_spec.rb +46 -0
- data/spec/unit/type_code_spec.rb +9 -11
- data/spec/unit/variable_store_spec.rb +41 -43
- metadata +54 -4
- data/spec/unit/generators/fact_spec.rb +0 -58
@@ -0,0 +1,118 @@
|
|
1
|
+
require_relative 'parsers/type'
|
2
|
+
|
3
|
+
module Retrospec
|
4
|
+
module Puppet
|
5
|
+
module Generators
|
6
|
+
class TypeGenerator < Retrospec::Plugins::V1::Plugin
|
7
|
+
attr_reader :template_dir, :context
|
8
|
+
|
9
|
+
# this is the list of core puppet types that cannot be recreated
|
10
|
+
CORE_TYPES = ["augeas", "computer", "cron", "exec", "file", "filebucket",
|
11
|
+
"group", "host", "interface", "k5login", "macauthorization", "mailalias",
|
12
|
+
"maillist", "mcx", "mount", "nagios_command", "nagios_contact",
|
13
|
+
"nagios_contactgroup", "nagios_host", "nagios_hostdependency",
|
14
|
+
"nagios_hostescalation", "nagios_hostextinfo", "nagios_hostgroup",
|
15
|
+
"nagios_service", "nagios_servicedependency",
|
16
|
+
"nagios_serviceescalation", "nagios_serviceextinfo",
|
17
|
+
"nagios_servicegroup", "nagios_timeperiod", "notify", "package",
|
18
|
+
"resources", "router", "schedule", "scheduled_task", "selboolean",
|
19
|
+
"selmodule", "service", "ssh_authorized_key", "sshkey", "stage",
|
20
|
+
"tidy", "user", "vlan", "yumrepo", "zfs", "zone", "zpool"]
|
21
|
+
|
22
|
+
# retrospec will initilalize this class so its up to you
|
23
|
+
# to set any additional variables you need to get the job done.
|
24
|
+
def initialize(module_path, spec_object = {})
|
25
|
+
super
|
26
|
+
# below is the Spec Object which serves as a context for template rendering
|
27
|
+
# you will need to initialize this object, so the erb templates can get the binding
|
28
|
+
# the SpecObject can be customized to your liking as its different for every plugin gem.
|
29
|
+
if CORE_TYPES.include?(spec_object[:name])
|
30
|
+
raise Retrospec::Puppet::Generators::CoreTypeException
|
31
|
+
end
|
32
|
+
@context = OpenStruct.new(:type_name => spec_object[:name], :parameters => spec_object[:parameters],
|
33
|
+
:properties => spec_object[:properties], :providers => spec_object[:providers])
|
34
|
+
end
|
35
|
+
|
36
|
+
def template_dir
|
37
|
+
external_templates = File.expand_path(File.join(config_data[:template_dir], 'types', 'type_template.rb.retrospec.erb'))
|
38
|
+
if File.exist?(external_templates)
|
39
|
+
File.join(config_data[:template_dir], 'types')
|
40
|
+
else
|
41
|
+
File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'templates', 'types'))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
# used to display subcommand options to the cli
|
45
|
+
# the global options are passed in for your usage
|
46
|
+
# http://trollop.rubyforge.org
|
47
|
+
# all options here are available in the config passed into config object
|
48
|
+
# returns the parameters
|
49
|
+
def self.run_cli(global_opts, args=ARGV)
|
50
|
+
sub_command_opts = Trollop.options(args) do
|
51
|
+
banner <<-EOS
|
52
|
+
Generates a new type with the given name, parameters, and properties.
|
53
|
+
|
54
|
+
EOS
|
55
|
+
opt :name, 'The name of the type you wish to create', :type => :string, :required => true, :short => '-n'
|
56
|
+
opt :parameters, 'A list of parameters to initialize your type with', :type => :strings, :required => false,
|
57
|
+
:short => '-p', :default => ['name']
|
58
|
+
opt :properties, 'A list of properties to initialize your type with', :type => :strings, :required => false,
|
59
|
+
:short => '-a', :default => []
|
60
|
+
opt :providers, 'A list of providers to create and associate with this type', :type => :strings,
|
61
|
+
:default => ['default'], :required => false
|
62
|
+
end
|
63
|
+
unless sub_command_opts[:name]
|
64
|
+
Trollop.educate
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
plugin_data = global_opts.merge(sub_command_opts)
|
68
|
+
plugin_data
|
69
|
+
end
|
70
|
+
|
71
|
+
def type_dir
|
72
|
+
@type_dir ||= File.join(module_path, 'lib', 'puppet', 'type')
|
73
|
+
end
|
74
|
+
|
75
|
+
def type_spec_dir
|
76
|
+
@type_spec_dir ||= File.join(module_path, 'spec', 'unit', 'puppet', 'type')
|
77
|
+
end
|
78
|
+
|
79
|
+
def type_name_path
|
80
|
+
File.join(type_dir, "#{type_name}.rb")
|
81
|
+
end
|
82
|
+
|
83
|
+
def type_name
|
84
|
+
context.type_name
|
85
|
+
end
|
86
|
+
|
87
|
+
def generate_provider_files
|
88
|
+
providers = context.providers
|
89
|
+
providers.each do |provider|
|
90
|
+
plugin_data = { :name => provider, :type => type_name, :template_dir => config_data[:template_dir] }
|
91
|
+
p = Retrospec::Puppet::Generators::ProviderGenerator.new(module_path, plugin_data)
|
92
|
+
p.generate_provider_files
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def generate_type_files
|
97
|
+
safe_create_template_file(type_name_path, File.join(template_dir, 'type_template.rb.retrospec.erb'), context)
|
98
|
+
generate_provider_files
|
99
|
+
type_name_path
|
100
|
+
end
|
101
|
+
|
102
|
+
# this will look through all
|
103
|
+
def generate_type_spec_files
|
104
|
+
type_files = Dir.glob(File.join(type_dir, '**', '*.rb')).sort
|
105
|
+
spec_files = []
|
106
|
+
type_files.each do |type_file|
|
107
|
+
type_file_data = Retrospec::Puppet::Type.load_type(type_file)
|
108
|
+
# because many facts can be in a single file we want to create a unique file for each fact
|
109
|
+
type_spec_path = File.join(type_spec_dir, "#{type_file_data.name}_spec.rb")
|
110
|
+
spec_files << type_spec_path
|
111
|
+
safe_create_template_file(type_spec_path, File.join(template_dir, 'type_spec.rb.retrospec.erb'), type_file_data)
|
112
|
+
end
|
113
|
+
spec_files
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
|
3
3
|
class Helpers
|
4
|
-
|
5
4
|
def self.get_module_name
|
6
5
|
module_name = nil
|
7
|
-
Dir[
|
6
|
+
Dir['manifests/*.pp'].entries.each do |manifest|
|
8
7
|
module_name = get_module_name_from_file(manifest)
|
9
8
|
break unless module_name.nil?
|
10
9
|
end
|
@@ -18,15 +17,12 @@ class Helpers
|
|
18
17
|
tokens = p.fullscan
|
19
18
|
|
20
19
|
i = tokens.index { |token| [:CLASS, :DEFINE].include? token.first }
|
21
|
-
unless i.nil?
|
22
|
-
module_name = tokens[i + 1].last[:value].split('::').first
|
23
|
-
end
|
20
|
+
module_name = tokens[i + 1].last[:value].split('::').first unless i.nil?
|
24
21
|
|
25
22
|
module_name
|
26
23
|
end
|
27
24
|
|
28
25
|
def self.is_module_dir?(dir)
|
29
|
-
Dir[File.join(dir,
|
26
|
+
Dir[File.join(dir, '*')].entries.include? 'manifests'
|
30
27
|
end
|
31
|
-
|
32
28
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'retrospec/plugins/v1/module_helpers'
|
2
2
|
require 'retrospec/plugins/v1'
|
3
3
|
require 'retrospec/config'
|
4
|
-
require_relative 'generators
|
5
|
-
require_relative '
|
4
|
+
require_relative 'generators'
|
5
|
+
require_relative 'exceptions'
|
6
6
|
require_relative 'spec_object'
|
7
7
|
require 'erb'
|
8
8
|
require_relative 'template_helpers'
|
@@ -21,11 +21,12 @@ module Retrospec
|
|
21
21
|
module V1
|
22
22
|
class Puppet < Retrospec::Plugins::V1::Plugin
|
23
23
|
include Retrospec::Puppet::TemplateHelpers
|
24
|
-
attr_reader :template_dir, :context, :
|
24
|
+
attr_reader :template_dir, :context, :manifest_files
|
25
|
+
attr_accessor :manifest_dir
|
25
26
|
|
26
|
-
def initialize(supplied_module_path=nil,config={})
|
27
|
+
def initialize(supplied_module_path = nil, config = {})
|
27
28
|
super
|
28
|
-
@manifest_dir = File.join(supplied_module_path,'manifests')
|
29
|
+
@manifest_dir = File.join(supplied_module_path, 'manifests')
|
29
30
|
Utilities::PuppetModule.instance.future_parser = config_data[:enable_future_parser]
|
30
31
|
# user supplied a template path or user wants to use local templates
|
31
32
|
@template_dir = setup_user_template_dir(config_data[:template_dir], config_data[:scm_url], config_data[:ref])
|
@@ -34,9 +35,12 @@ module Retrospec
|
|
34
35
|
def post_init
|
35
36
|
# before we validate the module directory we should ensure the module exists by creating it
|
36
37
|
# validation also occurs when setting the module path
|
38
|
+
# these are required because the puppet module creates a singleton with some cached values
|
39
|
+
Utilities::PuppetModule.instance.module_dir_name = File.basename(module_path)
|
40
|
+
Utilities::PuppetModule.instance.module_name = File.basename(module_path)
|
37
41
|
Utilities::PuppetModule.instance.module_path = module_path
|
38
42
|
Utilities::PuppetModule.create_tmp_module_path # this is required to finish initialization
|
39
|
-
# setting the context is
|
43
|
+
# setting the context is required to make other methods below work. #TODO lazy create the context
|
40
44
|
@context = ::Retrospec::Puppet::SpecObject.new(module_path, Utilities::PuppetModule.instance, config_data)
|
41
45
|
end
|
42
46
|
|
@@ -46,8 +50,22 @@ module Retrospec
|
|
46
50
|
# anything since it is not mandatory
|
47
51
|
# I thought about using the the module face to perform this generation but it seems like its not
|
48
52
|
# supported at this time, and you can't specify the path to generate the module in
|
49
|
-
def new_module(plugin_data)
|
50
|
-
|
53
|
+
def new_module(plugin_data, args)
|
54
|
+
plugin_data = Retrospec::Puppet::Generators::ModuleGenerator.run_cli(plugin_data, args)
|
55
|
+
# the user passed in /tmp/test1 and the name is irrelevent
|
56
|
+
if ! File.exists?(plugin_data[:module_path])
|
57
|
+
plugin_data[:module_path] = File.join(plugin_data[:module_path])
|
58
|
+
# if the module path basename is the same as the module name
|
59
|
+
# this is a parent directory or the module already exists
|
60
|
+
elsif File.basename(plugin_data[:module_path]) != plugin_data[:name]
|
61
|
+
plugin_data[:module_path] = File.join(plugin_data[:module_path], plugin_data[:name])
|
62
|
+
end
|
63
|
+
# we need to set this because the this class is created before we created the new module directory
|
64
|
+
# so we now have to set the manifests and module directory
|
65
|
+
self.module_path = plugin_data[:module_path]
|
66
|
+
config_data[:module_path] = plugin_data[:module_path]
|
67
|
+
self.manifest_dir = File.join(plugin_data[:module_path], 'manifests')
|
68
|
+
f = Retrospec::Puppet::Generators::ModuleGenerator.new(plugin_data[:module_path], plugin_data)
|
51
69
|
f.run(manifest_dir)
|
52
70
|
end
|
53
71
|
|
@@ -57,65 +75,127 @@ module Retrospec
|
|
57
75
|
# all options here are available in the config passed into the initialize code
|
58
76
|
# this is the only entry point into the plugin
|
59
77
|
def self.run_cli(global_opts, global_config, plugin_config, args=ARGV)
|
60
|
-
template_dir = plugin_config['plugins::puppet::template_dir'] || File.expand_path('~/.retrospec/repos/retrospec-puppet-templates')
|
78
|
+
template_dir = ENV['RETROSPEC_TEMPLATES_DIR'] || plugin_config['plugins::puppet::template_dir'] || File.expand_path('~/.retrospec/repos/retrospec-puppet-templates')
|
61
79
|
scm_url = ENV['RETROSPEC_PUPPET_SCM_URL'] || plugin_config['plugins::puppet::templates::url']
|
62
80
|
scm_branch = ENV['RETROSPEC_PUPPET_SCM_BRANCH'] || plugin_config['plugins::puppet::templates::ref'] || 'master'
|
63
81
|
future_parser = plugin_config['plugins::puppet::enable_future_parser'] || false
|
64
82
|
beaker_tests = plugin_config['plugins::puppet::enable_beaker_tests'] || false
|
65
83
|
# a list of subcommands for this plugin
|
66
|
-
sub_commands =
|
84
|
+
sub_commands = %w(new_module new_fact new_type new_provider new_function)
|
67
85
|
if sub_commands.count > 0
|
68
86
|
sub_command_help = "Subcommands:\n#{sub_commands.join("\n")}\n"
|
69
87
|
else
|
70
|
-
sub_command_help =
|
88
|
+
sub_command_help = ''
|
71
89
|
end
|
72
|
-
plugin_opts = Trollop
|
90
|
+
plugin_opts = Trollop.options(args) do
|
73
91
|
version "Retrospec puppet plugin: #{Retrospec::Puppet::VERSION} (c) Corey Osman"
|
74
92
|
banner <<-EOS
|
75
93
|
Generates puppet rspec test code based on the classes and defines inside the manifests directory.\n
|
76
94
|
#{sub_command_help}
|
77
95
|
|
78
96
|
EOS
|
79
|
-
opt :template_dir,
|
97
|
+
opt :template_dir, 'Path to templates directory (only for overriding Retrospec templates)', :type => :string,
|
80
98
|
:required => false, :default => template_dir
|
81
|
-
opt :scm_url,
|
99
|
+
opt :scm_url, 'SCM url for retrospec templates', :type => :string, :required => false,
|
82
100
|
:default => scm_url
|
83
|
-
opt :branch,
|
101
|
+
opt :branch, 'Branch you want to use for the retrospec template repo', :type => :string, :required => false,
|
84
102
|
:default => scm_branch
|
85
|
-
opt :enable_beaker_tests,
|
86
|
-
opt :enable_future_parser,
|
103
|
+
opt :enable_beaker_tests, 'Enable the creation of beaker tests', :require => false, :type => :boolean, :default => beaker_tests
|
104
|
+
opt :enable_future_parser, 'Enables the future parser only during validation', :default => future_parser, :require => false, :type => :boolean
|
87
105
|
stop_on sub_commands
|
88
106
|
end
|
89
107
|
# the passed in options will always override the config file
|
90
|
-
plugin_data = plugin_opts.merge(global_config).merge(global_opts).merge(plugin_opts)
|
108
|
+
plugin_data = plugin_opts.merge(global_config).merge(global_opts).merge(plugin_opts).merge(plugin_config)
|
91
109
|
# define the default action to use the plugin here, the default is run
|
92
110
|
sub_command = (args.shift || :run).to_sym
|
93
111
|
# create an instance of this plugin
|
94
|
-
plugin =
|
112
|
+
plugin = new(plugin_data[:module_path], plugin_data)
|
95
113
|
# check if the plugin supports the sub command
|
96
|
-
|
97
|
-
|
114
|
+
begin
|
115
|
+
if plugin.respond_to?(sub_command)
|
116
|
+
case sub_command
|
98
117
|
when :new_module
|
99
|
-
plugin.send(sub_command, plugin_data)
|
100
|
-
plugin.post_init
|
118
|
+
plugin.send(sub_command, plugin_data, args)
|
119
|
+
plugin.post_init # finish initialization
|
101
120
|
when :run
|
102
121
|
plugin.post_init # finish initialization
|
122
|
+
when :new_type
|
123
|
+
plugin.new_type(plugin_data, args)
|
124
|
+
when :new_function
|
125
|
+
plugin.new_function(plugin_data, args)
|
103
126
|
when :new_fact
|
104
|
-
plugin.new_fact(plugin_data)
|
127
|
+
plugin.new_fact(plugin_data, args)
|
128
|
+
when :new_provider
|
129
|
+
plugin.new_provider(plugin_data, args)
|
105
130
|
else
|
106
131
|
plugin.post_init # finish initialization
|
107
|
-
plugin.send(sub_command, plugin_data[:module_path], plugin_data)
|
132
|
+
plugin.send(sub_command, plugin_data[:module_path], plugin_data, args)
|
133
|
+
end
|
134
|
+
plugin.send(:run)
|
135
|
+
else
|
136
|
+
puts "The subcommand #{sub_command} is not supported or valid".fatal
|
137
|
+
exit 1
|
108
138
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
139
|
+
rescue Retrospec::Puppet::InvalidModulePathError => e
|
140
|
+
exit 1
|
141
|
+
rescue Retrospec::Puppet::NoManifestDirError => e
|
142
|
+
exit 1
|
143
|
+
rescue Retrospec::Puppet::ParserError => e
|
144
|
+
exit 1
|
145
|
+
rescue Retrospec::Puppet::Generators::CoreTypeException => e
|
146
|
+
puts e.message.fatal
|
147
|
+
rescue Exception => e
|
112
148
|
exit 1
|
113
149
|
end
|
150
|
+
plugin_data
|
151
|
+
end
|
152
|
+
|
153
|
+
def new_schema(module_path, config, args=[])
|
154
|
+
plugin_data = Retrospec::Puppet::Generators::SchemaGenerator.run_cli(config, args)
|
155
|
+
plugin_data[:puppet_context] = context
|
156
|
+
s = Retrospec::Puppet::Generators::SchemaGenerator.new(plugin_data[:module_path], plugin_data)
|
157
|
+
s.generate_schema_file
|
158
|
+
end
|
159
|
+
|
160
|
+
def new_function(config, args)
|
161
|
+
plugin_data = Retrospec::Puppet::Generators::FunctionGenerator.run_cli(config, args)
|
162
|
+
f = Retrospec::Puppet::Generators::FunctionGenerator.new(plugin_data[:module_path], plugin_data)
|
163
|
+
post_init
|
164
|
+
f.generate_function_file
|
165
|
+
end
|
166
|
+
|
167
|
+
def function_spec_files(module_path, config)
|
168
|
+
f = Retrospec::Puppet::Generators::FunctionGenerator.new(module_path, config)
|
169
|
+
f.generate_spec_files
|
170
|
+
end
|
171
|
+
|
172
|
+
def new_provider(config, args)
|
173
|
+
plugin_data = Retrospec::Puppet::Generators::ProviderGenerator.run_cli(config, args)
|
174
|
+
p = Retrospec::Puppet::Generators::ProviderGenerator.new(plugin_data[:module_path], plugin_data)
|
175
|
+
post_init
|
176
|
+
p.generate_provider_files
|
177
|
+
end
|
178
|
+
|
179
|
+
def provider_spec_files(module_path, config)
|
180
|
+
t = Retrospec::Puppet::Generators::ProviderGenerator.new(module_path, config)
|
181
|
+
t.generate_provider_spec_files
|
182
|
+
end
|
183
|
+
|
184
|
+
def new_type(config, args)
|
185
|
+
plugin_data = Retrospec::Puppet::Generators::TypeGenerator.run_cli(config, args)
|
186
|
+
t = Retrospec::Puppet::Generators::TypeGenerator.new(plugin_data[:module_path], plugin_data)
|
187
|
+
post_init
|
188
|
+
t.generate_type_files
|
114
189
|
end
|
115
190
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
191
|
+
def type_spec_files(module_path, config)
|
192
|
+
t = Retrospec::Puppet::Generators::TypeGenerator.new(module_path, config)
|
193
|
+
t.generate_type_spec_files
|
194
|
+
end
|
195
|
+
|
196
|
+
def new_fact(plugin_data, args)
|
197
|
+
f = Retrospec::Puppet::Generators::FactGenerator.run_cli(plugin_data, args)
|
198
|
+
post_init # finish initialization
|
119
199
|
f.generate_fact_file
|
120
200
|
end
|
121
201
|
|
@@ -139,10 +219,10 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
139
219
|
|
140
220
|
# runs a user defined hook called pre-hook
|
141
221
|
def run_pre_hook
|
142
|
-
hook_file = File.join(template_dir,'pre-hook')
|
143
|
-
if File.
|
222
|
+
hook_file = File.join(template_dir, 'pre-hook')
|
223
|
+
if File.exist?(hook_file)
|
144
224
|
output = `#{hook_file} #{module_path}`
|
145
|
-
if
|
225
|
+
if $CHILD_STATUS.success?
|
146
226
|
puts "Successfully ran hook: #{hook_file}".info
|
147
227
|
puts output.info
|
148
228
|
else
|
@@ -154,10 +234,10 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
154
234
|
|
155
235
|
# runs a user defined hook called post-hook
|
156
236
|
def run_post_hook
|
157
|
-
hook_file = File.join(template_dir,'post-hook')
|
158
|
-
if File.
|
237
|
+
hook_file = File.join(template_dir, 'post-hook')
|
238
|
+
if File.exist?(hook_file)
|
159
239
|
output = `#{hook_file} #{module_path}`
|
160
|
-
if
|
240
|
+
if $CHILD_STATUS.success?
|
161
241
|
puts "Successfully ran hook: #{hook_file}".info
|
162
242
|
puts output.info
|
163
243
|
else
|
@@ -172,15 +252,17 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
172
252
|
types = context.types
|
173
253
|
safe_create_module_files
|
174
254
|
fact(module_path, config_data)
|
255
|
+
type_spec_files(module_path, config_data)
|
256
|
+
provider_spec_files(module_path, config_data)
|
257
|
+
function_spec_files(module_path, config_data)
|
258
|
+
new_schema(module_path, config_data)
|
175
259
|
Retrospec::Puppet::Generators::ModuleGenerator.generate_metadata_file(context.module_name, config_data)
|
176
260
|
# a Type is nothing more than a defined type or puppet class
|
177
261
|
# we could have named this manifest but there could be multiple types
|
178
262
|
# in a manifest.
|
179
263
|
types.each do |type|
|
180
264
|
safe_create_resource_spec_files(type)
|
181
|
-
if context.enable_beaker_tests?
|
182
|
-
safe_create_acceptance_tests(type)
|
183
|
-
end
|
265
|
+
safe_create_acceptance_tests(type) if context.enable_beaker_tests?
|
184
266
|
end
|
185
267
|
Utilities::PuppetModule.clean_tmp_modules_dir
|
186
268
|
true
|
@@ -192,13 +274,13 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
192
274
|
# filenames must named how they would appear in the normal module path. The directory
|
193
275
|
# structure where the file is contained
|
194
276
|
def safe_create_module_files
|
195
|
-
templates = Find.find(File.join(template_dir,'module_files')).sort
|
277
|
+
templates = Find.find(File.join(template_dir, 'module_files')).sort
|
196
278
|
templates.each do |template|
|
197
279
|
# need to remove the erb extension and rework the destination path
|
198
280
|
if template =~ /nodesets|spec_helper_acceptance/ and !context.enable_beaker_tests?
|
199
281
|
next
|
200
282
|
else
|
201
|
-
dest = template.gsub(File.join(template_dir,'module_files'), module_path)
|
283
|
+
dest = template.gsub(File.join(template_dir, 'module_files'), module_path)
|
202
284
|
if File.symlink?(template)
|
203
285
|
safe_create_symlink(template, dest)
|
204
286
|
elsif File.directory?(template)
|
@@ -219,7 +301,7 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
219
301
|
end
|
220
302
|
|
221
303
|
# Creates an associated spec file for each type and even creates the subfolders for nested classes one::two::three
|
222
|
-
def safe_create_resource_spec_files(type,template=File.join(template_dir,'resource_spec_file.retrospec.erb'))
|
304
|
+
def safe_create_resource_spec_files(type, template = File.join(template_dir, 'resource_spec_file.retrospec.erb'))
|
223
305
|
context.parameters = type.arguments
|
224
306
|
context.type = type
|
225
307
|
VariableStore.populate(type)
|
@@ -227,15 +309,15 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
227
309
|
# pass the type to the variable store and it will discover all the variables and try to resolve them.
|
228
310
|
# this does not get deep nested conditional blocks
|
229
311
|
context.resources += Conditional.all(type)
|
230
|
-
dest = File.join(module_path,generate_file_path(type, false))
|
312
|
+
dest = File.join(module_path, generate_file_path(type, false))
|
231
313
|
safe_create_template_file(dest, template, context)
|
232
314
|
dest
|
233
315
|
end
|
234
316
|
|
235
|
-
def safe_create_acceptance_tests(type,template=File.join(template_dir,'acceptance_spec_test.retrospec.erb'))
|
317
|
+
def safe_create_acceptance_tests(type, template = File.join(template_dir, 'acceptance_spec_test.retrospec.erb'))
|
236
318
|
@parameters = type.arguments
|
237
319
|
@type = type
|
238
|
-
dest = File.join(module_path,generate_file_path(type, true))
|
320
|
+
dest = File.join(module_path, generate_file_path(type, true))
|
239
321
|
safe_create_template_file(dest, template, context)
|
240
322
|
dest
|
241
323
|
end
|
@@ -250,17 +332,17 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
250
332
|
hosts_dir = 'hosts'
|
251
333
|
acceptance_dir = 'acceptance'
|
252
334
|
case type.type
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
335
|
+
when :hostclass
|
336
|
+
type_dir_name = classes_dir
|
337
|
+
when :definition
|
338
|
+
type_dir_name = defines_dir
|
339
|
+
when :node
|
340
|
+
type_dir_name = hosts_dir
|
341
|
+
else
|
342
|
+
fail "#{type.type} retrospec does not support this resource type yet"
|
261
343
|
end
|
262
344
|
if is_acceptance_test
|
263
|
-
type_dir_name = File.join('spec',acceptance_dir, type_dir_name)
|
345
|
+
type_dir_name = File.join('spec', acceptance_dir, type_dir_name)
|
264
346
|
else
|
265
347
|
type_dir_name = File.join('spec', type_dir_name)
|
266
348
|
end
|
@@ -275,10 +357,10 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
275
357
|
# remove the last token since its the class name
|
276
358
|
tokens.pop
|
277
359
|
# so lets make a directory structure out of it
|
278
|
-
dir_name = File.join(tokens)
|
279
|
-
dir_name = File.join(type_dir_name,dir_name, file_name) # spec/classes/tomcat/config/server
|
360
|
+
dir_name = File.join(tokens) # config/server
|
361
|
+
dir_name = File.join(type_dir_name, dir_name, file_name) # spec/classes/tomcat/config/server
|
280
362
|
else
|
281
|
-
dir_name = File.join(type_dir_name,file_name)
|
363
|
+
dir_name = File.join(type_dir_name, file_name)
|
282
364
|
end
|
283
365
|
dir_name
|
284
366
|
end
|
@@ -306,8 +388,7 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
306
388
|
def self.file_type
|
307
389
|
'.pp'
|
308
390
|
end
|
309
|
-
|
310
391
|
end
|
311
392
|
end
|
312
393
|
end
|
313
|
-
end
|
394
|
+
end
|