Package com.vmware.aurora.vc.vcevent

Source Code of com.vmware.aurora.vc.vcevent.VcEventRouter

/***************************************************************************
* Copyright (c) 2012-2013 VMware, Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/

package com.vmware.aurora.vc.vcevent;

import java.util.EnumSet;

import org.apache.log4j.Logger;

import com.vmware.aurora.util.AuAssert;
import com.vmware.aurora.vc.VcCache;
import com.vmware.aurora.vc.VcVirtualMachine;
import com.vmware.aurora.vc.vcevent.VcEventHandlers.IVcEventHandler;
import com.vmware.aurora.vc.vcevent.VcEventHandlers.VcEventType;
import com.vmware.vim.binding.vim.event.Event;
import com.vmware.vim.binding.vim.event.EventEx;
import com.vmware.vim.binding.vim.event.ResourcePoolEvent;
import com.vmware.vim.binding.vim.event.VmCreatedEvent;
import com.vmware.vim.binding.vim.event.VmEvent;
import com.vmware.vim.binding.vim.event.VmResourcePoolMovedEvent;
import com.vmware.vim.binding.vmodl.ManagedObjectReference;

public class VcEventRouter {
   private static final Logger logger = Logger.getLogger(VcEventRouter.class);
   private static final EnumSet<VcEventType> vmEvents = EnumSet.of(
         VcEventType.VmConfigMissing, VcEventType.VmConnected,
         VcEventType.VmCreated, VcEventType.VmDasBeingReset,
         VcEventType.VmDasResetFailed, VcEventType.VmDisconnected,
         VcEventType.VmMessage, VcEventType.VmMessageError,
         VcEventType.VmMessageWarning, VcEventType.VmOrphaned,
         VcEventType.VmPoweredOn, VcEventType.VmPoweredOff,
         VcEventType.VmReconfigured, VcEventType.VmRelocated,
         VcEventType.VmRemoved, VcEventType.VmRenamed,
         VcEventType.VmResourcePoolMoved, VcEventType.VmResuming,
         VcEventType.VmSuspended, VcEventType.VmAppHealthChanged,
         VcEventType.NotEnoughResourcesToStartVmEvent,
         VcEventType.VmMaxRestartCountReached, VcEventType.VmFailoverFailed);

   /* External rp events to monitor. */
   private static final EnumSet<VcEventType> rpEvents = EnumSet.of(
   /* Generated by pseudo-tasks. */
   VcEventType.ResourcePoolCreated, VcEventType.ResourcePoolMoved,
         VcEventType.ResourcePoolReconfigured,

         /* Generated by real vc tasks. */
         VcEventType.ResourcePoolDestroyed, VcEventType.ResourceViolated);

   protected static final String ResourcePoolEvent = null;

   public VcEventRouter() {
      /* High level handler for external vm events. */
      VcEventListener.installExtEventHandler(vmEvents, new IVcEventHandler() {
         @Override
         public boolean eventHandler(VcEventType type, Event e)
               throws Exception {
            // Event can be either VmEvent or EventEx (TODO: Explicitly check for
            // VM specific EventEx class usage? e.g. VcEventType.VmAppHealthChanged?)
            AuAssert.check(e instanceof VmEvent || e instanceof EventEx);
            ManagedObjectReference moRef = e.getVm().getVm();
            switch (type) {
            case VmRemoved: {
               VcCache.purge(moRef);
               ManagedObjectReference rpMoRef = VcCache.removeVmRpPair(moRef);
               if (rpMoRef != null) {
                  VcCache.refresh(rpMoRef);
               }
               return false;
            }
            case VmDisconnected:
            case VmConnected: {
               VcVirtualMachine vm = VcCache.getIgnoreMissing(moRef);
               if (vm == null) {
                  return false;
               }
               vm.update();
               break;
            }
            case VmResourcePoolMoved: {
               VmResourcePoolMovedEvent event = (VmResourcePoolMovedEvent) e;
               VcCache.refresh(event.getOldParent().getResourcePool());
               VcCache.refresh(event.getNewParent().getResourcePool());
               break;
            }
            case VmCreated: {
               VmCreatedEvent event = (VmCreatedEvent) e;
               VcVirtualMachine vm = VcCache.get(event.getVm().getVm());
               vm.refreshRP();
               break;
            }
            case HostRemoved: {
               logger.info("Host removed event received" + e);
            }
            }
            VcCache.refreshAll(moRef);
            return false;
         }
      });

      /* High level handler for external rp events. */
      VcEventListener.installExtEventHandler(rpEvents, new IVcEventHandler() {
         @Override
         public boolean eventHandler(VcEventType type, Event e)
               throws Exception {
            ManagedObjectReference moRef =
                  ((ResourcePoolEvent) e).getResourcePool().getResourcePool();
            if (type == VcEventType.ResourcePoolDestroyed) {
               VcCache.purge(moRef);
            } else {
               VcCache.refreshAll(moRef);
            }
            return false;
         }
      });
   }
}
TOP

Related Classes of com.vmware.aurora.vc.vcevent.VcEventRouter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.