This commit is contained in:
Alex Huang 2013-01-08 14:46:38 -08:00
commit 7f3a748d6c
6 changed files with 131 additions and 26 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
protected ThreadPoolExecutor _connectExecutor;
@ -407,7 +407,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() ) {

View File

@ -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) {

View File

@ -43,6 +43,10 @@ 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.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
@ -68,6 +72,7 @@ import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd;
import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
@ -227,9 +232,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;
@ -243,6 +250,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;
@ -450,13 +459,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() {
@ -467,7 +471,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);
}
}
@ -480,15 +484,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;
}

View File

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