#   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
${ns_launch_pol_time}   30sec
${ns_delete_max_wait_time}   1min
${ns_delete_pol_time}   15sec
${ns_action_max_wait_time}   1min
${ns_action_pol_time}   15sec
${vnf_scale_max_wait_time}   5min
${vnf_scale_pol_time}   30sec


*** Keywords ***
Create Network Service
    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}  ${ns_launch_max_wait_time}=5min  ${config_file}=${EMPTY}

    ${config_attr}   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   \
    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
    ${config_file_attr}   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   \

    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_attr} ${config_file_attr}
    log   ${ns_id}

    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For NS Instance To Configured   ${ns_name}
    Check For NS Instance For Failure   ${ns_name}
    [Return]  ${ns_id}


Instantiate Network Service
    [Arguments]   ${ns_name}   ${nsd}   ${vim_name}   ${ns_extra_args}

    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} ${ns_extra_args}
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]  ${stdout}


Get Vnf Management Ip Address
    [Arguments]   ${ns_id}   ${vnf_member_index}

    Should Not Be Empty   ${ns_id}
    Should Not Be Empty   ${vnf_member_index}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $14}' 2>&1
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]  ${stdout}


Get Ns Vnf List
    [Arguments]   ${ns_id}

    Should Not Be Empty   ${ns_id}
    @{vnf_list_string}=   Run and Return RC and Output   osm vnf-list | grep ${ns_id} | awk '{print $2}' 2>&1
    # Returns a String of vnf_id and needs to be converted into a list
    @{vnf_list} =  Split String    ${vnf_list_string}[1]
    Log List    ${vnf_list}
    [Return]  @{vnf_list}


Get Ns Ip List
    [Arguments]   @{vnf_list}

    should not be empty   @{vnf_list}
    @{temp_list}=    Create List
    FOR   ${vnf_id}   IN   @{vnf_list}
        log   ${vnf_id}
        @{vnf_ip_list}   Get Vnf Ip List   ${vnf_id}
        @{temp_list}=   Combine Lists   ${temp_list}    ${vnf_ip_list}
    END
    should not be empty   ${temp_list}
    [return]  @{temp_list}


Get Vnf Ip List
    [arguments]   ${vnf_id}

    should not be empty   ${vnf_id}
    @{vnf_ip_list_string}=   run and return rc and output   osm vnf-show ${vnf_id} --filter vdur --literal | grep -o '[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}' | sort -t: -u -k1,1 2>&1
    # returns a string of ip addresses and needs to be converted into a list
    should not be empty   ${vnf_ip_list_string}[1]
    @{vnf_ip_list} =  split string    ${vnf_ip_list_string}[1]
    log list    ${vnf_ip_list}
    should not be empty   ${vnf_ip_list}
    [return]  @{vnf_ip_list}


Check For Ns Instance To Configured
    [arguments]  ${ns_name}

    ${rc}   ${stdout}=   run and return rc and output   osm ns-list --filter name="${ns_name}"
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Contain Any   ${stdout}   READY   BROKEN

Check For NS Instance For Failure
    [Arguments]  ${ns_name}

    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list --filter name="${ns_name}"
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Not Contain   ${stdout}   BROKEN

Check For NS Instance To Be Deleted
    [Arguments]  ${ns}

    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | awk '{print $2}' | grep ${ns}
    Should Not Be Equal As Strings   ${stdout}   ${ns}

Delete NS
    [Documentation]  Delete ns
    [Arguments]  ${ns}

    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-delete ${ns}
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}

    WAIT UNTIL KEYWORD SUCCEEDS  ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Deleted   ${ns}

