*** Settings ***

Documentation    Test Save Area feature of Management Console on BMC.

Resource          ../../lib/rest_client.robot
Resource          ../../lib/openbmc_ffdc.robot
Resource          ../../lib/resource.robot
Resource          ../../lib/bmc_redfish_utils.robot
Resource          ../../lib/utils.robot

Suite Setup    Suite Setup Execution
Test Teardown  Test Teardown Execution


*** Variables ***

${MAX_SIZE_MSG}           File size exceeds 200KB. Maximum allowed size is 200KB
${UPLOADED_MSG}           File Created
${FORBIDDEN_MSG}          Forbidden
${FILE_CREATE_ERROR_MSG}  Error while creating the file

@{ADMIN}                  admin_user              TestPwd123
@{OPERATOR}               operator_user           TestPwd123
&{USERS}                  Administrator=${ADMIN}  Operator=${OPERATOR}

*** Test Cases ***

Verify Small Partition File Upload And Delete
    [Documentation]  Verify small partition file upload and delete.
    [Tags]  Verify_Small_Partition_File_Upload_And_Delete
    [Template]  Upload File To Create Partition Then Delete Partition

    #                     partition                                         delete
    # file_name  size_kb  name       expect_resp_code     expected_msg      partition    username
    201KB_file   201      201KB      ${HTTP_BAD_REQUEST}  ${MAX_SIZE_MSG}   ${True}      ${OPENBMC_USERNAME}
    15KB_file    15       15KB       ${HTTP_OK}           ${UPLOADED_MSG}   ${True}      ${OPENBMC_USERNAME}
    200KB_file   200      200KB      ${HTTP_OK}           ${UPLOADED_MSG}   ${True}      ${OPENBMC_USERNAME}


Verify Multiple Files Upload
    [Documentation]  Verify multiple files upload.
    [Tags]  Verify_Multiple_Files_Upload
    [Template]  Upload File To Create Partition Then Delete Partition

    #                     partition                                         delete
    # file_name  size_kb  name       expect_resp_code     expected_msg      partition    username
    0KB_file     0        0KB        ${HTTP_OK}           ${UPLOADED_MSG}   ${False}     ${OPENBMC_USERNAME}
    10KB_file    10       10KB       ${HTTP_OK}           ${UPLOADED_MSG}   ${False}     ${OPENBMC_USERNAME}
    50KB_file    50       50KB       ${HTTP_OK}           ${UPLOADED_MSG}   ${False}     ${OPENBMC_USERNAME}
    250KB_file   250      250KB      ${HTTP_BAD_REQUEST}  ${MAX_SIZE_MSG}   ${False}     ${OPENBMC_USERNAME}
    19KB_file    19       19KB       ${HTTP_OK}           ${UPLOADED_MSG}   ${False}     ${OPENBMC_USERNAME}
    199KB_file   199      199KB      ${HTTP_OK}           ${UPLOADED_MSG}   ${False}     ${OPENBMC_USERNAME}


Verify Read Partition
    [Documentation]  Verify read partition.
    [Tags]  Verify_Read_Partition

    Set Test Variable  ${file_name}  testfile
    Set Test Variable  ${partition_name}  part_read
    Set Test Variable  ${content}  Sample Content to test partition file upload

    Run  echo "${content}" > ${file_name}
    OperatingSystem.File Should Exist  ${file_name}

    Upload File To Create Partition Then Delete Partition  ${file_name}  1  ${partition_name}
    ...  delete_partition=${False}

    Read Partition And Verify Content  ${partition_name}  ${content}


Verify Non-Admin User Is Forbidden To Upload Partition File
    [Documentation]  Verify non-admin user is forbidden to upload partition file.
    [Tags]   Verify_Non-Admin_User_Is_Forbidden_To_Upload_Partition_File
    [Template]  Upload File To Create Partition Then Delete Partition

    #                     partition                                         delete
    # file_name  size_kb  name       expect_resp_code     expected_msg      partition    username
    12KB_file    12       12KB       ${HTTP_FORBIDDEN}    ${FORBIDDEN_MSG}  ${False}     operator_user


