class Nagios::Promoo::Opennebula::Probes::VirtualMachineProbe

Probe for checking VM instantiation via ONe RPC2.

@author Boris Parak <parak@cesnet.cz>

Constants

VM_NAME_PREFIX

Public Class Methods

declaration() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 43
def declaration
  'virtual_machine'
end
description() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 13
def description
  ['virtual-machine', 'Run a probe instantiating a test instance in OpenNebula']
end
options() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 17
def options
  [
    [
      :template,
      {
        type: :string, default: 'monitoring',
        desc: 'Name referencing a template used for monitoring purposes'
      }
    ],
    [
      :vm_timeout,
      {
        type: :numeric, default: 180,
        desc: 'Timeout for VM instantiation (in seconds)'
      }
    ],
    [
      :cleanup,
      {
        type: :boolean, default: true,
        desc: 'Perform clean-up before launching a new instance'
      }
    ]
  ]
end
runnable?() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 47
def runnable?
  true
end

Public Instance Methods

run(_args = []) click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 54
def run(_args = [])
  if options[:timeout] <= options[:vm_timeout]
    raise "Timeout (#{options[:timeout]}) must be higher than "\
         "vm-timeout (#{options[:vm_timeout]}) "
  end

  @_virtual_machine = nil

  Timeout.timeout(options[:timeout]) do
    cleanup if options[:cleanup]
    create
    wait4running
  end

  puts "VirtualMachine OK - Instance #{@_virtual_machine.id.inspect} of template "\
       "#{options[:template].inspect} successfully created & cleaned up"
rescue => ex
  puts "VirtualMachine CRITICAL - #{ex.message}"
  puts ex.backtrace if options[:debug]
  exit 2
ensure
  begin
    cleanup @_virtual_machine unless @_virtual_machine.blank?
  rescue => ex
    puts "VirtualMachine CRITICAL - #{ex.message}"
    puts ex.backtrace if options[:debug]
    exit 2
  end
end

Private Instance Methods

cleanup(virtual_machine = nil) click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 86
def cleanup(virtual_machine = nil)
  virtual_machine ? shutdown_or_delete(virtual_machine) : search_and_destroy
end
create() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 90
def create
  template_pool = OpenNebula::TemplatePool.new(client)
  rc = template_pool.info_all
  raise rc.message if OpenNebula.is_error?(rc)

  template = template_pool.select { |tpl| tpl.name == options[:template] }.first
  raise "Template #{options[:template].inspect} could not be found" unless template

  vm_id = template.instantiate("#{VM_NAME_PREFIX}-#{Time.now.to_i}")
  raise vm_id.message if OpenNebula.is_error?(vm_id)

  virtual_machine = OpenNebula::VirtualMachine.new(OpenNebula::VirtualMachine.build_xml(vm_id), client)
  rc = virtual_machine.info
  raise rc.message if OpenNebula.is_error?(rc)

  @_virtual_machine = virtual_machine
end
search_and_destroy() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 125
def search_and_destroy
  vm_pool = OpenNebula::VirtualMachinePool.new(client)
  rc = vm_pool.info_mine
  raise rc.message if OpenNebula.is_error?(rc)

  candidates = vm_pool.select { |vm| vm.name.start_with?(VM_NAME_PREFIX) }
  candidates.each { |vm| shutdown_or_delete(vm) }

  candidates.count
end
shutdown_or_delete(virtual_machine) click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 136
def shutdown_or_delete(virtual_machine)
  rc = virtual_machine.terminate true
  raise rc.message if OpenNebula.is_error?(rc)
end
wait4running() click to toggle source
# File lib/nagios/promoo/opennebula/probes/virtual_machine_probe.rb, line 108
def wait4running
  Timeout.timeout(options[:vm_timeout]) do
    while @_virtual_machine.lcm_state_str != 'RUNNING'
      if @_virtual_machine.lcm_state_str.include?('FAILURE')
        raise 'Instance deployment failed (resulting state is "*_FAILED")'
      end

      rc = @_virtual_machine.info
      raise rc.message if OpenNebula.is_error?(rc)
    end
  end
rescue Timeout::Error
  puts 'VirtualMachine WARNING - Execution timed out while waiting for ' \
       "the instance to become active [#{options[:vm_timeout]}s]"
  exit 1
end