]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: gRPC client for nvmeof communication
authorNizamudeen A <nia@redhat.com>
Tue, 5 Dec 2023 10:16:12 +0000 (15:46 +0530)
committerNizamudeen A <nia@redhat.com>
Tue, 30 Jan 2024 10:09:35 +0000 (15:39 +0530)
Created a gRPC client by utilising the protobuf file available in nvmeof
repo

Copied the file to this repo and generated its output.

Fixes: https://tracker.ceph.com/issues/64201
Signed-off-by: Nizamudeen A <nia@redhat.com>
.gitmodules
src/pybind/mgr/dashboard/ceph-nvmeof [deleted submodule]
src/pybind/mgr/dashboard/controllers/nvmeof.py [new file with mode: 0644]
src/pybind/mgr/dashboard/module.py
src/pybind/mgr/dashboard/services/nvmeof_client.py [new file with mode: 0644]
src/pybind/mgr/dashboard/services/proto/gateway.proto [new file with mode: 0644]
src/pybind/mgr/dashboard/services/proto/gateway_pb2.py [new file with mode: 0644]
src/pybind/mgr/dashboard/services/proto/gateway_pb2_grpc.py [new file with mode: 0644]

index e47fe6495f5fee57738b844c8efdb3f64836ef6e..088ae3b577ce2f1489e213f8d9a22d8cfaab19c8 100644 (file)
@@ -75,6 +75,3 @@
 [submodule "src/jaegertracing/opentelemetry-cpp"]
        path = src/jaegertracing/opentelemetry-cpp
        url = https://github.com/open-telemetry/opentelemetry-cpp.git
-[submodule "nvmeof"]
-       path = src/pybind/mgr/dashboard/ceph-nvmeof
-       url = https://github.com/ceph/ceph-nvmeof.git
diff --git a/src/pybind/mgr/dashboard/ceph-nvmeof b/src/pybind/mgr/dashboard/ceph-nvmeof
deleted file mode 160000 (submodule)
index c6f6ce7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c6f6ce77863f854444dee3d2a59d360f3b4f2255
diff --git a/src/pybind/mgr/dashboard/controllers/nvmeof.py b/src/pybind/mgr/dashboard/controllers/nvmeof.py
new file mode 100644 (file)
index 0000000..2749852
--- /dev/null
@@ -0,0 +1,23 @@
+# # import grpc
+
+# from .proto import gateway_pb2 as pb2
+# from .proto import gateway_pb2_grpc as pb2_grpc
+
+
+# class NVMeoFClient(object):
+#     def __init__(self):
+#         self.host = '192.168.100.102'
+
+# from ..cephnvmeof.control.cli import GatewayClient
+
+from ..security import Scope
+from ..services.nvmeof_client import NVMeoFClient
+from . import APIDoc, APIRouter, RESTController, Endpoint, ReadPermission, CreatePermission
+
+@APIRouter('/nvmeof', Scope.ISCSI)
+@APIDoc('NVMe-oF Management API', 'NVMe-oF')
+class Nvmeof(RESTController):
+    @ReadPermission
+    def list(self):
+        """List all NVMeoF gateways"""
+        return NVMeoFClient().get_subsystems()
index efef273bda06d79dedc66351a4e0cab21f0c53e4..24e947c7066c40f2a848154e2cc5ddbe3f5bd13d 100644 (file)
@@ -37,6 +37,9 @@ from .settings import handle_option_command, options_command_list, options_schem
 from .tools import NotificationQueue, RequestLoggingTool, TaskManager, \
     prepare_url_prefix, str_to_bool
 
+# pylint: disable=unused-import
+from .services import nvmeof_cli
+
 try:
     import cherrypy
     from cherrypy._cptools import HandlerWrapperTool
