in libcloud/compute/drivers/vcloud.py [0:0]
def _clone_node(self, name, sourceNode, vdc, clone_timeout):
clone_xml = ET.Element(
"CloneVAppParams",
{
"name": name,
"deploy": "false",
"powerOn": "false",
"xmlns": "http://www.vmware.com/vcloud/v1.5",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
},
)
ET.SubElement(clone_xml, "Description").text = "Clone of " + sourceNode.name
ET.SubElement(clone_xml, "Source", {"href": sourceNode.id})
headers = {"Content-Type": "application/vnd.vmware.vcloud.cloneVAppParams+xml"}
res = self.connection.request(
"%s/action/cloneVApp" % get_url_path(vdc.id),
data=ET.tostring(clone_xml),
method="POST",
headers=headers,
)
vapp_name = res.object.get("name")
vapp_href = res.object.get("href")
task_href = res.object.find(fixxpath(res.object, "Tasks/Task")).get("href")
self._wait_for_task_completion(task_href, clone_timeout)
res = self.connection.request(get_url_path(vapp_href))
vms = res.object.findall(fixxpath(res.object, "Children/Vm"))
# Fix the networking for VMs
for i, vm in enumerate(vms):
# Remove network
network_xml = ET.Element(
"NetworkConnectionSection",
{
"ovf:required": "false",
"xmlns": "http://www.vmware.com/vcloud/v1.5",
"xmlns:ovf": "http://schemas.dmtf.org/ovf/envelope/1",
},
)
ET.SubElement(network_xml, "ovf:Info").text = (
"Specifies the available VM network connections"
)
headers = {"Content-Type": "application/vnd.vmware.vcloud.networkConnectionSection+xml"}
res = self.connection.request(
"%s/networkConnectionSection" % get_url_path(vm.get("href")),
data=ET.tostring(network_xml),
method="PUT",
headers=headers,
)
self._wait_for_task_completion(res.object.get("href"))
# Re-add network
network_xml = vm.find(fixxpath(vm, "NetworkConnectionSection"))
network_conn_xml = network_xml.find(fixxpath(network_xml, "NetworkConnection"))
network_conn_xml.set("needsCustomization", "true")
network_conn_xml.remove(network_conn_xml.find(fixxpath(network_xml, "IpAddress")))
network_conn_xml.remove(network_conn_xml.find(fixxpath(network_xml, "MACAddress")))
headers = {"Content-Type": "application/vnd.vmware.vcloud.networkConnectionSection+xml"}
res = self.connection.request(
"%s/networkConnectionSection" % get_url_path(vm.get("href")),
data=ET.tostring(network_xml),
method="PUT",
headers=headers,
)
self._wait_for_task_completion(res.object.get("href"))
return vapp_name, vapp_href