summaryrefslogtreecommitdiffstats
path: root/cyborg_enhancement/mitaka_version/cyborg/cyborg/accelerator/drivers/spdk/nvmf/nvmf.py
blob: 6e482a178f7889fb6096984c598a7429439721d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""
SPDK NVMFDRIVER module implementation.
"""

from cyborg.accelerator.drivers.spdk.util.pyspdk.nvmf_client import NvmfTgt
from oslo_log import log as logging
from cyborg.accelerator.common import exception
from cyborg.accelerator.drivers.spdk.util import common_fun
from cyborg.accelerator.drivers.spdk.spdk import SPDKDRIVER
from cyborg.accelerator.drivers.spdk.util.pyspdk.py_spdk import PySPDK

LOG = logging.getLogger(__name__)


class NVMFDRIVER(SPDKDRIVER):
    """NVMFDRIVER class.
    nvmf_tgt server app should be able to implement this driver.
    """

    SERVER = 'nvmf'

    def __init__(self, *args, **kwargs):
        super(NVMFDRIVER, self).__init__(*args, **kwargs)
        self.servers = common_fun.discover_servers()
        self.py = common_fun.get_py_client(self.SERVER)

    def discover_accelerator(self):
        if common_fun.check_for_setup_error(self.py, self.SERVER):
            return self.get_one_accelerator()

    def get_one_accelerator(self):
        acc_client = NvmfTgt(self.py)
        bdevs = acc_client.get_bdevs()
        # Display current blockdev list
        subsystems = acc_client.get_nvmf_subsystems()
        # Display nvmf subsystems
        accelerator_obj = {
            'server': self.SERVER,
            'bdevs': bdevs,
            'subsystems': subsystems
        }
        return accelerator_obj

    def install_accelerator(self, driver_id, driver_type):
        pass

    def uninstall_accelerator(self, driver_id, driver_type):
        pass

    def accelerator_list(self):
        return self.get_all_accelerators()

    def get_all_accelerators(self):
        accelerators = []
        for accelerator_i in range(len(self.servers)):
            accelerator = self.servers[accelerator_i]
            py_tmp = PySPDK(accelerator)
            if py_tmp.is_alive():
                accelerators.append(self.get_one_accelerator())
        return accelerators

    def update(self, driver_type, **kwargs):
        pass

    def attach_instance(self, instance_id):
        pass

    def detach_instance(self, instance_id):
        pass

    def delete_subsystem(self, nqn):
        """Delete a nvmf subsystem
        :param nqn: Target nqn(ASCII).
        :raise exception: Invaid
        """
        if nqn == "":
            acc_client = NvmfTgt(self.py)
            acc_client.delete_nvmf_subsystem(nqn)
        else:
            raise exception.Invalid('Delete nvmf subsystem failed.')

    def construct_subsystem(self,
                            nqn,
                            listen,
                            hosts,
                            serial_number,
                            namespaces
                            ):
        """Add a nvmf subsystem
        :param nqn: Target nqn(ASCII).
        :param listen: comma-separated list of Listen
        <trtype:transport_name traddr:address trsvcid:port_id>
        pairs enclosed in quotes.  Format:'trtype:transport0
        traddr:traddr0 trsvcid:trsvcid0,trtype:transport1
        traddr:traddr1 trsvcid:trsvcid1' etc.
        Example: 'trtype:RDMA traddr:192.168.100.8 trsvcid:4420,
        trtype:RDMA traddr:192.168.100.9 trsvcid:4420.'
        :param hosts: Whitespace-separated list of host nqn list.
        :param serial_number: Example: 'SPDK00000000000001.
        :param namespaces: Whitespace-separated list of namespaces.
        :raise exception: Invaid
        """
        if ((namespaces != '' and listen != '') and
                (hosts != '' and serial_number != '')) and nqn != '':
            acc_client = NvmfTgt(self.py)
            acc_client.construct_nvmf_subsystem(nqn,
                                                listen,
                                                hosts,
                                                serial_number,
                                                namespaces
                                                )
        else:
            raise exception.Invalid('Construct nvmf subsystem failed.')