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/01/31 23:40:12 UTC

[4/6] git commit: refs/heads/javelin - CloudStack CLOUDSTACK-723 Enhanced baremetal servers support on Cisco UCS

CloudStack CLOUDSTACK-723
Enhanced baremetal servers support on Cisco UCS


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/997e9fb7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/997e9fb7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/997e9fb7

Branch: refs/heads/javelin
Commit: 997e9fb7b0dec0eaec5cae3e7f8e75e41dc55ce4
Parents: 301b0b9
Author: frank <fr...@citrix.com>
Authored: Mon Jan 28 16:29:54 2013 -0800
Committer: frank <fr...@citrix.com>
Committed: Mon Jan 28 16:29:54 2013 -0800

----------------------------------------------------------------------
 .../ucs/src/com/cloud/ucs/manager/UcsCommands.java |   39 ++++++++
 .../src/com/cloud/ucs/manager/UcsManagerImpl.java  |   74 ++++++++++++---
 .../src/com/cloud/ucs/structure/ComputeBlade.java  |    3 +
 utils/src/com/cloud/utils/xmlobject/XmlObject.java |   10 --
 4 files changed, 102 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/997e9fb7/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsCommands.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsCommands.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsCommands.java
index 32c017d..b6f22c7 100755
--- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsCommands.java
+++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsCommands.java
@@ -41,4 +41,43 @@ public class UcsCommands {
         cmd.putElement("dn", dn);
         return cmd.toString();
     }
