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


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}


