class MiqVimEventMonitor

Constants

ADD_VM_EVENTS

The set of events for which fixupEvent should add a VM

Public Class Methods

new(server:, username:, password:, port: 443, ssl_options: {}, event_filter_spec: nil, page_size: 100, max_wait: 60) click to toggle source
Calls superclass method MiqVimInventory::new
# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 7
def initialize(server:, username:, password:, port: 443, ssl_options: {}, event_filter_spec: nil, page_size: 100, max_wait: 60)
  super(:server => server, :port => port, :ssl_options => ssl_options, :username => username, :password => password, :cache_scope => :cache_scope_event_monitor)

  @eventFilterSpec = event_filter_spec || VimHash.new("EventFilterSpec")
  @pgSize          = page_size
  @maxWait         = max_wait
  @_monitorEvents  = true
  @emPropCol       = nil

  hostSystemsByMor
  # datacentersByMor
  virtualMachinesByMor
  # dataStoresByMor
end

Public Instance Methods

doEvent(e) click to toggle source

Test: prevent clone of VM: rpo-clone-src

# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 162
def doEvent(e)
  return if e['eventType'] != "TaskEvent"
  return if e['info']['name'] != "CloneVM_Task"
  return if e['vm']['name'] != "rpo-clone-src"
  begin
    cancelTask(String.new(e['info']['task'].to_str))
  rescue => err
    logger.error err.to_s
    logger.error err.backtrace.join("\n")
  end
end
fixupEvent(event) click to toggle source
# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 103
def fixupEvent(event)
  unless event.kind_of?(Hash)
    logger.error "MiqVimEventMonitor.fixupEvent: Expecting Hash, got #{event.class}"
    if event.kind_of?(Array)
      event.each_index do |i|
        logger.error "MiqVimEventMonitor.fixupEvent: event[#{i}] is a #{event[i].class}"
        logger.error "\tMiqVimEventMonitor.fixupEvent: event[#{i}] = #{event[i].inspect}"
      end
    else
      logger.error "\tMiqVimEventMonitor.fixupEvent: event = #{event.inspect}"
    end
    raise "MiqVimEventMonitor.fixupEvent: Expecting Hash, got #{event.class}"
  end

  event['eventType'] = event.xsiType.split("::").last
  @cacheLock.synchronize(:SH) do
    ['vm', 'sourceVm', 'srcTemplate'].each do |vmStr|
      next unless (eventVmObj = event[vmStr])
      addVirtualMachine(eventVmObj['vm']) if ADD_VM_EVENTS.include?(event['eventType'])
      next unless (vmObj = virtualMachinesByMor_locked[eventVmObj['vm']])

      eventVmObj['path'] = vmObj['summary']['config']['vmPathName']
      eventVmObj['uuid'] = vmObj['summary']['config']['uuid'].presence

      removeVirtualMachine(eventVmObj['vm']) if event['eventType'] == 'VmRemovedEvent'
    end
  end
  et = event['eventType']
  if et == 'VmRelocatedEvent' || et == 'VmMigratedEvent' || et == 'DrsVmMigratedEvent' || et == 'VmResourcePoolMovedEvent' ||
     (et == 'TaskEvent' && event['info']['name'] == 'MarkAsVirtualMachine')
    vmMor = event['vm']['vm']
    removeVirtualMachine(vmMor)
    addVirtualMachine(vmMor)
  end
  (event)
end
monitorEvents() { |changeSetAry| ... } click to toggle source
# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 22
def monitorEvents
  raise "monitorEvents: no block given" unless block_given?

  eventHistoryCollector = createCollectorForEvents(@sic.eventManager, @eventFilterSpec)
  setCollectorPageSize(eventHistoryCollector, @pgSize)

  pfSpec = VimHash.new("PropertyFilterSpec") do |pfs|
    pfs.propSet = VimArray.new("ArrayOfPropertySpec") do |psa|
      psa << VimHash.new("PropertySpec") do |ps|
        ps.type = eventHistoryCollector.vimType
        ps.all = "false"
        ps.pathSet = "latestPage"
      end
    end
    pfs.objectSet = VimArray.new("ArrayOfObjectSpec") do |osa|
      osa << VimHash.new("ObjectSpec") do |os|
        os.obj = eventHistoryCollector
      end
    end
  end

  filterSpecRef = nil

  begin
      @emPropCol = @sic.propertyCollector
      filterSpecRef = createFilter(@emPropCol, pfSpec, "true")

      version = nil
      begin
          while @_monitorEvents
            updateSet = waitForUpdatesEx(@emPropCol, version, :max_wait => @maxWait)
            next if updateSet.nil?

            version = updateSet.version

            next if updateSet.filterSet.nil? || updateSet.filterSet.empty?
            fu = updateSet.filterSet[0]
            next if fu.filter != filterSpecRef
            objUpdate = fu.objectSet[0]
            next if objUpdate.kind != ObjectUpdateKind::Modify
            next if objUpdate.changeSet.empty?

            changeSetAry = []
            objUpdate.changeSet.each do |propChange|
              next unless propChange.name =~ /latestPage.*/
              next unless propChange.val
              if propChange.val.kind_of?(Array)
                propChange.val.each { |v| changeSetAry << fixupEvent(v) }
              else
                changeSetAry << fixupEvent(propChange.val)
              end
            end
            yield changeSetAry
          end
        rescue HTTPClient::ReceiveTimeoutError => terr
          retry if isAlive?
          logger.debug "MiqVimEventMonitor.monitorEvents: connection lost"
          raise
        end
    rescue SignalException => err
    ensure
      logger.info "MiqVimEventMonitor: calling destroyPropertyFilter"
      destroyPropertyFilter(filterSpecRef) if filterSpecRef
      logger.info "MiqVimEventMonitor: returned from destroyPropertyFilter"
      disconnect
    end
end
monitorEventsTest() click to toggle source
# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 151
def monitorEventsTest
  monitorEvents do |ea|
    ea.each do |e|
      puts e['message'] if e['message']
    end
  end
end
monitorEventsToStdout() click to toggle source
# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 140
def monitorEventsToStdout
  monitorEvents do |ea|
    ea.each do |e|
      puts
      puts "*** New Event: #{e['eventType']}"
      dumpObj(e)
      # doEvent(e)
    end
  end
end
stop() click to toggle source
# File lib/VMwareWebService/MiqVimEventMonitor.rb, line 90
def stop
  logger.info "MiqVimEventMonitor stopping..."
  @_monitorEvents = false
  if @emPropCol
    logger.info "MiqVimEventMonitor: calling cancelWaitForUpdates"
    cancelWaitForUpdates(@emPropCol)
    logger.info "MiqVimEventMonitor: returned from cancelWaitForUpdates"
  end
end