/** * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved. * * @author Andra Cismaru * * Handles functionality related to events received from VCenter */ package net.juniper.contrail.vcenter; import org.apache.log4j.Logger; import com.google.common.base.Throwables; import com.vmware.vim25.DVPortgroupCreatedEvent; import com.vmware.vim25.DVPortgroupDestroyedEvent; import com.vmware.vim25.DVPortgroupReconfiguredEvent; import com.vmware.vim25.DVPortgroupRenamedEvent; import com.vmware.vim25.Event; import com.vmware.vim25.VmClonedEvent; import com.vmware.vim25.VmCreatedEvent; import com.vmware.vim25.VmDeployedEvent; import com.vmware.vim25.VmMacAssignedEvent; import com.vmware.vim25.VmMacChangedEvent; import com.vmware.vim25.DrsVmMigratedEvent; import com.vmware.vim25.VmMigratedEvent; import com.vmware.vim25.VmPoweredOffEvent; import com.vmware.vim25.VmPoweredOnEvent; import com.vmware.vim25.DrsVmPoweredOnEvent; import com.vmware.vim25.VmReconfiguredEvent; import com.vmware.vim25.VmRemovedEvent; import com.vmware.vim25.VmRenamedEvent; import com.vmware.vim25.VmSuspendedEvent; public class VCenterEventHandler { VCenterDB vcenterDB; VncDB vncDB; private static final Logger s_logger = Logger.getLogger(VCenterEventHandler.class); VCenterEventHandler(VCenterDB vcenterDB, VncDB vncDB) { this.vcenterDB = vcenterDB; this.vncDB = vncDB; } public void handle(Event event) throws Exception { s_logger.info("Process event " + event.getFullFormattedMessage()); if (event instanceof VmCreatedEvent || event instanceof VmClonedEvent || event instanceof VmDeployedEvent || event instanceof VmReconfiguredEvent || event instanceof VmRenamedEvent || event instanceof VmMacChangedEvent || event instanceof VmMacAssignedEvent || event instanceof DrsVmMigratedEvent || event instanceof DrsVmPoweredOnEvent || event instanceof VmMigratedEvent || event instanceof VmPoweredOnEvent || event instanceof VmPoweredOffEvent || event instanceof VmSuspendedEvent) { handleVmUpdateEvent(event); } else if (event instanceof VmRemovedEvent) { handleVmDeleteEvent(event); } else if (event instanceof DVPortgroupCreatedEvent || event instanceof DVPortgroupReconfiguredEvent || event instanceof DVPortgroupRenamedEvent) { handleNetworkUpdateEvent(event); } else if (event instanceof DVPortgroupDestroyedEvent) { handleNetworkDeleteEvent(event); } else { handleEvent(event); } s_logger.info("Done processing event " + event.getFullFormattedMessage()); } private void handleVmUpdateEvent(Event event) throws Exception { if (event.getHost() != null) { String hostName = event.getHost().getName(); if (!vcenterDB.esxiToVRouterIpMap.containsKey(hostName)) { s_logger.info("Skipping event for unmanaged host " + hostName); return; } } VirtualMachineInfo newVmInfo = new VirtualMachineInfo(event, vcenterDB, vncDB); VirtualMachineInfo oldVmInfo = MainDB.getVmById(newVmInfo.getUuid()); if (oldVmInfo != null) { oldVmInfo.update(newVmInfo, vncDB); } else { newVmInfo.create(vncDB); } } private void handleVmDeleteEvent(Event event) throws Exception { if (event.getHost() != null) { String hostName = event.getHost().getName(); if (!vcenterDB.esxiToVRouterIpMap.containsKey(hostName)) { s_logger.info("Skipping event for unmanaged host " + hostName); return; } } VirtualMachineInfo vmInfo = MainDB.getVmByName(event.getVm().getName()); if (vmInfo == null) { return; } vmInfo.delete(vncDB); } private void handleNetworkUpdateEvent(Event event) throws Exception { VirtualNetworkInfo newVnInfo = new VirtualNetworkInfo(event, vcenterDB, vncDB); VirtualNetworkInfo oldVnInfo = MainDB.getVnByName(newVnInfo.getName()); if (oldVnInfo != null) { oldVnInfo.update(newVnInfo, vncDB); } else { newVnInfo.create(vncDB); VCenterNotify.watchVn(newVnInfo); } } private void handleNetworkDeleteEvent(Event event) throws Exception { String net_name = event.getNet().getName(); /* From Mitaka nova driver will append cluster_id to port group therefore need to extract the appended cluster id */ if (vcenterDB.mode == Mode.VCENTER_AS_COMPUTE) { net_name = net_name.substring(Math.max(0, net_name.length() - 36)); } VirtualNetworkInfo vnInfo = MainDB.getVnByName(net_name); if (vnInfo == null) { return; } VCenterNotify.unwatchVn(vnInfo); vnInfo.delete(vncDB); } private void handleEvent(Event event) { s_logger.error("Event "+ event.getClass().getName() + " received, but not handled."); } }