*** Settings ***
Library         SSHLibrary
Library         Process
Library         String
Resource        linux_services.resource

*** Variables ***
${Rascsi_Host}      rascsi.local
${Rascsi_Username}  pi
${Rascsi_Password}  raspberry


*** Keywords ***
Open Connection to Rascsi and Log In
    Open Connection  ${Rascsi_Host}
    Login  ${Rascsi_Username}  ${Rascsi_Password}

Create Blank Rascsi Drive Image of Size ${drive_size} megabytes named ${file_name}
    [Documentation]  Creates an empty drive image on the Rascsi host of the specified size and file name
    Execute Command  dd if=/dev/zero of=/home/pi/images/${file_name} bs=1M count=${drive_size}

Delete drive image ${file_name}
    [Documentation]  Delete a disk drive image that was created on the raspberry pi
    Remove File  /home/pi/images/${file_name}

Delete all RaSCSI drive images
    [Documentation]  Delete all of the temporary drive images that were created on the RaSCSI host
    Remove File  /home/pi/images/tmp_*

Drive image ${drive_image_file} is attached as SCSI ID ${scsi_id}
    [Documentation]  Attaches an existing drive image to the RaSCSI
    ${rasctl_output}=  Execute Command  rasctl -i ${scsi_id} -c attach -f /home/pi/images/${drive_image_file}
    log  ${rasctl_output}
    ${rasctl_output}=  Execute Command  rasctl -l
    log  ${rasctl_output}
    Rescan SCSI Bus

CD-ROM drive is attached as SCSI ID ${scsi_id}
    [Documentation]  Attaches a CD-ROM device (without any media) to the RaSCSI
    ${rasctl_output}=  Execute Command  rasctl -i ${scsi_id} -c attach -t cd
    log  ${rasctl_output}
    ${rasctl_output}=  Execute Command  rasctl -l
    log  ${rasctl_output}
    Rescan SCSI Bus

Magneto Optical drive is attached as SCSI ID ${scsi_id}
    [Documentation]  Attaches a Magneto Optical device (without any media) to the RaSCSI
    Execute Command  rasctl -i ${scsi_id} -c attach -t mo
    ${rasctl_output}=  Execute Command  rasctl -l
    log  ${rasctl_output}
    Rescan SCSI Bus


Detach all RaSCSI SCSI Devices
    [Documentation]  Send detach commands for all of the SCSI IDs to make sure that there
    ...              aren't any left over before/after a test
    FOR    ${scsi_id}    IN RANGE    0    7
        Detach RaSCSI SCSI ID ${scsi_id}
    END

Detach RaSCSI SCSI ID ${scsi_id:\d+}
    [Documentation]  Detaches the specified SCSI ID from Rascsi
    Execute Command  rasctl -c detach -i ${scsi_id}

Rasctl reports SCSI ID ${scsi_id} of type ${type:CD|MO|HD}
    [Documentation]  Executes rasctl and verifies that the drive is configured as the specified type
    ${rasctl_output}=  Execute Command  rasctl -l
    log  ${rasctl_output}
    Should Contain  ${rasctl_output}  |${SPACE*2}${scsi_id}${SPACE}|${SPACE*2}0${SPACE}|${SPACE}SC${type}${SPACE}|

# Create a ${iso_size} megabyte ISO named ${image_name} with random data
#     [Documentation]  Creates a file on the RaSCSI with random data (from /dev/urandom),
#     ...              then creates an ISO image with that data
#     Execute Command  mkdir /tmp/new_iso
#     Execute Command  dd if=/dev/urandom of=/tmp/new_iso/data.dat bs=1M count=${iso_size}
#     Execute Command  genisoimage -o /home/pi/images/${image_name} /tmp/new_iso/

Insert Removable Media ${image} into SCSI ID ${scsi_id}
    Execute Command  rasctl -c insert -i ${scsi_id} -f /home/pi/images/${image}
    ${result}=  Execute Command  rasctl -l
    Log  ${result}

Removable media ${image} is inserted into SCSI ID ${scsi_id:/d+}
    [Documentation]  Inserts the sepecified image name into the removable media drive
    Execute Command  rasctl -c insert -i ${scsi_id} -f /home/pi/images/${image}

