It makes it possible for stateless clients to send CreateDevice / DeleteDevice each time a volume is attached / detached. Deleting a device with attached volumes results in FAILED_PRECONDITION error, which a client can simply ignore. The device will be deleted during the final DeleteDevice call, once all volumes are detached. We limit this behavior to device types that support AttachVolume / DetachVolume methods, otherwise it would be impossible to delete such devices. Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com> Change-Id: I244b2b09455ec1430970c70f3fbb739cc9069754 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15670 Reviewed-by: Jing Yan <jing1.yan@intel.com> Reviewed-by: Filip Szufnarowski <filip.szufnarowski@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright (C) 2022 Intel Corporation.
|
|
# All rights reserved.
|
|
|
|
from ..proto import sma_pb2
|
|
|
|
|
|
class DeviceException(Exception):
|
|
def __init__(self, code, message):
|
|
self.code = code
|
|
self.message = message
|
|
|
|
|
|
class DeviceManager:
|
|
def __init__(self, name, protocol, client, allow_delete_volumes=False):
|
|
self._client = client
|
|
self.protocol = protocol
|
|
self.name = name
|
|
# Configures whether the device allows deleting a device with attached volumes
|
|
self.allow_delete_volumes = allow_delete_volumes
|
|
|
|
def init(self, config):
|
|
pass
|
|
|
|
def create_device(self, request):
|
|
raise NotImplementedError()
|
|
|
|
def delete_device(self, request):
|
|
raise NotImplementedError()
|
|
|
|
def attach_volume(self, request):
|
|
raise NotImplementedError()
|
|
|
|
def detach_volume(self, request):
|
|
raise NotImplementedError()
|
|
|
|
def owns_device(self, id):
|
|
raise NotImplementedError()
|
|
|
|
def set_qos(self, request):
|
|
raise NotImplementedError()
|
|
|
|
def get_qos_capabilities(self, request):
|
|
raise NotImplementedError()
|