class Collins::CLI::DC

Constants

DEFAULT_CONFIG_PATH
DEFAULT_OPTIONS
PROG_NAME

Attributes

options[R]
parser[R]

Public Class Methods

new() click to toggle source
# File lib/collins/cli/dc.rb, line 26
def initialize
  @options = DEFAULT_OPTIONS.clone
  @parsed, @validated = false, false
  @parser = nil
end

Public Instance Methods

configured_datacenters() click to toggle source
# File lib/collins/cli/dc.rb, line 154
def configured_datacenters
  # return list of dc names, followed by an asterisk if default?
  files = Dir.glob(File.expand_path(DEFAULT_CONFIG_PATH + ".*"))
  files.map do |f|
    File.basename(f).split('.').last
  end.sort
end
create_new_datacenter(dc, uri, user, pw, t) click to toggle source
# File lib/collins/cli/dc.rb, line 183
def create_new_datacenter dc, uri, user, pw, t
  o = {
    host: uri.to_s,
    username: user,
    timeout: t
  }
  o[:password] = pw unless pw.nil? || pw.empty?
  File.open(File.expand_path("#{DEFAULT_CONFIG_PATH}.#{dc}"), 'w', 0600) do |f|
    f.puts o.to_yaml
  end
end
default_datacenter() click to toggle source
# File lib/collins/cli/dc.rb, line 170
def default_datacenter
  def_cfg = File.expand_path(DEFAULT_CONFIG_PATH)
  if !File.symlink?(def_cfg)
    raise "Unable to determine default Collins datacenter: #{def_cfg} is not a symlink, which means #{PROG_NAME.inspect} is not managing this configuration"
  end
  target = File.basename(File.readlink(def_cfg))
  if target =~ /^\.collins\.yml\.([A-Za-z0-9\-_]+)$/
    return $1
  else
    raise "Unable to determine datacenter from target config #{target}; does not match .collins.yml.$DATACENTER"
  end
end
parse!(argv = ARGV) click to toggle source
# File lib/collins/cli/dc.rb, line 32
def parse!(argv = ARGV)
  @parser = OptionParser.new do |opts|
    opts.banner = "Usage: #{PROG_NAME} [options]"
    opts.separator ""
    opts.separator "New Configuration:"
    opts.on('-n', '--new DATACENTER', String, "Create a new configuration file for DATACENTER at #{DEFAULT_CONFIG_PATH}.DATACENTER") {|v| @options[:dc] = v ; @options[:mode] = :new}
    opts.on('-H', '--host URI', URI, 'Use URI for host when setting up new datacenter') {|v| @options[:host] = v}
    opts.on('-u', '--username USER', String, 'Use USER for username when setting up new datacenter') {|v| @options[:user] = v}
    opts.on('-p', '--password PASSWORD', String, 'Use PASSWORD for password when setting up new datacenter') {|v| @options[:pw] = v}

    opts.separator ""
    opts.separator "List:"
    opts.on('-l', '--list', 'List configured collins instances') {|v| @options[:mode] = :list}

    opts.separator ""
    opts.separator "General:"
    opts.on('-h','--help',"Help") {@options[:mode] = :help}

    opts.separator ""
    opts.separator "Examples:"
    opts.separator "  Show current Collins instance in use"
    opts.separator "    #{PROG_NAME}"
    opts.separator "  Set current Collins instance to jfk01"
    opts.separator "    #{PROG_NAME} jfk01"
    opts.separator "  List all Collins instances configured"
    opts.separator "    #{PROG_NAME} -l"
    opts.separator "  Set up new Collins instance for sfo01"
    opts.separator "    #{PROG_NAME} --new sfo01 --host https://collins.sfo01.company.net"
    opts.separator "  Iterate over all instances and find assets"
    opts.separator "    for dc in $(#{PROG_NAME} -l) ; do #{PROG_NAME} $dc ; collins find -p DEVELOPMENT ; done"
  end
  @parser.parse!(argv)
  #TODO(gabe): if user not specified, read from env or something

  # if mode is :show (default), and an argument was provided in argv, set mode to :set
  if @options[:mode] == :show && argv.length > 0
    @options[:mode] = :set
    @options[:dc] = argv.first
  end

  @parsed = true
  self
end
run!() click to toggle source
# File lib/collins/cli/dc.rb, line 83
def run!
  raise "Options not yet parsed with #parse!" unless @parsed
  raise "Options not yet validated with #validate!" unless @validated
  success = true
  case options[:mode]
  when :help
    puts parser
  when :show
    puts default_datacenter
  when :set
    dc = @options[:dc]
    if !configured_datacenters.include?(dc)
      raise "No Collins configuration for datacenter #{dc.inspect} found. Perhaps you want to create it with '#{PROG_NAME} --new #{dc}'?"
    end
    set_default_datacenter(dc)
  when :list
    dcs = configured_datacenters
    default = default_datacenter
    dcs.each do |dc|
      if dc == default && @options[:show_current]
        puts "#{dc} *"
      else
        puts dc
      end
    end
  when :new
    # check if dc already exists
    dc = @options[:dc]
    if configured_datacenters.include? dc
      raise "Unable to create new configuration for #{dc}: Configuration already exists at #{DEFAULT_CONFIG_PATH}.#{@options[:dc]}"
    end

    uri = @options[:host]
    if uri.nil?
      print "Enter Collins URI for #{dc} (i.e. https://collins.#{dc}.company.net): "
      x = gets
      uri = URI.parse(x.strip)
    end

    user = @options[:user]
    if user.nil?
      default = Etc.getlogin
      print "Enter username (default: #{default}): "
      x = gets.strip
      if x.empty?
        user = default
      else
        user = x
      end
    end

    pw = @options[:pw]
    if pw.nil?
      print "Enter password: "
      pw = STDIN.noecho(&:gets).chomp
      print "\n"
    end
    create_new_datacenter(dc, uri, user, pw, @options[:timeout])

    # if this is the only DC, use it
    has_default_dc = File.symlink?(File.expand_path(DEFAULT_CONFIG_PATH)) rescue false
    if !has_default_dc
      set_default_datacenter(dc)
      puts "Automatically selected #{dc.inspect} as the current datacenter with '#{PROG_NAME} #{dc}'"
    else
      puts "Now, select the Collins instance #{dc.inspect} with '#{PROG_NAME} #{dc}' to access Collins"
    end
  end
  success
end
set_default_datacenter(dc) click to toggle source
# File lib/collins/cli/dc.rb, line 162
def set_default_datacenter dc
  ln = File.expand_path(DEFAULT_CONFIG_PATH)
  if File.exist?(ln) && !File.symlink?(ln)
    raise "Unable to set config to use #{dc}: #{ln} is not a symlink, which means #{PROG_NAME.inspect} is not managing this configuration"
  end
  FileUtils.ln_sf(File.expand_path("~/.collins.yml.#{dc}"), File.expand_path(DEFAULT_CONFIG_PATH))
end
validate!() click to toggle source
# File lib/collins/cli/dc.rb, line 76
def validate!
  raise "You need to tell me to do something!" if @options[:mode].nil?
  raise "No asset tags found via ARGF" if [:allocate,:delete].include?(options[:mode]) && (options[:tags].nil? or options[:tags].empty?)
  @validated = true
  self
end