test/sma: plugin test
The test verifies that it's possible to register device managers from out-of-tree plugins. The test defines two plugins, each defining two device managers implementing the same two protocols and verifies that it's possible to register different combinations. Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com> Change-Id: I2144b40db603fea95bf8b571777e6662b4de9bc7 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11729 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
b41183835d
commit
2bf4927236
@ -92,3 +92,4 @@ zoned_fio
|
||||
|
||||
# SMA tests - disabled in CI for now
|
||||
sma_nvmf_tcp
|
||||
sma_plugins
|
||||
|
149
test/sma/plugins.sh
Executable file
149
test/sma/plugins.sh
Executable file
@ -0,0 +1,149 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
testdir=$(readlink -f "$(dirname "$0")")
|
||||
rootdir=$(readlink -f "$testdir/../..")
|
||||
|
||||
source "$rootdir/test/common/autotest_common.sh"
|
||||
source "$testdir/common.sh"
|
||||
|
||||
function create_device() {
|
||||
"$rootdir/scripts/sma-client.py" <<- EOF
|
||||
{
|
||||
"method": "CreateDevice",
|
||||
"params": {
|
||||
"$1": {}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
trap 'killprocess $smapid; exit 1' SIGINT SIGTERM EXIT
|
||||
|
||||
# First check a single plugin with both its devices enabled in the config
|
||||
PYTHONPATH=$testdir/plugins $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
plugins:
|
||||
- 'plugin1'
|
||||
devices:
|
||||
- name: 'plugin1-device1'
|
||||
- name: 'plugin1-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
# Wait for a while to make sure SMA starts listening
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvme | jq -r '.handle') == 'nvme:plugin1-device1' ]]
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin1-device2' ]]
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
# Check that it's possible to enable only a single device from a plugin
|
||||
PYTHONPATH=$testdir/plugins $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
plugins:
|
||||
- 'plugin1'
|
||||
devices:
|
||||
- name: 'plugin1-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin1-device2' ]]
|
||||
NOT create_device nvme
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
# Load two different plugins, but only enable devices from one of them
|
||||
PYTHONPATH=$testdir/plugins $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
plugins:
|
||||
- 'plugin1'
|
||||
- 'plugin2'
|
||||
devices:
|
||||
- name: 'plugin1-device1'
|
||||
- name: 'plugin1-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvme | jq -r '.handle') == 'nvme:plugin1-device1' ]]
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin1-device2' ]]
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
# Check the same but take devices defined by the other plugin
|
||||
PYTHONPATH=$testdir/plugins $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
plugins:
|
||||
- 'plugin1'
|
||||
- 'plugin2'
|
||||
devices:
|
||||
- name: 'plugin2-device1'
|
||||
- name: 'plugin2-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvme | jq -r '.handle') == 'nvme:plugin2-device1' ]]
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin2-device2' ]]
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
# Now pick a device from each plugin
|
||||
PYTHONPATH=$testdir/plugins $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
plugins:
|
||||
- 'plugin1'
|
||||
- 'plugin2'
|
||||
devices:
|
||||
- name: 'plugin1-device1'
|
||||
- name: 'plugin2-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvme | jq -r '.handle') == 'nvme:plugin1-device1' ]]
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin2-device2' ]]
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
# Check the same, but register plugins via a env var
|
||||
PYTHONPATH=$testdir/plugins SMA_PLUGINS=plugin1:plugin2 $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
devices:
|
||||
- name: 'plugin1-device1'
|
||||
- name: 'plugin2-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvme | jq -r '.handle') == 'nvme:plugin1-device1' ]]
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin2-device2' ]]
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
# Finally, register one plugin in a config and the other through env var
|
||||
PYTHONPATH=$testdir/plugins SMA_PLUGINS=plugin1 $rootdir/scripts/sma.py -c <(
|
||||
cat <<- EOF
|
||||
plugins:
|
||||
- 'plugin2'
|
||||
devices:
|
||||
- name: 'plugin1-device1'
|
||||
- name: 'plugin2-device2'
|
||||
EOF
|
||||
) &
|
||||
smapid=$!
|
||||
sma_waitforlisten
|
||||
|
||||
[[ $(create_device nvme | jq -r '.handle') == 'nvme:plugin1-device1' ]]
|
||||
[[ $(create_device nvmf_tcp | jq -r '.handle') == 'nvmf_tcp:plugin2-device2' ]]
|
||||
|
||||
killprocess $smapid
|
||||
|
||||
trap - SIGINT SIGTERM EXIT
|
21
test/sma/plugins/plugin1/__init__.py
Normal file
21
test/sma/plugins/plugin1/__init__.py
Normal file
@ -0,0 +1,21 @@
|
||||
from spdk.sma import DeviceManager
|
||||
from spdk.sma.proto import sma_pb2
|
||||
|
||||
|
||||
class TestDeviceManager1(DeviceManager):
|
||||
def __init__(self, client):
|
||||
super().__init__('plugin1-device1', 'nvme', client)
|
||||
|
||||
def create_device(self, request):
|
||||
return sma_pb2.CreateDeviceResponse(handle=f'{self.protocol}:{self.name}')
|
||||
|
||||
|
||||
class TestDeviceManager2(DeviceManager):
|
||||
def __init__(self, client):
|
||||
super().__init__('plugin1-device2', 'nvmf_tcp', client)
|
||||
|
||||
def create_device(self, request):
|
||||
return sma_pb2.CreateDeviceResponse(handle=f'{self.protocol}:{self.name}')
|
||||
|
||||
|
||||
devices = [TestDeviceManager1, TestDeviceManager2]
|
21
test/sma/plugins/plugin2/__init__.py
Normal file
21
test/sma/plugins/plugin2/__init__.py
Normal file
@ -0,0 +1,21 @@
|
||||
from spdk.sma import DeviceManager
|
||||
from spdk.sma.proto import sma_pb2
|
||||
|
||||
|
||||
class TestDeviceManager1(DeviceManager):
|
||||
def __init__(self, client):
|
||||
super().__init__('plugin2-device1', 'nvme', client)
|
||||
|
||||
def create_device(self, request):
|
||||
return sma_pb2.CreateDeviceResponse(handle=f'{self.protocol}:{self.name}')
|
||||
|
||||
|
||||
class TestDeviceManager2(DeviceManager):
|
||||
def __init__(self, client):
|
||||
super().__init__('plugin2-device2', 'nvmf_tcp', client)
|
||||
|
||||
def create_device(self, request):
|
||||
return sma_pb2.CreateDeviceResponse(handle=f'{self.protocol}:{self.name}')
|
||||
|
||||
|
||||
devices = [TestDeviceManager1, TestDeviceManager2]
|
@ -6,3 +6,4 @@ rootdir=$(readlink -f "$testdir/../..")
|
||||
source "$rootdir/test/common/autotest_common.sh"
|
||||
|
||||
run_test "sma_nvmf_tcp" $testdir/nvmf_tcp.sh
|
||||
run_test "sma_plugins" $testdir/plugins.sh
|
||||
|
Loading…
Reference in New Issue
Block a user