blob: 6bf8573f7c1a460e7898a5168de7d3b81e4148df (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#!/usr/bin/env bash
testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../../..)
source $rootdir/test/common/autotest_common.sh
source $rootdir/test/vhost/common.sh
rpc_py="$rootdir/scripts/rpc.py -s $(get_vhost_dir 0)/rpc.sock"
ctrl_type="spdk_vhost_scsi"
ssh_pass=""
vm_num="0"
vm_image="/home/sys_sgsw/windows_server.qcow2"
function usage() {
[[ -n $2 ]] && (
echo "$2"
echo ""
)
echo "Windows Server automated test"
echo "Usage: $(basename $1) [OPTIONS]"
echo "--vm-ssh-pass=PASSWORD Text password for the VM"
echo "--vm-image=PATH Path to qcow2 image of Windows VM"
echo "--ctrl-type=TYPE Controller type to use for test:"
echo " spdk_vhost_scsi - use spdk vhost scsi"
echo " spdk_vhost_blk - use spdk vhost block"
echo "-x set -x for script debug"
echo "-h, --help Print help and exit"
exit 0
}
while getopts 'xh-:' optchar; do
case "$optchar" in
-)
case "$OPTARG" in
help) usage $0 ;;
vm-ssh-pass=*) ssh_pass="${OPTARG#*=}" ;;
vm-image=*) vm_image="${OPTARG#*=}" ;;
ctrl-type=*) ctrl_type="${OPTARG#*=}" ;;
esac
;;
h) usage $0 ;;
x)
set -x
x="-x"
;;
*) usage $0 "Invalid argument '$OPTARG'" ;;
esac
done
# For some reason there is a problem between using SSH key authentication
# and Windows UAC. Some of the powershell commands fail due to lack of
# permissons, despite script running in elevated mode.
# There are some clues about this setup that suggest this might not work properly:
# https://superuser.com/questions/181581/how-can-i-run-something-as-administrator-via-cygwins-ssh
# https://cygwin.com/ml/cygwin/2004-09/msg00087.html
# But they apply to rather old Windows distributions.
# Potentially using Windows Server 2016 and newer may solve the issue
# due to OpenSSH being available directly from Windows Store.
function vm_sshpass() {
vm_num_is_valid $1 || return 1
local ssh_cmd
ssh_cmd="sshpass -p $2 ssh \
-o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no \
-o User=root \
-p $(vm_ssh_socket $1) $VM_SSH_OPTIONS 127.0.0.1"
shift 2
$ssh_cmd "$@"
}
if [[ -z "$ssh_pass" ]]; then
error "Please specify --vm-ssh-pass parameter"
fi
trap 'error_exit "${FUNCNAME}" "${LINENO}"; rm -f $aio_file' SIGTERM SIGABRT ERR
vm_kill_all
# Run vhost without debug!
# Windows Virtio drivers use indirect descriptors without negotiating
# their feature flag, which is explicitly forbidden by the Virtio 1.0 spec.
# "(2.4.5.3.1 Driver Requirements: Indirect Descriptors)
# The driver MUST NOT set the VIRTQ_DESC_F_INDIRECT flag unless the
# VIRTIO_F_INDIRECT_DESC feature was negotiated.".
# Violating this rule doesn't cause any issues for SPDK vhost,
# but triggers an assert, so we can only run Windows VMs with non-debug SPDK builds.
notice "running SPDK vhost"
vhost_run 0
notice "..."
# Prepare bdevs for later vhost controllers use
# Nvme bdev is automatically constructed during vhost_run
# by using scripts/gen_nvme.sh. No need to add it manually.
# Using various sizes to better identify bdevs if no name in BLK
# is available
# TODO: use a param for blocksize for AIO and Malloc bdevs
aio_file="$SPDK_TEST_STORAGE/aio_disk"
dd if=/dev/zero of=$aio_file bs=1M count=512
$rpc_py bdev_aio_create $aio_file Aio0 512
$rpc_py bdev_malloc_create -b Malloc0 256 512
$rpc_py bdev_get_bdevs
# Create vhost controllers
# Prepare VM setup command
setup_cmd="vm_setup --force=0 --memory=8192"
setup_cmd+=" --os=$vm_image"
if [[ "$ctrl_type" == "spdk_vhost_scsi" ]]; then
$rpc_py vhost_create_scsi_controller naa.0.0
$rpc_py vhost_scsi_controller_add_target naa.0.0 0 Nvme0n1
$rpc_py vhost_scsi_controller_add_target naa.0.0 1 Malloc0
$rpc_py vhost_scsi_controller_add_target naa.0.0 2 Aio0
setup_cmd+=" --disk-type=spdk_vhost_scsi --disks=0"
elif [[ "$ctrl_type" == "spdk_vhost_blk" ]]; then
$rpc_py vhost_create_blk_controller naa.0.0 Nvme0n1
$rpc_py vhost_create_blk_controller naa.1.0 Malloc0
$rpc_py vhost_create_blk_controller naa.2.0 Aio0
setup_cmd+=" --disk-type=spdk_vhost_blk --disks=0:1:2"
fi
$rpc_py vhost_get_controllers
$setup_cmd
# Spin up VM
vm_run "$vm_num"
vm_wait_for_boot "300" "$vm_num"
vm_sshpass "$vm_num" "$ssh_pass" "mkdir /cygdrive/c/fs_test"
vm_scp "$vm_num" "$testdir/windows_fs_test.ps1" "127.0.0.1:/cygdrive/c/fs_test"
vm_sshpass "$vm_num" "$ssh_pass" "cd /cygdrive/c/fs_test; powershell.exe -file windows_fs_test.ps1"
notice "Shutting down Windows VM..."
# Killing, actually. #TODO: implement vm_windwows_shutdown() function
vm_kill $vm_num
notice "Shutting down SPDK vhost app..."
vhost_kill 0
rm -f $aio_file
|