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);