def _clone_node()

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