Skip to content

Commit 02a0071

Browse files
authored
Merge pull request ceph#64215 from Hezko/nvmeof-cli-migrate-prs
mgr/dashboard: NVMeoF CLI migrate prs Reviewed-by: Afreen Misbah <[email protected]> Reviewed-by: Ernesto Puerta <[email protected]>
2 parents 621e74f + 2e82486 commit 02a0071

File tree

3 files changed

+215
-17
lines changed

3 files changed

+215
-17
lines changed

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

Lines changed: 123 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
2+
# pylint: disable=too-many-lines
23
import logging
3-
from typing import Any, Dict, Optional
4+
from typing import Any, Dict, List, Optional
45

56
import cherrypy
67
from orchestrator import OrchestratorError
@@ -100,10 +101,13 @@ class NVMeoFSpdk(RESTController):
100101
@NvmeofCLICommand("nvmeof spdk_log_level get", model.SpdkNvmfLogFlagsAndLevelInfo)
101102
@convert_to_model(model.SpdkNvmfLogFlagsAndLevelInfo)
102103
@handle_nvmeof_error
103-
def get_spdk_log_level(self, gw_group: Optional[str] = None, traddr: Optional[str] = None):
104+
def get_spdk_log_level(
105+
self, all_log_flags: Optional[bool] = None,
106+
gw_group: Optional[str] = None, traddr: Optional[str] = None
107+
):
104108
spdk_log_level = NVMeoFClient(gw_group=gw_group,
105109
traddr=traddr).stub.get_spdk_nvmf_log_flags_and_level(
106-
NVMeoFClient.pb2.get_spdk_nvmf_log_flags_and_level_req()
110+
NVMeoFClient.pb2.get_spdk_nvmf_log_flags_and_level_req(all_log_flags=all_log_flags)
107111
)
108112
return spdk_log_level
109113

