You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/01/08 23:24:55 UTC

git commit: Work with Spring proxy-ed object

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 <ke...@gmail.com>
Authored: Tue Jan 8 14:23:40 2013 -0800
Committer: Kelven Yang <ke...@gmail.com>
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);