Please find the changes attached as a text file, I am working on moving the hard coded value for the boolean parameter as a global config parameter. Kindly take a look to know if the approach is fine.
On Thu, Feb 27, 2014 at 2:06 AM, Chip Childers <chipchild...@apache.org>wrote: > On Wed, Feb 26, 2014 at 7:37 AM, Sonal Ojha <sonal.o...@sungard.com> > wrote: > > I am attaching the patch with the email kindly let me know your comments. > > Sonal, > > Attachments are stripped by the listserv. You might have to include the > text. > > -- Thanks and Regards, *Sonal Ojha* * Senior Engineer Product Development * SunGard IT Availability Mobile +91-9922412645* E-Mail: sonal.o...@sungard.com
From ce51a12fc06d93d099896ba71f41bc26382a7146 Mon Sep 17 00:00:00 2001 From: "sonal.ojha" <sonal.o...@sungard.com> Date: Wed, 26 Feb 2014 16:25:22 +0530 Subject: [PATCH] CLOUDSTACK-3272 Changes to allow publishing of events on the eventbus based on the event category config parameter --- api/src/com/cloud/event/EventCategory.java | 22 ++++++++++---- .../src/com/cloud/event/UsageEventUtils.java | 2 +- .../com/cloud/network/NetworkStateListener.java | 1 + .../apache/cloudstack/framework/events/Event.java | 22 +++++++++++++- .../cloudstack/framework/events/EventTopic.java | 15 ++++++++++ .../cloudstack/mom/rabbitmq/RabbitMQEventBus.java | 26 ++++++++++++---- .../network/contrail/management/EventUtils.java | 35 +++++++++++++++++++++- server/src/com/cloud/event/ActionEventUtils.java | 13 ++++---- server/src/com/cloud/event/AlertGenerator.java | 1 + .../storage/listener/SnapshotStateListener.java | 1 + .../storage/listener/VolumeStateListener.java | 1 + server/src/com/cloud/vm/UserVmStateListener.java | 1 + 12 files changed, 121 insertions(+), 19 deletions(-) diff --git a/api/src/com/cloud/event/EventCategory.java b/api/src/com/cloud/event/EventCategory.java index 47a1cf1..4d2f390 100644 --- a/api/src/com/cloud/event/EventCategory.java +++ b/api/src/com/cloud/event/EventCategory.java @@ -25,9 +25,17 @@ import java.util.List; public class EventCategory { private static List<EventCategory> eventCategories = new ArrayList<EventCategory>(); private String eventCategoryName; + private boolean eventCategoryPublishable; public EventCategory(String categoryName) { this.eventCategoryName = categoryName; + this.eventCategoryPublishable = true; + eventCategories.add(this); + } + + public EventCategory(String categoryName, boolean categoryPublishable) { + this.eventCategoryName = categoryName; + this.eventCategoryPublishable = categoryPublishable; eventCategories.add(this); } @@ -35,6 +43,10 @@ public class EventCategory { return eventCategoryName; } + public boolean isEventCategoryPublishable() { + return eventCategoryPublishable; + } + public static List<EventCategory> listAllEventCategories() { return eventCategories; } @@ -48,9 +60,9 @@ public class EventCategory { return null; } - public static final EventCategory ACTION_EVENT = new EventCategory("ActionEvent"); - public static final EventCategory ALERT_EVENT = new EventCategory("AlertEvent"); - public static final EventCategory USAGE_EVENT = new EventCategory("UsageEvent"); - public static final EventCategory RESOURCE_STATE_CHANGE_EVENT = new EventCategory("ResourceStateEvent"); - public static final EventCategory ASYNC_JOB_CHANGE_EVENT = new EventCategory("AsyncJobEvent"); + public static final EventCategory ACTION_EVENT = new EventCategory("ActionEvent", true); + public static final EventCategory ALERT_EVENT = new EventCategory("AlertEvent", true); + public static final EventCategory USAGE_EVENT = new EventCategory("UsageEvent", true); + public static final EventCategory RESOURCE_STATE_CHANGE_EVENT = new EventCategory("ResourceStateEvent", true); + public static final EventCategory ASYNC_JOB_CHANGE_EVENT = new EventCategory("AsyncJobEvent", true); } diff --git a/engine/components-api/src/com/cloud/event/UsageEventUtils.java b/engine/components-api/src/com/cloud/event/UsageEventUtils.java index a4be4dd..302cf3c 100644 --- a/engine/components-api/src/com/cloud/event/UsageEventUtils.java +++ b/engine/components-api/src/com/cloud/event/UsageEventUtils.java @@ -157,7 +157,7 @@ public class UsageEventUtils { if (account == null) return; - Event event = new Event(Name, EventCategory.USAGE_EVENT.getName(), usageEventType, + Event event = new Event(Name, EventCategory.USAGE_EVENT.getName(), EventCategory.USAGE_EVENT.isEventCategoryPublishable(), usageEventType, resourceType, resourceUUID); Map<String, String> eventDescription = new HashMap<String, String>(); diff --git a/engine/components-api/src/com/cloud/network/NetworkStateListener.java b/engine/components-api/src/com/cloud/network/NetworkStateListener.java index 5a3ba2b..3bc41e6 100644 --- a/engine/components-api/src/com/cloud/network/NetworkStateListener.java +++ b/engine/components-api/src/com/cloud/network/NetworkStateListener.java @@ -76,6 +76,7 @@ public class NetworkStateListener implements StateListener<State, Event, Network org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event( "management-server", EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), + EventCategory.RESOURCE_STATE_CHANGE_EVENT.isEventCategoryPublishable(), event, resourceName, vo.getUuid()); diff --git a/framework/events/src/org/apache/cloudstack/framework/events/Event.java b/framework/events/src/org/apache/cloudstack/framework/events/Event.java index eb6f48d..ec34193 100644 --- a/framework/events/src/org/apache/cloudstack/framework/events/Event.java +++ b/framework/events/src/org/apache/cloudstack/framework/events/Event.java @@ -29,6 +29,7 @@ public class Event { String resourceType; String resourceUUID; String description; + boolean eventCategoryPublishable; public Event(String eventSource, String eventCategory, String eventType, String resourceType, String resourceUUID) { @@ -37,6 +38,17 @@ public class Event { this.eventSource = eventSource; this.resourceType = resourceType; this.resourceUUID = resourceUUID; + this.eventCategoryPublishable = true; + } + + public Event(String eventSource, String eventCategory, boolean eventCategoryPublishable, String eventType, String resourceType, + String resourceUUID) { + this.eventCategory = eventCategory; + this.eventCategoryPublishable = eventCategoryPublishable; + this.eventType = eventType; + this.eventSource = eventSource; + this.resourceType = resourceType; + this.resourceUUID = resourceUUID; } public String getEventCategory() { @@ -91,4 +103,12 @@ public class Event { public String getResourceUUID () { return resourceUUID; } -} \ No newline at end of file + + public boolean isEventCategoryPublishable() { + return eventCategoryPublishable; + } + + public void setEventCategoryPublishable(boolean eventCategoryPublishable) { + this.eventCategoryPublishable = eventCategoryPublishable; + } +} diff --git a/framework/events/src/org/apache/cloudstack/framework/events/EventTopic.java b/framework/events/src/org/apache/cloudstack/framework/events/EventTopic.java index 19b727d..2e8d872 100644 --- a/framework/events/src/org/apache/cloudstack/framework/events/EventTopic.java +++ b/framework/events/src/org/apache/cloudstack/framework/events/EventTopic.java @@ -26,6 +26,7 @@ public class EventTopic { String resourceType; String resourceUUID; String eventSource; + boolean eventCategoryConfig; public EventTopic(String eventCategory, String eventType, String resourceType, String resourceUUID, String eventSource) { this.eventCategory = eventCategory; @@ -33,6 +34,16 @@ public class EventTopic { this.resourceType = resourceType; this.resourceUUID = resourceUUID; this.eventSource = eventSource; + this.eventCategoryConfig = true; + } + + public EventTopic(String eventCategory, String eventType, String resourceType, String resourceUUID, String eventSource, boolean eventCategoryConfig) { + this.eventCategory = eventCategory; + this.eventType = eventType; + this.resourceType = resourceType; + this.resourceUUID = resourceUUID; + this.eventSource = eventSource; + this.eventCategoryConfig = eventCategoryConfig; } public String getEventCategory() { @@ -54,4 +65,8 @@ public class EventTopic { public String getResourceUUID() { return resourceUUID; } + + public boolean getEventCategoryConfig() { + return eventCategoryConfig; + } } 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 478c8d7..2d34b12 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 @@ -187,7 +187,8 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { String eventType = getEventTypeFromRoutingKey(routingKey); String resourceType = getResourceTypeFromRoutingKey(routingKey); String resourceUUID = getResourceUUIDFromRoutingKey(routingKey); - Event event = new Event(eventSource, eventCategory, eventType, + boolean eventConfig = Boolean.valueOf(getEventConfigFromRoutingKey(routingKey)); + Event event = new Event(eventSource, eventCategory, eventConfig, eventType, resourceType, resourceUUID); event.setDescription(new String(body)); @@ -233,7 +234,8 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { // publish event on to the exchange created on AMQP server @Override public void publish(Event event) throws EventBusException { - + if (!event.isEventCategoryPublishable()) + return; String routingKey = createRoutingKey(event); String eventDescription = event.getDescription(); @@ -273,6 +275,8 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { String resourceUuid = replaceNullWithWildcard(event.getResourceUUID()); resourceUuid = resourceUuid.replace(".", "-"); + boolean eventCategoryConfig = event.isEventCategoryPublishable(); + // routing key will be of format: eventSource.eventCategory.eventType.resourceType.resourceUuid routingKey.append(eventSource); routingKey.append("."); @@ -283,6 +287,8 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { routingKey.append(resourceType); routingKey.append("."); routingKey.append(resourceUuid); + routingKey.append("."); + routingKey.append(eventCategoryConfig); return routingKey.toString(); } @@ -309,7 +315,9 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { String resourceUuid = replaceNullWithWildcard(topic.getResourceUUID()); resourceUuid = resourceUuid.replace(".", "-"); - // binding key will be of format: eventSource.eventCategory.eventType.resourceType.resourceUuid + boolean eventCategoryConfig = topic.getEventCategoryConfig(); + + // binding key will be of format: eventSource.eventCategory.eventType.resourceType.resourceUuid.eventCategoryConfig bindingKey.append(eventSource); bindingKey.append("."); bindingKey.append(eventCategory); @@ -319,6 +327,8 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { bindingKey.append(resourceType); bindingKey.append("."); bindingKey.append(resourceUuid); + bindingKey.append("."); + bindingKey.append(eventCategoryConfig); return bindingKey.toString(); } @@ -439,6 +449,11 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { return keyParts[4]; } + private String getEventConfigFromRoutingKey(String routingKey) { + String[] keyParts = routingKey.split("\\."); + return keyParts[5]; + } + @Override public String getName() { return _name; @@ -554,9 +569,10 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { String eventType = getEventTypeFromRoutingKey(routingKey); String resourceType = getResourceTypeFromRoutingKey(routingKey); String resourceUUID = getResourceUUIDFromRoutingKey(routingKey); + boolean eventConfig = Boolean.valueOf(getEventConfigFromRoutingKey(routingKey)); // create event object from the message details obtained from AMQP server - Event event = new Event(eventSource, eventCategory, eventType, + Event event = new Event(eventSource, eventCategory, eventConfig, eventType, resourceType, resourceUUID); event.setDescription(new String(body)); @@ -578,4 +594,4 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { return; } } -} \ No newline at end of file +} diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/EventUtils.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/EventUtils.java index dd18ca6..aac3044 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/EventUtils.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/EventUtils.java @@ -77,6 +77,39 @@ public class EventUtils { } + /*private static void publishOnMessageBus(String eventCategory, boolean eventCategoryConfig, + String eventType, String details, Event.State state) { + + if ((state != com.cloud.event.Event.State.Completed) || ! eventCategoryConfig) { + return; + } + + try { + _messageBus = (MessageBus)ComponentContext.getComponent(MessageBusBase.class); + } catch(NoSuchBeanDefinitionException nbe) { + return; // no provider is configured to provide events bus, so just return + } + + org.apache.cloudstack.framework.events.Event event = new org.apache.cloudstack.framework.events.Event( + ManagementServer.Name, + eventCategory, + eventCategoryConfig, + eventType, + EventTypes.getEntityForEvent(eventType), null); + + Map<String, String> eventDescription = new HashMap<String, String>(); + eventDescription.put("event", eventType); + eventDescription.put("status", state.toString()); + eventDescription.put("details", details); + event.setDescription(eventDescription); + try { + _messageBus.publish(EventTypes.getEntityForEvent(eventType), eventType, null, event); + } catch (Exception e) { + s_logger.warn("Failed to publish action event on the the event bus."); + } + + }*/ + public static class EventInterceptor implements ComponentMethodInterceptor { private static final Logger s_logger = Logger.getLogger(EventInterceptor.class); @@ -96,7 +129,7 @@ public class EventUtils { if (actionEvent != null) { CallContext ctx = CallContext.current(); if (!actionEvent.create()) { - publishOnMessageBus(EventCategory.ACTION_EVENT.getName(), + publishOnMessageBus(EventCategory.ACTION_EVENT.getName(), actionEvent.eventType(), ctx.getEventDetails(), com.cloud.event.Event.State.Completed); } } diff --git a/server/src/com/cloud/event/ActionEventUtils.java b/server/src/com/cloud/event/ActionEventUtils.java index 00122de..4c84f2a 100755 --- a/server/src/com/cloud/event/ActionEventUtils.java +++ b/server/src/com/cloud/event/ActionEventUtils.java @@ -70,7 +70,7 @@ public class ActionEventUtils { public static Long onActionEvent(Long userId, Long accountId, Long domainId, String type, String description) { - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), EventCategory.ACTION_EVENT.isEventCategoryPublishable(), type, com.cloud.event.Event.State.Completed, description); Event event = persistActionEvent(userId, accountId, domainId, null, type, Event.State.Completed, @@ -85,7 +85,7 @@ public class ActionEventUtils { public static Long onScheduledActionEvent(Long userId, Long accountId, String type, String description, long startEventId) { - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), EventCategory.ACTION_EVENT.isEventCategoryPublishable(), type, com.cloud.event.Event.State.Scheduled, description); Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Scheduled, @@ -115,7 +115,7 @@ public class ActionEventUtils { public static Long onStartedActionEvent(Long userId, Long accountId, String type, String description, long startEventId) { - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), EventCategory.ACTION_EVENT.isEventCategoryPublishable(), type, com.cloud.event.Event.State.Started, description); Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Started, @@ -126,7 +126,7 @@ public class ActionEventUtils { public static Long onCompletedActionEvent(Long userId, Long accountId, String level, String type, String description, long startEventId) { - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), EventCategory.ACTION_EVENT.isEventCategoryPublishable(), type, com.cloud.event.Event.State.Completed, description); Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Completed, @@ -137,7 +137,7 @@ public class ActionEventUtils { public static Long onCreatedActionEvent(Long userId, Long accountId, String level, String type, String description) { - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), EventCategory.ACTION_EVENT.isEventCategoryPublishable(), type, com.cloud.event.Event.State.Created, description); Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Created, description, null); @@ -168,7 +168,7 @@ public class ActionEventUtils { return event; } - private static void publishOnEventBus(long userId, long accountId, String eventCategory, + private static void publishOnEventBus(long userId, long accountId, String eventCategory, boolean eventCategoryConfig, String eventType, Event.State state, String description) { try { _eventBus = ComponentContext.getComponent(EventBus.class); @@ -188,6 +188,7 @@ public class ActionEventUtils { org.apache.cloudstack.framework.events.Event event = new org.apache.cloudstack.framework.events.Event( ManagementServer.Name, eventCategory, + eventCategoryConfig, eventType, EventTypes.getEntityForEvent(eventType), null); diff --git a/server/src/com/cloud/event/AlertGenerator.java b/server/src/com/cloud/event/AlertGenerator.java index d896e53..7fb17ff 100644 --- a/server/src/com/cloud/event/AlertGenerator.java +++ b/server/src/com/cloud/event/AlertGenerator.java @@ -66,6 +66,7 @@ public class AlertGenerator { org.apache.cloudstack.framework.events.Event event = new org.apache.cloudstack.framework.events.Event(ManagementServer.Name, EventCategory.ALERT_EVENT.getName(), + EventCategory.ALERT_EVENT.isEventCategoryPublishable(), alertType, null, null); diff --git a/server/src/com/cloud/storage/listener/SnapshotStateListener.java b/server/src/com/cloud/storage/listener/SnapshotStateListener.java index d47cc13..2b2e1cb 100644 --- a/server/src/com/cloud/storage/listener/SnapshotStateListener.java +++ b/server/src/com/cloud/storage/listener/SnapshotStateListener.java @@ -73,6 +73,7 @@ public class SnapshotStateListener implements StateListener<State, Event, Snapsh org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event( ManagementServer.Name, EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), + EventCategory.RESOURCE_STATE_CHANGE_EVENT.isEventCategoryPublishable(), event, resourceName, vo.getUuid()); diff --git a/server/src/com/cloud/storage/listener/VolumeStateListener.java b/server/src/com/cloud/storage/listener/VolumeStateListener.java index c8b9f4d..733bba7 100644 --- a/server/src/com/cloud/storage/listener/VolumeStateListener.java +++ b/server/src/com/cloud/storage/listener/VolumeStateListener.java @@ -68,6 +68,7 @@ public class VolumeStateListener implements StateListener<State, Event, Volume> org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event( ManagementServer.Name, EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), + EventCategory.RESOURCE_STATE_CHANGE_EVENT.isEventCategoryPublishable(), event, resourceName, vo.getUuid()); diff --git a/server/src/com/cloud/vm/UserVmStateListener.java b/server/src/com/cloud/vm/UserVmStateListener.java index f783ffa..8900933 100644 --- a/server/src/com/cloud/vm/UserVmStateListener.java +++ b/server/src/com/cloud/vm/UserVmStateListener.java @@ -127,6 +127,7 @@ public class UserVmStateListener implements StateListener<State, VirtualMachine. org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event( ManagementServer.Name, EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), + EventCategory.RESOURCE_STATE_CHANGE_EVENT.isEventCategoryPublishable(), event, resourceName, vo.getUuid()); -- 1.8.0.msysgit.0