Verify Partition Update On BMC
    [Documentation]  Verify partition update on BMC.
    [Tags]  Verify_Partition_Update_On_BMC

    Set Test Variable  ${file_name}  testfile
    Set Test Variable  ${partition_name}  part_read
    Set Test Variable  ${content1}  Sample Content to test partition file upload
    Set Test Variable  ${content2}  Sample Content to test partition file update

    Upload Partition File With Some Known Contents  ${file_name}  ${partition_name}  ${content1}
    Read Partition And Verify Content  ${partition_name}  ${content1}

    # Upload the same partition with modified contents to verify update partition feature.
    Upload Partition File With Some Known Contents  ${file_name}  ${partition_name}  ${content2}
    Read Partition And Verify Content  ${partition_name}  ${content2}


Verify Delete Partition When Partition Does Not Exist
    [Documentation]  Verify delete partition when partition does not exist.
    [Tags]  Verify_Delete_Partition_When_Partition_Does_Not_Exist
    [Template]  Delete Partition And Verify On BMC

    # partition_name    expect_resp_code      username
    Does_not_exist      ${HTTP_NOT_FOUND}     ${OPENBMC_USERNAME}
    Does_not_exist      ${HTTP_FORBIDDEN}     operator_user


Verify Partition Files Persistency And Re-upload After BMC Reboot
    [Documentation]  Verify partition files persistency and re-upload after BMC reboot.
    [Tags]  Verify_Partition_Files_Persistency_And_Re-upload_After_BMC_Reboot

    Set Test Variable  ${file_name}  testfile
    Set Test Variable  ${partition_name}  part_read
    Set Test Variable  ${content}  Sample Content to test partition file upload

    Upload Partition File With Some Known Contents
    ...  ${file_name}_1  ${partition_name}_1  ${content}_${file_name}_1
    Upload Partition File With Some Known Contents
    ...  ${file_name}_2  ${partition_name}_2  ${content}_${file_name}_2

    OBMC Reboot (off)

    # Get REST session to BMC.
    Initialize OpenBMC

    # Checking for the content of uploaded partitions after BMC reboot.
    Read Partition And Verify Content  ${partition_name}_1  ${content}_${file_name}_1
    Read Partition And Verify Content  ${partition_name}_2  ${content}_${file_name}_2

    # Upload same partition with different content to test partition update after BMC reboot.
    Upload Partition File With Some Known Contents
    ...  ${file_name}_1  ${partition_name}_1  ${content}_${file_name}_2

    # Upload different partition.
    Upload Partition File With Some Known Contents  ${file_name}  ${partition_name}  ${content}


Verify One Thousand Partitions File Upload
    [Documentation]  Verify One Thousand Partitions File Upload.
    [Tags]  Verify_One_Thousand_Partitions_File_Upload

    # Note: 1000 Partitions file upload would take 15-20 minutes.
    FOR  ${INDEX}  IN RANGE  1  1000
        ${status}=  Run Keyword And Return Status  Upload File To Create Partition Then Delete Partition
        ...  200KB  200  p${INDEX}  delete_partition=${False}
        Run Keyword If  ${status} == ${True}  Continue For Loop

        # Check if /var is full on BMC.
        ${status}  ${stderr}  ${rc}=  BMC Execute Command  df -k | grep \' /var\' | grep -v /var/
        ${var_size}=  Set Variable  ${status.split('%')[0].split()[1]}

        # Should be a problem if partition file upload request has failed when /var is not full.
        Exit For Loop If  ${var_size} != ${100}

        # Expect HTTP_INTERNAL_SERVER_ERROR and FILE_CREATE_ERROR_MSG when /var is full.
        Upload File To Create Partition Then Delete Partition
        ...  200KB  200  p${INDEX}  ${HTTP_INTERNAL_SERVER_ERROR}  ${FILE_CREATE_ERROR_MSG}  ${False}
    END


