lib/kpm/installer.rb



require 'logger'
require 'yaml'

module KPM
  class Installer
    LATEST_VERSION = 'LATEST'

    def self.from_file(config_path, logger=nil)
      Installer.new(YAML::load_file(config_path), logger)
    end

    def initialize(raw_config, logger=nil)
      raise(ArgumentError, 'killbill section must be specified') if raw_config['killbill'].nil?
      @config = raw_config['killbill']

      if logger.nil?
        @logger = Logger.new(STDOUT)
        @logger.level = Logger::INFO
      else
        @logger = logger
      end
    end

    def install
      install_killbill_server
      install_plugins
      install_default_bundles
    end

    private

    def install_killbill_server
      version = @config['version'] || LATEST_VERSION
      webapp_path = @config['webapp_path'] || KPM::root

      webapp_dir = File.dirname(webapp_path)
      FileUtils.mkdir_p(webapp_dir)

      @logger.info "Installing Kill Bill server #{version} to #{webapp_path}"
      file = KillbillServerArtifact.pull(version, webapp_dir, @config['nexus'], @config['nexus']['ssl_verify'])
      FileUtils.mv file[:file_path], webapp_path
    end

    def install_plugins
      bundles_dir = @config['plugins_dir']

      install_java_plugins(bundles_dir)
      install_ruby_plugins(bundles_dir)
    end

    def install_java_plugins(bundles_dir)
      return if @config['plugins'].nil? or @config['plugins']['java'].nil?

      @config['plugins']['java'].each do |plugin|
        artifact_id = plugin['name']
        version = plugin['version'] || LATEST_VERSION
        destination = "#{bundles_dir}/plugins/java/#{artifact_id}/#{version}"

        FileUtils.mkdir_p(destination)

        @logger.info "Installing Kill Bill Java plugin #{artifact_id} #{version} to #{destination}"
        KillbillPluginArtifact.pull(artifact_id, version, :java, destination, @config['nexus'], @config['nexus']['ssl_verify'])
      end
    end

    def install_ruby_plugins(bundles_dir)
      return if @config['plugins'].nil? or @config['plugins']['ruby'].nil?

      @config['plugins']['ruby'].each do |plugin|
        artifact_id = plugin['name']
        version = plugin['version'] || LATEST_VERSION
        destination = "#{bundles_dir}/plugins/ruby"

        FileUtils.mkdir_p(destination)

        @logger.info "Installing Kill Bill Ruby plugin #{artifact_id} #{version} to #{destination}"
        archive = KillbillPluginArtifact.pull(artifact_id, version, :ruby, destination, @config['nexus'], @config['nexus']['ssl_verify'])

        Utils.unpack_tgz(archive[:file_path], destination, true)
        FileUtils.rm archive[:file_path]
      end
    end

    def install_default_bundles
      return if @config['default_bundles'] == false

      group_id = 'org.kill-bill.billing'
      artifact_id = 'killbill-osgi-bundles-defaultbundles'
      packaging = 'tar.gz'
      version = @config['version'] || LATEST_VERSION
      destination = "#{@config['plugins_dir']}/platform"

      FileUtils.mkdir_p(destination)

      @logger.info "Installing Kill Bill #{artifact_id} #{version} to #{destination}"
      archive = BaseArtifact.pull(group_id, artifact_id, packaging, version, destination, @config['nexus'], @config['nexus']['ssl_verify'])

      Utils.unpack_tgz(archive[:file_path], destination)
      FileUtils.rm archive[:file_path]

      # The special JRuby bundle needs to be called jruby.jar
      File.rename Dir.glob("#{destination}/killbill-osgi-bundles-jruby-*.jar").first, "#{destination}/jruby.jar"
    end
  end
end