Skip to content

Commit 3a2aac2

Browse files
authored
Merge pull request ceph#61649 from Hezko/nvmeof-response-handling
mgr/dashboard: introduce "convert_to_model" and "pick" decorators
2 parents 6a4abeb + a33914e commit 3a2aac2

File tree

4 files changed

+655
-32
lines changed

4 files changed

+655
-32
lines changed

src/pybind/mgr/dashboard/controllers/nvmeof.py

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
}
2424

2525
try:
26-
from ..services.nvmeof_client import NVMeoFClient, empty_response, \
27-
handle_nvmeof_error, map_collection, map_model
26+
from ..services.nvmeof_client import NVMeoFClient, convert_to_model, \
27+
empty_response, handle_nvmeof_error, map_collection, pick
2828
except ImportError as e:
2929
logger.error("Failed to import NVMeoFClient and related components: %s", e)
3030
else:
@@ -33,7 +33,7 @@
3333
class NVMeoFGateway(RESTController):
3434
@EndpointDoc("Get information about the NVMeoF gateway")
3535
@NvmeofCLICommand("nvmeof gw info")
36-
@map_model(model.GatewayInfo)
36+
@convert_to_model(model.GatewayInfo)
3737
@handle_nvmeof_error
3838
def list(self, gw_group: Optional[str] = None):
3939
return NVMeoFClient(gw_group=gw_group).stub.get_gateway_info(
@@ -56,7 +56,7 @@ def group(self):
5656
@ReadPermission
5757
@Endpoint('GET', '/version')
5858
@NvmeofCLICommand("nvmeof gw version")
59-
@map_model(model.GatewayVersion)
59+
@convert_to_model(model.GatewayVersion)
6060
@handle_nvmeof_error
6161
def version(self, gw_group: Optional[str] = None):
6262
gw_info = NVMeoFClient(gw_group=gw_group).stub.get_gateway_info(
@@ -69,7 +69,7 @@ def version(self, gw_group: Optional[str] = None):
6969
@ReadPermission
7070
@Endpoint('GET', '/log_level')
7171
@NvmeofCLICommand("nvmeof gw get_log_level")
72-
@map_model(model.GatewayLogLevelInfo)
72+
@convert_to_model(model.GatewayLogLevelInfo)
7373
@handle_nvmeof_error
7474
def get_log_level(self, gw_group: Optional[str] = None):
7575
gw_log_level = NVMeoFClient(gw_group=gw_group).stub.get_gateway_log_level(
@@ -80,7 +80,7 @@ def get_log_level(self, gw_group: Optional[str] = None):
8080
@ReadPermission
8181
@Endpoint('PUT', '/log_level')
8282
@NvmeofCLICommand("nvmeof gw set_log_level")
83-
@map_model(model.RequestStatus)
83+
@convert_to_model(model.RequestStatus)
8484
@handle_nvmeof_error
8585
def set_log_level(self, log_level: str, gw_group: Optional[str] = None):
8686
log_level = log_level.lower()
@@ -95,7 +95,7 @@ class NVMeoFSpdk(RESTController):
9595
@ReadPermission
9696
@Endpoint('GET', '/log_level')
9797
@NvmeofCLICommand("nvmeof spdk_log_level get")
98-
@map_model(model.SpdkNvmfLogFlagsAndLevelInfo)
98+
@convert_to_model(model.SpdkNvmfLogFlagsAndLevelInfo)
9999
@handle_nvmeof_error
100100
def get_spdk_log_level(self, gw_group: Optional[str] = None):
101101
spdk_log_level = NVMeoFClient(gw_group=gw_group).stub.get_spdk_nvmf_log_flags_and_level(
@@ -106,7 +106,7 @@ def get_spdk_log_level(self, gw_group: Optional[str] = None):
106106
@ReadPermission
107107
@Endpoint('PUT', '/log_level')
108108
@NvmeofCLICommand("nvmeof spdk_log_level set")
109-
@map_model(model.RequestStatus)
109+
@convert_to_model(model.RequestStatus)
110110
@handle_nvmeof_error
111111
def set_spdk_log_level(self, log_level: Optional[str] = None,
112112
print_level: Optional[str] = None, gw_group: Optional[str] = None):
@@ -121,7 +121,7 @@ def set_spdk_log_level(self, log_level: Optional[str] = None,
121121
@ReadPermission
122122
@Endpoint('PUT', '/log_level/disable')
123123
@NvmeofCLICommand("nvmeof spdk_log_level disable")
124-
@map_model(model.RequestStatus)
124+
@convert_to_model(model.RequestStatus)
125125
@handle_nvmeof_error
126126
def disable_spdk_log_level(self, gw_group: Optional[str] = None):
127127
spdk_log_level = NVMeoFClient(gw_group=gw_group).stub.disable_spdk_nvmf_logs(
@@ -133,8 +133,9 @@ def disable_spdk_log_level(self, gw_group: Optional[str] = None):
133133
@APIDoc("NVMe-oF Subsystem Management API", "NVMe-oF Subsystem")
134134
class NVMeoFSubsystem(RESTController):
135135
@EndpointDoc("List all NVMeoF subsystems")
136+
@pick(field="subsystems", first=True)
136137
@NvmeofCLICommand("nvmeof subsystem list")
137-
@map_collection(model.Subsystem, pick="subsystems")
138+
@convert_to_model(model.SubsystemList)
138139
@handle_nvmeof_error
139140
def list(self, gw_group: Optional[str] = None):
140141
return NVMeoFClient(gw_group=gw_group).stub.list_subsystems(
@@ -148,8 +149,9 @@ def list(self, gw_group: Optional[str] = None):
148149
"gw_group": Param(str, "NVMeoF gateway group", True, None),
149150
},
150151
)
152+
@pick(field="subsystems", first=True)
151153
@NvmeofCLICommand("nvmeof subsystem get")
152-
@map_model(model.Subsystem, first="subsystems")
154+
@convert_to_model(model.SubsystemList)
153155
@handle_nvmeof_error
154156
def get(self, nqn: str, gw_group: Optional[str] = None):
155157
return NVMeoFClient(gw_group=gw_group).stub.list_subsystems(
@@ -165,8 +167,9 @@ def get(self, nqn: str, gw_group: Optional[str] = None):
165167
"gw_group": Param(str, "NVMeoF gateway group", True, None),
166168
},
167169
)
168-
@NvmeofCLICommand("nvmeof subsystem add")
169170
@empty_response
171+
@NvmeofCLICommand("nvmeof subsystem add")
172+
@convert_to_model(model.RequestStatus)
170173
@handle_nvmeof_error
171174
def create(self, nqn: str, enable_ha: bool, max_namespaces: int = 1024,
172175
gw_group: Optional[str] = None):
@@ -184,8 +187,9 @@ def create(self, nqn: str, enable_ha: bool, max_namespaces: int = 1024,
184187
"gw_group": Param(str, "NVMeoF gateway group", True, None),
185188
},
186189
)
187-
@NvmeofCLICommand("nvmeof subsystem del")
188190
@empty_response
191+
@NvmeofCLICommand("nvmeof subsystem del")
192+
@convert_to_model(model.RequestStatus)
189193
@handle_nvmeof_error
190194
def delete(self, nqn: str, force: Optional[str] = "false", gw_group: Optional[str] = None):
191195
return NVMeoFClient(gw_group=gw_group).stub.delete_subsystem(
@@ -204,8 +208,9 @@ class NVMeoFListener(RESTController):
204208
"gw_group": Param(str, "NVMeoF gateway group", True, None),
205209
},
206210
)
211+
@pick("listeners")
207212
@NvmeofCLICommand("nvmeof listener list")
208-
@map_collection(model.Listener, pick="listeners")
213+
@convert_to_model(model.ListenerList)
209214
@handle_nvmeof_error
210215
def list(self, nqn: str, gw_group: Optional[str] = None):
211216
return NVMeoFClient(gw_group=gw_group).stub.list_listeners(
@@ -223,8 +228,9 @@ def list(self, nqn: str, gw_group: Optional[str] = None):
223228
"gw_group": Param(str, "NVMeoF gateway group", True, None),
224229
},
225230
)
226-
@NvmeofCLICommand("nvmeof listener add")
227231
@empty_response
232+
@NvmeofCLICommand("nvmeof listener add")
233+
@convert_to_model(model.RequestStatus)
228234
@handle_nvmeof_error
229235
def create(
230236
self,
@@ -256,8 +262,9 @@ def create(
256262
"gw_group": Param(str, "NVMeoF gateway group", True, None),
257263
},
258264
)
259-
@NvmeofCLICommand("nvmeof listener del")
260265
@empty_response
266+
@NvmeofCLICommand("nvmeof listener del")
267+
@convert_to_model(model.RequestStatus)
261268
@handle_nvmeof_error
262269
def delete(
263270
self,
@@ -290,8 +297,9 @@ class NVMeoFNamespace(RESTController):
290297
"gw_group": Param(str, "NVMeoF gateway group", True, None),
291298
},
292299
)
300+
@pick("namespaces")
293301
@NvmeofCLICommand("nvmeof ns list")
294-
@map_collection(model.Namespace, pick="namespaces")
302+
@convert_to_model(model.NamespaceList)
295303
@handle_nvmeof_error
296304
def list(self, nqn: str, gw_group: Optional[str] = None):
297305
return NVMeoFClient(gw_group=gw_group).stub.list_namespaces(
@@ -306,8 +314,9 @@ def list(self, nqn: str, gw_group: Optional[str] = None):
306314
"gw_group": Param(str, "NVMeoF gateway group", True, None),
307315
},
308316
)
317+
@pick("namespaces", first=True)
309318
@NvmeofCLICommand("nvmeof ns get")
310-
@map_model(model.Namespace, first="namespaces")
319+
@convert_to_model(model.NamespaceList)
311320
@handle_nvmeof_error
312321
def get(self, nqn: str, nsid: str, gw_group: Optional[str] = None):
313322
return NVMeoFClient(gw_group=gw_group).stub.list_namespaces(
@@ -325,7 +334,7 @@ def get(self, nqn: str, nsid: str, gw_group: Optional[str] = None):
325334
},
326335
)
327336
@NvmeofCLICommand("nvmeof ns get_io_stats")
328-
@map_model(model.NamespaceIOStats)
337+
@convert_to_model(model.NamespaceIOStats)
329338
@handle_nvmeof_error
330339
def io_stats(self, nqn: str, nsid: str, gw_group: Optional[str] = None):
331340
return NVMeoFClient(gw_group=gw_group).stub.namespace_get_io_stats(
@@ -357,7 +366,7 @@ def io_stats(self, nqn: str, nsid: str, gw_group: Optional[str] = None):
357366
},
358367
)
359368
@NvmeofCLICommand("nvmeof ns add")
360-
@map_model(model.NamespaceCreation)
369+
@convert_to_model(model.NamespaceCreation)
361370
@handle_nvmeof_error
362371
def create(
363372
self,
@@ -404,8 +413,9 @@ def create(
404413
"trash_image": Param(bool, "Trash RBD image after removing namespace")
405414
},
406415
)
416+
@pick("namespaces", first=True)
407417
@NvmeofCLICommand("nvmeof ns update")
408-
@map_model(model.Namespace, first="namespaces")
418+
@convert_to_model(model.NamespaceList)
409419
@handle_nvmeof_error
410420
def update(
411421
self,
@@ -486,8 +496,9 @@ def update(
486496
"force": Param(str, "Force remove the RBD image")
487497
},
488498
)
489-
@NvmeofCLICommand("nvmeof ns del")
490499
@empty_response
500+
@NvmeofCLICommand("nvmeof ns del")
501+
@convert_to_model(model.RequestStatus)
491502
@handle_nvmeof_error
492503
def delete(
493504
self,
@@ -538,8 +549,9 @@ def list(self, nqn: str, gw_group: Optional[str] = None):
538549
"gw_group": Param(str, "NVMeoF gateway group", True, None),
539550
},
540551
)
541-
@NvmeofCLICommand("nvmeof host add")
542552
@empty_response
553+
@NvmeofCLICommand("nvmeof host add")
554+
@convert_to_model(model.RequestStatus)
543555
@handle_nvmeof_error
544556
def create(self, nqn: str, host_nqn: str, gw_group: Optional[str] = None):
545557
return NVMeoFClient(gw_group=gw_group).stub.add_host(
@@ -554,8 +566,9 @@ def create(self, nqn: str, host_nqn: str, gw_group: Optional[str] = None):
554566
"gw_group": Param(str, "NVMeoF gateway group", True, None),
555567
},
556568
)
557-
@NvmeofCLICommand("nvmeof host del")
558569
@empty_response
570+
@NvmeofCLICommand("nvmeof host del")
571+
@convert_to_model(model.RequestStatus)
559572
@handle_nvmeof_error
560573
def delete(self, nqn: str, host_nqn: str, gw_group: Optional[str] = None):
561574
return NVMeoFClient(gw_group=gw_group).stub.remove_host(
@@ -572,8 +585,9 @@ class NVMeoFConnection(RESTController):
572585
"gw_group": Param(str, "NVMeoF gateway group", True, None),
573586
},
574587
)
588+
@pick("connections")
575589
@NvmeofCLICommand("nvmeof connection list")
576-
@map_collection(model.Connection, pick="connections")
590+
@convert_to_model(model.ConnectionList)
577591
@handle_nvmeof_error
578592
def list(self, nqn: str, gw_group: Optional[str] = None):
579593
return NVMeoFClient(gw_group=gw_group).stub.list_connections(

src/pybind/mgr/dashboard/model/nvmeof.py

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import NamedTuple, Optional
1+
from typing import List, NamedTuple, Optional
22

33

44
class GatewayInfo(NamedTuple):
@@ -19,14 +19,14 @@ class GatewayVersion(NamedTuple):
1919
class GatewayLogLevelInfo(NamedTuple):
2020
status: int
2121
error_message: str
22-
log_level: int
22+
log_level: str
2323

2424

2525
class SpdkNvmfLogFlagsAndLevelInfo(NamedTuple):
2626
status: int
2727
error_message: str
28-
log_level: int
29-
log_print_level: int
28+
log_level: str
29+
log_print_level: str
3030

3131

3232
class Subsystem(NamedTuple):
@@ -41,6 +41,12 @@ class Subsystem(NamedTuple):
4141
max_namespaces: int
4242

4343

44+
class SubsystemList(NamedTuple):
45+
status: int
46+
error_message: str
47+
subsystems: List[Subsystem]
48+
49+
4450
class Connection(NamedTuple):
4551
traddr: str
4652
trsvcid: int
@@ -51,7 +57,16 @@ class Connection(NamedTuple):
5157
controller_id: int
5258

5359

60+
class ConnectionList(NamedTuple):
61+
status: int
62+
error_message: str
63+
subsystem_nqn: str
64+
connections: List[Connection]
65+
66+
5467
class NamespaceCreation(NamedTuple):
68+
status: int
69+
error_message: str
5570
nsid: int
5671

5772

@@ -71,7 +86,16 @@ class Namespace(NamedTuple):
7186
trash_image: bool
7287

7388

89+
class NamespaceList(NamedTuple):
90+
status: int
91+
error_message: str
92+
namespaces: List[Namespace]
93+
94+
7495
class NamespaceIOStats(NamedTuple):
96+
status: int
97+
error_message: str
98+
subsystem_nqn: str
7599
nsid: int
76100
uuid: str
77101
bdev_name: str
@@ -95,7 +119,7 @@ class NamespaceIOStats(NamedTuple):
95119
copy_latency_ticks: int
96120
max_copy_latency_ticks: int
97121
min_copy_latency_ticks: int
98-
# io_error: List[int]
122+
io_error: List[int]
99123

100124

101125
class Listener(NamedTuple):
@@ -106,6 +130,12 @@ class Listener(NamedTuple):
106130
trsvcid: int = 4420
107131

108132

133+
class ListenerList(NamedTuple):
134+
status: int
135+
error_message: str
136+
listeners: List[Listener]
137+
138+
109139
class Host(NamedTuple):
110140
nqn: str
111141

0 commit comments

Comments
 (0)