#   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 to deploy and delete NS, and run operations on them.

Library   DateTime


*** Variables ***
${success_return_code}   0
${ns_launch_pol_time}   30sec
${ns_delete_pol_time}   15sec
${ns_action_max_wait_time}   1min
${ns_action_pol_time}   15sec
${vnf_scale_pol_time}   15sec
${healing_pol_time}   15sec
${vim_timeout_multiplier}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}


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

    ${ns_launch_max_wait_time}=   Convert Time   ${ns_launch_max_wait_time}   result_format=number
    ${ns_launch_max_wait_time}=   Evaluate   ${ns_launch_max_wait_time} * ${vim_timeout_multiplier}
    Log   ${ns_launch_max_wait_time}
    ${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}


Update Network Service
    [Arguments]   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}

    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-update ${ns_id} --updatetype ${update_type} --config ${ns_update_config} --timeout ${ns_update_timeout} --wait
    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 Vnf Id
    [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 $2}' 2>&1
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    [Return]   ${stdout}


Get Ns Id
    [Arguments]   ${ns_name}

    Should Not Be Empty   ${ns_name}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | grep ${ns_name} | awk '{print $4}' 2>&1
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Not Be Empty   ${stdout}
    [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-list --filter id=${vnf_id} | 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   openstack server list
    log   ${stdout}
    ${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   openstack server list
    log   ${stdout}
    ${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   openstack server list
    log   ${stdout}
    ${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}   ${ns_delete_max_wait_time}=4min

    ${ns_delete_max_wait_time}=   Convert Time   ${ns_delete_max_wait_time}   result_format=number
    ${ns_delete_max_wait_time}=   Evaluate   ${ns_delete_max_wait_time} * ${vim_timeout_multiplier}
    Log   ${ns_delete_max_wait_time}
    ${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 Ended   ${stdout}
    Check For NS Operation Completed   ${stdout}
    [Return]   ${stdout}


Execute NS K8s Action
    [Documentation]   Execute an action over the desired K8s 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}   ${kdu_name}   @{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} --kdu_name ${kdu_name}
    ${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 Ended   ${stdout}
    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}   ${vnf_scale_max_wait_time}=2min

    ${vnf_scale_max_wait_time}=   Convert Time   ${vnf_scale_max_wait_time}   result_format=number
    ${vnf_scale_max_wait_time}=   Evaluate   ${vnf_scale_max_wait_time} * ${vim_timeout_multiplier}
    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   ${vnf_scale_max_wait_time}   ${vnf_scale_pol_time}   Check For NS Operation Ended   ${stdout}
    Check For NS Operation Completed   ${stdout}
    [Return]   ${stdout}


Heal Network Service
    [Documentation]   Execute healing operation over one NS.
    ...               Return the ID of the operation associated to the executed healing action.

    [Arguments]   ${ns_name}   ${params}   ${healing_max_wait_time}=10m

    Should Not Be Empty   ${ns_name}
    Should Not Be Empty   ${params}
    ${healing_max_wait_time}=   Convert Time   ${healing_max_wait_time}   result_format=number
    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${vim_timeout_multiplier}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-heal ${ns_name} ${params}
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${healing_pol_time}   Check For NS Operation Ended   ${stdout}
    Check For NS Operation Completed   ${stdout}
    [Return]   ${stdout}


Get Operations List
    [Arguments]   ${ns_name}

    Should Not Be Empty   ${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}

    Should Not Be Empty   ${ns_operation_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq .operationState | tr -d \\"
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Contain   ${stdout}   COMPLETED   msg=The ns-action with id ${ns_operation_id} was not completed   values=False


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

    [Arguments]   ${ns_operation_id}

    Should Not Be Empty   ${ns_operation_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq .operationState | tr -d \\"
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Contain   ${stdout}   FAILED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False


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

    [Arguments]   ${ns_operation_id}

    Should Not Be Empty   ${ns_operation_id}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq .operationState | tr -d \\"
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Contain Any   ${stdout}   FAILED   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}

    Should Not Be Empty   ${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}

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


Get Vnf Kdu Replica Count
    [Documentation]   Return the number of KDU replicas (empty if none) of a VNF instance.

    [Arguments]   ${vnf_id}   ${kdu_name}

    Should Not Be Empty   ${vnf_id}
    Should Not Be Empty   ${kdu_name}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --kdu ${kdu_name} | yq .config.replicaCount | tr -d \\"
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
    ${return} =   Set Variable If   '${stdout}' == 'null'   ${EMPTY}   ${stdout}
    [Return]   ${return}


Get Application Names
    [Documentation]   Return the list of the application of a VNF instance.

    [Arguments]   ${ns_name}

    Should Not Be Empty   ${ns_name}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | yq ._admin.deployed.VCA[].application | tr -d \\"
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
    @{app_names} =   Split String   ${stdout}
    [Return]   ${app_names}


Get VDU Affinity Group Name
    [Documentation]   Return the affinity group name for a NF

    [Arguments]   ${ns_name}   ${vnf_id}   ${vdur_id}

    ${rc}   ${affinity_group_id}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq '."affinity-or-anti-affinity-group-id"[0]' | tr -d \\" 2>&1
    log   ${affinity_group_id}
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${affinity_group_id}   values=False
    ${rc}   ${affinity_group_name}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | yq '."affinity-or-anti-affinity-group"[] | select(.id == "'${affinity_group_id}'")' | yq '.name' | tr -d \\" 2>&1
    log   ${affinity_group_name}
    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${affinity_group_name}   values=False
    [Return]   ${affinity_group_name}

Get Operations By Type
    [Documentation]   Keyword to get the operation by type

    [Arguments]   ${ns_id}   ${type}

    Should Not Be Empty   ${ns_id}
    Should Not Be Empty   ${type}
    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-list ${ns_id} | grep ${type} | awk '{print $2}' 2>&1
    log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${success_return_code}
    Should Not Be Empty   ${stdout}
    [Return]   ${stdout}