*** Keywords ***

Create Partition File
    [Documentation]  Create partition file.
    [Arguments]  ${file_name}=dummyfile  ${size_kb}=15

    # Description of argument(s):
    # file_name           Name of the test file to be created. Examples:  p1.log, part1.txt etc.
    # size_kb             Size of the test file to be created in KB, default is 15KB.
    #                     Example : 15, 200 etc.

    ${file_exist}=  Run Keyword And Return Status  OperatingSystem.File Should Exist  ${file_name}
    Return From Keyword If  ${file_exist}  ${True}

    # Create a partition file if it does not exist locally.
    Run  dd if=/dev/zero of=${file_name} bs=1 count=0 seek=${size_kb}KB
    OperatingSystem.File Should Exist  ${file_name}


Delete All Sessions And Login Using Given User
    [Documentation]    Delete all sessions and login using given user.
    [Arguments]   ${username}=${OPENBMC_USERNAME}

    # Description of argument(s):
    # username            Username to login. Default is OPENBMC_USERNAME.
    #                     Ex: root, operator_user, admin_user, readonly_user etc.

    Delete All Sessions
    ${password}=  Set Variable If  '${username}' == '${OPENBMC_USERNAME}'  ${OPENBMC_PASSWORD}  TestPwd123
    Initialize OpenBMC  rest_username=${username}  rest_password=${password}


Upload File To Create Partition Then Delete Partition
    [Documentation]  Upload file to create partition the delete partition.
    [Arguments]  ${file_name}=dummyfile  ${size_kb}=15  ${partition_name}=p1  ${expect_resp_code}=${HTTP_OK}
    ...  ${expected_msg}=File Created  ${delete_partition}=${True}  ${username}=${OPENBMC_USERNAME}

    # Description of argument(s):
    # file_name           Name of the test file to be created.
    # partition_name      Name of the partition on BMC.
    # expect_resp_code    Expected REST response code, default is ${HTTP_OK}.
    # expected_msg        Expected message from file upload, default is 'File Created'.
    # delete_partition    Partition will be deleted if this is True.
    # username            Login username

    # Create a session with given user to test upload partition file.
    Run Keyword If  '${username}' != '${OPENBMC_USERNAME}'
    ...  Delete All Sessions And Login Using Given User  ${username}

    # Create a partition file.
    Create Partition File  ${file_name}  ${size_kb}

    # Get the content of the file and upload to BMC.
    ${image_data}=  OperatingSystem.Get Binary File  ${file_name}
    ${data}=  Create Dictionary  data  ${image_data}
    ${headers}=  Create Dictionary  X-Auth-Token=${XAUTH_TOKEN}

    Set To Dictionary  ${data}  headers  ${headers}
    ${resp}=  Put Request  openbmc  /ibm/v1/Host/ConfigFiles/${partition_name}  &{data}
    Should Be Equal As Strings  ${resp.status_code}  ${expect_resp_code}

    ${description}=  Run Keyword If  ${expect_resp_code} != ${HTTP_FORBIDDEN}
    ...  Return Description Of REST Response  ${resp.text}
    ...  ELSE  Set Variable  ${FORBIDDEN_MSG}

    Should Be Equal As Strings  ${description}  ${expected_msg}

    # Cleanup local space after upload attempt.
    Run Keyword And Ignore Error  Delete Local File Created To Upload  ${file_name}

    ${upload_success}=  Set Variable If   ${expect_resp_code} != ${HTTP_OK}  ${False}  ${True}
    Verify Partition Available On BMC  ${partition_name}  ${upload_success}  ${username}

    # Delete partition and verify on BMC.
    ${expect_resp_code}=  Set Variable If  ${expect_resp_code} != ${HTTP_OK}  ${HTTP_NOT_FOUND}  ${HTTP_OK}
    Run Keyword If  ${delete_partition} == ${True}  Delete Partition And Verify On BMC
    ...  ${partition_name}  ${expect_resp_code}  ${username}