# Insert removable media ${image_name} into SCSI ID ${scsi_id:/d+}
#     [Documentation]  Inserts the sepecified image name into the removable media drive
#     Execute Command  rasctl -c insert -i ${scsi_id} -f /home/pi/images/${image_name}

Eject removable media from SCSI ID ${scsi_id:/d+}
    [Documentation]  Inserts the sepecified image name into the removable media drive
    Execute Command  rasctl -c eject -i ${scsi_id}

Checksum of Random Data File from RaSCSI
    [Documentation]  Calcualte the SHA signature of the random data that was generated
    ...              on the RaSCSI host
    ${sha_output}=  Execute Command  sha512sum /tmp/new_iso/data.dat | cut -f 1
    Log  Checksum of the file was ${sha_output}
    [Return]  ${sha_output}

Get checksum of RaSCSI Image ${image_name}
    [Documentation]  Calculate the checksum of the disk image on the RaSCSI host
    ${checksum}=  Execute Command  md5sum /home/pi/images/${image_name} | cut -f 1 --delimiter=" "
    [Return]  ${checksum}

Get Size of RaSCSI Image ${image_name} in bytes
    [Documentation]  Return the size of the specified disk image in bytes
    ${size_output}=  Execute Command  du -b /home/pi/images/${image_name} | cut -f 1
    [Return]  ${size_output}


Get checksum of ${filename} from ISO ${image_name} on the RaSCSI Host
    [Documentation]  Extracts the specified file from the ISO, calculates the checksum
    ...              then returns that value
    ${temp_dirname}=  Generate Random String  10  [LETTERS]
    Execute Command  mkdir /tmp/${temp_dirname}  sudo=True  sudo_password=${Rascsi_Password}
    Execute Command  mount /home/pi/images/${image_name} /tmp/${temp_dirname}  sudo=True  sudo_password=${Rascsi_Password}
    ${checksum}=  Execute Command  md5sum /tmp/${temp_dirname}/${filename} | cut -f 1 --delimiter=" "
    Execute Command  umount /tmp/${temp_dirname}  sudo=True  sudo_password=${Rascsi_Password}
    Execute Command  rm -rf /tmp/${temp_dirname}  sudo=True  sudo_password=${Rascsi_Password}
    [Return]  ${checksum}

The RaSCSI service is configured to use port ${port_number}
    [Documentation]  Modifies the rascsi.service systemd configuration file to use the specified port
    ...              instead of the default. This will erase any other options that have been previously
    ...              set in your rascsi.service file.
    Execute command  sed -i 's/^ExecStart=.*/ExecStart=\\\/usr\\\/local\\\/bin\\\/rascsi -p ${port_number}/' /etc/systemd/system/rascsi.service  sudo=True  sudo_password=${Rascsi_Password}
    Execute command  systemctl daemon-reload  sudo=True  sudo_password=${Rascsi_Password}
    ${service_file}=  Execute command  cat /etc/systemd/system/rascsi.service
    log  ${service_file}

The RaSCSI service is configured to use default port
    [Documentation]  Restore the rascsi.service systemd configuration file to use the default rascsi
    ...              launch command
    Execute command  sed -i 's/^ExecStart=.*/ExecStart=\\\/usr\\\/local\\\/bin\\\/rascsi/' /etc/systemd/system/rascsi.service  sudo=True  sudo_password=${Rascsi_Password}
    Execute command  systemctl daemon-reload  sudo=True  sudo_password=${Rascsi_Password}
    ${service_file}=  Execute command  cat /etc/systemd/system/rascsi.service
    log  ${service_file}

RASCTL should connect on port ${port_number}
    ${stdout_out}  ${stderr_out}=  Execute Command  rasctl -l -p ${port_number}  return_stderr=True
    log  ${stdout_out}
    log  ${stderr_out}
    Should Contain  ${stdout_out}  No images currently attached

RASCTL should not connect on port ${port_number}
    ${stdout_out}  ${stderr_out}=  Execute Command  rasctl -l -p ${port_number}  return_stderr=True
    log  ${stdout_out}
    log  ${stderr_out}
    Should Contain  ${stderr_out}  Error: Can't connect to rascsi process on host

Kill all rascsi processes
    ${result}=  Execute command  killall -9 rascsi  sudo=True  sudo_password=${Rascsi_Password}
    log  ${result}