Update version according to OSCI-883
[packages/precise/mcollective.git] / plugins / mcollective / pluginpackager / modulepackage_packager.rb
1 module MCollective
2   module PluginPackager
3     class ModulepackagePackager
4       require 'erb'
5
6       def initialize(plugin, pluginpath = nil, signature = nil, verbose = false, keep_artifacts = nil, module_template = nil)
7         assert_new_enough_puppet
8         @plugin = plugin
9         @package_name = "#{@plugin.mcname}_#{@plugin.metadata[:name]}".gsub(/-/, '_')
10         @verbose = verbose
11         @keep_artifacts = keep_artifacts
12         @module_template = module_template || File.join(File.dirname(__FILE__), 'templates', 'module')
13       end
14
15       # Build Process :
16       # - create module directory
17       # - run 'puppet module build'
18       # - move generated package back to cwd
19       def create_packages
20         begin
21           puts "Building module for #{@package_name} plugin."
22
23           @tmpdir = Dir.mktmpdir('mcollective_packager')
24           make_module
25           run_build
26           move_package
27
28           puts "Completed building module for #{@package_name} plugin."
29         ensure
30           if @keep_artifacts
31             puts 'Keeping build artifacts'
32             puts "Build artifacts saved - #{@tmpdir}"
33           else
34             cleanup_tmpdirs
35           end
36         end
37       end
38
39       private
40
41       def assert_new_enough_puppet
42         unless PluginPackager.command_available?('puppet')
43           raise("Cannot build package. 'puppet' is not present on the system.")
44         end
45
46         s = Shell.new('puppet --version')
47         s.runcommand
48         actual_version = s.stdout.chomp
49
50         required_version = '3.3.0'
51         if Util.versioncmp(actual_version, required_version) < 0
52           raise("Cannot build package. puppet #{required_version} or greater required.  We have #{actual_version}.")
53         end
54       end
55
56       def make_module
57         targetdir = File.join(@tmpdir, 'manifests')
58         FileUtils.mkdir_p(targetdir) unless File.directory?(targetdir)
59
60         # for each subpackage make a subclass
61         @plugin.packagedata.each do |klass,data|
62           data[:files].each do |file|
63             relative_path = file.sub(/^\.\//, '')
64             targetdir = File.join(@tmpdir, 'files', klass.to_s, 'mcollective', File.dirname(relative_path))
65             FileUtils.mkdir_p(targetdir) unless File.directory?(targetdir)
66             FileUtils.cp_r(file, targetdir)
67           end
68
69           @klass = klass.to_s
70           render_template('_manifest.pp.erb', File.join(@tmpdir, 'manifests', "#{klass}.pp"))
71         end
72
73         # render all the templates we have
74         Dir.glob(File.join(@module_template, '*.erb')).each do |template|
75           filename = File.basename(template, '.erb')
76           next if filename =~ /^_/ # starting with underscore makes it private
77           render_template("#{filename}.erb", File.join(@tmpdir, filename))
78         end
79       end
80
81       def render_template(template, path)
82         begin
83           erb = ERB.new(File.read(File.join(@module_template, template)), nil, '-')
84           File.open(path, 'w') do |f|
85             f.puts erb.result(binding)
86           end
87         rescue => e
88           puts "Could not render template to path - '#{path}'"
89           raise e
90         end
91       end
92
93       def run_build
94         begin
95           PluginPackager.execute_verbosely(@verbose) do
96             Dir.chdir(@tmpdir) do
97               PluginPackager.safe_system('puppet module build')
98             end
99           end
100         rescue => e
101           puts 'Build process has failed'
102           raise e
103         end
104       end
105
106       # Move built package to cwd
107       def move_package
108         begin
109           package_file = File.join(@tmpdir, 'pkg', "#{@plugin.vendor}-#{@package_name}-#{@plugin.metadata[:version]}.tar.gz")
110           FileUtils.cp(package_file, '.')
111         rescue => e
112           puts 'Could not copy package to working directory'
113           raise e
114         end
115       end
116
117       def cleanup_tmpdirs
118         begin
119           FileUtils.rm_r(@tmpdir) if File.directory?(@tmpdir)
120         rescue => e
121           puts "Could not remove temporary build directory - '#{@tmpdir}'"
122           raise e
123         end
124       end
125     end
126   end
127 end