#   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 VNF VIM ID
    [Arguments]   ${vnf_id}

    Should Not Be Empty   ${vnf_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | grep vim-id | awk '{print $2}'
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Get VDU list from VNF
    [Documentation]   Return a list of the VDUr ids for a VNF

    [Arguments]   ${vnf_id}

    Should Not Be Empty   ${vnf_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].id'
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
    @{vdur_ids}=   Split String   ${stdout}
    [Return]   @{vdur_ids}


Get VDU VIM Id
    [Documentation]   Return the VIM VM ID for a VDU

    [Arguments]   ${vnf_id}   ${vdur_id}

    Should Not Be Empty   ${vnf_id}
    ${rc}   ${vm_vim_id}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq '."vim-id"' | tr -d \\"
    log   ${vm_vim_id}
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${vm_vim_id}   values=False
    [Return]   ${vm_vim_id}


Get Vnf Vdur IPs
    [Documentation]   Return a list with the IP addresses of the VDU records of a VNF instance.

    [Arguments]   ${vnf_id}

    Should Not Be Empty   ${vnf_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].interfaces[]."ip-address"' | tr -d \\"
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
    @{ip} =   Split String   ${stdout}
    [Return]   @{ip}


Get Vdu Attribute
    [Documentation]   Return an attribute from VDU records selected by count_index of a VNF instance.

    [Arguments]   ${vnf_id}   ${attribute}   ${count_index}=0

    Should Not Be Empty   ${vnf_id}
    Should Not Be Empty   ${attribute}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(."count-index" == ${count_index})' | yq '."${attribute}"' | tr -d \\"
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
    [Return]   ${stdout}
