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

Reply via email to