test/spdkcli: Run different parts of tests with given spdk target.

Use nvmf_tgt for nvmf tests.
Use iscsi_tgt for spdkcli iscsi tests.
Use vhost target for spdkcli vhost tests.
Fixes #511.

Change-Id: I5f084bccf87d32b0ede210c62ccc4a2f7926d716
Signed-off-by: Pawel Kaminski <pawelx.kaminski@intel.com>
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Signed-off-by: Pawel Kaminski <pawelx.kaminski@intel.com>
Reviewed-on: https://review.gerrithub.io/435139
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Karol Latecki <karol.latecki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Pawel Kaminski 2018-11-27 13:58:25 -05:00 committed by Jim Harris
parent 71cd1ea7e7
commit 7e8206c330
8 changed files with 88 additions and 52 deletions

View File

@ -804,7 +804,7 @@ class UIVhostBlk(UIVhost):
def refresh(self): def refresh(self):
self._children = set([]) self._children = set([])
for ctrlr in self.get_root().get_vhost_ctrlrs(self.name): for ctrlr in self.get_root().get_vhost_controllers(ctrlr_type=self.name):
UIVhostBlkCtrlObj(ctrlr, self) UIVhostBlkCtrlObj(ctrlr, self)
def ui_command_create(self, name, bdev, cpumask=None, readonly=False): def ui_command_create(self, name, bdev, cpumask=None, readonly=False):
@ -838,7 +838,7 @@ class UIVhostScsi(UIVhost):
def refresh(self): def refresh(self):
self._children = set([]) self._children = set([])
for ctrlr in self.get_root().get_vhost_ctrlrs(self.name): for ctrlr in self.get_root().get_vhost_controllers(ctrlr_type=self.name):
UIVhostScsiCtrlObj(ctrlr, self) UIVhostScsiCtrlObj(ctrlr, self)
def ui_command_create(self, name, cpumask=None): def ui_command_create(self, name, cpumask=None):
@ -898,7 +898,7 @@ class UIVhostScsiCtrlObj(UIVhostCtrl):
try: try:
self.get_root().remove_vhost_scsi_target(ctrlr=self.ctrlr.ctrlr, self.get_root().remove_vhost_scsi_target(ctrlr=self.ctrlr.ctrlr,
scsi_target_num=int(target_num)) scsi_target_num=int(target_num))
for ctrlr in self.get_root().get_vhost_ctrlrs("scsi"): for ctrlr in self.get_root().get_vhost_controllers(ctrlr_type="scsi"):
if ctrlr.ctrlr == self.ctrlr.ctrlr: if ctrlr.ctrlr == self.ctrlr.ctrlr:
self.ctrlr = ctrlr self.ctrlr = ctrlr
except JSONRPCException as e: except JSONRPCException as e:
@ -921,7 +921,7 @@ class UIVhostScsiCtrlObj(UIVhostCtrl):
self.get_root().add_vhost_scsi_lun(ctrlr=self.ctrlr.ctrlr, self.get_root().add_vhost_scsi_lun(ctrlr=self.ctrlr.ctrlr,
scsi_target_num=int(target_num), scsi_target_num=int(target_num),
bdev_name=bdev_name) bdev_name=bdev_name)
for ctrlr in self.get_root().get_vhost_ctrlrs("scsi"): for ctrlr in self.get_root().get_vhost_controllers(ctrlr_type="scsi"):
if ctrlr.ctrlr == self.ctrlr.ctrlr: if ctrlr.ctrlr == self.ctrlr.ctrlr:
self.ctrlr = ctrlr self.ctrlr = ctrlr
except JSONRPCException as e: except JSONRPCException as e:

View File

@ -24,7 +24,10 @@ class UIISCSIGlobalParams(UINode):
def refresh(self): def refresh(self):
self._children = set([]) self._children = set([])
for param, val in self.get_root().get_iscsi_global_params().items(): iscsi_global_params = self.get_root().get_iscsi_global_params()
if not iscsi_global_params:
return
for param, val in iscsi_global_params.items():
UIISCSIGlobalParam("%s: %s" % (param, val), self) UIISCSIGlobalParam("%s: %s" % (param, val), self)
def ui_command_set_auth(self, g=None, d=None, r=None, m=None): def ui_command_set_auth(self, g=None, d=None, r=None, m=None):

View File

