Class: Commands::AbstractSSHCommand

Inherits:
Command show all
Defined in:
lib/commands.rb

Constant Summary collapse

CLOSED_DOWN_STATES =
Set.new(%w(TERMINATED SHUTTING_DOWN COMPLETED FAILED))
WAITING_OR_RUNNING_STATES =
Set.new(%w(WAITING RUNNING))

Instance Attribute Summary collapse

Attributes inherited from Command

#arg, #commands, #description, #logger, #name

Instance Method Summary collapse

Methods inherited from Command

#get_field, #has_value, #have, #option, #require, #require_single_jobflow, #resolve, #validate

Constructor Details

#initialize(*args) ⇒ AbstractSSHCommand

Returns a new instance of AbstractSSHCommand.



582
583
584
585
586
# File 'lib/commands.rb', line 582

def initialize(*args)
  super(*args)
  @ssh_opts = ["-o ServerAliveInterval=10", "-o StrictHostKeyChecking=no"]
  @scp_opts = ["-r"]
end

Instance Attribute Details

#destObject

Returns the value of attribute dest.



577
578
579
# File 'lib/commands.rb', line 577

def dest
  @dest
end

#hostnameObject

Returns the value of attribute hostname.



577
578
579
# File 'lib/commands.rb', line 577

def hostname
  @hostname
end

#jobflow_detailObject

Returns the value of attribute jobflow_detail.



577
578
579
# File 'lib/commands.rb', line 577

def jobflow_detail
  @jobflow_detail
end

#jobflow_idObject

Returns the value of attribute jobflow_id.



577
578
579
# File 'lib/commands.rb', line 577

def jobflow_id
  @jobflow_id
end

#key_pair_fileObject

Returns the value of attribute key_pair_file.



577
578
579
# File 'lib/commands.rb', line 577

def key_pair_file
  @key_pair_file
end

#no_waitObject

Returns the value of attribute no_wait.



577
578
579
# File 'lib/commands.rb', line 577

def no_wait
  @no_wait
end

Instance Method Details

#enact(client) ⇒ Object



619
620
621
622
623
624
625
626
627
# File 'lib/commands.rb', line 619

def enact(client)
  self.jobflow_id = require_single_jobflow
  self.jobflow_detail = client.describe_jobflow_with_id(self.jobflow_id)
  if ! get_field(:no_wait) then
    wait_for_jobflow(client)
  end
  self.hostname = self.jobflow_detail['Instances']['MasterPublicDnsName']
  self.key_pair_file = require(:key_pair_file, "Missing required option --key-pair-file for #{name}")
end

#exec(cmd) ⇒ Object



600
601
602
# File 'lib/commands.rb', line 600

def exec(cmd)
  commands.exec(cmd)
end

#get_scp_optsObject



596
597
598
# File 'lib/commands.rb', line 596

def get_scp_opts
  get_field(:scp_opts, []).join(" ")
end

#get_ssh_optsObject



592
593
594
# File 'lib/commands.rb', line 592

def get_ssh_opts
  get_field(:ssh_opts, []).join(" ")
end

#optsObject



588
589
590
# File 'lib/commands.rb', line 588

def opts
  (get_field(:ssh_opts, []) + get_field(:scp_opts, [])).join(" ")
end

#wait_for_jobflow(client) ⇒ Object



604
605
606
607
608
609
610
611
612
613
614
615
616
617
# File 'lib/commands.rb', line 604

def wait_for_jobflow(client)
  while true do
    state = resolve(self.jobflow_detail, "ExecutionStatusDetail", "State")
    if WAITING_OR_RUNNING_STATES.include?(state) then
      break
    elsif CLOSED_DOWN_STATES.include?(state) then
      raise RuntimeError, "Jobflow entered #{state} while waiting to ssh"
    else
      logger.info("Jobflow is in state #{state}, waiting....")
      sleep(30)
      self.jobflow_detail = client.describe_jobflow_with_id(jobflow_id)
    end
  end
end