RASCSI/test/robot/Resources/linux_scsi_utils.resource
akuker 7c5b645c48
Created an initial suite of tests to make sure that the RaSCSI is working properly (#33)
* First cut of very simple robot tests

* Remove log files and change test to use rascsi host name instead of hard-coded IP

* Added more keywords

* Added tests to check the reported SCSI vendor, revision, model and type

* Moved the Linux (host) utilities to a different file

* Added cdrom tests

* Added cdrom tests

* Finished up cd-rom tests. All tests pass, except for Anex86 drive

Co-authored-by: akuker <akuker@gmail.com>
2020-09-10 13:06:36 -05:00

204 lines
10 KiB
Plaintext

*** Settings ***
Library String
Library Collections
*** Variables ***
${drive_mount_path} /mnt/temp_drive/
# Taken from https://en.wikipedia.org/wiki/SCSI_Peripheral_Device_Type
${Scsi_device_type_hard_drive} 0
${Scsi_device_type_magnetic_tape} 1
${Scsi_device_type_printer} 2
${Scsi_device_type_processor} 3
${Scsi_device_type_write_once_dev} 4
${Scsi_device_type_cd_rom} 5
${Scsi_device_type_scanner} 6
${Scsi_device_type_optical_memory} 7
*** Keywords ***
Rescan SCSI Bus
[Documentation] Commands Linux to re-scan the SCSI bus on the local host
${result}= Run sudo bash -c "echo \\"- - -\\" > /sys/class/scsi_host/host0/scan"
${lsscsi}= Run lsscsi
log ${lsscsi}
SCSI ID ${scsi_id:\d+} is detected by Linux
[Documentation] Checks to see if a specific SCSI ID is found by lsscsi
${result}= Run lsscsi
Log ${result}
Should Contain ${result} [0:0:${scsi_id}:0]
Delete all SCSI devices from Linux
[Documentation] Remove all SCSI IDs from the Linux SCSI driver
FOR ${scsi_id} IN RANGE 0 7
Delete SCSI ID ${scsi_id} from Linux
END
Delete SCSI ID ${scsi_id:\d+} from Linux
[Documentation] Remove a SCSI ID from Linux. Basically, will un-do the Scan action
Run sudo bash -c "echo 1 > /sys/class/scsi_device/0:0:${scsi_id}:0/device/delete" 2>&1 > /dev/null
SCSI ID ${scsi_id} reports vendor ${scsi_vendor}
[Documentation] Reads the SCSI vendor from sysfs and checks that it matches expected value
# Sleep 2 minutes
${read_scsi_info}= OperatingSystem.Get File /sys/class/scsi_device/0:0:${scsi_id}:0/device/vendor
${read_scsi_info}= Remove String Using Regexp ${read_scsi_info} ${\n}
Log Vendor ID read from sysfs was --${read_scsi_info}--
Should Be Equal ${read_scsi_info} ${scsi_vendor} Incorrect SCSI vendor reported for ID ${scsi_id}
SCSI ID ${scsi_id} reports revision ${scsi_rev}
[Documentation] Reads the SCSI vendor from sysfs and checks that it matches expected value
${read_scsi_info}= OperatingSystem.Get File /sys/class/scsi_device/0:0:${scsi_id}:0/device/rev
${read_scsi_info}= Remove String Using Regexp ${read_scsi_info} ${\n}
Log SCSI revision read from sysfs was ${read_scsi_info}
Should Be Equal ${read_scsi_info} ${scsi_rev} Incorrect SCSI version reported for ID ${scsi_id}
SCSI ID ${scsi_id} reports model ${scsi_model}
[Documentation] Reads the SCSI vendor from sysfs and checks that it matches expected value
${read_scsi_info}= OperatingSystem.Get File /sys/class/scsi_device/0:0:${scsi_id}:0/device/model
${read_scsi_info}= Remove String Using Regexp ${read_scsi_info} ${\n}
Log SCSI model read from sysfs was --${read_scsi_info}--
Should Be Equal ${read_scsi_info} ${scsi_model} Incorrect SCSI model reported for ID ${scsi_id}
SCSI ID ${scsi_id} reports type ${scsi_type}
[Documentation] Reads the SCSI type from sysfs and checks that it matches expected value
${read_scsi_info}= OperatingSystem.Get File /sys/class/scsi_device/0:0:${scsi_id}:0/device/type
${read_scsi_info}= Remove String Using Regexp ${read_scsi_info} ${\n}
Log SCSI model read from sysfs was ${read_scsi_info}
Should Be Equal ${read_scsi_info} ${scsi_type} Incorrect SCSI type reported for ID ${scsi_id}
Checksum of Data File ${file_name} from mounted drive
[Documentation] Calculate the checksum of the specified file from the mounted drive
${sha_output}= Run sha512sum ${drive_mount_path}${file_name}
Log Checksum of the file was ${sha_output}
@{sha_output_list}= Split String ${sha_output} ${SPACE}
${sha_signature}= Get From List ${sha_output_list} 0
[Return] ${sha_signature}
Get device id for SCSI ID ${scsi_id:/d+}
[Documentation] Lookup the device name (ex /dev/sr0) for the specified SCSI ID
${lsscsi_output}= Run lsscsi --brief |grep \\\\[0\\\\:0\\\\:${scsi_id}\\\\:0\\\\] | cut -f 5 --delimiter=" "
Should Match Regexp ${lsscsi_output} \/dev\/[\\w\\d]+ Unable to find device ID for SCSI ID ${scsi_id}
[Return] ${lsscsi_output}
# log ${lsscsi_output}
# @{scsi_entries}= Split To Lines ${lsscsi_output}
# FOR ${cur_line} IN @{scsi_entries}
# Log ${cur_line}
# @{scsi_line}= SplitString ${cur_line}
# ${linux_id}= Set Variable ${scsi_line}[0]
# ${device_id}= Set Variable ${scsi_line}[1]
# Return From Keyword If "${linux_id}"=="[0:0:${scsi_id}:0]" ${device_id}
# END
# [Return] /dev/notfound
Get size of device id ${device_id} in bytes
[Documentation] Decypher the output of lsblk to determine the size of the
... specified device ID
${bare_device_id}= Remove String Using Regexp ${device_id} \/dev\/
${lsblk_output}= Run lsblk --raw --bytes | grep ${bare_device_id} | cut -f 4 --delimiter=" "
[Return] ${lsblk_output}
Get size of SCSI ID ${scsi_id} device in bytes
[Documentation] Given a SCSI ID, determine how big that drive is (in bytes)
${device_id}= Get device id for SCSI ID ${scsi_id}
${device_size}= Get size of device id ${device_id} in bytes
[Return] ${device_size}
Get checksum of SCSI ID ${scsi_id} device
[Documentation] Calculate the checksum of the disk image on the RaSCSI host
${device_id}= Get device id for SCSI ID ${scsi_id}
${checksum}= Run Keyword Get checksum of file ${device_id}
[Return] ${checksum}
Get checksum of file ${full_file_path}
${checksum}= Run md5sum ${full_file_path} | cut -f 1 --delimiter=" "
[Return] ${checksum}
Get filesystem type of SCSI ID ${scsi_id}
[Documentation] Get the type of file system for the specified scsi ID. It needs to be
... mounted in order for this command to work
${device_id}= Get device id for SCSI ID ${scsi_id}
${raw}= Run mount | grep ${device_id}
log ${raw}
${filesystem_type}= Run mount |grep ${device_id} |cut --delimiter=" " -f 5
[Return] ${filesystem_type}
The size of SCSI ID ${scsi_id} is equal to the size of ${image_name}
[Documentation] Get the size of the SCSI device specified and the size of the drive
... image and make sure they're equal
${device_size}= Get size of SCSI ID ${scsi_id} device in bytes
${image_size}= Get Size of RaSCSI Image ${image_name} in bytes
Should be Equal ${device_size} ${image_size} The device size did not match the image size
The checksum of SCSI ID ${scsi_id} is equal to the checksum of ${image_name}
[Documentation] Empty Keyword
${device_checksum}= Get checksum of SCSI ID ${scsi_id} device
${image_checksum}= Get checksum of RaSCSI Image ${image_name}
Should be Equal ${device_checksum} ${image_checksum} The device checksum did not match the image file
Mount SCSI ID ${scsi_id} as ${folder_name}
[Documentation] Mount the specified SCSI ID at the specified path in /mnt
Run sudo mkdir -p /mnt/${folder_name}
${device}= Get device id for SCSI ID ${scsi_id}
Run sudo mount ${device} /mnt/${folder_name}
${df}= Run df -h
Log ${df}
SCSI ID ${scsi_id} has been mounted at ${folder_name}
[Documentation] Check that the 'df' utility reports that the specified SCSI ID is
... mounted at the path specified
${device}= Get device id for SCSI ID ${scsi_id}
${df_output}= Run mount | grep ${device} | cut --delimiter=" " -f 3
log ${df_output}
Unmount SCSI ID ${scsi_id}
[Documentation] Un-mount the drive specified. Currently, this doesn't use the drive ID. However,
... it needs to be updated in the future to un-moune the correct device, instead of
... of being hard-coded to a specific path.
${device}= Get device id for SCSI ID ${scsi_id}
Run sudo umount ${device}
The file ${filename} in the ${directory} directory matches the original in ISO ${drive_image}
[Documentation] Check that the file ready by the host through the RaSCSI interface and make sure
... that the checksum matches the original file extracted from the ISO
${host_file_checksum}= Get checksum of file /mnt/${directory}/${filename}
${rascsi_file_checksum}= Get checksum of ${filename} from ISO ${drive_image} on the RaSCSI Host
Should be Equal ${host_file_checksum} ${rascsi_file_checksum} ${filename} did not match between the host and the RaSCSI
The filesystem type of SCSI ID ${scsi_id} is ${fs_type}
[Documentation] Fetches the filesystem type of the specified SCSI ID and checks that it matches
${actual_fs_type}= Get filesystem type of SCSI ID ${scsi_id}
Should be Equal ${fs_type} ${actual_fs_type} Incorrect file system type detected
The measured read speed for ${data_size} megabytes of data from SCSI ID ${scsi_id} is greater than ${expected_speed} KB/s
[Documentation] Read the specified amount of data from the SCSI drive and make sure that it is
... greater than the specified threshold
[Teardown] Remove temporary file ${temp_filename}
${device_id}= Get device id for SCSI ID ${scsi_id}
${temp_filename}= Generate Random String 10 [LETTERS]
${dd_time}= Run sudo dd if=${device_id} of=/tmp/${temp_filename} bs=1M count=${data_size} 2>&1 | awk '/copied/ {print $8}'
${copy_time}= Convert to Number ${dd_time}
${speed}= Evaluate (${data_size}*1024)/${copy_time}
Log Measured copy speed was ${speed} KB/s
Should be true ${speed}>=${expected_speed} Measured speed was not greater than minimum
# Run sudo rm /tmp/${temp_filename}
Create an image named ${iso_name} from SCSI ID ${scsi_id}
[Documentation] Will create a disk image from the specified SCSI device
${device_id}= Get device id for SCSI ID ${scsi_id}
${dd_output}= Run sudo dd if=${device_id} of=/tmp/${iso_name} bs=1M 2>&1
File Should Not be Empty /tmp/${iso_name}
Local file ${local_file_name} matches RaSCSI file ${rascsi_file_name}
[Documentation] Calculates the checksum of the local file and the remote file
... then ensures that they match
${local_file_checksum}= Get checksum of file /tmp/${local_file_name}
${remote_file_checksum}= Get checksum of RaSCSI Image ${rascsi_file_name}
Should be Equal ${local_file_checksum} ${remote_file_checksum} Files did not match
Remove temporary file ${file_name}
[Documentation] Deletes the specified file from the temp directory
Run sudo rm /tmp/${file_name}