@@ -114,13 +118,15 @@ def get_spdk_log_level(self, gw_group: Optional[str] = None, traddr: Optional[st
114118
@handle_nvmeof_error
115119
def set_spdk_log_level(self, log_level: Optional[str] = None,
116120
print_level: Optional[str] = None,
121+
extra_log_flags: Optional[List[str]] = None,
117122
gw_group: Optional[str] = None, traddr: Optional[str] = None):
118123
log_level = log_level.upper() if log_level else None
119124
print_level = print_level.upper() if print_level else None
120125
spdk_log_level = NVMeoFClient(gw_group=gw_group,
121-
traddr=traddr).stub.set_spdk_nvmf_logs_req(
126+
traddr=traddr).stub.set_spdk_nvmf_logs(
122127
NVMeoFClient.pb2.set_spdk_nvmf_logs_req(log_level=log_level,
123-
print_level=print_level)
128+
print_level=print_level,
129+
extra_log_flags=extra_log_flags)
124130
)
125131
return spdk_log_level
126132

@@ -129,11 +135,14 @@ def set_spdk_log_level(self, log_level: Optional[str] = None,
129135
@NvmeofCLICommand("nvmeof spdk_log_level disable", model.RequestStatus)
130136
@convert_to_model(model.RequestStatus)
131137
@handle_nvmeof_error
132-
def disable_spdk_log_level(self, gw_group: Optional[str] = None,
133-
traddr: Optional[str] = None):
138+
def disable_spdk_log_level(
139+
self, extra_log_flags: Optional[List[str]] = None,
140+
gw_group: Optional[str] = None,
141+
traddr: Optional[str] = None
142+
):
134143
spdk_log_level = NVMeoFClient(gw_group=gw_group,
135144
traddr=traddr).stub.disable_spdk_nvmf_logs(
136-
NVMeoFClient.pb2.disable_spdk_nvmf_logs_req()
145+
NVMeoFClient.pb2.disable_spdk_nvmf_logs_req(extra_log_flags=extra_log_flags)
137146
)
138147
return spdk_log_level
139148

@@ -390,10 +399,12 @@ def create(
390399
trash_image: Optional[bool] = False,
391400
block_size: int = 512,
392401
load_balancing_group: Optional[int] = None,
402+
force: Optional[bool] = False,
403+
no_auto_visible: Optional[bool] = False,
404+
disable_auto_resize: Optional[bool] = False,
405+
read_only: Optional[bool] = False,
393406
gw_group: Optional[str] = None,
394407
traddr: Optional[str] = None,
395-
force: Optional[bool] = False,
396-
no_auto_visible: Optional[bool] = False
397408
):
398409
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_add(
399410
NVMeoFClient.pb2.namespace_add_req(
@@ -406,7 +417,9 @@ def create(
406417
trash_image=trash_image,
407418
anagrpid=load_balancing_group,
408419
force=force,
409-
no_auto_visible=no_auto_visible
420+
no_auto_visible=no_auto_visible,
421+
disable_auto_resize=disable_auto_resize,
422+
read_only=read_only
410423
)
411424
)
412425

@@ -531,6 +544,11 @@ def resize(
531544
"nqn": Param(str, "NVMeoF subsystem NQN"),
532545
"nsid": Param(str, "NVMeoF Namespace ID"),
533546
"host_nqn": Param(str, 'NVMeoF host NQN. Use "*" to allow any host.'),
547+
"force": Param(
548+
bool,
549+
"Allow adding the host to the namespace even if the host "
550+
"has no access to the subsystem"
551+
),
534552
"gw_group": Param(str, "NVMeoF gateway group", True, None),
535553
"traddr": Param(str, "NVMeoF gateway address", True, None),
536554
},
@@ -543,13 +561,15 @@ def add_host(
543561
nqn: str,
544562
nsid: str,
545563
host_nqn: str,
564+
force: Optional[bool] = None,
546565
gw_group: Optional[str] = None,
547566
traddr: Optional[str] = None
548567
):
549568
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_add_host(
550569
NVMeoFClient.pb2.namespace_add_host_req(subsystem_nqn=nqn,
551570
nsid=int(nsid),
552-
host_nqn=host_nqn)
571+
host_nqn=host_nqn,
572+
force=str_to_bool(force))
553573
)
554574

555575
@ReadPermission
@@ -616,6 +636,41 @@ def change_visibility(
616636
)
617637
)
618638

639+
@ReadPermission
640+
@Endpoint('PUT', '{nsid}/set_auto_resize')
641+
@EndpointDoc(
642+
"Enable or disable namespace auto resize when RBD image is resized",
643+
parameters={
644+
"nqn": Param(str, "NVMeoF subsystem NQN"),
645+
"nsid": Param(str, "NVMeoF Namespace ID"),
646+
"auto_resize_enabled": Param(
647+
bool,
648+
'Enable or disable auto resize of '
649+
'namespace when RBD image is resized'
650+
),
651+
"gw_group": Param(str, "NVMeoF gateway group", True, None),
652+
"traddr": Param(str, "NVMeoF gateway address", True, None),
653+
},
654+
)
655+
@NvmeofCLICommand("nvmeof ns set_auto_resize", model=model.RequestStatus)
656+
@convert_to_model(model.RequestStatus)
657+
@handle_nvmeof_error
658+
def set_auto_resize(
659+
self,
660+
nqn: str,
661+
nsid: str,
662+
auto_resize_enabled: bool,
663+
gw_group: Optional[str] = None,
664+
traddr: Optional[str] = None
665+
):
666+
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_set_auto_resize(
667+
NVMeoFClient.pb2.namespace_set_auto_resize_req(
668+
subsystem_nqn=nqn,
669+
nsid=int(nsid),
670+
auto_resize=str_to_bool(auto_resize_enabled),
671+
)
672+
)
673+
619674
@ReadPermission
620675
@Endpoint('PUT', '{nsid}/set_rbd_trash_image')
621676
@EndpointDoc(
@@ -812,16 +867,21 @@ class NVMeoFHost(RESTController):
812867
"List all allowed hosts for an NVMeoF subsystem",
813868
parameters={
814869
"nqn": Param(str, "NVMeoF subsystem NQN"),
870+
"clear_alerts": Param(bool, "Clear any host alert signal after getting its value",
871+
True, False),
815872
"gw_group": Param(str, "NVMeoF gateway group", True, None),
816873
},
817874
)
818875
@pick('hosts')
819876
@NvmeofCLICommand("nvmeof host list", model.HostsInfo)
820877
@convert_to_model(model.HostsInfo, finalize=_update_hosts)
821878
@handle_nvmeof_error
822-
def list(self, nqn: str, gw_group: Optional[str] = None, traddr: Optional[str] = None):
879+
def list(
880+
self, nqn: str, clear_alerts: Optional[bool],
881+
gw_group: Optional[str] = None, traddr: Optional[str] = None
882+
):
823883
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.list_hosts(
824-
NVMeoFClient.pb2.list_hosts_req(subsystem=nqn)
884+
NVMeoFClient.pb2.list_hosts_req(subsystem=nqn, clear_alerts=clear_alerts)
825885
)
826886

827887
@EndpointDoc(
@@ -860,6 +920,51 @@ def delete(self, nqn: str, host_nqn: str, gw_group: Optional[str] = None,
860920
NVMeoFClient.pb2.remove_host_req(subsystem_nqn=nqn, host_nqn=host_nqn)
861921
)
862922

923+
@EndpointDoc(
924+
"Change host DH-HMAC-CHAP key",
925+
parameters={
926+
"nqn": Param(str, "NVMeoF subsystem NQN"),
927+
"host_nqn": Param(str, 'NVMeoF host NQN'),
928+
"dhchap_key": Param(str, 'Host DH-HMAC-CHAP key'),
929+
"gw_group": Param(str, "NVMeoF gateway group", True, None),
930+
},
931+
)
932+
@empty_response
933+
@NvmeofCLICommand("nvmeof host change_key", model.RequestStatus)
934+
@convert_to_model(model.RequestStatus)
935+
@handle_nvmeof_error
936+
def change_key(
937+
self, nqn: str, host_nqn: str, dhchap_key: str,
938+
gw_group: Optional[str] = None, traddr: Optional[str] = None
939+
):
940+
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.change_host_key(
941+
NVMeoFClient.pb2.change_host_key_req(subsystem_nqn=nqn,
942+
host_nqn=host_nqn,
943+
dhchap_key=dhchap_key)
944+
)
945+
946+
@EndpointDoc(
947+
"Delete host DH-HMAC-CHAP key",
948+
parameters={
949+
"nqn": Param(str, "NVMeoF subsystem NQN"),
950+
"host_nqn": Param(str, 'NVMeoF host NQN.'),
951+
"gw_group": Param(str, "NVMeoF gateway group", True, None),
952+
},
953+
)
954+
@empty_response
955+
@NvmeofCLICommand("nvmeof host del_key", model.RequestStatus)
956+
@convert_to_model(model.RequestStatus)
957+
@handle_nvmeof_error
958+
def del_key(
959+
self, nqn: str, host_nqn: str, gw_group: Optional[str] = None,
960+
traddr: Optional[str] = None
961+
):
962+
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.change_host_key(
963+
NVMeoFClient.pb2.change_host_key_req(subsystem_nqn=nqn,
964+
host_nqn=host_nqn,
965+
dhchap_key=None)
966+
)
967+
863968
@APIRouter("/nvmeof/subsystem/{nqn}/connection", Scope.NVME_OF)
864969
@APIDoc("NVMe-oF Subsystem Connection Management API", "NVMe-oF Subsystem Connection")
865970
class NVMeoFConnection(RESTController):
@@ -874,7 +979,10 @@ class NVMeoFConnection(RESTController):
874979
@NvmeofCLICommand("nvmeof connection list", model.ConnectionList)
875980
@convert_to_model(model.ConnectionList)
876981
@handle_nvmeof_error
877-
def list(self, nqn: str, gw_group: Optional[str] = None, traddr: Optional[str] = None):
982+
def list(self, nqn: Optional[str] = None,
983+
gw_group: Optional[str] = None, traddr: Optional[str] = None):
984+
if not nqn:
985+
nqn = '*'
878986
return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.list_connections(
879987
NVMeoFClient.pb2.list_connections_req(subsystem=nqn)
880988
)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ class Connection(NamedTuple):
9494
connected: bool
9595
qpairs_count: int
9696
controller_id: int
97+
use_psk: Optional[bool]
98+
use_dhchap: Optional[bool]
99+
subsystem: Optional[str]
100+
disconnected_due_to_keepalive_timeout: Optional[bool]
97101

98102

99103
class ConnectionList(NamedTuple):
@@ -126,6 +130,8 @@ class Namespace(NamedTuple):
126130
uuid: Optional[str]
127131
ns_subsystem_nqn: Optional[str]
128132
trash_image: Optional[bool]
133+
disable_auto_resize: Optional[bool]
134+
read_only: Optional[bool]
129135

130136

131137
class NamespaceList(NamedTuple):
@@ -183,6 +189,7 @@ class Host(NamedTuple):
183189
nqn: str
184190
use_psk: Optional[bool]
185191
use_dhchap: Optional[bool]
192+
disconnected_due_to_keepalive_timeout: Optional[bool]
186193

187194

188195
class HostsInfo(NamedTuple):

0 commit comments

Comments
 (0)