diff --git a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java index 5266cb74d72..3a06c42d277 100644 --- a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java +++ b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java @@ -161,8 +161,9 @@ public class RabbitMQEventBus implements EventBus { String eventCategory = getEventCategoryFromRoutingKey(routingKey); String eventType = getEventTypeFromRoutingKey(routingKey); String resourceType = getResourceTypeFromRoutingKey(routingKey); + String resourceUUID = getResourceUUIDFromRoutingKey(routingKey); Event event = new Event(eventSource, eventCategory, eventType, - resourceType, null); + resourceType, resourceUUID); event.setDescription(new String(body)); // deliver the event to call back object provided by subscriber @@ -526,10 +527,11 @@ public class RabbitMQEventBus implements EventBus { String eventCategory = getEventCategoryFromRoutingKey(routingKey); String eventType = getEventTypeFromRoutingKey(routingKey); String resourceType = getResourceTypeFromRoutingKey(routingKey); + String resourceUUID = getResourceUUIDFromRoutingKey(routingKey); // create event object from the message details obtained from AMQP server Event event = new Event(eventSource, eventCategory, eventType, - resourceType, null); + resourceType, resourceUUID); event.setDescription(new String(body)); // deliver the event to call back object provided by subscriber diff --git a/server/src/com/cloud/network/NetworkStateListener.java b/server/src/com/cloud/network/NetworkStateListener.java index fdabeb0afcb..7235fea963e 100644 --- a/server/src/com/cloud/network/NetworkStateListener.java +++ b/server/src/com/cloud/network/NetworkStateListener.java @@ -1,31 +1,89 @@ package com.cloud.network; +import com.cloud.event.EventCategory; import com.cloud.event.dao.UsageEventDao; import com.cloud.network.Network.Event; import com.cloud.network.Network.State; import com.cloud.network.dao.NetworkDao; +import com.cloud.server.ManagementServer; +import com.cloud.utils.component.Adapters; +import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.fsm.StateListener; +import org.apache.cloudstack.framework.events.EventBus; +import org.apache.cloudstack.framework.events.EventBusException; +import org.apache.log4j.Logger; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; public class NetworkStateListener implements StateListener { protected UsageEventDao _usageEventDao; protected NetworkDao _networkDao; + protected static EventBus _eventBus = null; + + private static final Logger s_logger = Logger.getLogger(NetworkStateListener.class); public NetworkStateListener(UsageEventDao usageEventDao, NetworkDao networkDao) { this._usageEventDao = usageEventDao; this._networkDao = networkDao; + initEventBusProvider(); } @Override public boolean preStateTransitionEvent(State oldState, Event event, State newState, Network vo, boolean status, Object opaque) { - // TODO Auto-generated method stub - return false; + pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState); + return true; } @Override public boolean postStateTransitionEvent(State oldState, Event event, State newState, Network vo, boolean status, Object opaque) { - // TODO Auto-generated method stub - return false; + pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState); + return true; + } + + private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) { + if (_eventBus != null) { + String resourceName = getEntityFromClassName(Network.class.getName()); + org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event( + ManagementServer.Name, + EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), + event, + resourceName, + vo.getUuid()); + Map eventDescription = new HashMap(); + eventDescription.put("resource", resourceName); + eventDescription.put("id", vo.getUuid()); + eventDescription.put("old-state", oldState.name()); + eventDescription.put("new-state", newState.name()); + eventMsg.setDescription(eventDescription); + try { + _eventBus.publish(eventMsg); + } catch (EventBusException e) { + s_logger.warn("Failed to publish action event on the the event bus."); + } + } + } + + private String getEntityFromClassName(String entityClassName) { + int index = entityClassName.lastIndexOf("."); + String entityName = entityClassName; + if (index != -1) { + entityName = entityClassName.substring(index+1); + } + return entityName; + } + + private void initEventBusProvider() { + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + Adapters eventBusImpls = locator.getAdapters(EventBus.class); + if (eventBusImpls != null) { + Enumeration eventBusenum = eventBusImpls.enumeration(); + if (eventBusenum != null && eventBusenum.hasMoreElements()) { + _eventBus = eventBusenum.nextElement(); + } + } } } diff --git a/server/src/com/cloud/vm/UserVmStateListener.java b/server/src/com/cloud/vm/UserVmStateListener.java index 37cce572a36..8f8e3febba5 100644 --- a/server/src/com/cloud/vm/UserVmStateListener.java +++ b/server/src/com/cloud/vm/UserVmStateListener.java @@ -16,32 +16,47 @@ // under the License. package com.cloud.vm; +import com.cloud.event.EventCategory; import com.cloud.event.EventTypes; import com.cloud.event.UsageEventUtils; import com.cloud.event.dao.UsageEventDao; +import com.cloud.network.Network; import com.cloud.network.NetworkVO; import com.cloud.network.dao.NetworkDao; +import com.cloud.server.ManagementServer; +import com.cloud.utils.component.Adapters; +import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.fsm.StateListener; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.NicDao; +import org.apache.cloudstack.framework.events.EventBus; +import org.apache.cloudstack.framework.events.EventBusException; +import org.apache.log4j.Logger; +import java.util.Enumeration; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class UserVmStateListener implements StateListener { protected UsageEventDao _usageEventDao; protected NetworkDao _networkDao; protected NicDao _nicDao; - + protected static EventBus _eventBus = null; + private static final Logger s_logger = Logger.getLogger(UserVmStateListener.class); + public UserVmStateListener(UsageEventDao usageEventDao, NetworkDao networkDao, NicDao nicDao) { this._usageEventDao = usageEventDao; this._networkDao = networkDao; this._nicDao = nicDao; + initEventBusProvider(); } @Override public boolean preStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo, boolean status, Object opaque) { + pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState); return true; } @@ -74,4 +89,47 @@ public class UserVmStateListener implements StateListener eventDescription = new HashMap(); + eventDescription.put("resource", resourceName); + eventDescription.put("id", vo.getUuid()); + eventDescription.put("old-state", oldState.name()); + eventDescription.put("new-state", newState.name()); + eventMsg.setDescription(eventDescription); + try { + _eventBus.publish(eventMsg); + } catch (EventBusException e) { + s_logger.warn("Failed to publish action event on the the event bus."); + } + } + } + + private String getEntityFromClassName(String entityClassName) { + int index = entityClassName.lastIndexOf("."); + String entityName = entityClassName; + if (index != -1) { + entityName = entityClassName.substring(index+1); + } + return entityName; + } + + private void initEventBusProvider() { + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + Adapters eventBusImpls = locator.getAdapters(EventBus.class); + if (eventBusImpls != null) { + Enumeration eventBusenum = eventBusImpls.enumeration(); + if (eventBusenum != null && eventBusenum.hasMoreElements()) { + _eventBus = eventBusenum.nextElement(); + } + } + } }