You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by fr...@apache.org on 2013/07/20 01:06:20 UTC
git commit: updated refs/heads/4.2 to a5ee39a
Updated Branches:
refs/heads/4.2 1694e53b1 -> a5ee39a54
CLOUDSTACK-3453
UCS:API: List Blades after decommissioning a blade, listUcsBlades API returns wrong number of total blades
fixed resolved
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a5ee39a5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a5ee39a5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a5ee39a5
Branch: refs/heads/4.2
Commit: a5ee39a54a8574b030655916d6156d049c99009c
Parents: 1694e53
Author: frank <fr...@citrix.com>
Authored: Fri Jul 19 16:15:17 2013 -0700
Committer: frank <fr...@citrix.com>
Committed: Fri Jul 19 16:15:46 2013 -0700
----------------------------------------------------------------------
.../com/cloud/ucs/manager/UcsManagerImpl.java | 86 +++++++++++++++++++-
server/src/com/cloud/configuration/Config.java | 4 +-
2 files changed, 87 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5ee39a5/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
index ee75f1b..f9e2c5a 100755
--- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
+++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
@@ -22,14 +22,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
-import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.AddUcsManagerCmd;
import org.apache.cloudstack.api.AssociateUcsProfileToBladeCmd;
import org.apache.cloudstack.api.ListUcsBladeCmd;
@@ -39,7 +39,10 @@ import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.UcsBladeResponse;
import org.apache.cloudstack.api.response.UcsManagerResponse;
import org.apache.cloudstack.api.response.UcsProfileResponse;
+import org.apache.log4j.Logger;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.ClusterDetailsDao;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.ClusterDao;
@@ -54,6 +57,7 @@ import com.cloud.ucs.database.UcsManagerVO;
import com.cloud.ucs.structure.ComputeBlade;
import com.cloud.ucs.structure.UcsCookie;
import com.cloud.ucs.structure.UcsProfile;
+import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria2;
@@ -83,11 +87,86 @@ public class UcsManagerImpl implements UcsManager {
private HostDao hostDao;
@Inject
private DataCenterDao dcDao;
+ @Inject
+ private ConfigurationDao configDao;
private final Map<Long, UcsCookie> cookies = new HashMap<Long, UcsCookie>();
private String name;
private int runLevel;
private Map<String, Object> params;
+ private ScheduledExecutorService syncBladesExecutor;
+ private int syncBladeInterval;
+
+ private class SyncBladesThread implements Runnable {
+
+ private void discoverNewBlades(Map<String, UcsBladeVO> previous,
+ Map<String, ComputeBlade> now, UcsManagerVO mgr) {
+ for (Map.Entry<String, ComputeBlade> e : now.entrySet()) {
+ String dn = e.getKey();
+ if (previous.keySet().contains(dn)) {
+ continue;
+ }
+
+ ComputeBlade nc = e.getValue();
+ UcsBladeVO vo = new UcsBladeVO();
+ vo.setDn(nc.getDn());
+ vo.setUcsManagerId(mgr.getId());
+ vo.setUuid(UUID.randomUUID().toString());
+ bladeDao.persist(vo);
+ s_logger.debug(String.format("discovered a new UCS blade[dn:%s] during sync", nc.getDn()));
+ }
+ }
+
+ private void decommissionFadedBlade(Map<String, UcsBladeVO> previous, Map<String, ComputeBlade> now) {
+ for (Map.Entry<String, UcsBladeVO> e : previous.entrySet()) {
+ String dn = e.getKey();
+ if (now.keySet().contains(dn)) {
+ continue;
+ }
+
+ UcsBladeVO vo = e.getValue();
+ bladeDao.remove(vo.getId());
+ s_logger.debug(String.format("decommission faded blade[dn:%s] during sync", vo.getDn()));
+ }
+ }
+
+ private void syncBlades(UcsManagerVO mgr) {
+ SearchCriteriaService<UcsBladeVO, UcsBladeVO> q = SearchCriteria2.create(UcsBladeVO.class);
+ q.addAnd(q.getEntity().getUcsManagerId(), Op.EQ, mgr.getId());
+ List<UcsBladeVO> pblades = q.list();
+ if (pblades.isEmpty()) {
+ return;
+ }
+
+
+ Map<String, UcsBladeVO> previousBlades = new HashMap<String, UcsBladeVO>(pblades.size());
+ for (UcsBladeVO b : pblades) {
+ previousBlades.put(b.getDn(), b);
+ }
+
+ List<ComputeBlade> cblades = listBlades(mgr.getId());
+ Map<String, ComputeBlade> currentBlades = new HashMap<String, ComputeBlade>(cblades.size());
+ for (ComputeBlade c : cblades) {
+ currentBlades.put(c.getDn(), c);
+ }
+
+ discoverNewBlades(previousBlades, currentBlades, mgr);
+ decommissionFadedBlade(previousBlades, currentBlades);
+ }
+
+ @Override
+ public void run() {
+ try {
+ List<UcsManagerVO> mgrs = ucsDao.listAll();
+ for (UcsManagerVO mgr : mgrs) {
+ syncBlades(mgr);
+ }
+ } catch (Throwable t) {
+ s_logger.warn(t.getMessage(), t);
+ }
+ }
+
+ }
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@@ -96,6 +175,9 @@ public class UcsManagerImpl implements UcsManager {
@Override
public boolean start() {
+ syncBladeInterval = Integer.valueOf(configDao.getValue(Config.UCSSyncBladeInterval.key()));
+ syncBladesExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("UCS-SyncBlades"));
+ syncBladesExecutor.scheduleAtFixedRate(new SyncBladesThread(), syncBladeInterval, syncBladeInterval, TimeUnit.SECONDS);
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5ee39a5/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java
index 18b2403..e800c40 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -436,7 +436,9 @@ public enum Config {
ExecuteInSequence("Advanced", ManagementServer.class, Boolean.class, "execute.in.sequence.hypervisor.commands", "false", "If set to true, StartCommand, StopCommand, CopyCommand will be synchronized on the agent side." +
" If set to false, these commands become asynchronous. Default value is false.", null),
ExecuteInSequenceNetworkElementCommands("Advanced", NetworkManager.class, Boolean.class, "execute.in.sequence.network.element.commands", "false", "If set to true, DhcpEntryCommand, SavePasswordCommand, UserDataCommand, VmDataCommand will be synchronized on the agent side." +
- " If set to false, these commands become asynchronous. Default value is false.", null);
+ " If set to false, these commands become asynchronous. Default value is false.", null),
+
+ UCSSyncBladeInterval("Advanced", ManagementServer.class, Integer.class, "ucs.sync.blade.interval", "3600", "the interval cloudstack sync with UCS manager for available blades in case user remove blades from chassis without notifying CloudStack", null);
private final String _category;
private final Class<?> _componentClass;