@ -20,11 +20,12 @@ class UIRoot(UINode):
self.set_rpc_target(s) self.set_rpc_target(s)
self.verbose = False self.verbose = False
self.is_init = self.check_init() self.is_init = self.check_init()
self.methods = []
def refresh(self): def refresh(self):
self.methods = self.get_rpc_methods(current=True)
if self.is_init is False: if self.is_init is False:
methods = self.get_rpc_methods(current=True) methods = "\n".join(self.methods)
methods = "\n".join(methods)
self.shell.log.warning("SPDK Application is not yet initialized.\n" self.shell.log.warning("SPDK Application is not yet initialized.\n"
"Please initialize subsystems with start_subsystem_init command.\n" "Please initialize subsystems with start_subsystem_init command.\n"
"List of available commands in current state:\n" "List of available commands in current state:\n"
@ -41,6 +42,7 @@ class UIRoot(UINode):
UIVhosts(self) UIVhosts(self)
if self.has_subsystem("nvmf"): if self.has_subsystem("nvmf"):
UINVMf(self) UINVMf(self)
if self.has_subsystem("iscsi"):
UIISCSI(self) UIISCSI(self)
def set_rpc_target(self, s): def set_rpc_target(self, s):
@ -61,6 +63,17 @@ class UIRoot(UINode):
return r return r
return w return w
def is_method_available(f):
# Check if method f is available for given spdk target
def w(self, **kwargs):
if f.__name__ in self.methods:
r = f(self, **kwargs)
return r
# If given method is not avaialble return empty list
# similar to real get_* like rpc
return []
return w
def ui_command_start_subsystem_init(self): def ui_command_start_subsystem_init(self):
if rpc.start_subsystem_init(self.client): if rpc.start_subsystem_init(self.client):
self.is_init = True self.is_init = True
@ -179,6 +192,8 @@ class UIRoot(UINode):
def delete_error_bdev(self, **kwargs): def delete_error_bdev(self, **kwargs):
rpc.bdev.delete_error_bdev(self.client, **kwargs) rpc.bdev.delete_error_bdev(self.client, **kwargs)
@verbose
@is_method_available
def get_lvol_stores(self): def get_lvol_stores(self):
if self.is_init: if self.is_init:
self.current_lvol_stores = rpc.lvol.get_lvol_stores(self.client) self.current_lvol_stores = rpc.lvol.get_lvol_stores(self.client)
@ -233,6 +248,8 @@ class UIRoot(UINode):
response = rpc.vhost.remove_virtio_bdev(self.client, **kwargs) response = rpc.vhost.remove_virtio_bdev(self.client, **kwargs)
return response return response
@verbose
@is_method_available
def get_virtio_scsi_devs(self): def get_virtio_scsi_devs(self):
if self.is_init: if self.is_init:
for bdev in rpc.vhost.get_virtio_scsi_devs(self.client): for bdev in rpc.vhost.get_virtio_scsi_devs(self.client):
@ -243,7 +260,9 @@ class UIRoot(UINode):
if self.is_init: if self.is_init:
self.current_vhost_ctrls = rpc.vhost.get_vhost_controllers(self.client) self.current_vhost_ctrls = rpc.vhost.get_vhost_controllers(self.client)
def get_vhost_ctrlrs(self, ctrlr_type): @verbose
@is_method_available
def get_vhost_controllers(self, ctrlr_type):
if self.is_init: if self.is_init:
self.list_vhost_ctrls() self.list_vhost_ctrls()
for ctrlr in [x for x in self.current_vhost_ctrls if ctrlr_type in list(x["backend_specific"].keys())]: for ctrlr in [x for x in self.current_vhost_ctrls if ctrlr_type in list(x["backend_specific"].keys())]:
@ -280,6 +299,8 @@ class UIRoot(UINode):
if self.is_init: if self.is_init:
self.current_nvmf_transports = rpc.nvmf.get_nvmf_transports(self.client) self.current_nvmf_transports = rpc.nvmf.get_nvmf_transports(self.client)
@verbose
@is_method_available
def get_nvmf_transports(self): def get_nvmf_transports(self):
if self.is_init: if self.is_init:
self.list_nvmf_transports() self.list_nvmf_transports()
@ -290,6 +311,8 @@ class UIRoot(UINode):
if self.is_init: if self.is_init:
self.current_nvmf_subsystems = rpc.nvmf.get_nvmf_subsystems(self.client) self.current_nvmf_subsystems = rpc.nvmf.get_nvmf_subsystems(self.client)
@verbose
@is_method_available
def get_nvmf_subsystems(self): def get_nvmf_subsystems(self):
if self.is_init: if self.is_init:
self.list_nvmf_subsystems() self.list_nvmf_subsystems()
@ -336,11 +359,15 @@ class UIRoot(UINode):
def nvmf_subsystem_allow_any_host(self, **kwargs): def nvmf_subsystem_allow_any_host(self, **kwargs):
rpc.nvmf.nvmf_subsystem_allow_any_host(self.client, **kwargs) rpc.nvmf.nvmf_subsystem_allow_any_host(self.client, **kwargs)
@verbose
@is_method_available
def get_scsi_devices(self): def get_scsi_devices(self):
if self.is_init: if self.is_init:
for device in rpc.iscsi.get_scsi_devices(self.client): for device in rpc.iscsi.get_scsi_devices(self.client):
yield ScsiObj(device) yield ScsiObj(device)
@verbose
@is_method_available
def get_target_nodes(self): def get_target_nodes(self):
if self.is_init: if self.is_init:
for tg in rpc.iscsi.get_target_nodes(self.client): for tg in rpc.iscsi.get_target_nodes(self.client):
@ -354,11 +381,15 @@ class UIRoot(UINode):
def delete_target_node(self, **kwargs): def delete_target_node(self, **kwargs):
rpc.iscsi.delete_target_node(self.client, **kwargs) rpc.iscsi.delete_target_node(self.client, **kwargs)
@verbose
@is_method_available
def get_portal_groups(self): def get_portal_groups(self):
if self.is_init: if self.is_init:
for pg in rpc.iscsi.get_portal_groups(self.client): for pg in rpc.iscsi.get_portal_groups(self.client):
yield ScsiObj(pg) yield ScsiObj(pg)
@verbose
@is_method_available
def get_initiator_groups(self): def get_initiator_groups(self):
if self.is_init: if self.is_init:
for ig in rpc.iscsi.get_initiator_groups(self.client): for ig in rpc.iscsi.get_initiator_groups(self.client):
@ -381,6 +412,7 @@ class UIRoot(UINode):
rpc.iscsi.delete_initiator_group(self.client, **kwargs) rpc.iscsi.delete_initiator_group(self.client, **kwargs)
@verbose @verbose
@is_method_available
def get_iscsi_connections(self, **kwargs): def get_iscsi_connections(self, **kwargs):
if self.is_init: if self.is_init:
for ic in rpc.iscsi.get_iscsi_connections(self.client, **kwargs): for ic in rpc.iscsi.get_iscsi_connections(self.client, **kwargs):
@ -411,6 +443,7 @@ class UIRoot(UINode):
rpc.iscsi.delete_secret_from_iscsi_auth_group(self.client, **kwargs) rpc.iscsi.delete_secret_from_iscsi_auth_group(self.client, **kwargs)
@verbose @verbose
@is_method_available
def get_iscsi_auth_groups(self, **kwargs): def get_iscsi_auth_groups(self, **kwargs):
return rpc.iscsi.get_iscsi_auth_groups(self.client, **kwargs) return rpc.iscsi.get_iscsi_auth_groups(self.client, **kwargs)
@ -435,6 +468,7 @@ class UIRoot(UINode):
rpc.iscsi.set_iscsi_discovery_auth(self.client, **kwargs) rpc.iscsi.set_iscsi_discovery_auth(self.client, **kwargs)
@verbose @verbose
@is_method_available
def get_iscsi_global_params(self, **kwargs): def get_iscsi_global_params(self, **kwargs):
return rpc.iscsi.get_iscsi_global_params(self.client, **kwargs) return rpc.iscsi.get_iscsi_global_params(self.client, **kwargs)

View File

@ -7,7 +7,18 @@ spdkcli_job="$SPDKCLI_BUILD_DIR/test/spdkcli/spdkcli_job.py"
function on_error_exit() { function on_error_exit() {
set +e set +e
if [ ! -z $spdk_tgt_pid ]; then
killprocess $spdk_tgt_pid killprocess $spdk_tgt_pid
fi
if [ ! -z $nvmf_tgt_pid ]; then
killprocess $nvmf_tgt_pid
fi
if [ ! -z $iscsi_tgt_pid ]; then
killprocess $iscsi_tgt_pid
fi
if [ ! -z $vhost_tgt_pid ]; then
killprocess $vhost_tgt_pid
fi
rm -f $testdir/${MATCH_FILE} $testdir/match_files/spdkcli_details_vhost.test /tmp/sample_aio /tmp/sample_pmem rm -f $testdir/${MATCH_FILE} $testdir/match_files/spdkcli_details_vhost.test /tmp/sample_aio /tmp/sample_pmem
print_backtrace print_backtrace
exit 1 exit 1
@ -19,6 +30,24 @@ function run_spdk_tgt() {
waitforlisten $spdk_tgt_pid waitforlisten $spdk_tgt_pid
} }
function run_nvmf_tgt() {
$SPDKCLI_BUILD_DIR/app/nvmf_tgt/nvmf_tgt -m 0x3 -p 0 -s 4096 &
nvmf_tgt_pid=$!
waitforlisten $nvmf_tgt_pid
}
function run_iscsi_tgt() {
$SPDKCLI_BUILD_DIR/app/iscsi_tgt/iscsi_tgt -m 0x3 -p 0 -s 4096 &
iscsi_tgt_pid=$!
waitforlisten $iscsi_tgt_pid
}
function run_vhost_tgt() {
$SPDKCLI_BUILD_DIR/app/vhost/vhost -m 0x3 -p 0 -s 4096 &
vhost_tgt_pid=$!
waitforlisten $vhost_tgt_pid
}
function check_match() { function check_match() {
$SPDKCLI_BUILD_DIR/scripts/spdkcli.py ll $SPDKCLI_BRANCH > $testdir/match_files/${MATCH_FILE} $SPDKCLI_BUILD_DIR/scripts/spdkcli.py ll $SPDKCLI_BRANCH > $testdir/match_files/${MATCH_FILE}
$SPDKCLI_BUILD_DIR/test/app/match/match -v $testdir/match_files/${MATCH_FILE}.match $SPDKCLI_BUILD_DIR/test/app/match/match -v $testdir/match_files/${MATCH_FILE}.match

View File

@ -10,9 +10,9 @@ testdir=$(readlink -f $(dirname $0))
timing_enter spdkcli_iscsi timing_enter spdkcli_iscsi
trap 'on_error_exit;' ERR trap 'on_error_exit;' ERR
timing_enter run_spdk_tgt timing_enter run_iscsi_tgt
run_spdk_tgt run_iscsi_tgt
timing_exit run_spdk_tgt timing_exit run_iscsi_tgt
timing_enter spdkcli_create_iscsi_config timing_enter spdkcli_create_iscsi_config
$spdkcli_job "'/bdevs/malloc create 32 512 Malloc0' 'Malloc0' True $spdkcli_job "'/bdevs/malloc create 32 512 Malloc0' 'Malloc0' True
@ -62,6 +62,6 @@ $spdkcli_job "'/iscsi/auth_groups delete_secret 1 test2' 'user=test2'
" "
timing_exit spdkcli_clear_iscsi_config timing_exit spdkcli_clear_iscsi_config
killprocess $spdk_tgt_pid killprocess $iscsi_tgt_pid
timing_exit spdkcli_iscsi timing_exit spdkcli_iscsi
report_test_completion spdk_cli report_test_completion spdk_cli

View File

@ -31,39 +31,9 @@ o- / ...........................................................................
| | o- Nvme0n1p3 $(S) [Size=$(FP)G, Not claimed] | | o- Nvme0n1p3 $(S) [Size=$(FP)G, Not claimed]
| o- virtioblk_disk ................................................................................................... [Bdevs: 0] | o- virtioblk_disk ................................................................................................... [Bdevs: 0]
| o- virtioscsi_disk .................................................................................................. [Bdevs: 0] | o- virtioscsi_disk .................................................................................................. [Bdevs: 0]
o- iscsi ................................................................................................................... [...]
| o- auth_groups ..................................................................................................... [Groups: 0]
| o- global_params ......................................................................................................... [...]
| | o- allow_duplicated_isid: False ........................................................................................ [...]
| | o- chap_group: 0 ....................................................................................................... [...]
| | o- default_time2retain: 20 ............................................................................................. [...]
| | o- default_time2wait: 2 ................................................................................................ [...]
| | o- disable_chap: False ................................................................................................. [...]
| | o- error_recovery_level: 0 ............................................................................................. [...]
| | o- first_burst_length: 8192 ............................................................................................ [...]
| | o- immediate_data: True ................................................................................................ [...]
| | o- max_connections_per_session: 2 ...................................................................................... [...]
| | o- max_queue_depth: 64 ................................................................................................. [...]
| | o- max_sessions: 128 ................................................................................................... [...]
| | o- min_connections_per_core: 4 ......................................................................................... [...]
| | o- mutual_chap: False .................................................................................................. [...]
| | o- node_base: iqn.2016-06.io.spdk ...................................................................................... [...]
| | o- nop_in_interval: 30 ................................................................................................. [...]
| | o- nop_timeout: 60 ..................................................................................................... [...]
| | o- require_chap: False ................................................................................................. [...]
| o- initiator_groups ...................................................................................... [Initiator groups: 0]
| o- iscsi_connections .......................................................................................... [Connections: 0]
| o- portal_groups ............................................................................................ [Portal groups: 0]
| o- target_nodes .............................................................................................. [Target nodes: 0]
o- lvol_stores .................................................................................................. [Lvol stores: 2] o- lvol_stores .................................................................................................. [Lvol stores: 2]
| o- lvs0 ................................................................................................ [Size=$(FP)M, Free=$(FP)M] | o- lvs0 $(S) [Size=$(FP)M, Free=$(FP)M]
| o- lvs1 ............................................................................................... [Size=$(FP)M, Free=$(FP)M] | o- lvs1 $(S) [Size=$(FP)M, Free=$(FP)M]
o- nvmf .................................................................................................................... [...]
| o- subsystem ................................................................................................... [Subsystems: 1]
| | o- nqn.2014-08.org.nvmexpress.discovery ....................................................... [st=Discovery, Allow any host]
| | o- hosts ........................................................................................................ [Hosts: 0]
| | o- listen_addresses ......................................................................................... [Addresses: 0]
| o- transport ................................................................................................... [Transports: 0]
o- vhost ................................................................................................................... [...] o- vhost ................................................................................................................... [...]
o- block ................................................................................................................. [...] o- block ................................................................................................................. [...]
| o- vhost_blk1 $(S) [$(S)] | o- vhost_blk1 $(S) [$(S)]

View File

@ -11,9 +11,9 @@ timing_enter spdkcli_nvmf
trap 'on_error_exit; revert_soft_roce' ERR trap 'on_error_exit; revert_soft_roce' ERR
rdma_device_init rdma_device_init
timing_enter run_spdk_tgt timing_enter run_nvmf_tgt
run_spdk_tgt run_nvmf_tgt
timing_exit run_spdk_tgt timing_exit run_nvmf_tgt
RDMA_IP_LIST=$(get_available_rdma_ips) RDMA_IP_LIST=$(get_available_rdma_ips)
NVMF_TARGET_IP=$(echo "$RDMA_IP_LIST" | head -n 1) NVMF_TARGET_IP=$(echo "$RDMA_IP_LIST" | head -n 1)
@ -80,7 +80,7 @@ $spdkcli_job "'/nvmf/subsystem/nqn.2014-08.org.spdk:cnode1/namespaces delete nsi
" "
timing_exit spdkcli_clear_nvmf_config timing_exit spdkcli_clear_nvmf_config
killprocess $spdk_tgt_pid killprocess $nvmf_tgt_pid
#revert_soft_roce #revert_soft_roce
timing_exit spdkcli_nvmf timing_exit spdkcli_nvmf
report_test_completion spdk_cli_nvmf report_test_completion spdk_cli_nvmf

View File

@ -10,7 +10,7 @@ testdir=$(readlink -f $(dirname $0))
timing_enter spdk_cli_vhost timing_enter spdk_cli_vhost
trap 'on_error_exit' ERR trap 'on_error_exit' ERR
timing_enter run_vhost_tgt timing_enter run_vhost_tgt
run_spdk_tgt run_vhost_tgt
timing_exit run_vhost_tgt timing_exit run_vhost_tgt
timing_enter spdkcli_create_bdevs_config timing_enter spdkcli_create_bdevs_config
@ -126,7 +126,7 @@ rm -f $testdir/config_vhost.json
rm -f /tmp/sample_aio rm -f /tmp/sample_aio
timing_exit spdkcli_load_config timing_exit spdkcli_load_config
killprocess $spdk_tgt_pid killprocess $vhost_tgt_pid
timing_exit spdk_cli_vhost timing_exit spdk_cli_vhost
report_test_completion spdk_cli_vhost report_test_completion spdk_cli_vhost