blob: 4fe034dbe27e25ec39f059a320f8b741ccef08d5 [file] [log] [blame]
# Copyright 2017-present Open Networking Foundation
#
# 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.
# voltctl common functions
*** Settings ***
Documentation Library for various utilities
Library SSHLibrary
Library String
Library DateTime
Library Process
Library Collections
Library RequestsLibrary
Library OperatingSystem
*** Keywords ***
Test Empty Device List
[Documentation] Verify that there are no devices in the system
${rc} ${output}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device list -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
Should Be Equal As Integers ${length} 0
Create Device
[Arguments] ${ip} ${port}
[Documentation] Creates a device in VOLTHA
#create/preprovision device
${rc} ${device_id}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device create -t openolt -H ${ip}:${port}
Should Be Equal As Integers ${rc} 0
[Return] ${device_id}
Enable Device
[Arguments] ${device_id}
[Documentation] Enables a device in VOLTHA
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device enable ${device_id}
Should Be Equal As Integers ${rc} 0
Disable Device
[Arguments] ${device_id}
[Documentation] Enables a device in VOLTHA
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device disable ${device_id}
Should Be Equal As Integers ${rc} 0
Disable Devices In Voltha
[Documentation] Disables all the known devices in voltha
[Arguments] ${filter}
${arg}= Set Variable ${EMPTY}
${arg}= Run Keyword If len('${filter}'.strip()) != 0 Set Variable --filter ${filter}
${rc} ${devices}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device list ${arg} --orderby Root -q | xargs echo -n
Should Be Equal As Integers ${rc} 0
${rc} ${output}= Run Keyword If len('${devices}') != 0 Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device disable ${devices}
Run Keyword If len('${devices}') != 0 Should Be Equal As Integers ${rc} 0
Test Devices Disabled In Voltha
[Documentation] Tests to verify that all devices in VOLTHA are disabled
[Arguments] ${filter}
${rc} ${count}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device list --filter '${filter},AdminState!=DISABLED' -q | wc -l
Should Be Equal As Integers ${rc} 0
Should Be Equal As Integers ${count} 0
Delete Devices In Voltha
[Documentation] Disables all the known devices in voltha
[Arguments] ${filter}
${arg}= Set Variable ${EMPTY}
${arg}= Run Keyword If len('${filter}'.strip()) != 0 Set Variable --filter ${filter}
${rc} ${devices}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device list ${arg} --orderby Root -q | xargs echo -n
Should Be Equal As Integers ${rc} 0
${rc} ${output}= Run Keyword If len('${devices}') != 0 Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device delete ${devices}
Run Keyword If len('${devices}') != 0 Should Be Equal As Integers ${rc} 0
Get Device Flows from Voltha
[Arguments] ${device_id}
[Documentation] Gets device flows from VOLTHA
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device flows ${device_id}
Should Be Equal As Integers ${rc} 0
[Return] ${output}
Get Logical Device Output from Voltha
[Arguments] ${device_id}
[Documentation] Gets logicaldevice flows and ports from VOLTHA
${rc1} ${flows}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl logicaldevice flows ${device_id}
${rc2} ${ports}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl logicaldevice port list ${device_id}
Log ${flows}
Log ${ports}
Should Be Equal As Integers ${rc1} 0
Should Be Equal As Integers ${rc2} 0
Get Device Output from Voltha
[Arguments] ${device_id}
[Documentation] Gets device flows and ports from VOLTHA
${rc1} ${flows}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device flows ${device_id}
${rc2} ${ports}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device port list ${device_id}
Log ${flows}
Log ${ports}
Should Be Equal As Integers ${rc1} 0
Should Be Equal As Integers ${rc2} 0
Get Device List from Voltha
[Documentation] Gets Device List Output from Voltha
${rc1} ${devices}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device list
Log ${devices}
Should Be Equal As Integers ${rc1} 0
Validate Device
[Documentation]
... Parses the output of "voltctl device list" and inspects device ${serial_number} and ${device_id}
... Arguments are matched for device states of: "admin_state", "oper_status", and "connect_status"
[Arguments] ${admin_state} ${oper_status} ${connect_status} ${serial_number}=${EMPTY}
... ${device_id}=${EMPTY} ${onu_reason}=${EMPTY} ${onu}=False
${rc} ${output}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device list -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
${length}= Get Length ${jsondata}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${astate}= Get From Dictionary ${value} adminstate
${opstatus}= Get From Dictionary ${value} operstatus
${cstatus}= Get From Dictionary ${value} connectstatus
${sn}= Get From Dictionary ${value} serialnumber
${devId}= Get From Dictionary ${value} id
${mib_state}= Get From Dictionary ${value} reason
Run Keyword If '${sn}' == '${serial_number}' or '${devId}' == '${device_id}' Exit For Loop
END
Log ${value}
Should Be Equal '${astate}' '${admin_state}' Device ${serial_number} admin_state != ${admin_state}
... values=False
Should Be Equal '${opstatus}' '${oper_status}' Device ${serial_number} oper_status != ${oper_status}
... values=False
Should Be Equal '${cstatus}' '${connect_status}' Device ${serial_number} conn_status != ${connect_status}
... values=False
Run Keyword If '${onu}' == 'True' Should Be Equal '${mib_state}' '${onu_reason}'
... Device ${serial_number} mib_state incorrect (${mib_state}) values=False
Validate OLT Device
[Arguments] ${admin_state} ${oper_status} ${connect_status} ${serial_number}=${EMPTY}
... ${device_id}=${EMPTY}
[Documentation] Parses the output of "voltctl device list" and inspects device ${serial_number} and/or
... ${device_id} Match on OLT Serial number or Device Id and inspect states
Validate Device ${admin_state} ${oper_status} ${connect_status} ${serial_number} ${device_id}
Validate ONU Devices
[Arguments] ${admin_state} ${oper_status} ${connect_status} ${List_ONU_Serial}
[Documentation] Parses the output of "voltctl device list" and inspects device ${List_ONU_Serial}
... Iteratively match on each Serial number contained in ${List_ONU_Serial} and inspect
... states including MIB state
FOR ${serial_number} IN @{List_ONU_Serial}
Validate Device ${admin_state} ${oper_status} ${connect_status} ${serial_number}
... onu_reason=omci-flows-pushed onu=True
END
Validate Device Port Types
[Documentation]
... Parses the output of voltctl device port list <device_id> and matches the port types listed
[Arguments] ${device_id} ${pon_type} ${ethernet_type}
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device port list ${device_id} -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${astate}= Get From Dictionary ${value} adminstate
${opstatus}= Get From Dictionary ${value} operstatus
${type}= Get From Dictionary ${value} type
#Should Be Equal '${astate}' 'ENABLED' Device ${device_id} port admin_state != ENABLED values=False
#Should Be Equal '${opstatus}' 'ACTIVE' Device ${device_id} port oper_status != ACTIVE values=False
Should Be True '${type}' == '${pon_type}' or '${type}' == '${ethernet_type}'
... Device ${device_id} port type is neither ${pon_type} or ${ethernet_type}
END
Validate OLT Port Types
[Documentation] Parses the output of voltctl device port list ${olt_device_id} and matches the port types listed
[Arguments] ${pon_type} ${ethernet_type}
Validate Device Port Types ${olt_device_id} ${pon_type} ${ethernet_type}
Validate ONU Port Types
[Arguments] ${List_ONU_Serial} ${pon_type} ${ethernet_type}
[Documentation] Parses the output of voltctl device port list for each ONU SN listed in ${List_ONU_Serial}
... and matches the port types listed
FOR ${serial_number} IN @{List_ONU_Serial}
${onu_dev_id}= Get Device ID From SN ${serial_number}
Validate Device Port Types ${onu_dev_id} ${pon_type} ${ethernet_type}
END
Validate Device Flows
[Arguments] ${device_id} ${flow_count}=${EMPTY}
[Documentation] Parses the output of voltctl device flows <device_id> and expects flow count > 0
${rc} ${output}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device flows ${device_id} -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
Log 'Number of flows = ' ${length}
Run Keyword If '${flow_count}' == '${EMPTY}' Should Be True ${length} > 0
... Number of flows for ${device_id} was 0
... ELSE Should Be True ${length} == ${flow_count}
... Number of flows for ${device_id} was not ${flow_count}
Validate OLT Flows
[Arguments] ${flow_count}=${EMPTY}
[Documentation] Parses the output of voltctl device flows ${olt_device_id}
... and expects flow count == ${flow_count}
Validate Device Flows ${olt_device_id} ${flow_count}
Validate ONU Flows
[Arguments] ${List_ONU_Serial} ${flow_count}=${EMPTY}
[Documentation] Parses the output of voltctl device flows for each ONU SN listed in ${List_ONU_Serial}
... and expects flow count == ${flow_count}
FOR ${serial_number} IN @{List_ONU_Serial}
${onu_dev_id}= Get Device ID From SN ${serial_number}
Validate Device Flows ${onu_dev_id} ${flow_count}
END
Validate Logical Device
[Documentation] Validate Logical Device is listed
${rc} ${output}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl logicaldevice list -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${devid}= Get From Dictionary ${value} id
${rootdev}= Get From Dictionary ${value} rootdeviceid
${sn}= Get From Dictionary ${value} serialnumber
Exit For Loop
END
Should Be Equal '${rootdev}' '${olt_device_id}' Root Device does not match ${olt_device_id} values=False
Should Be Equal '${sn}' '${BBSIM_OLT_SN}' Logical Device ${sn} does not match ${BBSIM_OLT_SN}
... values=False
[Return] ${devid}
Validate Logical Device Ports
[Arguments] ${logical_device_id}
[Documentation] Validate Logical Device Ports are listed and are > 0
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl logicaldevice port list ${logical_device_id} -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
Should Be True ${length} > 0 Number of ports for ${logical_device_id} was 0
Validate Logical Device Flows
[Arguments] ${logical_device_id}
[Documentation] Validate Logical Device Flows are listed and are > 0
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl logicaldevice flows ${logical_device_id} -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
Should Be True ${length} > 0 Number of flows for ${logical_device_id} was 0
Retrieve Peer List From OLT
[Arguments] ${olt_peer_list}
[Documentation] Retrieve the list of peer device id list from port list
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device port list ${olt_device_id} -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${type}= Get From Dictionary ${value} type
${peers}= Get From Dictionary ${value} peers
Run Keyword If '${type}' == 'PON_OLT' Exit For Loop
END
${length}= Get Length ${peers}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${peers} ${INDEX}
${peer_id}= Get From Dictionary ${value} deviceid
Append To List ${olt_peer_list} ${peer_id}
END
Validate OLT Peer Id List
[Arguments] ${olt_peer_id_list}
[Documentation] Match each entry in the ${olt_peer_id_list} against ONU device ids.
FOR ${peer_id} IN @{olt_peer_id_list}
Match OLT Peer Id ${peer_id}
END
Match OLT Peer Id
[Arguments] ${olt_peer_id}
[Documentation] Lookup the OLT Peer Id in against the list of ONU device Ids
${rc} ${output}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device list -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${devid}= Get From Dictionary ${value} id
Run Keyword If '${devid}' == '${olt_peer_id}' Exit For Loop
Run Keyword If '${INDEX}' == '${length}' Fail Peer id ${olt_peer_id} does not match any ONU device id;
END
Validate ONU Peer Id
[Arguments] ${olt_device_id} ${List_ONU_Serial}
[Documentation] Match each ONU peer to that of the OLT device id
FOR ${onu_serial} IN @{List_ONU_Serial}
${onu_dev_id}= Get Device ID From SN ${onu_serial}
Match ONU Peer Id ${onu_dev_id}
END
Match ONU Peer Id
[Arguments] ${onu_dev_id}
[Documentation] Match an ONU peer to that of the OLT device id
${rc} ${output}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device port list ${onu_dev_id} -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${type}= Get From Dictionary ${value} type
${peers}= Get From Dictionary ${value} peers
Run Keyword If '${type}' == 'PON_ONU' Exit For Loop
END
${length}= Get Length ${peers}
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${peers} ${INDEX}
${peer_id}= Get From Dictionary ${value} deviceid
END
Should Be Equal '${peer_id}' '${olt_device_id}'
... Mismatch between ONU peer ${peer_id} and OLT device id ${olt_device_id} values=False
Get Device ID From SN
[Arguments] ${serial_number}
[Documentation] Gets the device id by matching for ${serial_number}
${rc} ${id}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device list --filter=SerialNumber=${serial_number} --format='{{.Id}}'
Should Be Equal As Integers ${rc} 0
Log ${id}
[Return] ${id}
Get Logical Device ID From SN
[Arguments] ${serial_number}
[Documentation] Gets the device id by matching for ${serial_number}
${rc} ${id}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl logicaldevice list --filter=SerialNumber=${serial_number} --format='{{.Id}}'
Should Be Equal As Integers ${rc} 0
Log ${id}
[Return] ${id}
Build ONU SN List
[Arguments] ${serial_numbers}
[Documentation] Appends all ONU SNs to the ${serial_numbers} list
FOR ${INDEX} IN RANGE 0 ${num_onus}
Append To List ${serial_numbers} ${hosts.src[${INDEX}].onu}
END
Get SN From Device ID
[Arguments] ${device_id}
[Documentation] Gets the device id by matching for ${device_id}
${rc} ${sn}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device list --filter=Id=${device_id} --format='{{.SerialNumber}}'
Should Be Equal As Integers ${rc} 0
Log ${sn}
[Return] ${sn}
Get Parent ID From Device ID
[Arguments] ${device_id}
[Documentation] Gets the device id by matching for ${device_id}
${rc} ${pid}= Run and Return Rc and Output
... ${VOLTCTL_CONFIG}; voltctl device list --filter=Id=${device_id} --format='{{.ParentId}}'
Should Be Equal As Integers ${rc} 0
Log ${pid}
[Return] ${pid}
Validate Device Removed
[Arguments] ${id}
[Documentation] Verifys that device, ${serial_number}, has been removed
${rc} ${output}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device list -o json
Should Be Equal As Integers ${rc} 0
${jsondata}= To Json ${output}
Log ${jsondata}
${length}= Get Length ${jsondata}
@{ids}= Create List
FOR ${INDEX} IN RANGE 0 ${length}
${value}= Get From List ${jsondata} ${INDEX}
${device_id}= Get From Dictionary ${value} id
Append To List ${ids} ${device_id}
END
List Should Not Contain Value ${ids} ${id}
Reboot ONU
[Arguments] ${onu_id} ${src} ${dst}
[Documentation] Using voltctl command reboot ONU and verify that ONU comes up to running state
${rc} ${devices}= Run and Return Rc and Output ${VOLTCTL_CONFIG}; voltctl device reboot ${onu_id}
Should Be Equal As Integers ${rc} 0
Run Keyword and Ignore Error Wait Until Keyword Succeeds 60s 1s Validate Device
... ENABLED DISCOVERED UNREACHABLE ${onu_id} onu=True