Return Description Of REST Response
    [Documentation]  Return description of REST response.
    [Arguments]  ${resp_text}

    # Description of argument(s):
    # resp_text    REST response body.

    # resp_text after successful partition file upload looks like:
    #           {
    #             "Description": "File Created"
    #           }

    ${message}=  Evaluate  json.loads('''${resp_text}''')  json

    [Return]  ${message["Description"]}


Delete Partition And Verify On BMC
    [Documentation]  Delete partition and verify on BMC.
    [Arguments]  ${partition_name}  ${expect_resp_code}=${HTTP_OK}  ${username}=${OPENBMC_USERNAME}

    # Description of argument(s):
    # partition_name      Name of the partition on BMC.
    # expect_resp_code    Expected REST response code from DELETE request, default is ${HTTP_OK}.
    # username            Username to login, if other than OPENBMC_USERNAME user.

    # Create a session with given user to test delete operation.
    # If user is a non-admin user then DELETE request is forbidden for the user.
    Run Keyword If  '${username}' != '${OPENBMC_USERNAME}'
    ...  Delete All Sessions And Login Using Given User  ${username}

    Delete Partition  ${partition_name}  ${expect_resp_code}
    Verify Partition Available On BMC  ${partition_name}  ${False}  ${username}


Get List Of Partitions
    [Documentation]  Get list of partitions.
    [Arguments]  ${expect_resp_code}=${HTTP_OK}

    # Description of argument(s):
    # expect_resp_code    Expected REST response code, default is ${HTTP_OK}.

    ${resp}=  Get Request  openbmc  /ibm/v1/Host/ConfigFiles
    Should Be Equal As Strings  ${resp.status_code}  ${expect_resp_code}
    Return From Keyword If  ${expect_resp_code} != ${HTTP_OK}

    ${resp_json}=  To JSON  ${resp.content}
    ${partitions_cnt}=  Get Length  ${resp_json['Members']}

    [Return]  ${resp_json['Members']}  ${partitions_cnt}


Verify Partition Available On BMC
    [Documentation]  Verify partition available on BMC.
    [Arguments]  ${partition_name}=${EMPTY}  ${operation_status}=${True}  ${username}=${OPENBMC_USERNAME}

    # Description of argument(s):
    # partition_name     Name of the partition on BMC.
    # operation_success  Status of the previous operation like upload/delete success or failure.
    #                    True if operation was a success else False.
    # username           Username used to upload/delete. Default is ${OPENBMC_USERNAME}.

    # Non admin users will not have an access to do GET list
    Run Keyword If  '${username}' != '${OPENBMC_USERNAME}'
    ...  Delete All Sessions And Login Using Given User

    ${partitions}  ${partitions_cnt}=  Get List Of Partitions
    ${rest_response}=  Run Keyword And Return Status  List Should Contain Value  ${partitions}
    ...  /ibm/v1/Host/ConfigFiles/${partition_name}

    ${status}  ${stderr}  ${rc}=  BMC Execute Command
    ...  ls -l /var/lib/obmc/bmc-console-mgmt/save-area/${partition_name} | wc -l
    ${bmc_response}=  Run Keyword And Return Status  Should Be True  ${status} == ${1}

    Run Keyword If  '${partition_name}' == '${EMPTY}'  Run Keywords
    ...  Should Be Equal  ${rest_response}  ${False}  AND  Should Be Equal  ${bmc_response}  ${False}

    Run Keyword And Return If  '${partition_name}' != '${EMPTY}'  Run Keywords
    ...  Should Be True  ${rest_response} == ${operation_status}  AND
    ...  Should Be True  ${bmc_response} == ${operation_status}


