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:
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",
}
)
+ if addToRegistry:
+ xenrt.TEC().registry.sxProviderPut(name, p)
+
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'])
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):
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:
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):
self.preparecount = 0
self.params = params
self.containerHosts = []
+ self.blueprints = []
parser = None
for n in node.childNodes:
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))
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)
+
</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>