Execute NS Action
    [Documentation]     Execute an action over the desired NS.
    ...                 Parameters are given to this function in key=value format (one argument per key/value pair).
    ...                 Return the ID of the operation associated to the executed action.
    ...                 Examples of execution:
    ...                     \${ns_op_id}=  Execute NS Action  \${ns_name}  \${ns_action}  \${vnf_member_index}
    ...                     \${ns_op_id}=  Execute NS Action  \${ns_name}  \${ns_action}  \${vnf_member_index}  \${param1}=\${value1}  \${param2}=\${value2}

    [Arguments]  ${ns_name}  ${ns_action}  ${vnf_member_index}  @{action_params}

    ${params}=  Set Variable  ${EMPTY}
    FOR  ${param}  IN  @{action_params}
        ${match}  ${param_name}  ${param_value} =  Should Match Regexp  ${param}  (.+)=(.+)  msg=Syntax error in parameters
        ${params}=  Catenate  SEPARATOR=  ${params}  "${param_name}":"${param_value}",
    END
    ${osm_ns_action_command}=  Set Variable  osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index}
    ${osm_ns_action_command}=  Run Keyword If  '${params}'!='${EMPTY}'  Catenate  ${osm_ns_action_command}  --params '{${params}}'
    ...  ELSE  Set Variable  ${osm_ns_action_command}
    ${osm_ns_action_command}=  Catenate  ${osm_ns_action_command}  ${ns_name}
    ${rc}  ${stdout}=  Run and Return RC and Output  ${osm_ns_action_command}
    Should Be Equal As Integers  ${rc}  ${success_return_code}  msg=${stdout}  values=False
    Wait Until Keyword Succeeds  ${ns_action_max_wait_time}  ${ns_action_pol_time}  Check For NS Operation Completed  ${stdout}
    [Return]  ${stdout}


Execute Manual VNF Scale
    [Documentation]     Execute a manual VNF Scale action.
    ...                 The parameter 'scale_type' must be SCALE_IN or SCALE_OUT.
    ...                 Return the ID of the operation associated to the executed scale action.

    [Arguments]  ${ns_name}  ${vnf_member_index}  ${scaling_group}  ${scale_type}

    Should Contain Any  ${scale_type}  SCALE_IN  SCALE_OUT  msg=Unknown scale type: ${scale_type}  values=False
    ${osm_vnf_scale_command}=  Set Variable  osm vnf-scale --scaling-group ${scaling_group}
    ${osm_vnf_scale_command}=  Run Keyword If  '${scale_type}'=='SCALE_IN'  Catenate  ${osm_vnf_scale_command}  --scale-in
    ...  ELSE  Catenate  ${osm_vnf_scale_command}  --scale-out
    ${osm_vnf_scale_command}=  Catenate  ${osm_vnf_scale_command}  ${ns_name}  ${vnf_member_index}
    ${rc}  ${stdout}=  Run and Return RC and Output  ${osm_vnf_scale_command}
    Should Be Equal As Integers  ${rc}  ${success_return_code}  msg=${stdout}  values=False
    Wait Until Keyword Succeeds  ${ns_action_max_wait_time}  ${ns_action_pol_time}  Check For NS Operation Completed  ${stdout}
    [Return]  ${stdout}


Get Operations List
    [Arguments]  ${ns_name}

    ${rc}  ${stdout}=  Run and Return RC and Output  osm ns-op-list ${ns_name}
    log  ${stdout}
    log  ${rc}
    Should Be Equal As Integers  ${rc}  ${success_return_code}


Check For NS Operation Completed
    [Documentation]     Check wheter the status of the desired operation is "COMPLETED" or not.

    [Arguments]  ${ns_operation_id}

    ${rc}  ${stdout}=  Run and Return RC and Output  osm ns-op-show ${ns_operation_id} --literal | yq r - operationState
    log  ${stdout}
    Should Be Equal As Integers  ${rc}  ${success_return_code}
    Should Contain  ${stdout}  COMPLETED  msg=Timeout waiting for ns-action with id ${ns_operation_id}  values=False


Get Ns Vnfr Ids
    [Documentation]     Return a list with the IDs of the VNF records of a NS instance.

    [Arguments]  ${ns_id}

    ${rc}  ${stdout}=  Run and Return RC and Output  osm vnf-list | grep ${ns_id} | awk '{print $2}' 2>&1
    Should Be Equal As Integers  ${rc}  ${success_return_code}  msg=${stdout}  values=False
    @{vdur} =  Split String  ${stdout}
    [Return]  @{vdur}


Get Vnf Vdur Names
    [Documentation]     Return a list with the names of the VDU records of a VNF instance.

    [Arguments]  ${vnf_id}

    ${rc}  ${stdout}=  Run and Return RC and Output  osm vnf-show ${vnf_id} --literal | yq r - vdur.*.name
    Should Be Equal As Integers  ${rc}  ${success_return_code}  msg=${stdout}  values=False
    @{vdur} =  Split String  ${stdout}
    [Return]  @{vdur}

