#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

*** Variables ***
${success_return_code}   0


*** Keywords ***
Get Server Flavor ID
    [Arguments]   ${server_id}

    Should Not Be Empty   ${server_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server show ${server_id} | grep flavor | awk 'NR>1{print $1}' RS='(' FS=')'
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Get Flavor Properties
    [Arguments]   ${flavor_id}

    Should Not Be Empty   ${flavor_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack flavor show ${flavor_id} | grep properties | awk -F '|' '{print $3}'
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Check NS Servers In VIM
    [Documentation]   Check if the number of servers in Openstack by filtering by NS name is as expected.
    [Arguments]   ${ns_name}   ${number}

    Should Not Be Empty   ${ns_name}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list | grep ${ns_name} | awk '{print $4}'
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    @{servers} =   Split String   ${stdout}
    ${n_servers}=   Get Length   ${servers}
    Should Be Equal As Integers   ${number}   ${n_servers}


Check If Volume Bootable
    [Documentation]   Check the volume properties and return whether it is bootable or not.
    [Arguments]   ${volume_id}

    Should Not Be Empty   ${volume_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume show ${volume_id} | grep bootable | awk '{print $4}'
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Get Project Quota
    [Documentation]   Get a field (ram, cores, ports, etc.) from quota in current project.
    [Arguments]   ${field}

    Should Not Be Empty   ${field}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack quota show -f yaml | yq '.[] | select(.Resource=="${field}") | .Limit'
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Get Server Property
    [Documentation]   Get a field (flavor, image, volumes_attached, etc.) from a server.
    [Arguments]   ${server_id}   ${field}

    Should Not Be Empty   ${server_id}
    Should Not Be Empty   ${field}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server show ${server_id} -c ${field} -f value
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Check VM In Server Group
    [Documentation]   Check if a given server is included in an Openstack server group
    [Arguments]   ${server_id}   ${server_group_name}

    Should Not Be Empty   ${server_group_name}
    Should Not Be Empty   ${server_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server group show ${server_group_name} -c members -f value
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Contain   ${stdout}   ${server_id}


Set Volume Id
    [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
    [Arguments]   ${volume_match}   ${index}

    Should Not Be Empty   ${volume_match}   ${index}
    ${bootable}=   Check If Volume Bootable   ${volume_match}[${index}]
    Set Suite Variable   ${bootable}
    IF   '${bootable}'=='true'
        Set Suite Variable   ${root_vol_id}   ${volume_match}[${index}]
        IF   ${index}==0
            Set Suite Variable   ${ordinary_vol_id}   ${volume_match}[1]
        ELSE
            Set Suite Variable   ${ordinary_vol_id}   ${volume_match}[0]
        END
    END


Get Persistent Volumes Attached To Vm
    [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
    [Arguments]   ${ns_id}

    Variable Should Exist   ${ns_id}   msg=NS is not available
    ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
    ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
    ${volumes_attached}=   Get Server Property   ${vim_id}   volumes_attached
    log   ${volumes_attached}
    ${stdout}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
    log   ${stdout}
    [Return]   ${stdout}


Check If Volume Exists
    [Documentation]   Checks if a volume id exists
    [Arguments]   ${volume_id}

    Should Not Be Empty   ${volume_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume list | grep ${volume_id} | wc -l
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Delete Volume
    [Documentation]   Delete a volume by its identifier
    [Arguments]   ${volume_id}

    Should Not Be Empty   ${volume_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume delete ${volume_id}
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Get Subnet
    [Documentation]   Get subnet information in JSON format
    [Arguments]   ${subnet_id}

    Should Not Be Empty   ${subnet_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack subnet show ${subnet_id} -f json
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Stop Server
    [Documentation]   Stop a server
    [Arguments]   ${server_id}

    Should Not Be Empty   ${server_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server stop ${server_id}
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Halt Server
    [Documentation]   Reset a server
    [Arguments]   ${server_id}

    Should Not Be Empty   ${server_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server set --state error ${server_id}
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Delete Server
    [Documentation]   Delete a server
    [Arguments]   ${server_id}

    Should Not Be Empty   ${server_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server delete ${server_id}
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Create Flavor
    [Documentation]   Create a Flavor
    [Arguments]   ${flavor_name}   ${cpu}=1   ${ram}=1024   ${disk}=10

    Should Not Be Empty   ${flavor_name}
    ${rc}   ${flavor_id}=   Run and Return RC and Output   openstack flavor create ${flavor_name} --ram ${ram} --disk ${disk} --vcpus ${cpu} -f yaml | yq -r '.id'
    Log   ${flavor_id}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${flavor_id}


Delete Flavor
    [Documentation]   Delete a Flavor
    [Arguments]   ${flavor_id}

    Should Not Be Empty   ${flavor_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   openstack flavor delete ${flavor_id}
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}
