From f4feeda7440cc7f3fbc2caee2b7e5c4bb4f65a3c Mon Sep 17 00:00:00 2001 From: Alex Brett Date: Wed, 18 Nov 2015 14:22:03 +0000 Subject: [PATCH] Handle blueprints in prepare --- exec/xenrt/lib/scalextreme/sxagent.py | 11 +++-- exec/xenrt/registry.py | 9 ++++ exec/xenrt/seq/prepare.py | 59 +++++++++++++++++++++++++++ seqs/clmxdpoc.seq | 6 +-- seqs/seq.xsd | 16 ++++++++ 5 files changed, 95 insertions(+), 6 deletions(-) diff --git a/exec/xenrt/lib/scalextreme/sxagent.py b/exec/xenrt/lib/scalextreme/sxagent.py index 326197f5f..64e6e80c4 100644 --- a/exec/xenrt/lib/scalextreme/sxagent.py +++ b/exec/xenrt/lib/scalextreme/sxagent.py @@ -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) + diff --git a/exec/xenrt/registry.py b/exec/xenrt/registry.py index a7c484bf1..27c73d45a 100755 --- a/exec/xenrt/registry.py +++ b/exec/xenrt/registry.py @@ -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") diff --git a/exec/xenrt/seq/prepare.py b/exec/xenrt/seq/prepare.py index 8777723b5..827862066 100644 --- a/exec/xenrt/seq/prepare.py +++ b/exec/xenrt/seq/prepare.py @@ -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) + diff --git a/seqs/clmxdpoc.seq b/seqs/clmxdpoc.seq index d93f9897c..44f06d038 100644 --- a/seqs/clmxdpoc.seq +++ b/seqs/clmxdpoc.seq @@ -28,9 +28,9 @@ + + Windows Server 2012 R2 + - - - diff --git a/seqs/seq.xsd b/seqs/seq.xsd index 5c2668a66..086f6ab45 100755 --- a/seqs/seq.xsd +++ b/seqs/seq.xsd @@ -223,6 +223,21 @@ + + + + + + + + + + + + + + + @@ -567,6 +582,7 @@ + -- 2.39.5