Skip to content

Commit 32e67f6

Browse files
committed
Work with Spring proxy-ed object
1 parent a4f4c98 commit 32e67f6

6 files changed

Lines changed: 131 additions & 26 deletions

File tree

engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,13 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
113113
@Override
114114
public boolean start() {
115115
// TODO Auto-generated method stub
116-
return false;
116+
return true;
117117
}
118118

119119
@Override
120120
public boolean stop() {
121121
// TODO Auto-generated method stub
122-
return false;
122+
return true;
123123
}
124124

125125
@Override

engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
7474
@Override
7575
public boolean start() {
7676
// TODO Auto-generated method stub
77-
return false;
77+
return true;
7878
}
7979

8080
@Override
8181
public boolean stop() {
8282
// TODO Auto-generated method stub
83-
return false;
83+
return true;
8484
}
8585

8686
@Override

server/src/com/cloud/agent/manager/AgentManagerImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager {
218218

219219
protected int _pingInterval;
220220
protected long _pingTimeout;
221-
@Inject protected AgentMonitor _monitor = null;
221+
@Inject protected AgentMonitor _monitor;
222222

223223
protected ExecutorService _executor;
224224

@@ -401,7 +401,6 @@ public void sendToSecStorage(HostVO ssHost, Command cmd, Listener listener) thro
401401
}
402402
}
403403

