in libcloud/compute/drivers/kubevirt.py [0:0]
def attach_volume(self, node, volume, device="disk", ex_bus="virtio", ex_name=None):
"""
params: bus, name , device (disk or lun)
"""
# volume must be bound to a claim
if not volume.extra["is_bound"]:
volume = self._bind_volume(volume, node.extra["namespace"])
if volume is None:
raise LibcloudError(
"Selected Volume (PV) could not be bound "
"(to a PVC), please select another volume",
driver=self,
)
claimName = volume.extra["pvc"]["name"]
if ex_name is None:
name = claimName
else:
name = ex_name
namespace = volume.extra["pvc"]["namespace"]
# check if vm is stopped
self.stop_node(node)
# check if it is the same namespace
if node.extra["namespace"] != namespace:
msg = "The PVC and the VM must be in the same namespace"
raise ValueError(msg)
vm = node.name
req = KUBEVIRT_URL + "namespaces/" + namespace + "/virtualmachines/" + vm
disk_dict = {device: {"bus": ex_bus}, "name": name}
volumes_dict = {"persistentVolumeClaim": {"claimName": claimName}, "name": name}
# Get all the volumes of the vm
try:
result = self.connection.request(req).object
except Exception:
raise
disks = result["spec"]["template"]["spec"]["domain"]["devices"]["disks"]
volumes = result["spec"]["template"]["spec"]["volumes"]
disks.append(disk_dict)
volumes.append(volumes_dict)
# now patch the new volumes and disks lists into the resource
headers = {"Content-Type": "application/merge-patch+json"}
data = {
"spec": {
"template": {
"spec": {
"volumes": volumes,
"domain": {"devices": {"disks": disks}},
}
}
}
}
try:
result = self.connection.request(
req, method="PATCH", data=json.dumps(data), headers=headers
)
if "pvcs" in node.extra:
node.extra["pvcs"].append(claimName)
else:
node.extra["pvcs"] = [claimName]
return result in VALID_RESPONSE_CODES
except Exception:
raise