Commit 2bf49272 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

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: default avatarKonrad 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: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent b4118383
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -92,3 +92,4 @@ zoned_fio

# SMA tests - disabled in CI for now
sma_nvmf_tcp
sma_plugins

test/sma/plugins.sh

0 → 100755
+149 −0
Original line number Diff line number Diff line
#!/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 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
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]
+1 −0
Original line number Diff line number Diff line
@@ -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