From 32e67f60d4e6e9fb1a89a1bc445e50624c44d97a Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 8 Jan 2013 14:23:40 -0800 Subject: [PATCH] Work with Spring proxy-ed object --- .../ImageDataStoreProviderManagerImpl.java | 4 +- .../PrimaryDataStoreProviderManagerImpl.java | 4 +- .../cloud/agent/manager/AgentManagerImpl.java | 3 +- .../com/cloud/agent/manager/AgentMonitor.java | 20 ++-- .../cloud/server/ManagementServerImpl.java | 97 +++++++++++++++++-- .../utils/component/ComponentContext.java | 29 +++++- 6 files changed, 131 insertions(+), 26 deletions(-) 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 32f800cb4eb..62777f90bb6 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 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 7d1944941c5..33d98db8bfe 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 diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index d37bd15cb92..970cae5cc74 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 ssAHosts = _ssvmMgr.listUpAndConnectingSecondaryStorageVmHost(dcId); if (ssAHosts == null || ssAHosts.isEmpty() ) { diff --git a/server/src/com/cloud/agent/manager/AgentMonitor.java b/server/src/com/cloud/agent/manager/AgentMonitor.java index 93dc94020c5..ca8bde901e3 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 _pingMap; - protected AgentMonitor() { + public AgentMonitor() { } public AgentMonitor(long msId, HostDao hostDao, VMInstanceDao vmDao, DataCenterDao dcDao, HostPodDao podDao, AgentManagerImpl agentMgr, AlertManager alertMgr, long pingTimeout) { diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index d98825bd11a..374d1ab8aa5 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 managers = ComponentContext.getApplicationContext().getBeansOfType( + Manager.class); + + Map params = new HashMap(); + 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 adapters = ComponentContext.getApplicationContext().getBeansOfType( + Adapter.class); + + Map params = new HashMap(); + 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 getConfigs() { return _configs; } diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java index 3a47bb2bb8a..5d3f8c67462 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 matchedTypes = getComponentsOfType(beanType); if(matchedTypes.size() > 0) { for(Map.Entry 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 boolean isPrimary(Object instance, Class beanType) { + Map 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 inject(Class clz) { T instance = s_appContext.getAutowireCapableBeanFactory().createBean(clz); return inject(instance);