From c1cfaa2d1c553d86ae35443d15100b20c2d1b69f Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Mon, 10 Feb 2014 22:43:38 -0700 Subject: [PATCH] Contrail Event Interceptor fix When project/domains are created, our plugin code won't get invoked. Our contrail plugin uses Event infrastructure provided by cloudstack to receive these events and handle them accordingly. It is must to create domains/projects before creating a virtual network/vm object in contrail implementation. Hence our plugin must need a way to get notified about project/domain events. --- ...ng-contrail-system-context-inheritable.xml | 41 ++++++++++++++ .../contrail/management/EventUtils.java | 56 ++++++++++++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 plugins/network-elements/juniper-contrail/resources/META-INF/cloudstack/system/spring-contrail-system-context-inheritable.xml diff --git a/plugins/network-elements/juniper-contrail/resources/META-INF/cloudstack/system/spring-contrail-system-context-inheritable.xml b/plugins/network-elements/juniper-contrail/resources/META-INF/cloudstack/system/spring-contrail-system-context-inheritable.xml new file mode 100644 index 00000000000..085b99b8ab9 --- /dev/null +++ b/plugins/network-elements/juniper-contrail/resources/META-INF/cloudstack/system/spring-contrail-system-context-inheritable.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + 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 29b58fb7d78..faeff1f5bd6 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 @@ -20,6 +20,8 @@ package org.apache.cloudstack.network.contrail.management; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.apache.log4j.Logger; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -28,8 +30,11 @@ import org.springframework.stereotype.Component; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.MessageBusBase; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; import com.cloud.event.ActionEvent; +import com.cloud.event.ActionEvents; import com.cloud.event.Event; import com.cloud.event.EventCategory; import com.cloud.event.EventTypes; @@ -74,7 +79,7 @@ public class EventUtils { } - public static class EventInterceptor implements ComponentMethodInterceptor { + public static class EventInterceptor implements ComponentMethodInterceptor, MethodInterceptor { private static final Logger s_logger = Logger.getLogger(EventInterceptor.class); @@ -82,6 +87,55 @@ public class EventUtils { } + @Override + public Object invoke(MethodInvocation invocation) throws Throwable { + Method m = invocation.getMethod(); + Object target = invocation.getThis(); + + if ( getActionEvents(m).size() == 0 ) { + /* Look for annotation on impl class */ + m = target.getClass().getMethod(m.getName(), m.getParameterTypes()); + } + + Object interceptorData = null; + + boolean success = true; + try { + interceptorData = interceptStart(m, target); + + Object result = invocation.proceed(); + success = true; + + return result; + } finally { + if ( success ) { + interceptComplete(m, target, interceptorData); + } else { + interceptException(m, target, interceptorData); + } + } + } + + protected List getActionEvents(Method m) { + List result = new ArrayList(); + + ActionEvents events = m.getAnnotation(ActionEvents.class); + + if ( events != null ) { + for ( ActionEvent e : events.value() ) { + result.add(e); + } + } + + ActionEvent e = m.getAnnotation(ActionEvent.class); + + if ( e != null ) { + result.add(e); + } + + return result; + } + @Override public Object interceptStart(Method method, Object target) { return null;