intuit/heirloom

View on GitHub
lib/heirloom/cli/download.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Heirloom
  module CLI
    class Download

      include Heirloom::CLI::Shared

      def self.command_summary
        'Download Heirloom'
      end

      def initialize
        @opts = read_options
        @logger = HeirloomLogger.new :log_level => @opts[:level]
        @config = load_config :logger => @logger,
                              :opts   => @opts

        ensure_valid_options :provided => @opts,
                             :required => [:name, :output],
                             :config   => @config

        @catalog = Heirloom::Catalog.new :name    => @opts[:name],
                                         :config  => @config

        # Determine if we can download directly from S3
        # Or if we need to query additional information from the catalog
        validate_or_bypass_catalog

        # Lookup id, region & bucket_prefix from simpledb unless specified
        # Can't use fetch as Trollop sets :id to nil
        @region        = @opts[:region] || @catalog.regions.first
        @bucket_prefix = @opts[:bucket_prefix] || @catalog.bucket_prefix
        id             = @opts[:id] || (latest_id :name   => @opts[:name],
                                                  :config => @config)

        @archive = Archive.new :name   => @opts[:name],
                               :config => @config,
                               :id     => id
      end

      def download
        ensure_path_is_directory     :path => @opts[:output], :config => @config
        ensure_directory_is_writable :path => @opts[:output], :config => @config
        secret = read_secret :opts   => @opts,
                             :config => @config
        archive = @archive.download :output        => @opts[:output],
                                    :extract       => @opts[:extract],
                                    :region        => @region,
                                    :bucket_prefix => @bucket_prefix,
                                    :secret        => secret
        exit 1 unless archive
      end

      private

      def validate_or_bypass_catalog
        missing_bypass_catalog_args = [:bucket_prefix, :id, :region].reject {|a| @opts[a]}

        if missing_bypass_catalog_args.none?
          @logger.info "Required arguments to download Heirloom without querying catalog provided. Downloading..."
        else
          @logger.info "Querying catalog for '#{@opts[:name]}' information."
          @logger.info "Add #{missing_bypass_catalog_args.join(', ')} to bypass querying catalog."

          # Only verify the domain exists in Heirloom
          # if we don't bypass the catalog
          ensure_catalog_domain_exists :config  => @config,
                                       :catalog => @catalog
          ensure_entry_exists_in_catalog :config  => @config,
                                         :catalog => @catalog,
                                         :entry   => @opts[:name]
        end
      end

      def read_options
        Trollop::options do
          version Heirloom::VERSION
          banner <<-EOS

#{Download.command_summary}.

Usage:

heirloom download -n NAME -o OUTPUT_DIRECTORY

If id (-i) is not specified, the latest id will be downloaded.

To download Heirloom without looking up details in SimpleDB, specify region (-r), ID (-i) and bucket_prefix (-b) options.

EOS
          opt :bucket_prefix, "Bucket prefix of the Heirloom to download.", :type => :string
          opt :extract, "Extract the Heirloom into the given output path.", :short => "-x"
          opt :help, "Display Help"
          opt :id, "ID of the Heirloom to download.", :type => :string
          opt :level, "Log level [debug|info|warn|error].", :type    => :string,
                                                            :default => 'info'
          opt :metadata_region, "AWS region to store Heirloom metadata.", :type => :string
          opt :name, "Name of Heirloom.", :type => :string
          opt :output, "Path to output downloaded Heirloom. Must be existing directory.", :type => :string
          opt :region, "Region to download Heirloom.", :type => :string
          opt :secret, "Secret for encrypted Heirloom.", :type => :string
          opt :secret_file, "Read secret from file.", :type  => :string,
                                                      :short => :none
          opt :aws_access_key, "AWS Access Key ID", :type => :string,
                                                    :short => :none
          opt :aws_secret_key, "AWS Secret Access Key", :type => :string,
                                                        :short => :none
          opt :use_iam_profile, "Use IAM EC2 Profile", :short => :none
          opt :environment, "Environment (defined in heirloom config file)", :type => :string
        end
      end
    end
  end
end