def _to_node()

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,
        )