in libcloud/compute/drivers/kubevirt.py [0:0]
def _to_node(self, vm, is_stopped=False): # type: (dict, bool) -> Node
"""
converts a vm from the kubevirt API to a libcloud node
:param vm: kubevirt vm object
:type vm: dict
:param is_stopped: if the vm is stopped, it will not have a pod
:type is_stopped: bool
:return: a libcloud node
:rtype: :class:`Node`
"""
ID = vm["metadata"]["uid"]
name = vm["metadata"]["name"]
driver = self.connection.driver
extra = {"namespace": vm["metadata"]["namespace"]}
extra["pvcs"] = []
memory = 0
if "limits" in vm["spec"]["template"]["spec"]["domain"]["resources"]:
if "memory" in vm["spec"]["template"]["spec"]["domain"]["resources"]["limits"]:
memory = vm["spec"]["template"]["spec"]["domain"]["resources"]["limits"]["memory"]
elif vm["spec"]["template"]["spec"]["domain"]["resources"].get("requests", None):
if vm["spec"]["template"]["spec"]["domain"]["resources"]["requests"].get(
"memory", None
):
memory = vm["spec"]["template"]["spec"]["domain"]["resources"]["requests"]["memory"]
memory = _memory_in_MB(memory)
memory_req = (
vm["spec"]["template"]["spec"]["domain"]["resources"]
.get("requests", {})
.get("memory", None)
)
if memory_req:
memory_req = _memory_in_MB(memory_req)
else:
memory_req = memory
cpu = 1
if vm["spec"]["template"]["spec"]["domain"]["resources"].get("limits", None):
if vm["spec"]["template"]["spec"]["domain"]["resources"]["limits"].get("cpu", None):
cpu = vm["spec"]["template"]["spec"]["domain"]["resources"]["limits"]["cpu"]
elif vm["spec"]["template"]["spec"]["domain"]["resources"].get("requests", None) and vm[
"spec"
]["template"]["spec"]["domain"]["resources"]["requests"].get("cpu", None):
cpu = vm["spec"]["template"]["spec"]["domain"]["resources"]["requests"]["cpu"]
cpu_req = cpu
elif vm["spec"]["template"]["spec"]["domain"].get("cpu", None):
cpu = vm["spec"]["template"]["spec"]["domain"]["cpu"].get("cores", 1)
if not isinstance(cpu, int):
cpu = int(cpu.rstrip("m"))
cpu_req = (
vm["spec"]["template"]["spec"]["domain"]["resources"]
.get("requests", {})
.get("cpu", None)
)
if cpu_req is None:
cpu_req = cpu
extra_size = {"cpu": cpu, "cpu_request": cpu_req, "ram": memory, "ram_request": memory_req}
size_name = "{} vCPUs, {}MB Ram".format(str(cpu), str(memory))
size_id = hashlib.md5(size_name.encode("utf-8")).hexdigest() # nosec
size = NodeSize(
id=size_id,
name=size_name,
ram=memory,
disk=0,
bandwidth=0,
price=0,
driver=driver,
extra=extra_size,
)
extra["memory"] = memory
extra["cpu"] = cpu
image_name = "undefined"
for volume in vm["spec"]["template"]["spec"]["volumes"]:
for k, v in volume.items():
if type(v) is dict:
if "image" in v:
image_name = v["image"]
image = NodeImage(image_name, image_name, driver)
if "volumes" in vm["spec"]["template"]["spec"]:
for volume in vm["spec"]["template"]["spec"]["volumes"]:
if "persistentVolumeClaim" in volume:
extra["pvcs"].append(volume["persistentVolumeClaim"]["claimName"])
port_forwards = []
services = self.ex_list_services(namespace=extra["namespace"], node_name=name)
for service in services:
service_type = service["spec"].get("type")
for port_pair in service["spec"]["ports"]:
protocol = port_pair.get("protocol")
public_port = port_pair.get("port")
local_port = port_pair.get("targetPort")
try:
int(local_port)
except ValueError:
local_port = public_port
port_forwards.append(
{
"local_port": local_port,
"public_port": public_port,
"protocol": protocol,
"service_type": service_type,
}
)
extra["port_forwards"] = port_forwards
if is_stopped:
state = NodeState.STOPPED
public_ips = None
private_ips = None
return Node(
id=ID,
name=name,
state=state,
public_ips=public_ips,
private_ips=private_ips,
driver=driver,
size=size,
image=image,
extra=extra,
)
# getting image and image_ID from the container
req = ROOT_URL + "namespaces/" + extra["namespace"] + "/pods"
result = self.connection.request(req).object
pod = None
for pd in result["items"]:
if "metadata" in pd and "ownerReferences" in pd["metadata"]:
if pd["metadata"]["ownerReferences"][0]["name"] == name:
pod = pd
if pod is None or "containerStatuses" not in pod["status"]:
state = NodeState.PENDING
public_ips = None
private_ips = None
return Node(
id=ID,
name=name,
state=state,
public_ips=public_ips,
private_ips=private_ips,
driver=driver,
size=size,
image=image,
extra=extra,
)
extra["pod"] = {"name": pod["metadata"]["name"]}
for cont_status in pod["status"]["containerStatuses"]:
# only 2 containers are present the launcher and the vmi
if cont_status["name"] != "compute":
image = NodeImage(ID, cont_status["image"], driver)
state = (
NodeState.RUNNING if "running" in cont_status["state"] else NodeState.PENDING
)
public_ips = None
created_at = datetime.strptime(vm["metadata"]["creationTimestamp"], "%Y-%m-%dT%H:%M:%SZ")
if "podIPs" in pod["status"]:
private_ips = [ip["ip"] for ip in pod["status"]["podIPs"]]
else:
private_ips = []
return Node(
id=ID,
name=name,
state=state,
public_ips=public_ips,
private_ips=private_ips,
driver=driver,
size=size,
image=image,
extra=extra,
created_at=created_at,
)