require 'fileutils'

task :reconcile_delete, [:machine_name, :stack_name, :action] do |t, args|
  machines = [args[:machine_name]]
  machines = ["vista-kodak","vista-panorama","mocks","solr","jds","vxsync"] if args[:machine_name] == "all-machines"
  machines.each{ |machine|
    delete_node(machine, args[:stack_name], args[:action])
  }
end

task :sync_nodes_between_chef_server_and_chef_zero, [:machine_name, :stack_name,] do |t,args|
  if ENV.has_key?("CHEF_REPO")
    upload_to_server(args[:machine], args[:stack_name])
    download_to_zero(args[:machine], args[:stack_name])
  else
    download_to_zero(args[:machine], args[:stack_name])
    upload_to_server(args[:machine], args[:stack_name])
  end
end

def download_to_zero(machine, stack_name)
  nodes = "*-#{stack_name}*"
  nodes = "#{machine}-#{stack_name}*" unless machine.nil? || machine.eql?("") || machine.eql?("all-machines")
  if File.directory?("#{ENV['WORKSPACE']}/chef-repo")
    system "/opt/chefdk/bin/knife download /nodes/#{nodes}*.json --config #{ENV['WORKSPACE']}/.chef/knife.rb"
  end
end

def upload_to_server(machine, stack_name)
  nodes = "*-#{stack_name}*"
  nodes = machine unless machine.nil? || machine.eql?("") || machine.eql?("all-machines")
  node_folder = "#{ENV['WORKSPACE']}/chef-repo/nodes"
  if File.directory?(node_folder)
    begin
      system "/opt/chefdk/bin/knife node from file #{node_folder}/#{nodes}*.json --config #{ENV['WORKSPACE']}/.chef/knife.rb"
    rescue
      puts "Failed to upload some nodes..."
    end
  end
end

def delete_node(machine_name, stack_name, action)
  ENV.has_key?("CHEF_REPO") ? zero= "" : zero = "-z"
  ["#{machine_name}-#{stack_name}", "#{machine_name}-#{stack_name}-node"].each{ |machine|
    if File.directory?("#{ENV['WORKSPACE']}/chef-repo/nodes")
      if action == "destroy"
        begin
          system "yes | /opt/chefdk/bin/knife node delete #{machine} #{zero} --config #{ENV['WORKSPACE']}/.chef/knife.rb"
        rescue
          puts "Knife failed to delete node #{machine}"
        end
      end
    end
  }
end
