*** Comments ***
#   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.


*** Settings ***
Documentation   Library providing keywords to interact with Openstack with openstack client.

Library   OperatingSystem
Library   String

Resource   ns_lib.resource
Resource   vnf_lib.resource


*** Variables ***
${SUCCESS_RETURN_CODE}   0


*** Keywords ***
Get Server Flavor ID
    [Documentation]   Get from Openstack the flavor id of a server/VM passed as argument.
    [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
    [Documentation]   Get from Openstack the properties of a flavor passed as argument.
    [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}]
    IF   ${bootable}=='true'
        Set Suite Variable   ${ROOT_VOL_ID}   ${volume_match}[${index}]
        IF   not ${index}
            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} -c id -f value
    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}
