#   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     [HACKFEST-MULTIVDU] Basic NS with two multi-VDU VNF

Library   OperatingSystem
Library   String
Library   Collections
Library   Process
Library   SSHLibrary

Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot

Variables   %{ROBOT_DEVOPS_FOLDER}/resources/hackfest_multivdu_ns_data.py

Force Tags   hackfest_multivdu   cluster_main   daily   regression

Suite Teardown   Run Keyword And Ignore Error   Suite Cleanup


*** Variables ***
${ns_id}   ${EMPTY}
${username}   ubuntu
${password}   ${EMPTY}
${vnf_member_index}   1
${vnf_ip_addr}   ${EMPTY}
${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
${wait_guard_for_vm_boot}   50s
# ${ns_config}   ${EMPTY}

*** Test Cases ***
Create Hackfest multivdu VNF Descriptor

    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'


Create Hackfest Multivdu NS Descriptor

    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'

Network Service Instance Test

    ${status}   ${message}=   Run Keyword And Ignore Error  Variable Should Exist   ${publickey}
        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${publickey}   ${EMPTY}
    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
    Set Suite Variable   ${ns_id}   ${id}
    Sleep   ${wait_guard_for_vm_boot}  Waiting for VM's daemons to be up and running

Get Vnf Ip Address

    ${ip_addr}  Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
    log   ${ip_addr}
    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}

Test Ping
    Test Connectivity   ${vnf_ip_addr}

Test SSH Access
    ${status}   ${message}=   Run Keyword And Ignore Error  Variable Should Exist   ${privatekey}
        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${privatekey}   ${EMPTY}
    Test SSH Connection   ${vnf_ip_addr}  ${username}  ${password}  ${privatekey} 

Delete NS Instance Test
    [Tags]   cleanup

    Delete NS   ${ns_name}


Delete NS Descriptor Test
    [Tags]   cleanup

    Delete NSD   ${nsd_name}


Delete VNF Descriptor Test
    [Tags]   cleanup

    Delete VNFD   ${vnfd_name}


*** Keywords ***
Suite Cleanup
    [Documentation]  Test Suit Cleanup: Deleting Descriptor, instance and vim

    Run Keyword If Any Tests Failed  Delete NS   ${ns_name}

    Run Keyword If Any Tests Failed  Delete NSD   ${nsd_name}

    Run Keyword If Any Tests Failed  Delete VNFD   ${vnfd_name}
