X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=plugins%2Fmcollective%2Fpluginpackager%2Fmodulepackage_packager.rb;fp=plugins%2Fmcollective%2Fpluginpackager%2Fmodulepackage_packager.rb;h=6fcd606e466e3f035a5d543d5f31459aaf4b9abf;hb=7c9314f502cde8daad23b61d10b24a542e04154a;hp=0000000000000000000000000000000000000000;hpb=d1f1649ba43c5cbc43c4beb2380096ba051d646a;p=packages%2Fprecise%2Fmcollective.git diff --git a/plugins/mcollective/pluginpackager/modulepackage_packager.rb b/plugins/mcollective/pluginpackager/modulepackage_packager.rb new file mode 100644 index 0000000..6fcd606 --- /dev/null +++ b/plugins/mcollective/pluginpackager/modulepackage_packager.rb @@ -0,0 +1,127 @@ +module MCollective + module PluginPackager + class ModulepackagePackager + require 'erb' + + def initialize(plugin, pluginpath = nil, signature = nil, verbose = false, keep_artifacts = nil, module_template = nil) + assert_new_enough_puppet + @plugin = plugin + @package_name = "#{@plugin.mcname}_#{@plugin.metadata[:name]}".gsub(/-/, '_') + @verbose = verbose + @keep_artifacts = keep_artifacts + @module_template = module_template || File.join(File.dirname(__FILE__), 'templates', 'module') + end + + # Build Process : + # - create module directory + # - run 'puppet module build' + # - move generated package back to cwd + def create_packages + begin + puts "Building module for #{@package_name} plugin." + + @tmpdir = Dir.mktmpdir('mcollective_packager') + make_module + run_build + move_package + + puts "Completed building module for #{@package_name} plugin." + ensure + if @keep_artifacts + puts 'Keeping build artifacts' + puts "Build artifacts saved - #{@tmpdir}" + else + cleanup_tmpdirs + end + end + end + + private + + def assert_new_enough_puppet + unless PluginPackager.command_available?('puppet') + raise("Cannot build package. 'puppet' is not present on the system.") + end + + s = Shell.new('puppet --version') + s.runcommand + actual_version = s.stdout.chomp + + required_version = '3.3.0' + if Util.versioncmp(actual_version, required_version) < 0 + raise("Cannot build package. puppet #{required_version} or greater required. We have #{actual_version}.") + end + end + + def make_module + targetdir = File.join(@tmpdir, 'manifests') + FileUtils.mkdir_p(targetdir) unless File.directory?(targetdir) + + # for each subpackage make a subclass + @plugin.packagedata.each do |klass,data| + data[:files].each do |file| + relative_path = file.sub(/^\.\//, '') + targetdir = File.join(@tmpdir, 'files', klass.to_s, 'mcollective', File.dirname(relative_path)) + FileUtils.mkdir_p(targetdir) unless File.directory?(targetdir) + FileUtils.cp_r(file, targetdir) + end + + @klass = klass.to_s + render_template('_manifest.pp.erb', File.join(@tmpdir, 'manifests', "#{klass}.pp")) + end + + # render all the templates we have + Dir.glob(File.join(@module_template, '*.erb')).each do |template| + filename = File.basename(template, '.erb') + next if filename =~ /^_/ # starting with underscore makes it private + render_template("#{filename}.erb", File.join(@tmpdir, filename)) + end + end + + def render_template(template, path) + begin + erb = ERB.new(File.read(File.join(@module_template, template)), nil, '-') + File.open(path, 'w') do |f| + f.puts erb.result(binding) + end + rescue => e + puts "Could not render template to path - '#{path}'" + raise e + end + end + + def run_build + begin + PluginPackager.execute_verbosely(@verbose) do + Dir.chdir(@tmpdir) do + PluginPackager.safe_system('puppet module build') + end + end + rescue => e + puts 'Build process has failed' + raise e + end + end + + # Move built package to cwd + def move_package + begin + package_file = File.join(@tmpdir, 'pkg', "#{@plugin.vendor}-#{@package_name}-#{@plugin.metadata[:version]}.tar.gz") + FileUtils.cp(package_file, '.') + rescue => e + puts 'Could not copy package to working directory' + raise e + end + end + + def cleanup_tmpdirs + begin + FileUtils.rm_r(@tmpdir) if File.directory?(@tmpdir) + rescue => e + puts "Could not remove temporary build directory - '#{@tmpdir}'" + raise e + end + end + end + end +end