diff options
Diffstat (limited to 'cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers')
13 files changed, 834 insertions, 0 deletions
diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/base.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/base.py new file mode 100644 index 0000000..2041330 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/base.py @@ -0,0 +1,105 @@ +# Copyright 2018 Intel, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock +import os +import subprocess + +import fixtures + +from cyborg.accelerator.drivers.fpga.base import FPGADriver +from cyborg.accelerator.drivers.fpga.intel import sysinfo +from cyborg.tests import base +from cyborg.tests.unit.accelerator.drivers.fpga.intel import prepare_test_data + + +class TestFPGADriver(base.TestCase): + + def setUp(self): + super(TestFPGADriver, self).setUp() + self.syspath = sysinfo.SYS_FPGA + sysinfo.SYS_FPGA = "/sys/class/fpga" + tmp_sys_dir = self.useFixture(fixtures.TempDir()) + prepare_test_data.create_fake_sysfs(tmp_sys_dir.path) + sysinfo.SYS_FPGA = os.path.join( + tmp_sys_dir.path, sysinfo.SYS_FPGA.split("/", 1)[-1]) + + def tearDown(self): + super(TestFPGADriver, self).tearDown() + sysinfo.SYS_FPGA = self.syspath + + def test_create(self): + FPGADriver.create("intel") + self.assertRaises(LookupError, FPGADriver.create, "xilinx") + + def test_discover(self): + d = FPGADriver() + self.assertRaises(NotImplementedError, d.discover) + + def test_program(self): + d = FPGADriver() + self.assertRaises(NotImplementedError, d.program, "path", "image") + + def test_intel_discover(self): + expect = [{'function': 'pf', 'assignable': False, 'pr_num': '1', + 'vendor_id': '0x8086', 'devices': '0000:5e:00.0', + 'regions': [{ + 'function': 'vf', 'assignable': True, + 'product_id': '0xbcc1', + 'name': 'intel-fpga-dev.2', + 'parent_devices': '0000:5e:00.0', + 'path': '%s/intel-fpga-dev.2' % sysinfo.SYS_FPGA, + 'vendor_id': '0x8086', + 'devices': '0000:5e:00.1'}], + 'name': 'intel-fpga-dev.0', + 'parent_devices': '', + 'path': '%s/intel-fpga-dev.0' % sysinfo.SYS_FPGA, + 'product_id': '0xbcc0'}, + {'function': 'pf', 'assignable': True, 'pr_num': '0', + 'vendor_id': '0x8086', 'devices': '0000:be:00.0', + 'name': 'intel-fpga-dev.1', + 'parent_devices': '', + 'path': '%s/intel-fpga-dev.1' % sysinfo.SYS_FPGA, + 'product_id': '0xbcc0'}] + expect.sort() + + intel = FPGADriver.create("intel") + fpgas = intel.discover() + fpgas.sort() + self.assertEqual(2, len(fpgas)) + self.assertEqual(fpgas, expect) + + @mock.patch.object(subprocess, 'Popen', autospec=True) + def test_intel_program(self, mock_popen): + + class p(object): + returncode = 0 + + def wait(self): + pass + + b = "0x5e" + d = "0x00" + f = "0x0" + expect_cmd = ['sudo', 'fpgaconf', '-b', b, + '-d', d, '-f', f, '/path/image'] + mock_popen.return_value = p() + intel = FPGADriver.create("intel") + # program VF + intel.program("0000:5e:00.1", "/path/image") + mock_popen.assert_called_with(expect_cmd, stdout=subprocess.PIPE) + + # program PF + intel.program("0000:5e:00.0", "/path/image") + mock_popen.assert_called_with(expect_cmd, stdout=subprocess.PIPE) diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/driver.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/driver.py new file mode 100644 index 0000000..5760ecf --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/driver.py @@ -0,0 +1,93 @@ +# Copyright 2018 Intel, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock +import os +import subprocess + +import fixtures + +from cyborg.accelerator.drivers.fpga.intel import sysinfo +from cyborg.accelerator.drivers.fpga.intel.driver import IntelFPGADriver +from cyborg.tests import base +from cyborg.tests.unit.accelerator.drivers.fpga.intel import prepare_test_data + + +class TestIntelFPGADriver(base.TestCase): + + def setUp(self): + super(TestIntelFPGADriver, self).setUp() + self.syspath = sysinfo.SYS_FPGA + sysinfo.SYS_FPGA = "/sys/class/fpga" + tmp_sys_dir = self.useFixture(fixtures.TempDir()) + prepare_test_data.create_fake_sysfs(tmp_sys_dir.path) + sysinfo.SYS_FPGA = os.path.join( + tmp_sys_dir.path, sysinfo.SYS_FPGA.split("/", 1)[-1]) + + def tearDown(self): + super(TestIntelFPGADriver, self).tearDown() + sysinfo.SYS_FPGA = self.syspath + + def test_discover(self): + expect = [{'function': 'pf', 'assignable': False, 'pr_num': '1', + 'vendor_id': '0x8086', 'devices': '0000:5e:00.0', + 'regions': [{ + 'function': 'vf', 'assignable': True, + 'product_id': '0xbcc1', + 'name': 'intel-fpga-dev.2', + 'parent_devices': '0000:5e:00.0', + 'path': '%s/intel-fpga-dev.2' % sysinfo.SYS_FPGA, + 'vendor_id': '0x8086', + 'devices': '0000:5e:00.1'}], + 'name': 'intel-fpga-dev.0', + 'parent_devices': '', + 'path': '%s/intel-fpga-dev.0' % sysinfo.SYS_FPGA, + 'product_id': '0xbcc0'}, + {'function': 'pf', 'assignable': True, 'pr_num': '0', + 'vendor_id': '0x8086', 'devices': '0000:be:00.0', + 'parent_devices': '', + 'name': 'intel-fpga-dev.1', + 'path': '%s/intel-fpga-dev.1' % sysinfo.SYS_FPGA, + 'product_id': '0xbcc0'}] + expect.sort() + + intel = IntelFPGADriver() + fpgas = intel.discover() + fpgas.sort() + self.assertEqual(2, len(fpgas)) + self.assertEqual(fpgas, expect) + + @mock.patch.object(subprocess, 'Popen', autospec=True) + def test_intel_program(self, mock_popen): + + class p(object): + returncode = 0 + + def wait(self): + pass + + b = "0x5e" + d = "0x00" + f = "0x0" + expect_cmd = ['sudo', 'fpgaconf', '-b', b, + '-d', d, '-f', f, '/path/image'] + mock_popen.return_value = p() + intel = IntelFPGADriver() + # program VF + intel.program("0000:5e:00.1", "/path/image") + mock_popen.assert_called_with(expect_cmd, stdout=subprocess.PIPE) + + # program PF + intel.program("0000:5e:00.0", "/path/image") + mock_popen.assert_called_with(expect_cmd, stdout=subprocess.PIPE) diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/prepare_test_data.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/prepare_test_data.py new file mode 100644 index 0000000..8955c39 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/fpga/intel/prepare_test_data.py @@ -0,0 +1,295 @@ +# Copyright 2018 Intel, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import argparse +import copy +import glob +import os +import shutil + + +PF0_ADDR = "0000:5e:00.0" +PF1_ADDR = "0000:be:00.0" +VF0_ADDR = "0000:5e:00.1" +FPGA_TREE = { + "dev.0": {"bdf": PF0_ADDR, + "regions": {"dev.2": {"bdf": VF0_ADDR}}}, + "dev.1": {"bdf": PF1_ADDR}} + +SYS_DEVICES = "sys/devices" +SYS_CLASS_FPGA = "sys/class/fpga" + +DEV_PREFIX = "intel-fpga" + +PGFA_DEVICE_COMMON_SUB_DIR = ["power"] + +PGFA_DEVICE_COMMON_CONTENT = { + "broken_parity_status": "0", + "class": "0x120000", + "config": "", + "consistent_dma_mask_bits": "64", + "d3cold_allowed": "1", + "device": "0xbcc0", + "dma_mask_bits": "64", + "driver_override": "(null)", + "enable": "1", + "irq": "16", + "local_cpulist": "0-111", + "local_cpus": "00000000,00000000,00000000,00000000,00000000," + "00000000,00000000,00000000,00000000,00000000," + "0000ffff,ffffffff,ffffffff,ffffffff", + "modalias": "pci:v00008086d0000BCC0sv00000000sd00000000bc12sc00i00", + "msi_bus": "", + "numa_node": "-1", + "resource": [ + "0x00000000c6000000 0x00000000c607ffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x00000000c6080000 0x00000000c60fffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x00000000c6100000 0x00000000c617ffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000"], + "resource0": "", + "resource0_wc": "", + "subsystem_device": "0x0000", + "subsystem_vendor": "0x0000", + "uevent": [ + "DRIVER=intel-fpga-pci", + "PCI_CLASS=120000", + "PCI_ID=8086:BCC0", + "PCI_SUBSYS_ID=0000:0000", + "PCI_SLOT_NAME=0000:5e:00.0", + "MODALIAS=pci:v00008086d0000BCC0sv00000000sd00000000bc12sc00i00"], + "vendor": "0x8086"} + +PGFA_DEVICES_SPECIAL_COMMON_CONTENT = { + "dev.0": { + "resource2": "", + "resource2_wc": "", + "sriov_numvfs": "1", + "sriov_totalvfs": "1", + }, + "dev.1": { + "resource": [ + "0x00000000fbc00000 0x00000000fbc7ffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x00000000fbc80000 0x00000000fbcfffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x00000000fbd00000 0x00000000fbd7ffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000"], + "resource2": "", + "resource2_wc": "", + "sriov_numvfs": "0", + "sriov_totalvfs": "1", + "uevent": [ + "DRIVER=intel-fpga-pci", + "PCI_CLASS=120000", + "PCI_ID=8086:BCC0", + "PCI_SUBSYS_ID=0000:0000", + "PCI_SLOT_NAME=0000:be:00.0", + "MODALIAS=pci:v00008086d0000BCC0sv00000000sd00000000bc12sc00i00"], + }, + "dev.2": { + "d3cold_allowed": "0", + "device": "0xbcc1", + "modalias": "pci:v00008086d0000BCC0sv00000000sd00000000bc12sc00i00", + "irq": "0", + "resource": [ + "0x00000000c6100000 0x00000000c617ffff 0x000000000014220c", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000", + "0x0000000000000000 0x0000000000000000 0x0000000000000000"], + "uevent": [ + "DRIVER=intel-fpga-pci", + "PCI_CLASS=120000", + "PCI_ID=8086:BCC1", + "PCI_SUBSYS_ID=0000:0000", + "PCI_SLOT_NAME=0000:5e:00.1", + "MODALIAS=pci:v00008086d0000BCC1sv00000000sd00000000bc12sc00i00"], + } +} + +PGFA_DEVICE_COMMON_SOFT_LINK = { + "driver": "../../../bus/pci/drivers/intel-fpga-pci", + "iommu": "../../virtual/iommu/dmar8", + "iommu_group": "../../../kernel/iommu_groups/75", + "subsystem": "../../../bus/pci" +} + +PGFA_DEVICES_SPECIAL_SOFT_LINK = { + "dev.0": { + "firmware_node": "../../LNXSYSTM:00/device:00/PNP0A08:18/device:1d4", + }, + "dev.1": { + "firmware_node": "../../LNXSYSTM:00/device:00/PNP0A08:19/device:1d5", + "iommu": "../../virtual/iommu/dmar4", + "iommu_group": "../../../kernel/iommu_groups/76", + }, + "dev.2": { + "iommu": "../../virtual/iommu/dmar9", + "iommu_group": "../../../kernel/iommu_groups/81", + } +} +PGFA_DEVICES_SPECIAL_SOFT_LINK = { + "dev.0": { + "firmware_node": "../../LNXSYSTM:00/device:00/PNP0A08:18/device:1d4", + }, + "dev.1": { + "firmware_node": "../../LNXSYSTM:00/device:00/PNP0A08:19/device:1d5", + "iommu": "../../virtual/iommu/dmar4", + "iommu_group": "../../../kernel/iommu_groups/76", + }, + "dev.2": { + "iommu": "../../virtual/iommu/dmar9", + "iommu_group": "../../../kernel/iommu_groups/81", + } +} + +PGFA_DEVICE_PF_SOFT_LINK = { + "virtfn": lambda k, v: (k + str(int(v.rsplit(".", 1)[-1]) - 1), + "/".join(["..", v])) +} + +PGFA_DEVICE_VF_SOFT_LINK = { + "physfn": lambda k, v: (k, "/".join(["..", v])) +} + + +def gen_fpga_content(path, dev): + content = copy.copy(PGFA_DEVICE_COMMON_CONTENT) + content.update(PGFA_DEVICES_SPECIAL_COMMON_CONTENT[dev]) + for k, v in content.items(): + p = os.path.join(path, k) + if not v: + os.mknod(p) + elif type(v) is str: + with open(p, 'a') as f: + f.write(v + "\n") + elif type(v) is list: + with open(p, 'a') as f: + f.writelines([l + "\n" for l in v]) + + +def gen_fpga_sub_dir(path): + for d in PGFA_DEVICE_COMMON_SUB_DIR: + p = os.path.join(path, d) + os.makedirs(p) + + +def gen_fpga_pf_soft_link(path, bdf): + for k, v in PGFA_DEVICE_PF_SOFT_LINK.items(): + if callable(v): + k, v = v(k, bdf) + os.symlink(v, os.path.join(path, k)) + + +def gen_fpga_common_soft_link(path, bdf): + for k, v in PGFA_DEVICE_COMMON_SOFT_LINK.items(): + os.symlink(v, os.path.join(path, k)) + + +def gen_fpga_vf_soft_link(path, bdf): + for k, v in PGFA_DEVICE_VF_SOFT_LINK.items(): + if callable(v): + k, v = v(k, bdf) + os.symlink(v, os.path.join(path, k)) + + +def create_devices_path_and_files(tree, device_path, class_fpga_path, + vf=False, pfinfo={}): + for k, v in tree.items(): + bdf = v["bdf"] + pci_path = "pci" + bdf.rsplit(":", 1)[0] + bdf_path = os.path.join(device_path, pci_path, bdf) + ln = "-".join([DEV_PREFIX, k]) + dev_path = os.path.join(bdf_path, "fpga", ln) + os.makedirs(dev_path) + gen_fpga_content(bdf_path, k) + gen_fpga_sub_dir(bdf_path) + if vf: + gen_fpga_pf_soft_link(pfinfo["path"], bdf) + gen_fpga_vf_soft_link(bdf_path, pfinfo["bdf"]) + pfinfo = {"path": bdf_path, "bdf": bdf} + if "regions" in v: + create_devices_path_and_files( + v["regions"], device_path, class_fpga_path, True, pfinfo) + source = dev_path.split("sys")[-1] + os.symlink("../.." + source, os.path.join(class_fpga_path, ln)) + os.symlink("../../../" + bdf, os.path.join(dev_path, "device")) + + +def create_devices_soft_link(class_fpga_path): + devs = glob.glob1(class_fpga_path, "*") + for dev in devs: + path = os.path.realpath("%s/%s/device" % (class_fpga_path, dev)) + softlinks = copy.copy(PGFA_DEVICE_COMMON_SOFT_LINK) + softlinks.update( + PGFA_DEVICES_SPECIAL_SOFT_LINK[dev.rsplit("-", 1)[-1]]) + for k, v in softlinks.items(): + source = os.path.normpath(os.path.join(path, v)) + if not os.path.exists(source): + os.makedirs(source) + os.symlink(v, os.path.join(path, k)) + + +def create_fake_sysfs(prefix=""): + sys_device = os.path.join(prefix, SYS_DEVICES) + sys_class_fpga = os.path.join(prefix, SYS_CLASS_FPGA) + basedir = os.path.dirname(sys_device) + if os.path.exists(basedir): + shutil.rmtree(basedir, ignore_errors=False, onerror=None) + os.makedirs(sys_class_fpga) + create_devices_path_and_files(FPGA_TREE, sys_device, sys_class_fpga) + create_devices_soft_link(sys_class_fpga) + + +def main(): + create_fake_sysfs() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Generate a fake sysfs for intel FPGA.") + group = parser.add_mutually_exclusive_group() + group.add_argument("-v", "--verbose", action="store_true") + group.add_argument("-q", "--quiet", action="store_true") + parser.add_argument("-p", "--prefix", type=str, + default="/tmp", dest="p", + help='Set the prefix path of the fake sysfs. ' + 'default "/tmp"') + args = parser.parse_args() + + create_fake_sysfs(args.p) diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/modules/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/modules/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/modules/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/modules/test_generic.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/modules/test_generic.py new file mode 100644 index 0000000..bf066e4 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/modules/test_generic.py @@ -0,0 +1,66 @@ +# Copyright 2017 Lenovo Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Base classes for Generic Driver tests.""" + +import mock + +from cyborg.accelerator.drivers.generic_driver import GenericDriver as generic +from cyborg.conductor.rpcapi import ConductorAPI as conductor_api + +FAKE_CONTEXT = mock.MagicMock() + + +class GenericDriverTest(): + """Class for testing of generic driver + """ + + def setUp(self): + super(GenericDriverTest, self).setUp() + + @mock.patch.object(conductor_api, 'accelerator_create') + def test_create_accelerator(self, mock_acc_create): + mock_acc_create.return_value = self.acc + generic.create_accelerator(context=FAKE_CONTEXT) + + mock_acc_create.assert_called() + + @mock.patch.object(conductor_api, 'accelerator_list_one') + def test_get_accelerator(self, mock_acc_get): + mock_acc_get.return_value = self.acc + generic.get_accelerator(context=FAKE_CONTEXT) + + mock_acc_get.assert_called() + + @mock.patch.object(conductor_api, 'accelerator_list_all') + def test_list_accelerators(self, mock_acc_list): + mock_acc_list.return_value = self.acc + generic.list_accelerators(context=FAKE_CONTEXT) + + mock_acc_list.assert_called() + + @mock.patch.object(conductor_api, 'accelerator_update') + def test_update_accelerator(self, mock_acc_update): + mock_acc_update.return_value = self.acc + generic.update_accelerator(context=FAKE_CONTEXT) + + mock_acc_update.assert_called() + + @mock.patch.object(conductor_api, 'accelerator_delete') + def test_delete_accelerator(self, mock_acc_delete): + mock_acc_delete.return_value = self.acc + generic.delete_accelerator(context=FAKE_CONTEXT) + + mock_acc_delete.assert_called() diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/nvmf/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/nvmf/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/nvmf/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/nvmf/test_nvmf.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/nvmf/test_nvmf.py new file mode 100644 index 0000000..9f9a5be --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/nvmf/test_nvmf.py @@ -0,0 +1,131 @@ +# Copyright 2017 Huawei Technologies Co.,LTD. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cyborg.tests import base +import mock +from cyborg.accelerator.drivers.spdk.nvmf.nvmf import NVMFDRIVER +from cyborg.accelerator.drivers.spdk.util import common_fun +from cyborg.accelerator.drivers.spdk.util.pyspdk.nvmf_client import NvmfTgt + + +class TestNVMFDRIVER(base.TestCase): + + def setUp(self,): + super(TestNVMFDRIVER, self).setUp() + self.nvmf_driver = NVMFDRIVER() + + def tearDown(self): + super(TestNVMFDRIVER, self).tearDown() + self.vhost_driver = None + + @mock.patch.object(NVMFDRIVER, 'get_one_accelerator') + def test_discover_accelerator(self, mock_get_one_accelerator): + expect_accelerator = { + 'server': 'nvmf', + 'bdevs': [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }], + 'subsystems': [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + } + alive = mock.Mock(return_value=False) + self.nvmf_driver.py.is_alive = alive + check_error = mock.Mock(return_value=False) + common_fun.check_for_setup_error = check_error + self.assertFalse( + mock_get_one_accelerator.called, + "Failed to discover_accelerator if py not alive." + ) + alive = mock.Mock(return_value=True) + self.nvmf_driver.py.is_alive = alive + check_error = mock.Mock(return_value=True) + common_fun.check_for_setup_error = check_error + acce_client = NvmfTgt(self.nvmf_driver.py) + bdevs_fake = [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }] + bdev_list = mock.Mock(return_value=bdevs_fake) + acce_client.get_bdevs = bdev_list + subsystems_fake = [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + subsystem_list = mock.Mock(return_value=subsystems_fake) + acce_client.get_nvmf_subsystems = subsystem_list + accelerator_fake = { + 'server': self.nvmf_driver.SERVER, + 'bdevs': acce_client.get_bdevs(), + 'subsystems': acce_client.get_nvmf_subsystems() + } + success_send = mock.Mock(return_value=accelerator_fake) + self.nvmf_driver.get_one_accelerator = success_send + accelerator = self.nvmf_driver.discover_accelerator() + self.assertEqual(accelerator, expect_accelerator) + + def test_accelerator_list(self): + expect_accelerators = [{ + 'server': 'nvmf', + 'bdevs': [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }], + 'subsystems': + [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + }, + { + 'server': 'nvnf_tgt', + 'bdevs': [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }], + 'subsystems': + [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + } + ] + success_send = mock.Mock(return_value=expect_accelerators) + self.nvmf_driver.get_all_accelerators = success_send + self.assertEqual(self.nvmf_driver.accelerator_list(), + expect_accelerators) + + def test_install_accelerator(self): + pass + + def test_uninstall_accelerator(self): + pass + + def test_update(self): + pass + + def test_attach_instance(self): + pass + + def test_detach_instance(self): + pass + + def test_delete_subsystem(self): + pass + + def test_construct_subsystem(self): + pass diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/vhost/__init__.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/vhost/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/vhost/__init__.py diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/vhost/test_vhost.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/vhost/test_vhost.py new file mode 100644 index 0000000..3c04b8c --- /dev/null +++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/tests/unit/accelerator/drivers/spdk/vhost/test_vhost.py @@ -0,0 +1,144 @@ +# Copyright 2017 Huawei Technologies Co.,LTD. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cyborg.tests import base +import mock +from cyborg.accelerator.drivers.spdk.vhost.vhost import VHOSTDRIVER +from cyborg.accelerator.drivers.spdk.util import common_fun +from cyborg.accelerator.drivers.spdk.util.pyspdk.vhost_client import VhostTgt + + +class TestVHOSTDRIVER(base.TestCase): + + def setUp(self): + super(TestVHOSTDRIVER, self).setUp() + self.vhost_driver = VHOSTDRIVER() + + def tearDown(self): + super(TestVHOSTDRIVER, self).tearDown() + self.vhost_driver = None + + @mock.patch.object(VHOSTDRIVER, 'get_one_accelerator') + def test_discover_accelerator(self, mock_get_one_accelerator): + expect_accelerator = { + 'server': 'vhost', + 'bdevs': [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }], + 'scsi_devices': [], + 'luns': [{"claimed": True, + "name": "Malloc0"}], + 'interfaces': [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + } + alive = mock.Mock(return_value=True) + self.vhost_driver.py.is_alive = alive + check_error = mock.Mock(return_value=True) + common_fun.check_for_setup_error = check_error + self.assertFalse( + mock_get_one_accelerator.called, + "Failed to discover_accelerator if py not alive." + ) + acce_client = VhostTgt(self.vhost_driver.py) + bdevs_fake = [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }] + bdev_list = mock.Mock(return_value=bdevs_fake) + acce_client.get_bdevs = bdev_list + scsi_devices_fake = [] + scsi_device_list = mock.Mock(return_value=scsi_devices_fake) + acce_client.get_scsi_devices = scsi_device_list + luns_fake = [{"claimed": True, + "name": "Malloc0"}] + lun_list = mock.Mock(return_value=luns_fake) + acce_client.get_luns = lun_list + interfaces_fake = \ + [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + interface_list = mock.Mock(return_value=interfaces_fake) + acce_client.get_interfaces = interface_list + accelerator_fake = { + 'server': self.vhost_driver.SERVER, + 'bdevs': acce_client.get_bdevs(), + 'scsi_devices': acce_client.get_scsi_devices(), + 'luns': acce_client.get_luns(), + 'interfaces': acce_client.get_interfaces() + } + success_send = mock.Mock(return_value=accelerator_fake) + self.vhost_driver.get_one_accelerator = success_send + accelerator = self.vhost_driver.discover_accelerator() + self.assertEqual(accelerator, expect_accelerator) + + def test_accelerator_list(self): + expect_accelerators = [{ + 'server': 'vhost', + 'bdevs': [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }], + 'scsi_devices': [], + 'luns': [{"claimed": True, + "name": "Malloc0"}], + 'interfaces': [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + }, + { + 'server': 'vhost_tgt', + 'bdevs': [{"num_blocks": 131072, + "name": "nvme1", + "block_size": 512 + }], + 'scsi_devices': [], + 'luns': [{"claimed": True, + "name": "Malloc0"}], + 'interfaces': [{"core": 0, + "nqn": "nqn.2018-01.org.nvmexpress.discovery", + "hosts": [] + }] + } + ] + success_send = mock.Mock(return_value=expect_accelerators) + self.vhost_driver.get_all_accelerators = success_send + self.assertEqual(self.vhost_driver.accelerator_list(), + expect_accelerators) + + def test_install_accelerator(self): + pass + + def test_uninstall_accelerator(self): + pass + + def test_update(self): + pass + + def test_attach_instance(self): + pass + + def test_detach_instance(self): + pass + + def test_delete_ip_address(self): + pass + + def test_add_ip_address(self): + pass |