class Gaptool::DeployCommand

Public Instance Methods

execute() click to toggle source
# File lib/gaptool_client/commands.rb, line 304
def execute
  attrs = Gaptool::Helpers.split_attrs(attribute_list)
  if instance
    n = Gaptool::API.client.getonenode(instance)
    if n['environment'] != environment
      Gaptool::Helpers.error "Instance #{instance} is not in environment #{environment}"
    else
      app_list.each do |app|
        Gaptool::Helpers.error "Instance #{instance} does not host #{app} in env #{environment}" \
          unless n['apps'].include?(app)
      end
    end
    nodes = [n]

  else
    params = hidden? ? { hidden: true } : {}
    nodes = []
    app_list.each do |app|
      nodes.concat(Gaptool::API.client.getappnodes(app, environment, params))
    end
  end

  # dedup nodes
  seen = Set.new
  app_set = Set.new(app_list)
  nodes = nodes.select do |x|
    res = !seen.include?(x['instance'])
    seen << x['instance']
    res
  end

  nodes = nodes.map do |x|
    x.merge(
      'attrs' => attrs,
      'deploy_apps' => (Set.new(x['apps']) & app_set).to_a
    )
  end
  pre_hook = proc do |node|
    json = node['attrs']
    json['run_list'] = node['chef_runlist'] || ['recipe[deploy]']
    json['deploy_apps'] = node['deploy_apps']
    host = "#{node['role']}:#{node['environment']}:#{node['instance']}"
    puts "#{Rainbow('Deploying apps').cyan} '" + \
         Rainbow(node['deploy_apps'].join(' ')).green + \
         "' #{Rainbow('on').cyan} " + \
         Rainbow(host).green
    upload!(StringIO.new(json.to_json), '/tmp/chef.json')
  end

  command = 'sudo gtrunchef -j /tmp/chef.json'
  command = "#{command} -v" if verbose?
  command = "#{command} -b #{branch}" if branch
  command = "#{command} -M" if migrate?
  command = "#{command} -R" if rollback?
  command = "#{command} -B #{chef_branch}" if chef_branch

  res = Gaptool::SSH.exec(
    nodes, [command],
    pre_hooks: [pre_hook], serial: serial?, continue_on_errors: continue_on_errors?,
    batch_size: batch_size
  )
  exit res
end