]> xenbits.xensource.com Git - xenrt-citrix/xenrt.git/commitdiff
Handle blueprints in prepare
authorAlex Brett <alex.brett@citrix.com>
Wed, 18 Nov 2015 14:22:03 +0000 (14:22 +0000)
committerAlex Brett <alex.brett@citrix.com>
Wed, 18 Nov 2015 14:22:03 +0000 (14:22 +0000)
exec/xenrt/lib/scalextreme/sxagent.py
exec/xenrt/registry.py
exec/xenrt/seq/prepare.py
seqs/clmxdpoc.seq
seqs/seq.xsd

index 326197f5fad095411e8587cdf27627494625a4d1..64e6e80c458fae057ae72ce8b17370085bbf4262 100644 (file)
@@ -137,7 +137,7 @@ class SXAgent(object):
 
         return False
 
-    def createEnvironment(self, host=None):
+    def createEnvironment(self, host=None, addToRegistry=True):
         """Create environment with existing agent and XenServer"""
 
         if self.nodeId == None:
@@ -146,8 +146,10 @@ class SXAgent(object):
         if not host:
             host = self.agentVM.host
 
-        self.apiHandler.execute(method="POST", category="providers",
-            params = {"name": xenrt.TEC().lookup("SX_ENVIRONMENT_NAME", "xenrt-%s" % xenrt.TEC().lookup("JOBID", "nojob")),
+        name = xenrt.TEC().lookup("SX_ENVIRONMENT_NAME", "xenrt-%s" % xenrt.TEC().lookup("JOBID", "nojob"))
+
+        p = self.apiHandler.execute(method="POST", category="providers",
+            params = {"name": name,
                 "providercode": "xenserver",
                 "server": "http://" + host.getIP(),
                 "username": "root",
@@ -156,3 +158,6 @@ class SXAgent(object):
             }
         )
 
+        if addToRegistry:
+            xenrt.TEC().registry.sxProviderPut(name, p)
+
index a7c484bf17b18b9f31730ecddd3707b195cc9944..27c73d45a332fbb8c06a227c066fe64b209f224f 100755 (executable)
@@ -455,3 +455,12 @@ class Registry(object):
 
     def srGetAll(self):
         return self.objGetAll("sr")
+
+    def sxProviderPut(self, id, p):
+        self.objPut("sxProvider", id, p)
+
+    def sxProviderGet(self, id):
+        return self.objGet("sxProvider", id)
+
+    def sxProviderGetDefault(self):
+        return self.objGetDefault("sxProvider")
index 8777723b5220a9ffa1af6776f64311940086a3b6..827862066d61e29b921104ff18f9f8add933bcb2 100644 (file)
@@ -26,6 +26,8 @@ class PrepareNodeParserJSON(PrepareNodeParserBase):
             self.handleInstanceNode(x, template=False)
         for x in self.data.get("vlans", []):
             self.handleVLANNode(x)
+        for x in self.data.get("blueprints", []):
+            self.handleBlueprintNode(x)
         
         if "multihosts" in self.data:
             self.handleMultiHostNode(self.data['multihosts'])
@@ -573,6 +575,18 @@ class PrepareNodeParserJSON(PrepareNodeParserBase):
             self.parent.instances.append(instance)
         return instance
 
+    def handleBlueprintNode(self, node):
+        blueprint = {}
+
+        blueprint["name"] = node["name"]
+        blueprint["version"] = node["version"]
+        blueprint["deploymentProfileTemplateName"] = node["version"]
+        if "templateName" in node:
+            blueprint["template"] = node["templateName"]
+
+        self.parent.blueprints.append(blueprint)
+        return blueprint
+
 
 class PrepareNodeParserXML(PrepareNodeParserBase):
 
@@ -610,6 +624,8 @@ class PrepareNodeParserXML(PrepareNodeParserBase):
                 self.handleInstanceNode(n, template=False)
             elif n.localName == "vlan":
                 self.handleVLANNode(n)
+            elif n.localName == "blueprint":
+                self.handleBlueprintNode(n)
         
         # Do the cloud nodes now the other hosts have been allocated
         for n in self.data.childNodes:
@@ -1049,6 +1065,22 @@ class PrepareNodeParserXML(PrepareNodeParserBase):
             self.parent.instances.append(instance)
         return instance
 
+    def handleBlueprintNode(self, node):
+        blueprint = {}
+        blueprint["name"] = self.expand(node.getAttribute("name"))
+        blueprint["version"] = self.expand(node.getAttribute("version"))
+        blueprint["deploymentProfileTemplateName"] = self.expand(node.getAttribute("deploymentProfileTemplateName"))
+
+        for x in node.childNodes:
+            if x.nodeType == x.ELEMENT_NODE:
+                if x.localName == "templateName":
+                    for a in x.childNodes:
+                        if a.nodeType == a.TEXT_NODE:
+                            blueprint["template"] = self.expand(str(a.data))
+
+        self.parent.blueprints.append(blueprint)
+        return blueprint
+
 class PrepareNode(object):
 
     def __init__(self, toplevel, node, params):
@@ -1069,6 +1101,7 @@ class PrepareNode(object):
         self.preparecount = 0
         self.params = params
         self.containerHosts = []
+        self.blueprints = []
 
         parser = None
         for n in node.childNodes:
@@ -1820,6 +1853,20 @@ class PrepareNode(object):
                 for w in workers:
                     if w.exception:        
                         raise w.exception
+            if len(self.blueprints) > 0:
+                queue = InstallWorkQueue()
+                for b in self.blueprints:
+                    queue.add(b)
+                workers = []
+                for i in range(max(int(xenrt.TEC().lookup("PREPARE_WORKERS", "4")), 4)):
+                    w = BlueprintInstallWorker(queue, name="BPWorker%02u" % (i))
+                    workers.append(w)
+                    w.start()
+                for w in workers:
+                    w.join()
+                for w in workers:
+                    if w.exception:
+                        raise w.exception
 
         except Exception, e:
             sys.stderr.write(str(e))
@@ -2060,3 +2107,15 @@ class InstanceInstallWorker(_InstallWorker):
         toolstack = xenrt.TEC().registry.toolstackGetDefault()
         toolstack.createInstance(**work) 
 
+class BlueprintInstallWorker(_InstallWorker):
+    """Worker thread for parallel blueprint installs"""
+    def doWork(self, work):
+        # TODO: Generalise for other hypervisors + multiple pool scenarios etc
+        sxp = xenrt.lib.scalextreme.sxprocess.SXProcess.getByName(work["name"], work["version"], work["deploymentProfileTemplateName"])
+
+        provider = xenrt.TEC().registry.sxProviderGetDefault()
+        template = xenrt.TEC().registry.guestGet(work["template"])
+        host = template.getHost()
+
+        sxp.deploy(provider['providerId'], host, template.getUUID(), template.password)
+
index d93f9897c29079f29a67b996aec2c1d236756431..44f06d038352f29077ad56cab84df452d2c25d1d 100644 (file)
@@ -28,9 +28,9 @@
         <disk device="0" size="32" />
       </vm>
     </host>
+    <blueprint name="XenApp and XenDesktop Proof of Concept (25)" deploymentProfileTemplateName="xenrt-template">
+      <templateName>Windows Server 2012 R2</templateName>
+    </blueprint>
   </prepare>
-  <testsequence>
-    <testcase id="scalextreme.poc.XDPoc" />
-  </testsequence>
 </xenrt>
 
index 5c2668a66f6c405ce0947a92b81c9f0d1dc2ba76..086f6ab45e5dec4d1eb586c9b5dc7eeccdd49371 100755 (executable)
     </xs:sequence>
   </xs:group>
 
+  <xs:group name="blueprint">
+    <xs:sequence>
+      <xs:element name="blueprint" minOccurs="0" maxOccurs="unbounded">
+        <xs:complexType>
+          <xs:attribute name="name" use="required" type="xs:string" />
+          <xs:attribute name="version" use="optional" type="xs:string" />
+          <xs:attribute name="deploymentProfileTemplateName" use="optional" type="xs:string"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="templateName" minOccurs="0" maxOccurs="1" type="xs:string"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+
   <xs:group name="template">
     <xs:sequence>
       <xs:element name ="template" minOccurs="0" maxOccurs="unbounded">
               <xs:group ref="cloud" minOccurs="0" maxOccurs="unbounded"/>
               <xs:group ref="template" minOccurs="0" maxOccurs="unbounded"/>
               <xs:group ref="instance" minOccurs="0" maxOccurs="unbounded"/>
+              <xs:group ref="blueprint" minOccurs="0" maxOccurs="unbounded"/>
             </xs:choice>
           </xs:complexType>
         </xs:element>