404-
405404
private void sendToSSVM(final long dcId, final Command cmd, final Listener listener) throws AgentUnavailableException {
406405
List<HostVO> ssAHosts = _ssvmMgr.listUpAndConnectingSecondaryStorageVmHost(dcId);
407406
if (ssAHosts == null || ssAHosts.isEmpty() ) {

server/src/com/cloud/agent/manager/AgentMonitor.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,24 +60,22 @@ public class AgentMonitor extends Thread implements Listener {
6060
private static Logger s_logger = Logger.getLogger(AgentMonitor.class);
6161
private static Logger status_Logger = Logger.getLogger(Status.class);
6262
private long _pingTimeout;
63-
private HostDao _hostDao;
63+
@Inject private HostDao _hostDao;
6464
private boolean _stop;
65-
private AgentManagerImpl _agentMgr;
66-
private VMInstanceDao _vmDao;
67-
private DataCenterDao _dcDao = null;
68-
private HostPodDao _podDao = null;
69-
private AlertManager _alertMgr;
65+
@Inject private AgentManagerImpl _agentMgr;
66+
@Inject private VMInstanceDao _vmDao;
67+
@Inject private DataCenterDao _dcDao = null;
68+
@Inject private HostPodDao _podDao = null;
69+
@Inject private AlertManager _alertMgr;
7070
private long _msId;
7171
private ConnectionConcierge _concierge;
72-
@Inject
73-
ClusterDao _clusterDao;
74-
@Inject
75-
ResourceManager _resourceMgr;
72+
@Inject ClusterDao _clusterDao;
73+
@Inject ResourceManager _resourceMgr;
7674

7775
// private ConnectionConcierge _concierge;
7876
private Map<Long, Long> _pingMap;
7977

80-
protected AgentMonitor() {
78+
public AgentMonitor() {
8179
}
8280

8381
public AgentMonitor(long msId, HostDao hostDao, VMInstanceDao vmDao, DataCenterDao dcDao, HostPodDao podDao, AgentManagerImpl agentMgr, AlertManager alertMgr, long pingTimeout) {

server/src/com/cloud/server/ManagementServerImpl.java

Lines changed: 89 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,14 @@
4343
import javax.crypto.Mac;
4444
import javax.crypto.spec.SecretKeySpec;
4545
import javax.inject.Inject;
46+
import javax.management.InstanceAlreadyExistsException;
47+
import javax.management.MBeanRegistrationException;
48+
import javax.management.MalformedObjectNameException;
49+
import javax.management.NotCompliantMBeanException;
4650

4751
import org.apache.commons.codec.binary.Base64;
4852
import org.apache.log4j.Logger;
53+
import org.springframework.context.annotation.Primary;
4954
import org.springframework.stereotype.Component;
5055

5156
import com.cloud.acl.SecurityChecker.AccessType;
@@ -218,9 +223,11 @@
218223
import com.cloud.utils.Pair;
219224
import com.cloud.utils.PasswordGenerator;
220225
import com.cloud.utils.Ternary;
226+
import com.cloud.utils.component.Adapter;
221227
import com.cloud.utils.component.Adapters;
222228
import com.cloud.utils.component.ComponentContext;
223229
import com.cloud.utils.component.ComponentLocator;
230+
import com.cloud.utils.component.Manager;
224231
import com.cloud.utils.component.SystemIntegrityChecker;
225232
import com.cloud.utils.concurrency.NamedThreadFactory;
226233
import com.cloud.utils.crypt.DBEncryptionUtil;
@@ -234,6 +241,8 @@
234241
import com.cloud.utils.db.SearchCriteria;
235242
import com.cloud.utils.db.Transaction;
236243
import com.cloud.utils.exception.CloudRuntimeException;
244+
import com.cloud.utils.mgmt.JmxUtil;
245+
import com.cloud.utils.mgmt.ManagementBean;
237246
import com.cloud.utils.net.MacAddress;
238247
import com.cloud.utils.net.NetUtils;
239248
import com.cloud.utils.ssh.SSHKeysHelper;
@@ -368,13 +377,8 @@ public void startup() {
368377
private void initCloudStackComponents() {
369378
runCheckers();
370379
startDaos(); // daos should not be using managers and adapters.
371-
372-
/*
373-
configureManagers();
374-
configureAdapters();
375380
startManagers();
376381
startAdapters();
377-
*/
378382
}
379383

380384
private void runCheckers() {
@@ -385,7 +389,7 @@ private void runCheckers() {
385389
try {
386390
checker.check();
387391
} catch (Exception e) {
388-
s_logger.error("Problems with running checker:" + checker.getClass().getName(), e);
392+
s_logger.error("Problems with running checker:" + ComponentContext.getTargetClass(checker).getName(), e);
389393
System.exit(1);
390394
}
391395
}
@@ -398,15 +402,92 @@ private void startDaos() {
398402

399403
for(GenericDaoBase dao : daos.values()) {
400404
try {
405+
s_logger.info("Starting dao " + ComponentContext.getTargetClass(dao).getName());
401406

407+
// TODO
402408
// dao.configure(dao.getClass().getSimpleName(), params);
403409
} catch (Exception e) {
404-
s_logger.error("Problems with running checker:" + dao.getClass().getName(), e);
410+
s_logger.error("Problems with running checker:" + ComponentContext.getTargetClass(dao).getName(), e);
405411
System.exit(1);
406412
}
407413
}
408414
}
409-
415+
416+
private void startManagers() {
417+
@SuppressWarnings("rawtypes")
418+
Map<String, Manager> managers = ComponentContext.getApplicationContext().getBeansOfType(
419+
Manager.class);
420+
421+
Map<String, Object> params = new HashMap<String, Object>();
422+
for(Manager manager : managers.values()) {
423+
s_logger.info("Start manager: " + ComponentContext.getTargetClass(manager).getName() + "...");
424+
try {
425+
if(!ComponentContext.isPrimary(manager, Manager.class)) {
426+
s_logger.error("Skip manager:" + ComponentContext.getTargetClass(manager).getName() + " as there are multiple matches");
427+
continue;
428+
}
429+
430+
if(!manager.configure(manager.getClass().getSimpleName(), params)) {
431+
throw new CloudRuntimeException("Failed to start manager: " + ComponentContext.getTargetClass(manager).getName());
432+
}
433+
434+
if (!manager.start()) {
435+
throw new CloudRuntimeException("Failed to start manager: " + ComponentContext.getTargetClass(manager).getName());
436+
}
437+
438+
if (manager instanceof ManagementBean) {
439+
registerMBean((ManagementBean)manager);
440+
}
441+
} catch (Exception e) {
442+
s_logger.error("Problems to start manager:" + ComponentContext.getTargetClass(manager).getName(), e);
443+
System.exit(1);
444+
}
445+
}
446+
}
447+
448+
private void startAdapters() {
449+
@SuppressWarnings("rawtypes")
450+
Map<String, Adapter> adapters = ComponentContext.getApplicationContext().getBeansOfType(
451+
Adapter.class);
452+
453+
Map<String, Object> params = new HashMap<String, Object>();
454+
for(Adapter adapter : adapters.values()) {
455+
try {
456+
if(!ComponentContext.isPrimary(adapter, Adapter.class))
457+
continue;
458+
459+
if(!adapter.configure(adapter.getClass().getSimpleName(), params)) {
460+
throw new CloudRuntimeException("Failed to start adapter: " + ComponentContext.getTargetClass(adapter).getName());
461+
}
462+
if (!adapter.start()) {
463+
throw new CloudRuntimeException("Failed to start adapter: " + ComponentContext.getTargetClass(adapter).getName());
464+
}
465+
466+
if (adapter instanceof ManagementBean) {
467+
registerMBean((ManagementBean)adapter);
468+
}
469+
} catch (Exception e) {
470+
s_logger.error("Problems to start manager:" + ComponentContext.getTargetClass(adapter).getName(), e);
471+
System.exit(1);
472+
}
473+
}
474+
}
475+
476+
protected void registerMBean(ManagementBean mbean) {
477+
try {
478+
JmxUtil.registerMBean(mbean);
479+
} catch (MalformedObjectNameException e) {
480+
s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
481+
} catch (InstanceAlreadyExistsException e) {
482+
s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
483+
} catch (MBeanRegistrationException e) {
484+
s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
485+
} catch (NotCompliantMBeanException e) {
486+
s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
487+
}
488+
s_logger.info("Registered MBean: " + mbean.getName());
489+
}
490+
410491
protected Map<String, String> getConfigs() {
411492
return _configs;
412493
}

utils/src/com/cloud/utils/component/ComponentContext.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121

2222
import org.apache.log4j.Logger;
2323
import org.springframework.aop.Advisor;
24+
import org.springframework.aop.framework.Advised;
2425
import org.springframework.aop.framework.ProxyFactory;
26+
import org.springframework.aop.support.AopUtils;
2527
import org.springframework.aop.support.DefaultPointcutAdvisor;
2628
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2729
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
@@ -30,6 +32,7 @@
3032
import org.springframework.context.annotation.Primary;
3133
import org.springframework.stereotype.Component;
3234

35+
import com.cloud.utils.component.ComponentContext;
3336
import com.cloud.utils.db.TransactionContextBuilder;
3437

3538
/**
@@ -65,7 +68,7 @@ public static <T> T getCompanent(Class<T> beanType) {
6568
Map<String, T> matchedTypes = getComponentsOfType(beanType);
6669
if(matchedTypes.size() > 0) {
6770
for(Map.Entry<String, T> entry : matchedTypes.entrySet()) {
68-
Primary primary = entry.getClass().getAnnotation(Primary.class);
71+
Primary primary = getTargetClass(entry).getAnnotation(Primary.class);
6972
if(primary != null)
7073
return entry.getValue();
7174
}
@@ -81,6 +84,30 @@ public static <T> Map<String, T> getComponentsOfType(Class<T> beanType) {
8184
return s_appContext.getBeansOfType(beanType);
8285
}
8386

87+
public static <T> boolean isPrimary(Object instance, Class<T> beanType) {
88+
Map<String, T> matchedTypes = ComponentContext.getComponentsOfType(beanType);
89+
if(matchedTypes.size() > 1) {
90+
Primary primary = getTargetClass(instance).getAnnotation(Primary.class);
91+
if(primary != null)
92+
return true;
93+
94+
return false;
95+
}
96+
97+
return true;
98+
}
99+
100+
public static Class<?> getTargetClass(Object instance) {
101+
if(instance instanceof Advised) {
102+
try {
103+
return ((Advised)instance).getTargetSource().getTarget().getClass();
104+
} catch(Exception e) {
105+
return instance.getClass();
106+
}
107+
}
108+
return instance.getClass();
109+
}
110+
84111
public static <T> T inject(Class<T> clz) {
85112
T instance = s_appContext.getAutowireCapableBeanFactory().createBean(clz);
86113
return inject(instance);

0 commit comments

Comments
 (0)