diff --git a/src/pybind/mgr/dashboard/services/nvmeof_client.py b/src/pybind/mgr/dashboard/services/nvmeof_client.py
new file mode 100644 (file)
index 0000000..ec8911a
--- /dev/null
@@ -0,0 +1,29 @@
+import grpc
+import json
+
+import logging
+
+from .proto import gateway_pb2 as pb2
+from .proto import gateway_pb2_grpc as pb2_grpc
+
+from google.protobuf.json_format import MessageToJson
+
+from .nvmeof_conf import NvmeofGatewaysConfig
+
+logger = logging.getLogger('nvmeof_client')
+
+
+class NVMeoFClient(object):
+    def __init__(self):
+        logger.info('Initiating nvmeof gateway connection...')
+
+        self.gateway_addr = list(NvmeofGatewaysConfig.get_gateways_config()['gateways'].values())[0]['service_url']
+        self.channel = grpc.insecure_channel(
+            '{}'.format(self.gateway_addr)
+        )
+        logger.info('Found nvmeof gateway at {}'.format(self.gateway_addr))
+        self.stub = pb2_grpc.GatewayStub(self.channel)
+
+    def get_subsystems(self):
+        response = self.stub.get_subsystems(pb2.get_subsystems_req())
+        return json.loads(MessageToJson(response))
diff --git a/src/pybind/mgr/dashboard/services/proto/gateway.proto b/src/pybind/mgr/dashboard/services/proto/gateway.proto
new file mode 100644 (file)
index 0000000..85238c8
--- /dev/null
@@ -0,0 +1,247 @@
+//
+//  Copyright (c) 2021 International Business Machines
+//  All rights reserved.
+//
+//  SPDX-License-Identifier: MIT
+//
+//  Authors: anita.shekar@ibm.com, sandy.kaur@ibm.com
+//
+
+
+syntax = "proto3";
+
+enum TransportType {
+    INVALID = 0;
+    RDMA = 1;
+    FC = 2;
+    TCP = 3;
+    PCIE = 256;
+    VFIOUSER = 1024;
+    CUSTOM = 4096;
+}
+
+enum AddressFamily {
+    invalid = 0;
+    ipv4 = 1;
+    ipv6 = 2;
+    ib = 3;
+    fc = 4;
+}
+
+enum LogLevel {
+    DISABLED = 0;
+    ERROR = 1;
+    WARN = 2;
+    NOTICE = 3;
+    INFO = 4;
+    DEBUG = 5;
+}
+
+service Gateway {
+       // Creates a bdev from an RBD image
+       rpc create_bdev(create_bdev_req) returns (bdev) {}
+
+       // Resizes a bdev
+       rpc resize_bdev(resize_bdev_req) returns (req_status) {}
+
+       // Deletes a bdev
+       rpc delete_bdev(delete_bdev_req) returns (req_status) {}
+
+       // Creates a subsystem
+       rpc create_subsystem(create_subsystem_req) returns(req_status) {}
+
+       // Deletes a subsystem
+       rpc delete_subsystem(delete_subsystem_req) returns(req_status) {}
+
+       // Adds a namespace to a subsystem
+       rpc add_namespace(add_namespace_req) returns(nsid_status) {}
+
+       // Removes a namespace from a subsystem
+       rpc remove_namespace(remove_namespace_req) returns(req_status) {}
+
+       // Adds a host to a subsystem
+       rpc add_host(add_host_req) returns (req_status) {}
+
+       // Removes a host from a subsystem
+       rpc remove_host(remove_host_req) returns (req_status) {}
+
+       // Creates a listener for a subsystem at a given IP/Port
+       rpc create_listener(create_listener_req) returns(req_status) {}
+
+       // Deletes a listener from a subsystem at a given IP/Port
+       rpc delete_listener(delete_listener_req) returns(req_status) {}
+
+       // Gets subsystems
+       rpc get_subsystems(get_subsystems_req) returns(subsystems_info) {}
+
+       // Gets spdk nvmf log flags and level
+       rpc get_spdk_nvmf_log_flags_and_level(get_spdk_nvmf_log_flags_and_level_req) returns(spdk_nvmf_log_flags_and_level_info) {}
+
+       // Disables spdk nvmf logs
+       rpc disable_spdk_nvmf_logs(disable_spdk_nvmf_logs_req) returns(req_status) {}
+
+       // Set spdk nvmf logs
+       rpc set_spdk_nvmf_logs(set_spdk_nvmf_logs_req) returns(req_status) {}
+
+       // Set spdk nvmf logs
+       rpc get_gateway_info(get_gateway_info_req) returns(gateway_info) {}
+}
+
+// Request messages
+
+message create_bdev_req {
+       string bdev_name = 1;
+       string rbd_pool_name = 2;
+       string rbd_image_name = 3;
+       int32 block_size = 4;
+       optional string uuid = 5;
+}
+
+message resize_bdev_req {
+       string bdev_name = 1;
+       int32 new_size = 2;
+}
+
+message delete_bdev_req {
+       string bdev_name = 1;
+       bool force = 2;
+}
+
+message create_subsystem_req {
+       string subsystem_nqn = 1;
+       string serial_number = 2;
+       int32 max_namespaces = 3;
+       bool  ana_reporting  = 4;
+       bool  enable_ha      = 5;
+}
+
+message delete_subsystem_req {
+       string subsystem_nqn = 1;
+}
+
+message add_namespace_req {
+       string subsystem_nqn = 1;
+       string bdev_name = 2;
+       optional uint32 nsid = 3;
+       optional int32 anagrpid = 4;
+}
+
+message remove_namespace_req {
+       string subsystem_nqn = 1;
+       uint32 nsid = 2;
+}
+
+message add_host_req {
+       string subsystem_nqn = 1;
+       string host_nqn = 2;
+}
+
+message remove_host_req {
+       string subsystem_nqn = 1;
+       string host_nqn = 2;
+}
+
+message create_listener_req {
+       string nqn = 1;
+       string gateway_name = 2;
+       TransportType trtype = 3;
+       AddressFamily adrfam = 4;
+       string traddr = 5;
+       string trsvcid = 6;
+}
+
+message delete_listener_req {
+       string nqn = 1;
+       string gateway_name = 2;
+       TransportType trtype = 3;
+       AddressFamily adrfam = 4;
+       string traddr = 5;
+       string trsvcid = 6;
+}
+
+message get_subsystems_req {
+}
+
+message get_spdk_nvmf_log_flags_and_level_req {
+}
+
+message disable_spdk_nvmf_logs_req {
+}
+
+message set_spdk_nvmf_logs_req {
+       optional LogLevel log_level = 1;
+       optional LogLevel print_level = 2;
+}
+
+message get_gateway_info_req {
+       string cli_version = 1;
+}
+
+// Return messages 
+
+message bdev {
+       string bdev_name = 1;
+       bool status = 2;
+}
+
+message req_status {
+       bool status = 1;
+}
+
+message nsid_status {
+       uint32 nsid = 1;
+       bool status = 2;
+}
+
+message subsystems_info {
+       repeated subsystem subsystems = 1;
+}
+
+message subsystem {
+       string nqn = 1;
+       string subtype = 2;
+       repeated listen_address listen_addresses = 3;
+       repeated host hosts = 4;
+       bool allow_any_host = 5;
+       optional string serial_number = 6;
+       optional string model_number = 7;
+       optional uint32 max_namespaces = 8;
+       optional uint32 min_cntlid = 9;
+       optional uint32 max_cntlid = 10;
+       repeated namespace namespaces = 11;
+}
+
+message gateway_info {
+       string cli_version = 1;
+       string gateway_version = 2;
+       string gateway_name = 3;
+       string gateway_group = 4;
+       string gateway_addr = 5;
+       string gateway_port = 6;
+       bool status = 7;
+}
+
+message listen_address {
+       string transport = 1;
+       TransportType trtype = 2;
+       AddressFamily adrfam = 3;
+       string traddr = 4;
+       string trsvcid = 5;
+}
+
+message host {
+    string nqn = 1;
+}
+
+message namespace {
+    uint32 nsid = 1;
+    string name = 2;
+    optional string bdev_name = 3;
+    optional string nguid = 4;
+    optional string uuid = 5;
+    optional uint32 anagrpid = 6;
+}
+
+message spdk_nvmf_log_flags_and_level_info {
+       string flags_level =1;
+}
\ No newline at end of file
diff --git a/src/pybind/mgr/dashboard/services/proto/gateway_pb2.py b/src/pybind/mgr/dashboard/services/proto/gateway_pb2.py
new file mode 100644 (file)
index 0000000..2cd4d0c
--- /dev/null
@@ -0,0 +1,318 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: gateway.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rgateway.proto\"\x83\x01\n\x0f\x63reate_bdev_req\x12\x11\n\tbdev_name\x18\x01 \x01(\t\x12\x15\n\rrbd_pool_name\x18\x02 \x01(\t\x12\x16\n\x0erbd_image_name\x18\x03 \x01(\t\x12\x12\n\nblock_size\x18\x04 \x01(\x05\x12\x11\n\x04uuid\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_uuid\"6\n\x0fresize_bdev_req\x12\x11\n\tbdev_name\x18\x01 \x01(\t\x12\x10\n\x08new_size\x18\x02 \x01(\x05\"3\n\x0f\x64\x65lete_bdev_req\x12\x11\n\tbdev_name\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\"\x86\x01\n\x14\x63reate_subsystem_req\x12\x15\n\rsubsystem_nqn\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x16\n\x0emax_namespaces\x18\x03 \x01(\x05\x12\x15\n\rana_reporting\x18\x04 \x01(\x08\x12\x11\n\tenable_ha\x18\x05 \x01(\x08\"-\n\x14\x64\x65lete_subsystem_req\x12\x15\n\rsubsystem_nqn\x18\x01 \x01(\t\"}\n\x11\x61\x64\x64_namespace_req\x12\x15\n\rsubsystem_nqn\x18\x01 \x01(\t\x12\x11\n\tbdev_name\x18\x02 \x01(\t\x12\x11\n\x04nsid\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x61nagrpid\x18\x04 \x01(\x05H\x01\x88\x01\x01\x42\x07\n\x05_nsidB\x0b\n\t_anagrpid\";\n\x14remove_namespace_req\x12\x15\n\rsubsystem_nqn\x18\x01 \x01(\t\x12\x0c\n\x04nsid\x18\x02 \x01(\r\"7\n\x0c\x61\x64\x64_host_req\x12\x15\n\rsubsystem_nqn\x18\x01 \x01(\t\x12\x10\n\x08host_nqn\x18\x02 \x01(\t\":\n\x0fremove_host_req\x12\x15\n\rsubsystem_nqn\x18\x01 \x01(\t\x12\x10\n\x08host_nqn\x18\x02 \x01(\t\"\x99\x01\n\x13\x63reate_listener_req\x12\x0b\n\x03nqn\x18\x01 \x01(\t\x12\x14\n\x0cgateway_name\x18\x02 \x01(\t\x12\x1e\n\x06trtype\x18\x03 \x01(\x0e\x32\x0e.TransportType\x12\x1e\n\x06\x61\x64rfam\x18\x04 \x01(\x0e\x32\x0e.AddressFamily\x12\x0e\n\x06traddr\x18\x05 \x01(\t\x12\x0f\n\x07trsvcid\x18\x06 \x01(\t\"\x99\x01\n\x13\x64\x65lete_listener_req\x12\x0b\n\x03nqn\x18\x01 \x01(\t\x12\x14\n\x0cgateway_name\x18\x02 \x01(\t\x12\x1e\n\x06trtype\x18\x03 \x01(\x0e\x32\x0e.TransportType\x12\x1e\n\x06\x61\x64rfam\x18\x04 \x01(\x0e\x32\x0e.AddressFamily\x12\x0e\n\x06traddr\x18\x05 \x01(\t\x12\x0f\n\x07trsvcid\x18\x06 \x01(\t\"\x14\n\x12get_subsystems_req\"\'\n%get_spdk_nvmf_log_flags_and_level_req\"\x1c\n\x1a\x64isable_spdk_nvmf_logs_req\"~\n\x16set_spdk_nvmf_logs_req\x12!\n\tlog_level\x18\x01 \x01(\x0e\x32\t.LogLevelH\x00\x88\x01\x01\x12#\n\x0bprint_level\x18\x02 \x01(\x0e\x32\t.LogLevelH\x01\x88\x01\x01\x42\x0c\n\n_log_levelB\x0e\n\x0c_print_level\"+\n\x14get_gateway_info_req\x12\x13\n\x0b\x63li_version\x18\x01 \x01(\t\")\n\x04\x62\x64\x65v\x12\x11\n\tbdev_name\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x08\"\x1c\n\nreq_status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"+\n\x0bnsid_status\x12\x0c\n\x04nsid\x18\x01 \x01(\r\x12\x0e\n\x06status\x18\x02 \x01(\x08\"1\n\x0fsubsystems_info\x12\x1e\n\nsubsystems\x18\x01 \x03(\x0b\x32\n.subsystem\"\xfc\x02\n\tsubsystem\x12\x0b\n\x03nqn\x18\x01 \x01(\t\x12\x0f\n\x07subtype\x18\x02 \x01(\t\x12)\n\x10listen_addresses\x18\x03 \x03(\x0b\x32\x0f.listen_address\x12\x14\n\x05hosts\x18\x04 \x03(\x0b\x32\x05.host\x12\x16\n\x0e\x61llow_any_host\x18\x05 \x01(\x08\x12\x1a\n\rserial_number\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cmodel_number\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0emax_namespaces\x18\x08 \x01(\rH\x02\x88\x01\x01\x12\x17\n\nmin_cntlid\x18\t \x01(\rH\x03\x88\x01\x01\x12\x17\n\nmax_cntlid\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1e\n\nnamespaces\x18\x0b \x03(\x0b\x32\n.namespaceB\x10\n\x0e_serial_numberB\x0f\n\r_model_numberB\x11\n\x0f_max_namespacesB\r\n\x0b_min_cntlidB\r\n\x0b_max_cntlid\"\xa5\x01\n\x0cgateway_info\x12\x13\n\x0b\x63li_version\x18\x01 \x01(\t\x12\x17\n\x0fgateway_version\x18\x02 \x01(\t\x12\x14\n\x0cgateway_name\x18\x03 \x01(\t\x12\x15\n\rgateway_group\x18\x04 \x01(\t\x12\x14\n\x0cgateway_addr\x18\x05 \x01(\t\x12\x14\n\x0cgateway_port\x18\x06 \x01(\t\x12\x0e\n\x06status\x18\x07 \x01(\x08\"\x84\x01\n\x0elisten_address\x12\x11\n\ttransport\x18\x01 \x01(\t\x12\x1e\n\x06trtype\x18\x02 \x01(\x0e\x32\x0e.TransportType\x12\x1e\n\x06\x61\x64rfam\x18\x03 \x01(\x0e\x32\x0e.AddressFamily\x12\x0e\n\x06traddr\x18\x04 \x01(\t\x12\x0f\n\x07trsvcid\x18\x05 \x01(\t\"\x13\n\x04host\x12\x0b\n\x03nqn\x18\x01 \x01(\t\"\xab\x01\n\tnamespace\x12\x0c\n\x04nsid\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x16\n\tbdev_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05nguid\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04uuid\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x15\n\x08\x61nagrpid\x18\x06 \x01(\rH\x03\x88\x01\x01\x42\x0c\n\n_bdev_nameB\x08\n\x06_nguidB\x07\n\x05_uuidB\x0b\n\t_anagrpid\"9\n\"spdk_nvmf_log_flags_and_level_info\x12\x13\n\x0b\x66lags_level\x18\x01 \x01(\t*^\n\rTransportType\x12\x0b\n\x07INVALID\x10\x00\x12\x08\n\x04RDMA\x10\x01\x12\x06\n\x02\x46\x43\x10\x02\x12\x07\n\x03TCP\x10\x03\x12\t\n\x04PCIE\x10\x80\x02\x12\r\n\x08VFIOUSER\x10\x80\x08\x12\x0b\n\x06\x43USTOM\x10\x80 *@\n\rAddressFamily\x12\x0b\n\x07invalid\x10\x00\x12\x08\n\x04ipv4\x10\x01\x12\x08\n\x04ipv6\x10\x02\x12\x06\n\x02ib\x10\x03\x12\x06\n\x02\x66\x63\x10\x04*N\n\x08LogLevel\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x08\n\x04WARN\x10\x02\x12\n\n\x06NOTICE\x10\x03\x12\x08\n\x04INFO\x10\x04\x12\t\n\x05\x44\x45\x42UG\x10\x05\x32\xaf\x07\n\x07Gateway\x12(\n\x0b\x63reate_bdev\x12\x10.create_bdev_req\x1a\x05.bdev\"\x00\x12.\n\x0bresize_bdev\x12\x10.resize_bdev_req\x1a\x0b.req_status\"\x00\x12.\n\x0b\x64\x65lete_bdev\x12\x10.delete_bdev_req\x1a\x0b.req_status\"\x00\x12\x38\n\x10\x63reate_subsystem\x12\x15.create_subsystem_req\x1a\x0b.req_status\"\x00\x12\x38\n\x10\x64\x65lete_subsystem\x12\x15.delete_subsystem_req\x1a\x0b.req_status\"\x00\x12\x33\n\radd_namespace\x12\x12.add_namespace_req\x1a\x0c.nsid_status\"\x00\x12\x38\n\x10remove_namespace\x12\x15.remove_namespace_req\x1a\x0b.req_status\"\x00\x12(\n\x08\x61\x64\x64_host\x12\r.add_host_req\x1a\x0b.req_status\"\x00\x12.\n\x0bremove_host\x12\x10.remove_host_req\x1a\x0b.req_status\"\x00\x12\x36\n\x0f\x63reate_listener\x12\x14.create_listener_req\x1a\x0b.req_status\"\x00\x12\x36\n\x0f\x64\x65lete_listener\x12\x14.delete_listener_req\x1a\x0b.req_status\"\x00\x12\x39\n\x0eget_subsystems\x12\x13.get_subsystems_req\x1a\x10.subsystems_info\"\x00\x12r\n!get_spdk_nvmf_log_flags_and_level\x12&.get_spdk_nvmf_log_flags_and_level_req\x1a#.spdk_nvmf_log_flags_and_level_info\"\x00\x12\x44\n\x16\x64isable_spdk_nvmf_logs\x12\x1b.disable_spdk_nvmf_logs_req\x1a\x0b.req_status\"\x00\x12<\n\x12set_spdk_nvmf_logs\x12\x17.set_spdk_nvmf_logs_req\x1a\x0b.req_status\"\x00\x12:\n\x10get_gateway_info\x12\x15.get_gateway_info_req\x1a\r.gateway_info\"\x00\x62\x06proto3')
+
+_TRANSPORTTYPE = DESCRIPTOR.enum_types_by_name['TransportType']
+TransportType = enum_type_wrapper.EnumTypeWrapper(_TRANSPORTTYPE)
+_ADDRESSFAMILY = DESCRIPTOR.enum_types_by_name['AddressFamily']
+AddressFamily = enum_type_wrapper.EnumTypeWrapper(_ADDRESSFAMILY)
+_LOGLEVEL = DESCRIPTOR.enum_types_by_name['LogLevel']
+LogLevel = enum_type_wrapper.EnumTypeWrapper(_LOGLEVEL)
+INVALID = 0
+RDMA = 1
+FC = 2
+TCP = 3
+PCIE = 256
+VFIOUSER = 1024
+CUSTOM = 4096
+invalid = 0
+ipv4 = 1
+ipv6 = 2
+ib = 3
+fc = 4
+DISABLED = 0
+ERROR = 1
+WARN = 2
+NOTICE = 3
+INFO = 4
+DEBUG = 5
+
+
+_CREATE_BDEV_REQ = DESCRIPTOR.message_types_by_name['create_bdev_req']
+_RESIZE_BDEV_REQ = DESCRIPTOR.message_types_by_name['resize_bdev_req']
+_DELETE_BDEV_REQ = DESCRIPTOR.message_types_by_name['delete_bdev_req']
+_CREATE_SUBSYSTEM_REQ = DESCRIPTOR.message_types_by_name['create_subsystem_req']
+_DELETE_SUBSYSTEM_REQ = DESCRIPTOR.message_types_by_name['delete_subsystem_req']
+_ADD_NAMESPACE_REQ = DESCRIPTOR.message_types_by_name['add_namespace_req']
+_REMOVE_NAMESPACE_REQ = DESCRIPTOR.message_types_by_name['remove_namespace_req']
+_ADD_HOST_REQ = DESCRIPTOR.message_types_by_name['add_host_req']
+_REMOVE_HOST_REQ = DESCRIPTOR.message_types_by_name['remove_host_req']
+_CREATE_LISTENER_REQ = DESCRIPTOR.message_types_by_name['create_listener_req']
+_DELETE_LISTENER_REQ = DESCRIPTOR.message_types_by_name['delete_listener_req']
+_GET_SUBSYSTEMS_REQ = DESCRIPTOR.message_types_by_name['get_subsystems_req']
+_GET_SPDK_NVMF_LOG_FLAGS_AND_LEVEL_REQ = DESCRIPTOR.message_types_by_name['get_spdk_nvmf_log_flags_and_level_req']
+_DISABLE_SPDK_NVMF_LOGS_REQ = DESCRIPTOR.message_types_by_name['disable_spdk_nvmf_logs_req']
+_SET_SPDK_NVMF_LOGS_REQ = DESCRIPTOR.message_types_by_name['set_spdk_nvmf_logs_req']
+_GET_GATEWAY_INFO_REQ = DESCRIPTOR.message_types_by_name['get_gateway_info_req']
+_BDEV = DESCRIPTOR.message_types_by_name['bdev']
+_REQ_STATUS = DESCRIPTOR.message_types_by_name['req_status']
+_NSID_STATUS = DESCRIPTOR.message_types_by_name['nsid_status']
+_SUBSYSTEMS_INFO = DESCRIPTOR.message_types_by_name['subsystems_info']
+_SUBSYSTEM = DESCRIPTOR.message_types_by_name['subsystem']
+_GATEWAY_INFO = DESCRIPTOR.message_types_by_name['gateway_info']
+_LISTEN_ADDRESS = DESCRIPTOR.message_types_by_name['listen_address']
+_HOST = DESCRIPTOR.message_types_by_name['host']
+_NAMESPACE = DESCRIPTOR.message_types_by_name['namespace']
+_SPDK_NVMF_LOG_FLAGS_AND_LEVEL_INFO = DESCRIPTOR.message_types_by_name['spdk_nvmf_log_flags_and_level_info']
+create_bdev_req = _reflection.GeneratedProtocolMessageType('create_bdev_req', (_message.Message,), {
+  'DESCRIPTOR' : _CREATE_BDEV_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:create_bdev_req)
+  })
+_sym_db.RegisterMessage(create_bdev_req)
+
+resize_bdev_req = _reflection.GeneratedProtocolMessageType('resize_bdev_req', (_message.Message,), {
+  'DESCRIPTOR' : _RESIZE_BDEV_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:resize_bdev_req)
+  })
+_sym_db.RegisterMessage(resize_bdev_req)
+
+delete_bdev_req = _reflection.GeneratedProtocolMessageType('delete_bdev_req', (_message.Message,), {
+  'DESCRIPTOR' : _DELETE_BDEV_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:delete_bdev_req)
+  })
+_sym_db.RegisterMessage(delete_bdev_req)
+
+create_subsystem_req = _reflection.GeneratedProtocolMessageType('create_subsystem_req', (_message.Message,), {
+  'DESCRIPTOR' : _CREATE_SUBSYSTEM_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:create_subsystem_req)
+  })
+_sym_db.RegisterMessage(create_subsystem_req)
+
+delete_subsystem_req = _reflection.GeneratedProtocolMessageType('delete_subsystem_req', (_message.Message,), {
+  'DESCRIPTOR' : _DELETE_SUBSYSTEM_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:delete_subsystem_req)
+  })
+_sym_db.RegisterMessage(delete_subsystem_req)
+
+add_namespace_req = _reflection.GeneratedProtocolMessageType('add_namespace_req', (_message.Message,), {
+  'DESCRIPTOR' : _ADD_NAMESPACE_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:add_namespace_req)
+  })
+_sym_db.RegisterMessage(add_namespace_req)
+
+remove_namespace_req = _reflection.GeneratedProtocolMessageType('remove_namespace_req', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVE_NAMESPACE_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:remove_namespace_req)
+  })
+_sym_db.RegisterMessage(remove_namespace_req)
+
+add_host_req = _reflection.GeneratedProtocolMessageType('add_host_req', (_message.Message,), {
+  'DESCRIPTOR' : _ADD_HOST_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:add_host_req)
+  })
+_sym_db.RegisterMessage(add_host_req)
+
+remove_host_req = _reflection.GeneratedProtocolMessageType('remove_host_req', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVE_HOST_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:remove_host_req)
+  })
+_sym_db.RegisterMessage(remove_host_req)
+
+create_listener_req = _reflection.GeneratedProtocolMessageType('create_listener_req', (_message.Message,), {
+  'DESCRIPTOR' : _CREATE_LISTENER_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:create_listener_req)
+  })
+_sym_db.RegisterMessage(create_listener_req)
+
+delete_listener_req = _reflection.GeneratedProtocolMessageType('delete_listener_req', (_message.Message,), {
+  'DESCRIPTOR' : _DELETE_LISTENER_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:delete_listener_req)
+  })
+_sym_db.RegisterMessage(delete_listener_req)
+
+get_subsystems_req = _reflection.GeneratedProtocolMessageType('get_subsystems_req', (_message.Message,), {
+  'DESCRIPTOR' : _GET_SUBSYSTEMS_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:get_subsystems_req)
+  })
+_sym_db.RegisterMessage(get_subsystems_req)
+
+get_spdk_nvmf_log_flags_and_level_req = _reflection.GeneratedProtocolMessageType('get_spdk_nvmf_log_flags_and_level_req', (_message.Message,), {
+  'DESCRIPTOR' : _GET_SPDK_NVMF_LOG_FLAGS_AND_LEVEL_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:get_spdk_nvmf_log_flags_and_level_req)
+  })
+_sym_db.RegisterMessage(get_spdk_nvmf_log_flags_and_level_req)
+
+disable_spdk_nvmf_logs_req = _reflection.GeneratedProtocolMessageType('disable_spdk_nvmf_logs_req', (_message.Message,), {
+  'DESCRIPTOR' : _DISABLE_SPDK_NVMF_LOGS_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:disable_spdk_nvmf_logs_req)
+  })
+_sym_db.RegisterMessage(disable_spdk_nvmf_logs_req)
+
+set_spdk_nvmf_logs_req = _reflection.GeneratedProtocolMessageType('set_spdk_nvmf_logs_req', (_message.Message,), {
+  'DESCRIPTOR' : _SET_SPDK_NVMF_LOGS_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:set_spdk_nvmf_logs_req)
+  })
+_sym_db.RegisterMessage(set_spdk_nvmf_logs_req)
+
+get_gateway_info_req = _reflection.GeneratedProtocolMessageType('get_gateway_info_req', (_message.Message,), {
+  'DESCRIPTOR' : _GET_GATEWAY_INFO_REQ,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:get_gateway_info_req)
+  })
+_sym_db.RegisterMessage(get_gateway_info_req)
+
+bdev = _reflection.GeneratedProtocolMessageType('bdev', (_message.Message,), {
+  'DESCRIPTOR' : _BDEV,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:bdev)
+  })
+_sym_db.RegisterMessage(bdev)
+
+req_status = _reflection.GeneratedProtocolMessageType('req_status', (_message.Message,), {
+  'DESCRIPTOR' : _REQ_STATUS,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:req_status)
+  })
+_sym_db.RegisterMessage(req_status)
+
+nsid_status = _reflection.GeneratedProtocolMessageType('nsid_status', (_message.Message,), {
+  'DESCRIPTOR' : _NSID_STATUS,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:nsid_status)
+  })
+_sym_db.RegisterMessage(nsid_status)
+
+subsystems_info = _reflection.GeneratedProtocolMessageType('subsystems_info', (_message.Message,), {
+  'DESCRIPTOR' : _SUBSYSTEMS_INFO,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:subsystems_info)
+  })
+_sym_db.RegisterMessage(subsystems_info)
+
+subsystem = _reflection.GeneratedProtocolMessageType('subsystem', (_message.Message,), {
+  'DESCRIPTOR' : _SUBSYSTEM,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:subsystem)
+  })
+_sym_db.RegisterMessage(subsystem)
+
+gateway_info = _reflection.GeneratedProtocolMessageType('gateway_info', (_message.Message,), {
+  'DESCRIPTOR' : _GATEWAY_INFO,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:gateway_info)
+  })
+_sym_db.RegisterMessage(gateway_info)
+
+listen_address = _reflection.GeneratedProtocolMessageType('listen_address', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEN_ADDRESS,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:listen_address)
+  })
+_sym_db.RegisterMessage(listen_address)
+
+host = _reflection.GeneratedProtocolMessageType('host', (_message.Message,), {
+  'DESCRIPTOR' : _HOST,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:host)
+  })
+_sym_db.RegisterMessage(host)
+
+namespace = _reflection.GeneratedProtocolMessageType('namespace', (_message.Message,), {
+  'DESCRIPTOR' : _NAMESPACE,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:namespace)
+  })
+_sym_db.RegisterMessage(namespace)
+
+spdk_nvmf_log_flags_and_level_info = _reflection.GeneratedProtocolMessageType('spdk_nvmf_log_flags_and_level_info', (_message.Message,), {
+  'DESCRIPTOR' : _SPDK_NVMF_LOG_FLAGS_AND_LEVEL_INFO,
+  '__module__' : 'gateway_pb2'
+  # @@protoc_insertion_point(class_scope:spdk_nvmf_log_flags_and_level_info)
+  })
+_sym_db.RegisterMessage(spdk_nvmf_log_flags_and_level_info)
+
+_GATEWAY = DESCRIPTOR.services_by_name['Gateway']
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _TRANSPORTTYPE._serialized_start=2436
+  _TRANSPORTTYPE._serialized_end=2530
+  _ADDRESSFAMILY._serialized_start=2532
+  _ADDRESSFAMILY._serialized_end=2596
+  _LOGLEVEL._serialized_start=2598
+  _LOGLEVEL._serialized_end=2676
+  _CREATE_BDEV_REQ._serialized_start=18
+  _CREATE_BDEV_REQ._serialized_end=149
+  _RESIZE_BDEV_REQ._serialized_start=151
+  _RESIZE_BDEV_REQ._serialized_end=205
+  _DELETE_BDEV_REQ._serialized_start=207
+  _DELETE_BDEV_REQ._serialized_end=258
+  _CREATE_SUBSYSTEM_REQ._serialized_start=261
+  _CREATE_SUBSYSTEM_REQ._serialized_end=395
+  _DELETE_SUBSYSTEM_REQ._serialized_start=397
+  _DELETE_SUBSYSTEM_REQ._serialized_end=442
+  _ADD_NAMESPACE_REQ._serialized_start=444
+  _ADD_NAMESPACE_REQ._serialized_end=569
+  _REMOVE_NAMESPACE_REQ._serialized_start=571
+  _REMOVE_NAMESPACE_REQ._serialized_end=630
+  _ADD_HOST_REQ._serialized_start=632
+  _ADD_HOST_REQ._serialized_end=687
+  _REMOVE_HOST_REQ._serialized_start=689
+  _REMOVE_HOST_REQ._serialized_end=747
+  _CREATE_LISTENER_REQ._serialized_start=750
+  _CREATE_LISTENER_REQ._serialized_end=903
+  _DELETE_LISTENER_REQ._serialized_start=906
+  _DELETE_LISTENER_REQ._serialized_end=1059
+  _GET_SUBSYSTEMS_REQ._serialized_start=1061
+  _GET_SUBSYSTEMS_REQ._serialized_end=1081
+  _GET_SPDK_NVMF_LOG_FLAGS_AND_LEVEL_REQ._serialized_start=1083
+  _GET_SPDK_NVMF_LOG_FLAGS_AND_LEVEL_REQ._serialized_end=1122
+  _DISABLE_SPDK_NVMF_LOGS_REQ._serialized_start=1124
+  _DISABLE_SPDK_NVMF_LOGS_REQ._serialized_end=1152
+  _SET_SPDK_NVMF_LOGS_REQ._serialized_start=1154
+  _SET_SPDK_NVMF_LOGS_REQ._serialized_end=1280
+  _GET_GATEWAY_INFO_REQ._serialized_start=1282
+  _GET_GATEWAY_INFO_REQ._serialized_end=1325
+  _BDEV._serialized_start=1327
+  _BDEV._serialized_end=1368
+  _REQ_STATUS._serialized_start=1370
+  _REQ_STATUS._serialized_end=1398
+  _NSID_STATUS._serialized_start=1400
+  _NSID_STATUS._serialized_end=1443
+  _SUBSYSTEMS_INFO._serialized_start=1445
+  _SUBSYSTEMS_INFO._serialized_end=1494
+  _SUBSYSTEM._serialized_start=1497
+  _SUBSYSTEM._serialized_end=1877
+  _GATEWAY_INFO._serialized_start=1880
+  _GATEWAY_INFO._serialized_end=2045
+  _LISTEN_ADDRESS._serialized_start=2048
+  _LISTEN_ADDRESS._serialized_end=2180
+  _HOST._serialized_start=2182
+  _HOST._serialized_end=2201
+  _NAMESPACE._serialized_start=2204
+  _NAMESPACE._serialized_end=2375
+  _SPDK_NVMF_LOG_FLAGS_AND_LEVEL_INFO._serialized_start=2377
+  _SPDK_NVMF_LOG_FLAGS_AND_LEVEL_INFO._serialized_end=2434
+  _GATEWAY._serialized_start=2679
+  _GATEWAY._serialized_end=3622
+# @@protoc_insertion_point(module_scope)
diff --git a/src/pybind/mgr/dashboard/services/proto/gateway_pb2_grpc.py b/src/pybind/mgr/dashboard/services/proto/gateway_pb2_grpc.py
new file mode 100644 (file)
index 0000000..b3d9c2d
--- /dev/null
@@ -0,0 +1,577 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from ..proto import gateway_pb2 as gateway__pb2
+
+
+class GatewayStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.create_bdev = channel.unary_unary(
+                '/Gateway/create_bdev',
+                request_serializer=gateway__pb2.create_bdev_req.SerializeToString,
+                response_deserializer=gateway__pb2.bdev.FromString,
+                )
+        self.resize_bdev = channel.unary_unary(
+                '/Gateway/resize_bdev',
+                request_serializer=gateway__pb2.resize_bdev_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.delete_bdev = channel.unary_unary(
+                '/Gateway/delete_bdev',
+                request_serializer=gateway__pb2.delete_bdev_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.create_subsystem = channel.unary_unary(
+                '/Gateway/create_subsystem',
+                request_serializer=gateway__pb2.create_subsystem_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.delete_subsystem = channel.unary_unary(
+                '/Gateway/delete_subsystem',
+                request_serializer=gateway__pb2.delete_subsystem_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.add_namespace = channel.unary_unary(
+                '/Gateway/add_namespace',
+                request_serializer=gateway__pb2.add_namespace_req.SerializeToString,
+                response_deserializer=gateway__pb2.nsid_status.FromString,
+                )
+        self.remove_namespace = channel.unary_unary(
+                '/Gateway/remove_namespace',
+                request_serializer=gateway__pb2.remove_namespace_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.add_host = channel.unary_unary(
+                '/Gateway/add_host',
+                request_serializer=gateway__pb2.add_host_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.remove_host = channel.unary_unary(
+                '/Gateway/remove_host',
+                request_serializer=gateway__pb2.remove_host_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.create_listener = channel.unary_unary(
+                '/Gateway/create_listener',
+                request_serializer=gateway__pb2.create_listener_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.delete_listener = channel.unary_unary(
+                '/Gateway/delete_listener',
+                request_serializer=gateway__pb2.delete_listener_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.get_subsystems = channel.unary_unary(
+                '/Gateway/get_subsystems',
+                request_serializer=gateway__pb2.get_subsystems_req.SerializeToString,
+                response_deserializer=gateway__pb2.subsystems_info.FromString,
+                )
+        self.get_spdk_nvmf_log_flags_and_level = channel.unary_unary(
+                '/Gateway/get_spdk_nvmf_log_flags_and_level',
+                request_serializer=gateway__pb2.get_spdk_nvmf_log_flags_and_level_req.SerializeToString,
+                response_deserializer=gateway__pb2.spdk_nvmf_log_flags_and_level_info.FromString,
+                )
+        self.disable_spdk_nvmf_logs = channel.unary_unary(
+                '/Gateway/disable_spdk_nvmf_logs',
+                request_serializer=gateway__pb2.disable_spdk_nvmf_logs_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.set_spdk_nvmf_logs = channel.unary_unary(
+                '/Gateway/set_spdk_nvmf_logs',
+                request_serializer=gateway__pb2.set_spdk_nvmf_logs_req.SerializeToString,
+                response_deserializer=gateway__pb2.req_status.FromString,
+                )
+        self.get_gateway_info = channel.unary_unary(
+                '/Gateway/get_gateway_info',
+                request_serializer=gateway__pb2.get_gateway_info_req.SerializeToString,
+                response_deserializer=gateway__pb2.gateway_info.FromString,
+                )
+
+
+class GatewayServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def create_bdev(self, request, context):
+        """Creates a bdev from an RBD image
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def resize_bdev(self, request, context):
+        """Resizes a bdev
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def delete_bdev(self, request, context):
+        """Deletes a bdev
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def create_subsystem(self, request, context):
+        """Creates a subsystem
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def delete_subsystem(self, request, context):
+        """Deletes a subsystem
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def add_namespace(self, request, context):
+        """Adds a namespace to a subsystem
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def remove_namespace(self, request, context):
+        """Removes a namespace from a subsystem
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def add_host(self, request, context):
+        """Adds a host to a subsystem
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def remove_host(self, request, context):
+        """Removes a host from a subsystem
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def create_listener(self, request, context):
+        """Creates a listener for a subsystem at a given IP/Port
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def delete_listener(self, request, context):
+        """Deletes a listener from a subsystem at a given IP/Port
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def get_subsystems(self, request, context):
+        """Gets subsystems
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def get_spdk_nvmf_log_flags_and_level(self, request, context):
+        """Gets spdk nvmf log flags and level
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def disable_spdk_nvmf_logs(self, request, context):
+        """Disables spdk nvmf logs
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def set_spdk_nvmf_logs(self, request, context):
+        """Set spdk nvmf logs
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def get_gateway_info(self, request, context):
+        """Set spdk nvmf logs
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_GatewayServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'create_bdev': grpc.unary_unary_rpc_method_handler(
+                    servicer.create_bdev,
+                    request_deserializer=gateway__pb2.create_bdev_req.FromString,
+                    response_serializer=gateway__pb2.bdev.SerializeToString,
+            ),
+            'resize_bdev': grpc.unary_unary_rpc_method_handler(
+                    servicer.resize_bdev,
+                    request_deserializer=gateway__pb2.resize_bdev_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'delete_bdev': grpc.unary_unary_rpc_method_handler(
+                    servicer.delete_bdev,
+                    request_deserializer=gateway__pb2.delete_bdev_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'create_subsystem': grpc.unary_unary_rpc_method_handler(
+                    servicer.create_subsystem,
+                    request_deserializer=gateway__pb2.create_subsystem_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'delete_subsystem': grpc.unary_unary_rpc_method_handler(
+                    servicer.delete_subsystem,
+                    request_deserializer=gateway__pb2.delete_subsystem_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'add_namespace': grpc.unary_unary_rpc_method_handler(
+                    servicer.add_namespace,
+                    request_deserializer=gateway__pb2.add_namespace_req.FromString,
+                    response_serializer=gateway__pb2.nsid_status.SerializeToString,
+            ),
+            'remove_namespace': grpc.unary_unary_rpc_method_handler(
+                    servicer.remove_namespace,
+                    request_deserializer=gateway__pb2.remove_namespace_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'add_host': grpc.unary_unary_rpc_method_handler(
+                    servicer.add_host,
+                    request_deserializer=gateway__pb2.add_host_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'remove_host': grpc.unary_unary_rpc_method_handler(
+                    servicer.remove_host,
+                    request_deserializer=gateway__pb2.remove_host_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'create_listener': grpc.unary_unary_rpc_method_handler(
+                    servicer.create_listener,
+                    request_deserializer=gateway__pb2.create_listener_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'delete_listener': grpc.unary_unary_rpc_method_handler(
+                    servicer.delete_listener,
+                    request_deserializer=gateway__pb2.delete_listener_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'get_subsystems': grpc.unary_unary_rpc_method_handler(
+                    servicer.get_subsystems,
+                    request_deserializer=gateway__pb2.get_subsystems_req.FromString,
+                    response_serializer=gateway__pb2.subsystems_info.SerializeToString,
+            ),
+            'get_spdk_nvmf_log_flags_and_level': grpc.unary_unary_rpc_method_handler(
+                    servicer.get_spdk_nvmf_log_flags_and_level,
+                    request_deserializer=gateway__pb2.get_spdk_nvmf_log_flags_and_level_req.FromString,
+                    response_serializer=gateway__pb2.spdk_nvmf_log_flags_and_level_info.SerializeToString,
+            ),
+            'disable_spdk_nvmf_logs': grpc.unary_unary_rpc_method_handler(
+                    servicer.disable_spdk_nvmf_logs,
+                    request_deserializer=gateway__pb2.disable_spdk_nvmf_logs_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'set_spdk_nvmf_logs': grpc.unary_unary_rpc_method_handler(
+                    servicer.set_spdk_nvmf_logs,
+                    request_deserializer=gateway__pb2.set_spdk_nvmf_logs_req.FromString,
+                    response_serializer=gateway__pb2.req_status.SerializeToString,
+            ),
+            'get_gateway_info': grpc.unary_unary_rpc_method_handler(
+                    servicer.get_gateway_info,
+                    request_deserializer=gateway__pb2.get_gateway_info_req.FromString,
+                    response_serializer=gateway__pb2.gateway_info.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'Gateway', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Gateway(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def create_bdev(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/create_bdev',
+            gateway__pb2.create_bdev_req.SerializeToString,
+            gateway__pb2.bdev.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def resize_bdev(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/resize_bdev',
+            gateway__pb2.resize_bdev_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def delete_bdev(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/delete_bdev',
+            gateway__pb2.delete_bdev_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def create_subsystem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/create_subsystem',
+            gateway__pb2.create_subsystem_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def delete_subsystem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/delete_subsystem',
+            gateway__pb2.delete_subsystem_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def add_namespace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/add_namespace',
+            gateway__pb2.add_namespace_req.SerializeToString,
+            gateway__pb2.nsid_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def remove_namespace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/remove_namespace',
+            gateway__pb2.remove_namespace_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def add_host(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/add_host',
+            gateway__pb2.add_host_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def remove_host(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/remove_host',
+            gateway__pb2.remove_host_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def create_listener(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/create_listener',
+            gateway__pb2.create_listener_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def delete_listener(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/delete_listener',
+            gateway__pb2.delete_listener_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def get_subsystems(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/get_subsystems',
+            gateway__pb2.get_subsystems_req.SerializeToString,
+            gateway__pb2.subsystems_info.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def get_spdk_nvmf_log_flags_and_level(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/get_spdk_nvmf_log_flags_and_level',
+            gateway__pb2.get_spdk_nvmf_log_flags_and_level_req.SerializeToString,
+            gateway__pb2.spdk_nvmf_log_flags_and_level_info.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def disable_spdk_nvmf_logs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/disable_spdk_nvmf_logs',
+            gateway__pb2.disable_spdk_nvmf_logs_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def set_spdk_nvmf_logs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/set_spdk_nvmf_logs',
+            gateway__pb2.set_spdk_nvmf_logs_req.SerializeToString,
+            gateway__pb2.req_status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def get_gateway_info(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/Gateway/get_gateway_info',
+            gateway__pb2.get_gateway_info_req.SerializeToString,
+            gateway__pb2.gateway_info.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)