class Bosh::Director::Jobs::VmState

Constants

TIMEOUT

Public Class Methods

job_type() click to toggle source
# File lib/bosh/director/jobs/vm_state.rb, line 8
def self.job_type
  :vms
end
new(deployment_id, format, state_for_missing_vms = false) click to toggle source
# File lib/bosh/director/jobs/vm_state.rb, line 12
def initialize(deployment_id, format, state_for_missing_vms = false)
  @deployment_id = deployment_id
  @format = format
  @state_for_missing_vms = state_for_missing_vms
end

Public Instance Methods

perform() click to toggle source
# File lib/bosh/director/jobs/vm_state.rb, line 18
def perform
  instances = Models::Instance.filter(:deployment_id => @deployment_id)
  instances = instances.exclude(vm_cid: nil) unless @state_for_missing_vms
  ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
    instances.each do |instance|
      pool.process do
        vm_state = process_instance(instance)
        result_file.write(vm_state.to_json + "\n")
      end
    end
  end

  # task result
  nil
end
process_instance(instance) click to toggle source
# File lib/bosh/director/jobs/vm_state.rb, line 34
def process_instance(instance)
  dns_records = []

  job_state, job_vitals, processes, ips = vm_details(instance)

  if dns_manager.dns_enabled?
    dns_records = dns_manager.find_dns_record_names_by_instance(instance)
    dns_records.sort_by! { |name| -(name.split('.').first.length) }
  end

  vm_type_name = instance.spec_p('vm_type.name')

  {
    :vm_cid => instance.vm_cid,
    :disk_cid => instance.persistent_disk_cid,
    :ips => ips,
    :dns => dns_records,
    :agent_id => instance.agent_id,
    :job_name => instance.job,
    :index => instance.index,
    :job_state => job_state,
    :state => instance.state,
    :resource_pool => vm_type_name,
    :vm_type => vm_type_name,
    :vitals => job_vitals,
    :processes => processes,
    :resurrection_paused => instance.resurrection_paused,
    :az => instance.availability_zone,
    :id => instance.uuid,
    :bootstrap => instance.bootstrap,
    :ignore => instance.ignore
  }
end

Private Instance Methods

get_index(agent_state) click to toggle source
# File lib/bosh/director/jobs/vm_state.rb, line 97
def get_index(agent_state)
  index = agent_state['index']

  # Postgres cannot coerce an empty string to integer, and fails on Models::Instance.find
  index = nil if index.is_a?(String) && index.empty?

  index
end
vm_details(instance) click to toggle source
# File lib/bosh/director/jobs/vm_state.rb, line 70
def vm_details(instance)
  ips = []
  processes = []
  job_vitals = nil
  job_state = nil

  if instance.vm_cid
    begin
      agent = AgentClient.with_vm_credentials_and_agent_id(instance.credentials, instance.agent_id, :timeout => TIMEOUT)
      agent_state = agent.get_state(@format)
      agent_state['networks'].each_value do |network|
        ips << network['ip']
      end

      job_state = agent_state['job_state']
      if agent_state['vitals']
        job_vitals = agent_state['vitals']
      end
      processes = agent_state['processes'] if agent_state['processes']
    rescue Bosh::Director::RpcTimeout
      job_state = 'unresponsive agent'
    end
  end

  return job_state, job_vitals, processes, ips
end