Updated Branches:
  refs/heads/javelin a4f4c9867 -> 32e67f60d

Work with Spring proxy-ed object


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/32e67f60
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/32e67f60
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/32e67f60

Branch: refs/heads/javelin
Commit: 32e67f60d4e6e9fb1a89a1bc445e50624c44d97a
Parents: a4f4c98
Author: Kelven Yang <[email protected]>
Authored: Tue Jan 8 14:23:40 2013 -0800
Committer: Kelven Yang <[email protected]>
Committed: Tue Jan 8 14:24:19 2013 -0800

----------------------------------------------------------------------
 .../ImageDataStoreProviderManagerImpl.java         |    4 +-
 .../PrimaryDataStoreProviderManagerImpl.java       |    4 +-
 .../com/cloud/agent/manager/AgentManagerImpl.java  |    3 +-
 .../src/com/cloud/agent/manager/AgentMonitor.java  |   20 ++--
 .../src/com/cloud/server/ManagementServerImpl.java |   97 +++++++++++++--
 .../cloud/utils/component/ComponentContext.java    |   29 ++++-
 6 files changed, 131 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/32e67f60/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
 
b/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
index 32f800c..62777f9 100644
--- 
a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
+++ 
b/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
@@ -113,13 +113,13 @@ public class ImageDataStoreProviderManagerImpl implements 
ImageDataStoreProvider
     @Override
     public boolean start() {
         // TODO Auto-generated method stub
-        return false;
+        return true;
     }
 
     @Override
     public boolean stop() {
         // TODO Auto-generated method stub
-        return false;
+        return true;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/32e67f60/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
index 7d19449..33d98db 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
@@ -74,13 +74,13 @@ public class PrimaryDataStoreProviderManagerImpl implements 
PrimaryDataStoreProv
     @Override
     public boolean start() {
         // TODO Auto-generated method stub
-        return false;
+        return true;
     }
 
     @Override
     public boolean stop() {
         // TODO Auto-generated method stub
-        return false;
+        return true;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/32e67f60/server/src/com/cloud/agent/manager/AgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java 
b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
index d37bd15..970cae5 100755
--- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -218,7 +218,7 @@ public class AgentManagerImpl implements AgentManager, 
HandlerFactory, Manager {
 
     protected int _pingInterval;
     protected long _pingTimeout;
-    @Inject protected AgentMonitor _monitor = null;
+    @Inject protected AgentMonitor _monitor;
 
     protected ExecutorService _executor;
     
@@ -401,7 +401,6 @@ public class AgentManagerImpl implements AgentManager, 
HandlerFactory, Manager {
         }
     }
 
-
     private void sendToSSVM(final long dcId, final Command cmd, final Listener 
listener) throws AgentUnavailableException {
         List<HostVO> ssAHosts = 
_ssvmMgr.listUpAndConnectingSecondaryStorageVmHost(dcId);
         if (ssAHosts == null || ssAHosts.isEmpty() ) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/32e67f60/server/src/com/cloud/agent/manager/AgentMonitor.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/agent/manager/AgentMonitor.java 
b/server/src/com/cloud/agent/manager/AgentMonitor.java
index 93dc940..ca8bde9 100755
--- a/server/src/com/cloud/agent/manager/AgentMonitor.java
+++ b/server/src/com/cloud/agent/manager/AgentMonitor.java
@@ -60,24 +60,22 @@ public class AgentMonitor extends Thread implements 
Listener {
     private static Logger s_logger = Logger.getLogger(AgentMonitor.class);
     private static Logger status_Logger = Logger.getLogger(Status.class);
     private long _pingTimeout;
-    private HostDao _hostDao;
+    @Inject private HostDao _hostDao;
     private boolean _stop;
-    private AgentManagerImpl _agentMgr;
-    private VMInstanceDao _vmDao;
-    private DataCenterDao _dcDao = null;
-    private HostPodDao _podDao = null;
-    private AlertManager _alertMgr;
+    @Inject private AgentManagerImpl _agentMgr;
+    @Inject private VMInstanceDao _vmDao;
+    @Inject private DataCenterDao _dcDao = null;
+    @Inject private HostPodDao _podDao = null;
+    @Inject private AlertManager _alertMgr;
     private long _msId;
     private ConnectionConcierge _concierge;
-    @Inject
-    ClusterDao _clusterDao;
-    @Inject
-    ResourceManager _resourceMgr;
+    @Inject ClusterDao _clusterDao;
+    @Inject ResourceManager _resourceMgr;
     
     // private ConnectionConcierge _concierge;
     private Map<Long, Long> _pingMap;
 
-    protected AgentMonitor() {
+    public AgentMonitor() {
     }
 
     public AgentMonitor(long msId, HostDao hostDao, VMInstanceDao vmDao, 
DataCenterDao dcDao, HostPodDao podDao, AgentManagerImpl agentMgr, AlertManager 
alertMgr, long pingTimeout) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/32e67f60/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java 
b/server/src/com/cloud/server/ManagementServerImpl.java
index d98825b..374d1ab 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -43,9 +43,14 @@ import javax.annotation.PostConstruct;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import javax.inject.Inject;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
+import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Component;
 
 import com.cloud.acl.SecurityChecker.AccessType;
@@ -218,9 +223,11 @@ import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.PasswordGenerator;
 import com.cloud.utils.Ternary;
+import com.cloud.utils.component.Adapter;
 import com.cloud.utils.component.Adapters;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ComponentLocator;
+import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.SystemIntegrityChecker;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.crypt.DBEncryptionUtil;
@@ -234,6 +241,8 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.mgmt.JmxUtil;
+import com.cloud.utils.mgmt.ManagementBean;
 import com.cloud.utils.net.MacAddress;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.ssh.SSHKeysHelper;
@@ -368,13 +377,8 @@ public class ManagementServerImpl implements 
ManagementServer {
        private void initCloudStackComponents() {
         runCheckers();
         startDaos();    // daos should not be using managers and adapters.
-     
-/*        
-        configureManagers();
-        configureAdapters();
         startManagers();
         startAdapters();
-*/     
        }
        
     private void runCheckers() {
@@ -385,7 +389,7 @@ public class ManagementServerImpl implements 
ManagementServer {
                        try {
                                checker.check();
                        } catch (Exception e) {
-                s_logger.error("Problems with running checker:" + 
checker.getClass().getName(), e);
+                s_logger.error("Problems with running checker:" + 
ComponentContext.getTargetClass(checker).getName(), e);
                 System.exit(1);
                        }
                }
@@ -398,15 +402,92 @@ public class ManagementServerImpl implements 
ManagementServer {
                        
                for(GenericDaoBase dao : daos.values()) {
                        try {
+                               s_logger.info("Starting dao " + 
ComponentContext.getTargetClass(dao).getName());
                                
+                               // TODO
                                // 
dao.configure(dao.getClass().getSimpleName(), params);
                        } catch (Exception e) {
-                s_logger.error("Problems with running checker:" + 
dao.getClass().getName(), e);
+                s_logger.error("Problems with running checker:" + 
ComponentContext.getTargetClass(dao).getName(), e);
                 System.exit(1);
                        }
                }
     }
-  
+ 
+    private void startManagers() {
+               @SuppressWarnings("rawtypes")
+               Map<String, Manager> managers = 
ComponentContext.getApplicationContext().getBeansOfType(
+                               Manager.class);
+                       
+               Map<String, Object> params = new HashMap<String, Object>();
+               for(Manager manager : managers.values()) {
+                       s_logger.info("Start manager: " + 
ComponentContext.getTargetClass(manager).getName() + "...");
+                       try {
+                               if(!ComponentContext.isPrimary(manager, 
Manager.class)) {
+                       s_logger.error("Skip manager:" + 
ComponentContext.getTargetClass(manager).getName() + " as there are multiple 
matches");
+                                       continue;
+                               }
+                               
+                               
if(!manager.configure(manager.getClass().getSimpleName(), params)) {
+                    throw new CloudRuntimeException("Failed to start manager: 
" + ComponentContext.getTargetClass(manager).getName());
+                               }
+                               
+                if (!manager.start()) {
+                    throw new CloudRuntimeException("Failed to start manager: 
" + ComponentContext.getTargetClass(manager).getName());
+                }
+                
+                if (manager instanceof ManagementBean) {
+                    registerMBean((ManagementBean)manager);
+                }
+                       } catch (Exception e) {
+                s_logger.error("Problems to start manager:" + 
ComponentContext.getTargetClass(manager).getName(), e);
+                System.exit(1);
+                       }
+               }
+    }
+    
+    private void startAdapters() {
+               @SuppressWarnings("rawtypes")
+               Map<String, Adapter> adapters = 
ComponentContext.getApplicationContext().getBeansOfType(
+                               Adapter.class);
+                       
+               Map<String, Object> params = new HashMap<String, Object>();
+               for(Adapter adapter : adapters.values()) {
+                       try {
+                               if(!ComponentContext.isPrimary(adapter, 
Adapter.class))
+                                       continue;
+                               
+                               
if(!adapter.configure(adapter.getClass().getSimpleName(), params)) {
+                    throw new CloudRuntimeException("Failed to start adapter: 
" + ComponentContext.getTargetClass(adapter).getName());
+                               }
+                if (!adapter.start()) {
+                    throw new CloudRuntimeException("Failed to start adapter: 
" + ComponentContext.getTargetClass(adapter).getName());
+                }
+                
+                if (adapter instanceof ManagementBean) {
+                    registerMBean((ManagementBean)adapter);
+                }
+                       } catch (Exception e) {
+                s_logger.error("Problems to start manager:" + 
ComponentContext.getTargetClass(adapter).getName(), e);
+                System.exit(1);
+                       }
+               }
+    }
+    
+    protected void registerMBean(ManagementBean mbean) {
+        try {
+            JmxUtil.registerMBean(mbean);
+        } catch (MalformedObjectNameException e) {
+            s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+        } catch (InstanceAlreadyExistsException e) {
+            s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+        } catch (MBeanRegistrationException e) {
+            s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+        } catch (NotCompliantMBeanException e) {
+            s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+        }
+        s_logger.info("Registered MBean: " + mbean.getName());
+    }
+   
     protected Map<String, String> getConfigs() {
         return _configs;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/32e67f60/utils/src/com/cloud/utils/component/ComponentContext.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java 
b/utils/src/com/cloud/utils/component/ComponentContext.java
index 3a47bb2..5d3f8c6 100644
--- a/utils/src/com/cloud/utils/component/ComponentContext.java
+++ b/utils/src/com/cloud/utils/component/ComponentContext.java
@@ -21,7 +21,9 @@ import java.util.Map;
 
 import org.apache.log4j.Logger;
 import org.springframework.aop.Advisor;
+import org.springframework.aop.framework.Advised;
 import org.springframework.aop.framework.ProxyFactory;
+import org.springframework.aop.support.AopUtils;
 import org.springframework.aop.support.DefaultPointcutAdvisor;
 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
@@ -30,6 +32,7 @@ import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Component;
 
+import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.TransactionContextBuilder;
 
 /**
@@ -65,7 +68,7 @@ public class ComponentContext implements 
ApplicationContextAware {
                Map<String, T> matchedTypes = getComponentsOfType(beanType);
                if(matchedTypes.size() > 0) {
                        for(Map.Entry<String, T> entry : 
matchedTypes.entrySet()) {
-                               Primary primary = 
entry.getClass().getAnnotation(Primary.class);
+                               Primary primary = 
getTargetClass(entry).getAnnotation(Primary.class);
                                if(primary != null)
                                        return entry.getValue();
                        }
@@ -81,6 +84,30 @@ public class ComponentContext implements 
ApplicationContextAware {
        return s_appContext.getBeansOfType(beanType);
     }
     
+    public static <T> boolean isPrimary(Object instance, Class<T> beanType) {
+               Map<String, T> matchedTypes = 
ComponentContext.getComponentsOfType(beanType);
+               if(matchedTypes.size() > 1) {
+                       Primary primary = 
getTargetClass(instance).getAnnotation(Primary.class);
+                       if(primary != null)
+                               return true;
+                       
+                       return false;
+       }
+       
+       return true;
+    }
+    
+    public static Class<?> getTargetClass(Object instance) {
+           if(instance instanceof Advised) {
+               try {
+                       return 
((Advised)instance).getTargetSource().getTarget().getClass();
+               } catch(Exception e) {
+                       return instance.getClass();
+               }
+           }
+           return instance.getClass();
+    }
+    
     public static <T> T inject(Class<T> clz) {
        T instance = 
s_appContext.getAutowireCapableBeanFactory().createBean(clz);
        return inject(instance);

Reply via email to