)
)
+ @empty_response
+ @NvmeofCLICommand(
+ "nvmeof subsystem add_kmip_server_endpoint", model.RequestStatus
+ )
+ @EndpointDoc(
+ "Add a KMIP server endpoint to the subsystem",
+ parameters={
+ "nqn": Param(str, "NVMeoF subsystem NQN"),
+ "server_name": Param(str, "Name of the KMIP server the endpoint points to"),
+ "address": Param(str, "KMIP server endpoint address", True, None),
+ "port": Param(int, "KMIP server endpoint port", True, 5696),
+ "gw_group": Param(str, "NVMeoF gateway group", True, None),
+ "traddr": Param(str, "NVMeoF gateway address", True, None),
+ },
+ )
+ @convert_to_model(model.RequestStatus)
+ @handle_nvmeof_error
+ def add_kmip_server_endpoint(self, nqn: str, server_name: str,
+ address: Optional[str] = None,
+ port: Optional[int] = 5696, gw_group: Optional[str] = None,
+ traddr: Optional[str] = None):
+ ep = NVMeoFClient.pb2.kmip_server_endpoint(address=address, port=port)
+ return NVMeoFClient(
+ gw_group=gw_group,
+ traddr=traddr
+ ).stub.add_kmip_server_endpoints(
+ NVMeoFClient.pb2.add_kmip_server_endpoints_req(
+ subsystem_nqn=nqn, server_name=server_name,
+ endpoints=[ep]
+ )
+ )
+
+ @empty_response
+ @NvmeofCLICommand(
+ "nvmeof subsystem del_kmip_server_endpoint", model.RequestStatus
+ )
+ @EndpointDoc(
+ "Delete a KMIP server endpoint from the subsystem",
+ parameters={
+ "nqn": Param(str, "NVMeoF subsystem NQN"),
+ "server_name": Param(str, "Name of the KMIP server the endpoint points to"),
+ "address": Param(str, "KMIP server endpoint address", True, None),
+ "port": Param(int, "KMIP server endpoint port", True, 5696),
+ "gw_group": Param(str, "NVMeoF gateway group", True, None),
+ "traddr": Param(str, "NVMeoF gateway address", True, None),
+ },
+ )
+ @convert_to_model(model.RequestStatus)
+ @handle_nvmeof_error
+ def del_kmip_server_endpoint(self, nqn: str, server_name: str,
+ address: Optional[str] = None,
+ port: Optional[int] = 5696, gw_group: Optional[str] = None,
+ traddr: Optional[str] = None):
+ ep = NVMeoFClient.pb2.kmip_server_endpoint(address=address, port=port)
+ return NVMeoFClient(
+ gw_group=gw_group,
+ traddr=traddr
+ ).stub.del_kmip_server_endpoints(
+ NVMeoFClient.pb2.del_kmip_server_endpoints_req(
+ subsystem_nqn=nqn, server_name=server_name,
+ endpoints=[ep]
+ )
+ )
+
+ @NvmeofCLICommand("nvmeof subsystem list_kmip_server_endpoints",
+ model.SubsystemListKMIPEndpoints)
+ @EndpointDoc(
+ "List KMIP server endpoints for a subsystem or all subsystems",
+ parameters={
+ "nqn": Param(str, "Only show endpoints for this subsystem NQN", True, None),
+ "server_name": Param(str, "Only show endpoints for this KMIP server name",
+ True, None),
+ "gw_group": Param(str, "NVMeoF gateway group", True, None),
+ "traddr": Param(str, "NVMeoF gateway address", True, None),
+ },
+ )
+ @convert_to_model(model.SubsystemListKMIPEndpoints)
+ @handle_nvmeof_error
+ def list_eps(self, nqn: Optional[str] = None, server_name: Optional[str] = None,
+ gw_group: Optional[str] = None, traddr: Optional[str] = None):
+ return NVMeoFClient(
+ gw_group=gw_group,
+ traddr=traddr
+ ).stub.list_kmip_server_endpoints(
+ NVMeoFClient.pb2.list_kmip_server_endpoints_req(subsystem_nqn=nqn,
+ server_name=server_name)
+ )
+
@NvmeofCLICommand("nvmeof get_subsystems", model.GetSubsystems)
@convert_to_model(model.GetSubsystems)
@handle_nvmeof_error
"no_auto_visible": Param(
bool,
"Namespace will be visible only for the allowed hosts"
- )
+ ),
+ "encryption_format": Param([str],
+ "Encryption format(s) to use, LUKS1 or LUKS2, "
+ "separated by commas",
+ True, None),
+ "encryption_algorithm": Param(str,
+ "Algorithm to use for encryption",
+ True, None),
+ "key_id": Param([str],
+ "Key ID(s) to use for encryption pass phrases, "
+ "separated by commas",
+ True, None),
},
)
@convert_to_model(model.NamespaceCreation)
gw_group: Optional[str] = None,
traddr: Optional[str] = None,
rados_namespace: Optional[str] = None,
+ encryption_format: Optional[List[str]] = None,
+ encryption_algorithm: Optional[str] = None,
+ key_id: Optional[List[str]] = None,
):
- return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_add(
+ encryption_format = encryption_format or []
+ key_id = key_id or []
+ if len(encryption_format) != len(key_id):
+ raise DashboardException(
+ msg="The number of key IDs should match the number of encryption formats",
+ code="key_ids_encryption_formats_mismatch",
+ http_status_code=400,
+ component="nvmeof",
+ )
+ enc_entries = [
+ NVMeoFClient.pb2.encryption_entry(
+ format=f.strip().lower(),
+ key_id=k.strip()
+ ) for f, k in zip(encryption_format, key_id)]
+ enc_alg = encryption_algorithm.strip().lower() if encryption_algorithm else None
+ return NVMeoFClient(
+ gw_group=gw_group,
+ traddr=traddr
+ ).stub.namespace_add(
NVMeoFClient.pb2.namespace_add_req(
subsystem_nqn=nqn,
nsid=int(nsid) if nsid else None,
force=force,
no_auto_visible=no_auto_visible,
disable_auto_resize=disable_auto_resize,
- read_only=read_only
+ read_only=read_only,
+ encryption_entries=enc_entries,
+ encryption_algorithm=enc_alg
)
)
"no_auto_visible": Param(
bool,
"Namespace will be visible only for the allowed hosts"
- )
+ ),
+ "encryption_format": Param([str],
+ "Encryption format(s) to use, LUKS1 or LUKS2, "
+ "separated by commas",
+ True, None),
+ "encryption_algorithm": Param(str,
+ "Algorithm to use for encryption",
+ True, None),
+ "key_id": Param([str],
+ "Key ID(s) to use for encryption pass phrases, "
+ "separated by commas",
+ True, None),
},
)
@convert_to_model(model.NamespaceCreation)
gw_group: Optional[str] = None,
traddr: Optional[str] = None,
rados_namespace: Optional[str] = None,
-
+ encryption_format: Optional[List[str]] = None,
+ encryption_algorithm: Optional[str] = None,
+ key_id: Optional[List[str]] = None,
):
if size and rbd_image_size:
raise DashboardException(
size_b = convert_to_bytes(size, default_unit='MB')
if rbd_image_size:
rbd_image_size_b = convert_to_bytes(rbd_image_size, default_unit='MB')
- return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_add(
+ if not encryption_format:
+ encryption_format = []
+ if not key_id:
+ key_id = []
+ if len(encryption_format) != len(key_id):
+ raise DashboardException(
+ msg="The number of key IDs should match the number of encryption formats",
+ code="key_ids_encryption_formats_mismatch",
+ http_status_code=400,
+ component="nvmeof",
+ )
+ enc_entries = [
+ NVMeoFClient.pb2.encryption_entry(
+ format=f.strip().lower(),
+ key_id=k.strip()
+ ) for f, k in zip(encryption_format, key_id)]
+ enc_alg = encryption_algorithm.strip().lower() if encryption_algorithm else None
+ return NVMeoFClient(
+ gw_group=gw_group,
+ traddr=traddr
+ ).stub.namespace_add(
NVMeoFClient.pb2.namespace_add_req(
subsystem_nqn=nqn,
nsid=int(nsid) if nsid else None,
force=force,
no_auto_visible=no_auto_visible,
disable_auto_resize=disable_auto_resize,
- read_only=read_only
+ read_only=read_only,
+ encryption_entries=enc_entries,
+ encryption_algorithm=enc_alg
)
)