# encoding=utf-8
#
# Copyright (C) 2013 Red Hat, Inc.
#
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.
import os.path
import pytest
import libvirt
from virtinst import Guest
from virtinst import NodeDevice
from virtinst import DeviceHostdev
from tests import utils
# Requires XML_SANITIZE to parse correctly, see bug 1184131
funky_chars_xml = """
L3B2616
"""
DATADIR = utils.DATADIR + "/nodedev/"
def _nodeDevFromName(conn, devname):
node = conn.nodeDeviceLookupByName(devname)
xml = node.XMLDesc(0)
return NodeDevice(conn, xml)
def _testNode2DeviceCompare(conn, nodename, devfile, nodedev=None):
devfile = os.path.join(DATADIR, "devxml", devfile)
if not nodedev:
nodedev = _nodeDevFromName(conn, nodename)
dev = DeviceHostdev(conn)
dev.set_from_nodedev(nodedev)
dev.set_defaults(Guest(conn))
utils.diff_compare(dev.get_xml() + "\n", devfile)
def testFunkyChars():
# Ensure parsing doesn't fail
conn = utils.URIs.open_testdriver_cached()
dev = NodeDevice(conn, funky_chars_xml)
assert dev.name == "L3B2616"
assert dev.device_type == "LENOVO"
def testNetDevice():
conn = utils.URIs.open_testdriver_cached()
devname = "net_00_1c_25_10_b1_e4"
dev = _nodeDevFromName(conn, devname)
assert dev.name == devname
assert dev.parent == "pci_8086_1049"
assert dev.device_type == "net"
assert dev.interface == "eth0"
def testPCIDevice():
conn = utils.URIs.open_testdriver_cached()
nodename = "pci_8086_10fb"
obj = _nodeDevFromName(conn, nodename)
assert obj.is_pci_sriov() is True
nodename = "pci_8086_2448"
obj = _nodeDevFromName(conn, nodename)
assert obj.is_pci_bridge() is True
def testUSBDevDevice():
conn = utils.URIs.open_testdriver_cached()
devname = "usb_device_781_5151_2004453082054CA1BEEE"
dev = _nodeDevFromName(conn, devname)
assert dev.vendor_name == "SanDisk Corp."
assert dev.product_name == "Cruzer Micro 256/512MB Flash Drive"
devname = "usb_device_1d6b_1_0000_00_1a_0"
dev = _nodeDevFromName(conn, devname)
assert dev.is_usb_linux_root_hub() is True
def testSCSIDevice():
conn = utils.URIs.open_testdriver_cached()
devname = "pci_8086_2829_scsi_host_scsi_device_lun0"
dev = _nodeDevFromName(conn, devname)
assert dev.host == "0"
assert dev.bus == "0"
assert dev.target == "0"
def testStorageDevice():
conn = utils.URIs.open_testdriver_cached()
devname = "storage_serial_SATA_WDC_WD1600AAJS__WD_WCAP95119685"
dev = _nodeDevFromName(conn, devname)
assert dev.block == "/dev/sda"
assert dev.drive_type == "disk"
assert dev.media_available is None
devname = "storage_model_DVDRAM_GSA_U1200N"
dev = _nodeDevFromName(conn, devname)
assert dev.media_label == "Fedora12_media"
assert dev.media_available == 1
def testSCSIBus():
conn = utils.URIs.open_testdriver_cached()
devname = "pci_8086_2829_scsi_host_1"
dev = _nodeDevFromName(conn, devname)
assert dev.host == "2"
def testDRMDevice():
conn = utils.URIs.open_testdriver_cached()
devname = "drm_renderD129"
dev = _nodeDevFromName(conn, devname)
assert dev.devnodes[0].path == "/dev/dri/renderD129"
assert dev.devnodes[0].node_type == "dev"
assert dev.devnodes[1].path == "/dev/dri/by-path/pci-0000:00:02.0-render"
assert dev.devnodes[1].node_type == "link"
assert dev.is_drm_render() is True
assert dev.get_devnode("frob")
def testDASDMdev():
conn = utils.URIs.open_testdriver_cached()
devname = "mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110"
dev = _nodeDevFromName(conn, devname)
assert dev.name == devname
assert dev.parent == "css_0_0_0023"
assert dev.device_type == "mdev"
assert dev.type_id == "vfio_ccw-io"
def testAPQNMdev():
conn = utils.URIs.open_testdriver_cached()
devname = "mdev_11f92c9d_b0b0_4016_b306_a8071277f8b9"
dev = _nodeDevFromName(conn, devname)
assert dev.name == devname
assert dev.parent == "ap_matrix"
assert dev.device_type == "mdev"
assert dev.type_id == "vfio_ap-passthrough"
def testPCIMdev():
conn = utils.URIs.open_testdriver_cached()
devname = "mdev_4b20d080_1b54_4048_85b3_a6a62d165c01"
dev = _nodeDevFromName(conn, devname)
assert dev.name == devname
assert dev.parent == "pci_0000_06_00_0"
assert dev.device_type == "mdev"
assert dev.type_id == "nvidia-11"
assert dev.get_mdev_uuid() == "4b20d080-1b54-4048-85b3-a6a62d165c01"
# libvirt <7.3.0 doesn't support in the mdev node device xml
@pytest.mark.skipif(libvirt.getVersion() < 7003000, reason="libvirt version doesn't support new mdev format")
def testPCIMdevNewFormat():
conn = utils.URIs.open_testdriver_cached()
devname = "mdev_35ceae7f_eea5_4f28_b7f3_7b12a3e62d3c_0000_06_00_0"
dev = _nodeDevFromName(conn, devname)
assert dev.name == devname
assert dev.parent == "pci_0000_06_00_0"
assert dev.device_type == "mdev"
assert dev.type_id == "nvidia-11"
assert dev.get_mdev_uuid() == "35ceae7f-eea5-4f28-b7f3-7b12a3e62d3c"
# NodeDevice 2 Device XML tests
def testNodeDev2USB1():
conn = utils.URIs.open_testdriver_cached()
nodename = "usb_device_781_5151_2004453082054CA1BEEE"
devfile = "usbdev1.xml"
_testNode2DeviceCompare(conn, nodename, devfile)
def testNodeDev2USB2():
conn = utils.URIs.open_testdriver_cached()
nodename = "usb_device_1d6b_2_0000_00_1d_7"
devfile = "usbdev2.xml"
nodedev = _nodeDevFromName(conn, nodename)
_testNode2DeviceCompare(conn, nodename, devfile, nodedev=nodedev)
def testNodeDev2PCI():
conn = utils.URIs.open_testdriver_cached()
nodename = "pci_1180_592"
devfile = "pcidev.xml"
_testNode2DeviceCompare(conn, nodename, devfile)
def testNodeDevFail():
conn = utils.URIs.open_testdriver_cached()
nodename = "usb_device_1d6b_1_0000_00_1d_1_if0"
devfile = ""
# This should exist, since usbbus is not a valid device to
# pass to a guest.
with pytest.raises(ValueError):
_testNode2DeviceCompare(conn, nodename, devfile)