blob: cc2dd631aebb1321fd3454162b0fe1bc9aea44a7 [file] [log] [blame]
#!perl
use strict;
use warnings;
use Cwd qw(abs_path);
use File::Basename;
use File::Spec;
use Test;
my $testdir;
my $scstadmin;
my $redirect_file;
my $redirect;
BEGIN {
$redirect_file = "/tmp/scstadmin-test-07-output.txt";
unlink($redirect_file);
$testdir = dirname(abs_path($0));
my $scstadmin_pm_dir = dirname($testdir);
my $scstadmin_dir = dirname($scstadmin_pm_dir);
$scstadmin = File::Spec->catfile($scstadmin_dir, "scstadmin");
unless(grep /blib/, @INC) {
unshift(@INC, File::Spec->catdir($scstadmin_pm_dir, "lib"));
}
plan tests => 59;
}
use Data::Dumper;
use SCST::SCST;
use File::Temp qw/tempfile/;
sub setup {
my $SCST = shift;
my ($drivers, $errorString) = $SCST->drivers();
my %drivers = map { $_ => 1 } @{$drivers};
ok(exists($drivers{'scst_local'}));
ok(system("dd if=/dev/zero of=/dev/scstadmin-regression-test-vdisk bs=1M count=1 >/dev/null 2>&1"), 0);
}
sub teardown {
system("rm -f /dev/scstadmin-regression-test-vdisk");
}
sub attributeTest {
my $expected = shift;
my $tmpfilename1 = File::Spec->catfile(File::Spec->tmpdir(),
"scstadmin-test-07-$$-1");
my $tmpfilename2 = File::Spec->catfile(File::Spec->tmpdir(),
"scstadmin-test-07-$$-2");
my $diff = File::Spec->catfile(File::Spec->tmpdir(),
"scstadmin-test-07-$$-diff");
ok(system("$scstadmin -clear_config -force -noprompt -no_lip $redirect"), 0);
ok(system("$scstadmin -open_dev nodev -handler vdisk_nullio -attributes dummy=1 $redirect"), 0);
ok(system("$scstadmin -open_dev disk0 -handler vdisk_fileio -attributes filename=/dev/scstadmin-regression-test-vdisk,read_only=1 $redirect"), 0);
ok(system("$scstadmin -open_dev disk1 -handler vdisk_fileio -attributes filename=/dev/scstadmin-regression-test-vdisk,nv_cache=1 $redirect"), 0);
ok(system("$scstadmin -driver scst_local -add_target local $redirect"), 0);
ok(system("$scstadmin -driver scst_local -target local " .
"-add_lun 0 -device nodev $redirect"), 0);
ok(system("$scstadmin -driver scst_local -target local -add_group ig " .
"$redirect"), 0);
ok(system("$scstadmin -driver scst_local -target local -group ig " .
"-add_init ini1 $redirect"), 0);
ok(system("$scstadmin -driver scst_local -target local -group ig " .
"-add_init ini2 $redirect"), 0);
ok(system("$scstadmin -driver scst_local -target local -group ig " .
"-add_lun 0 -device disk0 $redirect"), 0);
ok(system("$scstadmin -driver scst_local -target local -group ig " .
"-add_lun 1 -device disk1 $redirect"), 0);
ok(system("$scstadmin -add_dgrp dgroup1 $redirect"), 0);
ok(system("$scstadmin -add_tgrp tgroup1 -dev_group dgroup1 $redirect"), 0);
ok(system("$scstadmin -noprompt -set_tgrp_attr tgroup1 -dev_group dgroup1 -attributes group_id=256 $redirect"), 0);
ok(system("$scstadmin -add_tgrp_tgt local -dev_group dgroup1 -tgt_group tgroup1 $redirect"), 0);
ok(system("$scstadmin -add_tgrp tgroup2 -dev_group dgroup1 $redirect"), 0);
ok(system("$scstadmin -noprompt -set_tgrp_attr tgroup2 -dev_group dgroup1 -attributes group_id=257 $redirect"), 0);
ok(system("$scstadmin -add_tgrp_tgt remote -dev_group dgroup1 -tgt_group tgroup2 $redirect"), 0);
ok(system("{ echo 11 > /sys/kernel/scst_tgt/device_groups/dgroup1/target_groups/tgroup2/remote/rel_tgt_id; } $redirect"), 0);
ok(system("$scstadmin -add_dgrp dgroup2 $redirect"), 0);
ok(system("$scstadmin -add_tgrp tgroup1 -dev_group dgroup2 $redirect"), 0);
ok(system("$scstadmin -noprompt -set_tgrp_attr tgroup1 -dev_group dgroup2 -attributes group_id=258 $redirect"), 0);
ok(system("$scstadmin -add_tgrp_tgt local -dev_group dgroup2 -tgt_group tgroup1 $redirect"), 0);
ok(system("$scstadmin -add_tgrp tgroup2 -dev_group dgroup2 $redirect"), 0);
ok(system("$scstadmin -noprompt -set_tgrp_attr tgroup2 -dev_group dgroup2 -attributes group_id=259 $redirect"), 0);
ok(system("$scstadmin -noprompt -set_tgrp_attr tgroup1 -dev_group dgroup2 -attributes rel_tgt_id=2 $redirect"), 0);
ok(system("$scstadmin -add_tgrp_tgt remote -dev_group dgroup2 -tgt_group tgroup2 $redirect"), 0);
ok(system("{ echo 12 > /sys/kernel/scst_tgt/device_groups/dgroup2/target_groups/tgroup2/remote/rel_tgt_id; } $redirect"), 0);
ok(system("$scstadmin -write_config $tmpfilename1 >/dev/null"), 0);
# Keep only the scst_local target driver information.
my $cmd = "gawk 'BEGIN { t = 0 } /^# Automatically generated by SCST Configurator v/ {" .
'$0 = "# Automatically generated by SCST Configurator v..." } ' .
'/^TARGET_DRIVER.*{$/ { if (match($0, "TARGET_DRIVER ([^ ]*) {", d) && d[1] != "scst_local") t = 1 } ' .
'/^}$/ { if (t == 1) t = 2 } ' .
'/^$/ { if (t == 2) { t = 3 } } ' .
'/^./ { if (t == 3) { t = 0 } } ' .
'{ if (t == 0) print }' .
"' <$tmpfilename1 >$tmpfilename2";
ok(system($cmd), 0);
my $compare_result = system("diff -u $tmpfilename2 $expected >$diff");
ok($compare_result, 0);
if ($compare_result == 0) {
unlink($diff);
unlink($tmpfilename2);
unlink($tmpfilename1);
}
}
# Run shell command $1 and return what it wrote to stdout and stderr as a
# string.
sub run {
my ($cmd) = @_;
my $tmpfile = File::Spec->catfile(File::Spec->tmpdir(),
"scstadmin-test-07-$$-3");
my $res;
my $rc;
$rc = system("$cmd >$tmpfile 2>&1");
if (!open(my $file, $tmpfile)) {
$res = "failed to read $tmpfile";
} else {
local $/ = undef;
binmode $file;
$res = <$file>;
if (!defined($res)) {
$res = "";
}
close $file;
}
unlink($tmpfile);
return $res;
}
# Trigger the scstadmin prompt() subroutine.
sub testPrompt {
my $result;
$result = <<'EOS';
Collecting current configuration: done.
Performing this action may result in lost or corrupt data, are you sure you wish to continue (y/[n]) ? Aborting action.
All done.
EOS
ok(run("$scstadmin -clear_config -force </dev/null"), $result);
}
# Test the scstadmin -list_* options.
sub listTest {
my $result;
$result = <<'EOS';
Collecting current configuration: done.
Handler
-------------
vcdrom
vdisk_blockio
vdisk_fileio
vdisk_nullio
All done.
EOS
ok(run("$scstadmin -list_handler"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Handler Device
-----------------------
vcdrom -
vdisk_blockio -
vdisk_fileio disk0
disk1
vdisk_nullio nodev
All done.
EOS
ok(run("$scstadmin -list_device"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
------------------------------------------------------------------------
filename /dev/scstadmin-regression-test-vdisk Yes Yes
read_only 1 No Yes
size 1048576 No Yes
All done.
EOS
ok(run("$scstadmin -list_device disk0"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Device Group
------------
dgroup1
dgroup2
All done.
EOS
ok(run("$scstadmin -list_dgrp"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Targets
-------
All done.
EOS
ok(run("$scstadmin -list_tgrp tgrp -dev_group dgroup1"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Driver
------------
copy_manager
ib_srpt
iscsi
scst_local
All done.
EOS
ok(run("$scstadmin -list_driver"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Driver Target
copy_manager copy_manager_tgt
scst_local local
All done.
EOS
my ($output, $include);
foreach my $line (split '\n', run("$scstadmin -list_target")) {
if ($line =~ '^\t-') {
$line = "";
} elsif ($line =~ '^\tib_srpt') {
undef $include;
} elsif ($line =~ '^\t[^[:blank:]]' || $line =~ '^$' ||
$line =~ '^[^\t]') {
$include = 1;
}
$line =~ s/\s+$//;
$output .= $line . "\n" if $include;
}
ok($output, $result);
$result = <<'EOS';
Collecting current configuration: done.
Driver: copy_manager
Target: copy_manager_tgt
Assigned LUNs:
LUN Device
----------
10 disk1
8 nodev
9 disk0
Driver: scst_local
Target: local
Assigned LUNs:
LUN Device
----------
0 nodev
Group: ig
Assigned LUNs:
LUN Device
----------
0 disk0
1 disk1
Assigned Initiators:
Initiator
----
ini1
ini2
All done.
EOS
undef $output;
$include = 1;
foreach my $line (split '\n', run("$scstadmin -list_group")) {
if ($line =~ '^Driver: ib_srpt') {
undef $include;
} elsif ($line =~ '^Driver:' || $line =~ '^[AC]') {
$include = 1;
}
$line =~ s/\s+$//;
$output .= $line . "\n" if $include;
}
ok($output, $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
All done.
EOS
ok(run("$scstadmin -list_scst_attr"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
Device CREATE attributes available
----------------------------------
tst
All done.
EOS
ok(run("$scstadmin -list_hnd_attr vcdrom"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
Device CREATE attributes available
----------------------------------
active
bind_alua_state
blocksize
cluster_mode
dif_filename
dif_mode
dif_static_app_tag
dif_type
filename
numa_node_id
nv_cache
read_only
removable
rotational
thin_provisioned
tst
write_through
All done.
EOS
ok(run("$scstadmin -list_hnd_attr vdisk_blockio"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
Device CREATE attributes available
----------------------------------
async
blocksize
cluster_mode
dif_filename
dif_mode
dif_static_app_tag
dif_type
filename
numa_node_id
nv_cache
o_direct
read_only
removable
rotational
thin_provisioned
tst
write_through
zero_copy
All done.
EOS
ok(run("$scstadmin -list_hnd_attr vdisk_fileio"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
Device CREATE attributes available
----------------------------------
blocksize
cluster_mode
dif_mode
dif_static_app_tag
dif_type
dummy
numa_node_id
read_only
removable
rotational
size
size_mb
tst
All done.
EOS
ok(run("$scstadmin -list_hnd_attr vdisk_nullio"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
------------------------------------------------------------------------
filename /dev/scstadmin-regression-test-vdisk Yes Yes
read_only 1 No Yes
size 1048576 No Yes
All done.
EOS
ok(run("$scstadmin -list_dev_attr disk0"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
------------------------------------------------------------------------
filename /dev/scstadmin-regression-test-vdisk Yes Yes
nv_cache 1 No Yes
size 1048576 No Yes
All done.
EOS
ok(run("$scstadmin -list_dev_attr disk1"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
All done.
EOS
ok(run("$scstadmin -list_drv_attr ib_srpt"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
------------------------------------------
group_id 256 Yes Yes
state active Yes Yes
All done.
EOS
ok(run("$scstadmin -list_tgrp_attr tgroup1 -dev_group dgroup1"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
All done.
EOS
ok(run("$scstadmin -list_ttgt_attr local -tgt_group tgroup1 -dev_group dgroup1"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
LUN CREATE attributes available
-------------------------------
read_only
All done.
EOS
ok(run("$scstadmin -list_tgt_attr local -driver scst_local"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
LUN CREATE attributes available
-------------------------------
read_only
All done.
EOS
ok(run("$scstadmin -list_grp_attr ig -driver scst_local -target local -group ip"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
All done.
EOS
ok(run("$scstadmin -list_lun_attr 0 -driver scst_local -target local"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Attribute Value Writable KEY
-----------------------------------------
(none)
All done.
EOS
ok(run("$scstadmin -list_lun_attr 1 -driver scst_local -target local -group ig"), $result);
$result = <<'EOS';
Collecting current configuration: done.
WARNING: Received the following error:
initiatorAttributes(): Unable to read directory '/sys/kernel/scst_tgt/targets/scst_local/local/ini_groups/ig/initiators/ini1': Bad file descriptor
All done.
EOS
ok(run("$scstadmin -list_init_attr ini1 -driver scst_local -target local -group ig"), $result);
$result = <<'EOS';
Collecting current configuration: done.
WARNING: Received the following error:
initiatorAttributes(): Unable to read directory '/sys/kernel/scst_tgt/targets/scst_local/local/ini_groups/ig/initiators/ini2': Bad file descriptor
All done.
EOS
ok(run("$scstadmin -list_init_attr ini2 -driver scst_local -target local -group ig"), $result);
$result = <<'EOS';
Collecting current configuration: done.
Driver/Target: copy_manager/copy_manager_tgt
Session: copy_manager_sess
Attribute Value Writable KEY
active_commands 0 Yes No
bidi_cmd_count 0 Yes No
bidi_io_count_kb 0 Yes No
bidi_unaligned_cmd_count 0 Yes No
commands 0 Yes No
dif_checks_failed app ref guard Yes No
initiator_name copy_manager_sess Yes No
none_cmd_count 0 Yes No
read_cmd_count 11 Yes No
read_io_count_kb 44 Yes No
read_unaligned_cmd_count 0 Yes No
unknown_cmd_count 0 Yes No
write_cmd_count 0 Yes No
write_io_count_kb 0 Yes No
write_unaligned_cmd_count 0 Yes No
Driver/Target: scst_local/local
(no sessions)
All done.
EOS
undef $output;
$include = 1;
foreach my $line (split '\n', run("$scstadmin -list_sessions")) {
if ($line =~ '^\t-') {
$line = "";
} elsif ($line =~ '^Driver/Target: ib_srpt') {
undef $include;
} elsif ($line =~ '^Driver/Target:' || $line =~ '^[AC]') {
$include = 1;
}
$line =~ s/\s+$//;
$output .= $line . "\n" if $include;
}
ok($output, $result);
}
my $_DEBUG_ = 0;
if ($_DEBUG_) {
$redirect = ">>$redirect_file 2>&1";
open(my $logfile, '>>', $redirect_file);
select $logfile;
} else {
$redirect = ">/dev/null";
}
my $SCST = eval { new SCST::SCST($_DEBUG_) };
die("Creation of SCST object failed") if (!defined($SCST));
setup($SCST);
attributeTest(File::Spec->catfile($testdir, "07-result.conf"));
testPrompt();
listTest();
teardown();