/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ /* * This file contain the class SOSEventManager which is having all functions * that manage all events. this class contain a queue which is holding events that * are generated in that one hour. The functions takes the event type generated in * Bourne and returns the objects parameters understand by vCenter. */ package com.emc.storageos.vasa; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.LinkedList; import java.util.Queue; import org.apache.log4j.Logger; import com.emc.storageos.vasa.data.internal.Event; import com.vmware.vim.vasa._1_0.data.xsd.EntityTypeEnum; import com.vmware.vim.vasa._1_0.data.xsd.EventConfigTypeEnum; import com.vmware.vim.vasa._1_0.data.xsd.EventTypeEnum; import com.vmware.vim.vasa._1_0.data.xsd.NameValuePair; import com.vmware.vim.vasa._1_0.data.xsd.StorageEvent; /** * This class contain functions related to Event management. * */ public class SOSEventManager { private Queue<StorageEvent> eventQ; private Calendar lastEventEnqTime; private static Logger log = Logger.getLogger(SOSEventManager.class); public SOSEventManager() { eventQ = new LinkedList<StorageEvent>(); lastEventEnqTime = null; } public StorageEvent getEventRecord() { return eventQ.peek(); } public boolean setEventRecord(StorageEvent eventObj) { eventQ.add(eventObj); return true; } public Queue<StorageEvent> getEventQ() { return this.eventQ; } public Calendar getLastEventEnqTime() { return lastEventEnqTime; } public void setLastEventEnqTime(Calendar lastEventEnqTime) { this.lastEventEnqTime = Calendar.getInstance(); this.lastEventEnqTime.setTimeInMillis(lastEventEnqTime .getTimeInMillis()); } /** * * @param event * - The Event generated from StorageOS. * @return TRUE - if the event/alert belongs to event, otherwise false. */ public boolean isItEvent(Event event) { if (event.getRecordType() != null & event.getRecordType().equals("Event")) { return true; } return false; } public boolean isEventRequired(String eventType) { if (eventType == null) { return false; } if (eventType.startsWith("GenericSystem") || /* * eventType.startsWith("FileSystemCreated") * || eventType.startsWith("FileSystemDeleted") || */ eventType.startsWith("FileSystemExported") || eventType.startsWith("FileSystemUnexported") || eventType.startsWith("FileSystemRestored") || eventType.startsWith("FileSystemAcive") || eventType.startsWith("FileSystemInactive") /* * || eventType.startsWith("FileSystemSnapshotExported") * || eventType.startsWith("FileSystemSnapshotUnexported") */ || eventType.startsWith("FileSystemExpanded") || /* * eventType.startsWith("VolumeCreated") * || eventType.startsWith("VolumeDeleted") || */ eventType.startsWith("VolumeExpanded") || eventType.startsWith("ExportVolumeAdded") || eventType.startsWith("ExportVolumeRemoved") || eventType.startsWith("VolumeRestored") /* * || eventType.startsWith("VolumeSnapshotCreated") * || eventType.startsWith("VolumeSnapshotDeleted") * || eventType.startsWith("VolumeSnapshotActivated") * || eventType.startsWith("VolumeSnapshotDeactivated") * || eventType.startsWith("VolumeSnapshotRestored") */ || eventType.startsWith("Vpool") || eventType.contains("STORAGEPORT") || eventType.contains("StoragePort") || eventType.contains("Export")) { return true; } return false; } public String getVasaEventType(String eventType) { if (eventType == null) { return ""; } String strVasaEventType = EventTypeEnum.System.getValue(); if (eventType.startsWith("GenericSystem") || eventType.startsWith("FileSystemRestored") || eventType.startsWith("FileSystemAcive") || eventType.startsWith("FileSystemInactive") /* * || eventType.startsWith("FileSystemCreated") * || eventType.startsWith("FileSystemDeleted") || * * eventType.startsWith("VolumeCreated") * || eventType.startsWith("VolumeDeleted") */ || eventType.startsWith("VolumeRestored") || eventType.startsWith("VolumeAcive") || eventType.startsWith("VolumeInactive")) { strVasaEventType = EventTypeEnum.System.getValue(); } else if (eventType.startsWith("FileSystemExported") || eventType.startsWith("FileSystemUnexported") || eventType.startsWith("FileSystemExpanded") /* * || eventType.startsWith("FileSystemSnapshotExported") * || eventType.startsWith("FileSystemSnapshotUnexported") */ || eventType.startsWith("ExportVolumeAdded") || eventType.startsWith("ExportVolumeRemoved") /* * || eventType.startsWith("VolumeSnapshotExported") * || eventType.startsWith("VolumeSnapshotUnexported") * || eventType.startsWith("VolumeSnapshotRestored") */ || eventType.startsWith("VolumeExpanded") || eventType.startsWith("Vpool") || eventType.contains("STORAGEPORT") || eventType.contains("StoragePort")) { strVasaEventType = EventTypeEnum.Config.getValue(); } else { log.warn("Unknown event type: [" + eventType + "] in getVasaEventType()"); } return strVasaEventType; } public String getVasaConfigType(String eventType) { if (eventType == null) { return ""; } String strVasaConfigType = EventConfigTypeEnum.New.getValue(); if (eventType.startsWith("FileSystemExported") // || eventType.startsWith("FileSystemSnapshotExported") || eventType.startsWith("ExportVolumeAdded") // || eventType.startsWith("VolumeSnapshotExported") || eventType.startsWith("VpoolCreated") || eventType.startsWith("CREATE STORAGEPORT") || eventType.startsWith("REGISTER STORAGEPORT") || eventType.startsWith("StoragePortRegistered")) { return EventConfigTypeEnum.New.getValue(); } else if (eventType.startsWith("FileSystemUnexported") // || eventType.startsWith("FileSystemSnapshotUnexported") || eventType.startsWith("ExportVolumeRemoved") // || eventType.startsWith("VolumeSnapshotUnexported") || eventType.startsWith("VpoolDeleted") || eventType.startsWith("DELETE STORAGEPORT") || eventType.startsWith("UNREGISTER STORAGEPORT") || eventType.startsWith("StoragePortUnregistered")) { return EventConfigTypeEnum.Delete.getValue(); } else if (// eventType.startsWith("VolumeSnapshotRestored") || eventType.startsWith("FileSystemExpanded") || eventType.startsWith("VpoolUpdated") || eventType.startsWith("VolumeExpanded") || eventType.startsWith("UPDATE STORAGEPORT") || eventType.startsWith("StoragePortUpdated")) { return EventConfigTypeEnum.Update.getValue(); } else { log.warn("Unknown event type: " + eventType + "in getVasaConfigType()"); } return strVasaConfigType; } /** * Returns the object type on which the event occurred * * @param eventType * - type of event generated in StorageOS. * @return - object type string which is recognized by vCenter Server for * corresponding event type. */ public String getEventObjectType(String eventType) { String objectTypeString = ""; if (eventType.startsWith("FileShare") || eventType.startsWith("FileSystem")) { objectTypeString = EntityTypeEnum.StorageFileSystem.getValue(); } else if (eventType.startsWith("Volume") || eventType.startsWith("ExportVolume")) { objectTypeString = EntityTypeEnum.StorageLun.getValue(); } else if (eventType.startsWith("Vpool")) { objectTypeString = EntityTypeEnum.StorageCapability.getValue(); } else if (eventType.startsWith("StorageArray")) { objectTypeString = EntityTypeEnum.StorageArray.getValue(); } else if (eventType.startsWith("StorageProcessor")) { objectTypeString = EntityTypeEnum.StorageProcessor.getValue(); } else if (eventType.contains("STORAGEPORT") || eventType.contains("StoragePort")) { objectTypeString = EntityTypeEnum.StoragePort.getValue(); } else { log.warn("Unknown event type [" + eventType + "] in getEventObjectType()"); } return objectTypeString; } /** * Returns the messageId defined in event.vmsg * * @param eventType * - type of event generated in StorageOS. * @return - messageID for corresponding eventType. this message should be * defined in catalog's event.mvsg file. * * The messageId = StorageOS.eventType. for example eventType = * FileSystemCreated, then the messageId= * StorageOS.FileSystemCreated. all these messages should be defined * in the events.mvsg file under catalog folder. */ public String getMessageIdForEvent(String eventType) { String msgIdPrefix = "StorageOS."; if (eventType == null) { return ""; } else if (eventType.startsWith("ExportVolumeAdded")) { return msgIdPrefix + "VolumeExported"; } else if (eventType.startsWith("ExportVolumeRemoved")) { return msgIdPrefix + "VolumeUnexported"; } else if (eventType.contains("STORAGEPORT")) { if (eventType.contains("CREATE")) { return msgIdPrefix + "StoragePortCreated"; } else if (eventType.contains("REGISTER")) { return msgIdPrefix + "StoragePortRegistered"; } else if (eventType.contains("UNREGISTER")) { return msgIdPrefix + "StoragePortUnregistered"; } else if (eventType.contains("DELETE")) { return msgIdPrefix + "StoragePortDeleted"; } else if (eventType.contains("UPDATE")) { return msgIdPrefix + "StoragePortUpdated"; } } else if (eventType.contains("StoragePortRegistered")) { return msgIdPrefix + "StoragePortRegistered"; } else if (eventType.contains("StoragePortUnregistered")) { return msgIdPrefix + "StoragePortUnregistered"; } else if (eventType.contains("StoragePortUpdated")) { return msgIdPrefix + "StoragePortUpdated"; } return msgIdPrefix + eventType; } /** * It searches the given event in the Q. * * @return - true, if the event already exists in the Q, false, otherwise. * @param event * -The Event generated in StorageOS * * */ public boolean isEventExistsInQueue(Event event) { Iterator<StorageEvent> it = getEventQ().iterator(); while (it.hasNext()) { StorageEvent storageEvent = it.next(); NameValuePair nvpList[] = storageEvent.getParameterList(); String eventId = event.getEventId().toString(); for (NameValuePair nvp : nvpList) { if (nvp.getParameterName().equalsIgnoreCase("SOSEventId") && nvp.getParameterValue().equalsIgnoreCase(eventId)) { return true; } } } return false; } public String getEventObjectTypeId(String eventType) { String objectTypeIdString = ""; if (eventType.startsWith("FileShare") || eventType.startsWith("FileSystem")) { objectTypeIdString = EntityTypeEnum.StorageFileSystem.getValue(); } else if (eventType.startsWith("Volume") || eventType.startsWith("ExportVolume")) { objectTypeIdString = EntityTypeEnum.StorageLun.getValue(); } else if (eventType.startsWith("Vpool")) { objectTypeIdString = EntityTypeEnum.StorageCapability.getValue(); } else if (eventType.startsWith("StorageArray")) { objectTypeIdString = EntityTypeEnum.StorageArray.getValue(); } else if (eventType.startsWith("StorageProcessor")) { objectTypeIdString = EntityTypeEnum.StorageProcessor.getValue(); } else if (eventType.contains("STORAGEPORT") || eventType.contains("StoragePort")) { objectTypeIdString = EntityTypeEnum.StoragePort.getValue(); } else { log.warn("Unknown event type: [" + eventType + "] in getEventObjectTypeId()"); } return objectTypeIdString; } public StorageEvent createNewEvent(String bourneEventId, String bourneEventTimestamp, long lastEventId, String resourceId, String resourceType, String eventType, String eventConfigType, String messageId) { StorageEvent storageEvent = new StorageEvent(); storageEvent.setEventId(lastEventId); storageEvent.setObjectId(resourceId); storageEvent.setEventObjType(resourceType); storageEvent.setEventType(eventType); storageEvent.setEventConfigType(eventConfigType); GregorianCalendar gc = new GregorianCalendar(); gc.setTimeInMillis(Long.parseLong(bourneEventTimestamp)); storageEvent.setEventTimeStamp(gc); storageEvent.setMessageId(messageId); // Storageos generated eventid is used to check the // duplicates in the Q!!. NameValuePair nvp = new NameValuePair(); nvp.setParameterName("SOSEventId"); nvp.setParameterValue(bourneEventId); storageEvent.addParameterList(nvp); NameValuePair nvp2 = new NameValuePair(); nvp2.setParameterName("resId"); nvp2.setParameterValue(resourceId); storageEvent.addParameterList(nvp2); return storageEvent; } }