+    
+    public static String associateProfileToBlade(String cookie, String profileDn, String bladeDn) {
+        XmlObject cmd = new XmlObject("configConfMos").putElement("inHierarchical", "true").putElement(
+                "inConfigs", new XmlObject("inConfigs").putElement(
+                        "pair", new XmlObject("pair").putElement("key", profileDn).putElement(
+                                "lsServer", new XmlObject("lsServer")
+                                .putElement("agentPolicyName", "")
+                                .putElement("biosProfileName", "")
+                                .putElement("bootPolicyName", "")
+                                .putElement("descr", "")
+                                .putElement("dn", profileDn)
+                                .putElement("dynamicConPolicyName", "")
+                                .putElement("extIPState", "none")
+                                .putElement("hostFwPolicyName", "")
+                                .putElement("identPoolName", "")
+                                .putElement("localDiskPolicyName", "")
+                                .putElement("maintPolicyName", "")
+                                .putElement("mgmtAccessPolicyName", "")
+                                .putElement("mgmtFwPolicyName", "")
+                                .putElement("powerPolicyName", "")
+                                .putElement("scrubPolicyName", "")
+                                .putElement("solPolicyName", "")
+                                .putElement("srcTemplName", "")
+                                .putElement("statsPolicyName", "default")
+                                .putElement("status", "")
+                                .putElement("usrLbl", "")
+                                .putElement("", "")
+                                .putElement("vconProfileName", "")
+                                .putElement("lsBinding", new XmlObject("lsBinding")
+                                            .putElement("pnDn", bladeDn)
+                                            .putElement("restrictMigration", "no")
+                                            .putElement("rn", "pn")
+                                        )
+                                )
+                        )
+                );
+        
+        return cmd.dump();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/997e9fb7/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 d19e535..c82c8b4 100755
--- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
+++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
@@ -23,6 +23,7 @@ import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cxf.helpers.FileUtils;
 import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.dao.ClusterDao;
@@ -30,6 +31,8 @@ import com.cloud.host.HostVO;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.org.Cluster;
 import com.cloud.resource.ResourceService;
+import com.cloud.ucs.database.UcsBladeDao;
+import com.cloud.ucs.database.UcsBladeVO;
 import com.cloud.ucs.database.UcsManagerDao;
 import com.cloud.ucs.database.UcsManagerVO;
 import com.cloud.ucs.structure.ComputeBlade;
@@ -45,6 +48,7 @@ import com.cloud.utils.xmlobject.XmlObject;
 import com.cloud.utils.xmlobject.XmlObjectParser;
 
 @Local(value = { UcsManager.class })
+@Component
 public class UcsManagerImpl implements UcsManager {
     public static final Logger s_logger = Logger.getLogger(UcsManagerImpl.class);
 
@@ -56,6 +60,8 @@ public class UcsManagerImpl implements UcsManager {
     private ClusterDao clusterDao;
     @Inject
     private ClusterDetailsDao clusterDetailsDao;
+    @Inject
+    private UcsBladeDao bladeDao;
 
     private Map<Long, String> cookies = new HashMap<Long, String>();
 
@@ -79,6 +85,17 @@ public class UcsManagerImpl implements UcsManager {
         return "UcsManager";
     }
 
+    private void discoverBlades(UcsManagerVO ucsMgrVo) {
+        List<ComputeBlade> blades = listBlades(ucsMgrVo.getId());
+        for (ComputeBlade b : blades) {
+            UcsBladeVO vo = new UcsBladeVO();
+            vo.setDn(b.getDn());
+            vo.setUcsManagerId(ucsMgrVo.getId());
+            vo.setUuid(UUID.randomUUID().toString());
+            bladeDao.persist(vo);
+        }
+    }
+    
     @Override
     @DB
     public AddUcsManagerResponse addUcsManager(AddUcsManagerCmd cmd) {
@@ -99,18 +116,12 @@ public class UcsManagerImpl implements UcsManager {
         rsp.setName(vo.getName());
         rsp.setUrl(vo.getUrl());
         rsp.setZoneId(String.valueOf(vo.getZoneId()));
+        
+        discoverBlades(vo);
+        
         return rsp;
     }
 
-    private String getUcsManagerIp() {
-        SearchCriteriaService<UcsManagerVO, UcsManagerVO> serv = SearchCriteria2.create(UcsManagerVO.class);
-        List<UcsManagerVO> vos = serv.list();
-        if (vos.isEmpty()) {
-            throw new CloudRuntimeException("Cannot find any UCS manager, you must add it first");
-        }
-        return vos.get(0).getUrl();
-    }
-
     private String getCookie(Long ucsMgrId) {
         try {
             String cookie = cookies.get(ucsMgrId);
@@ -172,11 +183,7 @@ public class UcsManagerImpl implements UcsManager {
         return xo.get("lsClone.outConfig.lsServer.dn");
     }
 
-    private String buildProfileNameForHost(HostVO vo) {
-        return String.format("z%sp%sc%sh%s", vo.getDataCenterId(), vo.getPodId(), vo.getClusterId(), vo.getId());
-    }
-
-    private boolean isBladeAssociated(Long ucsMgrId, String dn) {
+    private boolean isProfileAssociated(Long ucsMgrId, String dn) {
         UcsManagerVO mgrvo = ucsDao.findById(ucsMgrId);
         UcsHttpClient client = new UcsHttpClient(mgrvo.getUrl());
         String cookie = getCookie(ucsMgrId);
@@ -188,6 +195,45 @@ public class UcsManagerImpl implements UcsManager {
 
     @Override
     public void associateProfileToBlade(AssociateUcsProfileToBladeCmd cmd) {
+        SearchCriteriaService<UcsBladeVO, UcsBladeVO> q = SearchCriteria2.create(UcsBladeVO.class);
+        q.addAnd(q.getEntity().getUcsManagerId(), Op.EQ, cmd.getUcsManagerId());
+        q.addAnd(q.getEntity().getId(), Op.EQ, cmd.getBladeId());
+        UcsBladeVO bvo = q.find();
+        if (bvo == null) {
+            throw new IllegalArgumentException(String.format("cannot find UCS blade[id:%s, ucs manager id:%s]", cmd.getBladeId(), cmd.getUcsManagerId()));
+        }
+        
+        if (bvo.getHostId() != null) {
+            throw new CloudRuntimeException(String.format("blade[id:%s,  dn:%s] has been associated with host[id:%s]", bvo.getId(), bvo.getDn(), bvo.getHostId()));
+        }
+        
+        UcsManagerVO mgrvo = ucsDao.findById(cmd.getUcsManagerId());
+        String cookie = getCookie(cmd.getUcsManagerId());
+        String pdn = cloneProfile(mgrvo.getId(), cmd.getProfileDn(), "profile-for-blade-" + bvo.getId());
+        String ucscmd = UcsCommands.associateProfileToBlade(cookie, pdn, bvo.getDn());
+        UcsHttpClient client = new UcsHttpClient(mgrvo.getUrl());
+        String res = client.call(ucscmd);
+        int count = 0;
+        int timeout = 600;
+        while (count < timeout) {
+            if (isProfileAssociated(mgrvo.getId(), bvo.getDn())) {
+                break;
+            }
+            
+            try {
+                TimeUnit.SECONDS.sleep(2);
+            } catch (InterruptedException e) {
+                throw new CloudRuntimeException(e);
+            }
+            
+            count += 2;
+        }
+        
+        if (count >= timeout) {
+            throw new CloudRuntimeException(String.format("associating profile[%s] to balde[%s] timeout after 600 seconds", pdn, bvo.getDn()));
+        }
+        
+        s_logger.debug(String.format("successfully associated profile[%s] to blade[%s]", pdn, bvo.getDn()));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/997e9fb7/plugins/hypervisors/ucs/src/com/cloud/ucs/structure/ComputeBlade.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/structure/ComputeBlade.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/structure/ComputeBlade.java
index 9c7356c..6251ecf 100755
--- a/plugins/hypervisors/ucs/src/com/cloud/ucs/structure/ComputeBlade.java
+++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/structure/ComputeBlade.java
@@ -159,4 +159,7 @@ public class ComputeBlade {
     public void setUuid(String uuid) {
         this.uuid = uuid;
     }
+    public boolean isAssociated() {
+        return this.assignedToDn.equals("");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/997e9fb7/utils/src/com/cloud/utils/xmlobject/XmlObject.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/xmlobject/XmlObject.java b/utils/src/com/cloud/utils/xmlobject/XmlObject.java
index e133d61..fc8043d 100755
--- a/utils/src/com/cloud/utils/xmlobject/XmlObject.java
+++ b/utils/src/com/cloud/utils/xmlobject/XmlObject.java
@@ -1,9 +1,5 @@
 package com.cloud.utils.xmlobject;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -12,12 +8,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.SAXException;
-
 import com.cloud.utils.exception.CloudRuntimeException;
 
 import edu.emory.mathcs.backport.java.util.Collections;