Delete Partition
    [Documentation]  Delete partition.
    [Arguments]  ${partition_name}='${EMPTY}'  ${expect_resp_code}=${HTTP_OK}

    # Description of argument(s):
    # partition_name      Name of the partition on BMC.
    # expect_resp_code    Expected REST response code, default is ${HTTP_OK}.

    ${data}=  Create Dictionary
    ${headers}=  Create Dictionary  X-Auth-Token=${XAUTH_TOKEN}
    Set To Dictionary  ${data}  headers  ${headers}

    ${resp}=  Delete Request  openbmc  /ibm/v1/Host/ConfigFiles/${partition_name}  &{data}
    ${expect_resp_code}=  Set Variable If  '${partition_name}' == '${EMPTY}'
    ...  ${HTTP_NOT_FOUND}  ${expect_resp_code}
    Should Be Equal As Strings  ${resp.status_code}  ${expect_resp_code}


Delete And Verify All Partitions on BMC
    [Documentation]  Delete and verify all partitions on BMC.
    [Arguments]  ${expect_resp_code}=${HTTP_OK}

    # Description of argument(s):
    # expect_resp_code    Expected REST response code, default is ${HTTP_OK}.

    ${data}=  Create Dictionary
    ${headers}=  Create Dictionary  X-Auth-Token=${XAUTH_TOKEN}
    Set To Dictionary  ${data}  headers  ${headers}

    ${resp}=  Post Request  openbmc  /ibm/v1/Host/ConfigFiles/Actions/FileCollection.DeleteAll  &{data}
    Should Be Equal As Strings  ${resp.status_code}  ${expect_resp_code}

    Return From Keyword If  ${expect_resp_code} != ${HTTP_OK}
    Verify Partition Available On BMC  operation_status=${False}


Read Partition And Verify Content
    [Documentation]  Read partition and verify content.
    [Arguments]  ${partition_name}=p1  ${content}=${EMPTY}  ${expect_resp_code}=${HTTP_OK}

    # Description of argument(s):
    # partition_name      Name of the partition on BMC.
    # content             Content of the partition file uploaded.
    # expect_resp_code    Expected REST response code, default is ${HTTP_OK}.

    ${resp}=  Get Request  openbmc  /ibm/v1/Host/ConfigFiles/${partition_name}
    Should Be Equal As Strings  ${resp.status_code}  ${expect_resp_code}

    ${partition_data}=  Remove String  ${resp.text}  \\n
    ${partition_data}=  Evaluate  json.loads('''${partition_data}''')  json
    Should Be Equal As Strings  ${partition_data["Data"]}  ${content}


Delete Local File Created To Upload
    [Documentation]  Delete local file created to upload.
    [Arguments]  ${file_name}

    # Description of argument(s):
    # file_name       Name of the local file to be deleted.

    Run Keyword And Ignore Error  Run  rm -f ${file_name}


Upload Partition File With Some Known Contents
    [Documentation]  Upload partition file with some known contents.
    [Arguments]  ${file_name}  ${partition_name}  ${content}

    # Description of argument(s):
    # file_name           Name of the partition file to be uploaded.
    # partition_name      Name of the partition on BMC.
    # content             Content of the partition file to be uploaded.

    Run  echo "${content}" > ${file_name}
    OperatingSystem.File Should Exist  ${file_name}

    Upload File To Create Partition Then Delete Partition  ${file_name}  1  ${partition_name}
    ...  delete_partition=${False}


Suite Setup Execution
    [Documentation]  Suite setup execution.

    # Create different user accounts.
    Redfish.Login
    Create Users With Different Roles  users=${USERS}  force=${True}
    Redfish.Logout

    # Get REST session to BMC.
    Initialize OpenBMC


Test Teardown Execution
    [Documentation]  Test teardown execution.

    Delete And Verify All Partitions on BMC
    FFDC On Test Case Fail

