#   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}


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 -c ${field} -f value
    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}


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}


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}
