${str2}= Convert to String ${str2}
${output}= Catenate ${str1} ${str2}
[Return] ${output}
+
+Remove All Elements At URI
+ [Arguments] ${uri}
+ ${resp} RequestsLibrary.Delete session ${uri}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Add Elements To URI From File
+ [Arguments] ${dest_uri} ${data_file}
+ ${body} OperatingSystem.Get File ${data_file}
+ ${resp} RequestsLibrary.Put session ${dest_uri} data=${body} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Functions, Operates functions from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_FUNCTIONS_URI} /restconf/config/service-function:service-functions/
+${SERVICE_FUNCTIONS_FILE} ../../../variables/sfc/service-functions.json
+${SF_DPI102100_URI} /restconf/config/service-function:service-functions/service-function/dpi-102-100/
+${SF_DPI102100_FILE} ../../../variables/sfc/sf_dpi_102_100.json
+${SF_DPL101_FILE} ../../../variables/sfc/sf_dpl_101.json
+
+*** Test Cases ***
+Add Service Functions
+ [Documentation] Add Service Functions from JSON file
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTIONS_FILE}
+ ${jsonbody} To Json ${body}
+ ${functions} Get From Dictionary ${jsonbody} service-functions
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${function} Get From Dictionary ${result} service-functions
+ Lists Should be Equal ${function} ${functions}
+
+Delete All Service Functions
+ [Documentation] Delete all Service Functions
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTIONS_FILE}
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Get one Service Function
+ [Documentation] Get one Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ ${elements}= Create List dpi-102-1 service-function-type:dpi
+ Check For Elements At URI ${SERVICE_FUNCTIONS_URI}service-function/dpi-102-1 ${elements}
+
+Get A Non-existing Service Function
+ [Documentation] Get A Non-existing Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}service-function/non-existing-sf
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete A Service Function
+ [Documentation] Delete A Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}service-function/dpi-102-1
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} dpi-102-1
+
+Delete A Non-existing Empty Service Function
+ [Documentation] Delete A Non existing Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTIONS_FILE}
+ ${jsonbody} To Json ${body}
+ ${functions} Get From Dictionary ${jsonbody} service-functions
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}service-function/non-existing-sf
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${function} Get From Dictionary ${result} service-functions
+ Lists Should be Equal ${function} ${functions}
+
+Put one Service Function
+ [Documentation] Put one Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SF_DPI102100_URI} ${SF_DPI102100_FILE}
+ ${elements}= Create List dpi-102-100 service-function-type:dpi
+ Check For Elements At URI ${SF_DPI102100_URI} ${elements}
+ Check For Elements At URI ${SERVICE_FUNCTIONS_URI} ${elements}
+
+Get Service Function DPL
+ [Documentation] Get Service Function Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SF_DPI102100_URI} ${SF_DPI102100_FILE}
+ ${elements}= Create List 100 10100
+ Check For Elements At URI ${SF_DPI102100_URI}sf-data-plane-locator/dpl-100 ${elements}
+
+Put Service Function DPL
+ [Documentation] Put Service Function Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SF_DPI102100_URI} ${SF_DPI102100_FILE}
+ Add Elements To URI From File ${SF_DPI102100_URI}sf-data-plane-locator/dpl-101 ${SF_DPL101_FILE}
+ ${elements}= Create List dpl-101 10101
+ Check For Elements At URI ${SF_DPI102100_URI}sf-data-plane-locator/dpl-101 ${elements}
+ Check For Elements At URI ${SF_DPI102100_URI} ${elements}
+
+Put Service Function DPL to a Non-existing Service Function
+ [Documentation] Put Service Function DPL to a Non-existing Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SF_DPI102100_URI}sf-data-plane-locator/dpl-101 ${SF_DPL101_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTIONS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} dpi-102-100
+ ${elements}= Create List dpl-101 10101
+ Check For Elements At URI ${SF_DPI102100_URI}sf-data-plane-locator/dpl-101 ${elements}
+ Check For Elements At URI ${SF_DPI102100_URI} ${elements}
+
+Delete Service Function DPL
+ [Documentation] Delete Service Function Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Add Elements To URI From File ${SF_DPI102100_URI} ${SF_DPI102100_FILE}
+ Remove All Elements At URI ${SF_DPI102100_URI}sf-data-plane-locator/dpl-100
+ ${resp} RequestsLibrary.Get session ${SF_DPI102100_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} dpl-100
+
+Clean Datastore After Tests
+ [Documentation] Clean All Service Functions In Datastore After Tests
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Function Forwarders, Operates SFFs from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_FORWARDERS_URI} /restconf/config/service-function-forwarder:service-function-forwarders/
+${SERVICE_FORWARDERS_FILE} ../../../variables/sfc/service-function-forwarders.json
+${SFF_OVS100_URI} /restconf/config/service-function-forwarder:service-function-forwarders/service-function-forwarder/ovs-100/
+${SFF_OVS100_FILE} ../../../variables/sfc/sff_ovs_100.json
+${SFF_DPL101_FILE} ../../../variables/sfc/sff_dpl_101.json
+${SFF_DPL_LOCATOR_FILE} ../../../variables/sfc/sff_dpl_locator.json
+${SFF_SFD_SF100_FILE} ../../../variables/sfc/sff_sfd_sf100.json
+${SFF_SFD_LOCATOR_FILE} ../../../variables/sfc/sff_sfd_locator.json
+${SFF_CSD_SFF100_FILE} ../../../variables/sfc/sff_csd_sff100.json
+${SFF_CSD_LOCATOR_FILE} ../../../variables/sfc/sff_csd_locator.json
+
+*** Test Cases ***
+Put Service Function Forwarders
+ [Documentation] Add Service Function Forwarders from JSON file
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FORWARDERS_FILE}
+ ${jsonbody} To Json ${body}
+ ${forwarders} Get From Dictionary ${jsonbody} service-function-forwarders
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${forwarder} Get From Dictionary ${result} service-function-forwarders
+ Lists Should be Equal ${forwarder} ${forwarders}
+
+Delete All Service Function Forwarders
+ [Documentation] Delete all Service Function Forwarders
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Get one Service Function Forwarder
+ [Documentation] Get one Service Function Forwarder
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${elements}= Create List SFF-bootstrap service-locator:vxlan-gpe SF1
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap ${elements}
+
+Get A Non-existing Service Function Forwarder
+ [Documentation] Get A Non-existing Service Function Forwarder
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/non-existing-sff
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete A Service Function Forwarder
+ [Documentation] Delete A Service Function Forwarder
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap
+ Should Be Equal As Strings ${resp.status_code} 404
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} SF1
+
+Delete A Non-existing Service Function Forwarder
+ [Documentation] Delete A Non existing Service Function
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FORWARDERS_FILE}
+ ${jsonbody} To Json ${body}
+ ${forwarders} Get From Dictionary ${jsonbody} service-function-forwarders
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/non-existing-sff
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${forwarder} Get From Dictionary ${result} service-function-forwarders
+ Lists Should be Equal ${forwarder} ${forwarders}
+
+Put one Service Function Forwarder
+ [Documentation] Put one Service Function Forwarder
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ ${resp} RequestsLibrary.Get session ${SFF_OVS100_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${elements}= Create List ovs-100 SF7
+ Check For Elements At URI ${SFF_OVS100_URI} ${elements}
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI} ${elements}
+
+Get Service Function Forwarder DPL
+ [Documentation] Get Service Function Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ ${elements}= Create List eth0 service-locator:vxlan-gpe
+ Check For Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/eth0 ${elements}
+
+Put Service Function Forwarder DPL
+ [Documentation] Put Service Function Forwarder Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ Add Elements To URI From File ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${SFF_DPL101_FILE}
+ ${elements}= Create List dpl-101 6101
+ Check For Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${elements}
+ Check For Elements At URI ${SFF_OVS100_URI} ${elements}
+
+Put DPL to a Non-existing Service Function Forwarder
+ [Documentation] Put Service Function DPL to a Non-existing Service Function
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${SFF_DPL101_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} ovs-100
+ ${elements}= Create List dpl-101 6101
+ Check For Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${elements}
+ Check For Elements At URI ${SFF_OVS100_URI} ${elements}
+
+Delete Service Function Forwarder DPL
+ [Documentation] Delete Service Function Forwarder Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ Remove All Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/eth0
+ ${resp} RequestsLibrary.Get session ${SFF_OVS100_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} eth0
+
+Get Service Function Forwarder DPL's Locator
+ [Documentation] Get Service Function Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ ${elements}= Create List 6000 service-locator:vxlan-gpe
+ Check For Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/eth0/data-plane-locator/ ${elements}
+
+Put Service Function Forwarder DPL's Locator
+ [Documentation] Put Service Function Forwarder Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ Add Elements To URI From File ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${SFF_DPL101_FILE}
+ Add Elements To URI From File ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101/data-plane-locator/ ${SFF_DPL_LOCATOR_FILE}
+ ${elements}= Create List 5000 service-locator:vxlan-gpe
+ Check For Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101/data-plane-locator ${elements}
+ ${elements}= Create List dpl-101 5000 service-locator:vxlan-gpe
+ Check For Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${elements}
+ Check For Elements At URI ${SFF_OVS100_URI} ${elements}
+
+Delete Service Function Forwarder DPL's Locator
+ [Documentation] Delete Service Function Forwarder Data Plane Locator
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SFF_OVS100_URI} ${SFF_OVS100_FILE}
+ Add Elements To URI From File ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101 ${SFF_DPL101_FILE}
+ Add Elements To URI From File ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101/data-plane-locator/ ${SFF_DPL_LOCATOR_FILE}
+ Remove All Elements At URI ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101/data-plane-locator
+ ${resp} RequestsLibrary.Get session ${SFF_OVS100_URI}sff-data-plane-locator/dpl-101
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} dpl-101
+ Should Not Contain ${resp.content} 6101
+ Should Not Contain ${resp.content} service-locator:vxlan-gpe
+ ${resp} RequestsLibrary.Get session ${SFF_OVS100_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} dpl-101
+ Should Not Contain ${resp.content} 6101
+
+Get Service Function Dictionary From SFF
+ [Documentation] Get Service Function Dictionary From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${elements}= Create List service-function-dictionary service-function-type:dpi SF1
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1 ${elements}
+
+Delete Service Function Dictionary From SFF
+ [Documentation] Delete Service Function Dictionary From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1
+ Should Be Equal As Strings ${resp.status_code} 404
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} service-function-dictionary
+ Should Not Contain ${resp.content} SF1
+
+Put Service Function Dictionary to SFF
+ [Documentation] Put Service Function Dictionary to SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF100 ${SFF_SFD_SF100_FILE}
+ ${elements}= Create List service-function-type:napt44 SF100
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF100 ${elements}
+ ${elements}= create list service-function-dictionary service-function-type:napt44 SF100
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/ ${elements}
+
+Get Service Function Dictionary's DPL From SFF
+ [Documentation] Get Service Function Dictionary From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${elements}= create list sff-sf-data-plane-locator 5000 10.1.1.1
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/sff-sf-data-plane-locator/ ${elements}
+
+Delete Service Function Dictionary's DPL From SFF
+ [Documentation] Delete Service Function Dictionary From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/sff-sf-data-plane-locator/
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/sff-sf-data-plane-locator/
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/sff-sf-data-plane-locator/
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Put DPL of Service Function Dictionary to SFF
+ [Documentation] Put DPL of Service Function Dictionary to SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/sff-sf-data-plane-locator/ ${SFF_SFD_LOCATOR_FILE}
+ ${elements}= create list sff-sf-data-plane-locator 6000 10.1.1.1
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/sff-sf-data-plane-locator/ ${elements}
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/service-function-dictionary/SF1/ ${elements}
+
+Get Connected SFF Dictionary From SFF
+ [Documentation] Get Connected SFF Dictionary Dictionary From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${elements}= create list connected-sff-dictionary br-int-ovs-2 sff-sff-data-plane-locator
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2 ${elements}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/br-int-ovs-2/connected-sff-dictionary/SFF-bootstrap
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} SFF-bootstrap
+
+Delete Connected SFF Dictionary From SFF
+ [Documentation] Delete Connected SFF Dictionary From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2
+ Should Be Equal As Strings ${resp.status_code} 404
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} br-int-ovs-2
+
+Put Connected SFF Dictionary to SFF
+ [Documentation] Put Connected SFF Dictionary to SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/SFF100 ${SFF_CSD_SFF100_FILE}
+ ${elements}= create list SFF100 service-function-forwarder:open
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/SFF100 ${elements}
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/ ${elements}
+
+Get Connected SFF Dictionary's DPL From SFF
+ [Documentation] Get Connected SFF Dictionary's DPL From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${elements}= create list sff-sff-data-plane-locator 5000 192.168.1.2
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/sff-sff-data-plane-locator/ ${elements}
+
+Delete Connected SFF Dictionary's DPL From SFF
+ [Documentation] Connected SFF Dictionary's DPL From SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/sff-sff-data-plane-locator/
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/sff-sff-data-plane-locator/
+ ${resp} RequestsLibrary.Get session ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/sff-sff-data-plane-locator/
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Put DPL of Connected SFF Dictionary to SFF
+ [Documentation] Put DPL of Connected SFF Dictionary to SFF
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/sff-sff-data-plane-locator/ ${SFF_CSD_LOCATOR_FILE}
+ ${elements}= create list sff-sff-data-plane-locator 6000 10.1.1.1
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/sff-sff-data-plane-locator/ ${elements}
+ Check For Elements At URI ${SERVICE_FORWARDERS_URI}service-function-forwarder/SFF-bootstrap/connected-sff-dictionary/br-int-ovs-2/ ${elements}
+
+Clean The Datastore After Tests
+ [Documentation] Clean All Service Function Forwarders In Datastore After Tests
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Nodes, Operates Nodes from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_NODES_URI} /restconf/config/service-node:service-nodes/
+${SERVICE_NODES_FILE} ../../../variables/sfc/service-nodes.json
+${SN_NODE100_URI} /restconf/config/service-node:service-nodes/service-node/node-100
+${SN_NODE100_FILE} ../../../variables/sfc/sn_node_100.json
+
+*** Test Cases ***
+Put Service Nodes
+ [Documentation] Add Service Nodes from JSON file
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_NODES_FILE}
+ ${jsonbody} To Json ${body}
+ ${nodes} Get From Dictionary ${jsonbody} service-nodes
+ ${resp} RequestsLibrary.Get session ${SERVICE_NODES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${node} Get From Dictionary ${result} service-nodes
+ Lists Should be Equal ${node} ${nodes}
+
+Delete All Service Nodes
+ [Documentation] Delete all Service Nodes
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_NODES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ ${resp} RequestsLibrary.Get session ${SERVICE_NODES_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Get one Service Node
+ [Documentation] Get one Service Node
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ ${elements}= Create List node-101 firewall-101-2 10.3.1.101
+ Check For Elements At URI ${SERVICE_NODES_URI}service-node/node-101 ${elements}
+
+Get A Non-existing Service Node
+ [Documentation] Get A Non-existing Service Node
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_NODES_URI}service-node/non-existing-sf
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete A Service Node
+ [Documentation] Delete A Service Node
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ Remove All Elements At URI ${SERVICE_NODES_URI}service-node/node-101
+ ${resp} RequestsLibrary.Get session ${SERVICE_NODES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} node-101
+
+Delete A Non-existing Service Node
+ [Documentation] Delete A Non existing Service Node
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_NODES_FILE}
+ ${jsonbody} To Json ${body}
+ ${nodes} Get From Dictionary ${jsonbody} service-nodes
+ Remove All Elements At URI ${SERVICE_NODES_URI}service-node/non-existing-sn
+ ${resp} RequestsLibrary.Get session ${SERVICE_NODES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${node} Get From Dictionary ${result} service-nodes
+ Lists Should be Equal ${node} ${nodes}
+
+Put one Service Node
+ [Documentation] Put one Service Node
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ Add Elements To URI From File ${SN_NODE100_URI} ${SN_NODE100_FILE}
+ ${elements}= Create List node-100 10.3.1.100 dpi-100-1 firewall-102-1
+ Check For Elements At URI ${SN_NODE100_URI} ${elements}
+ Check For Elements At URI ${SERVICE_NODES_URI} ${elements}
+
+Clean All Service Nodes After Tests
+ [Documentation] Delete all Service Nodes From Datastore After Tests
+ Remove All Elements At URI ${SERVICE_NODES_URI}
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Function Chains, Operates Chains from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_CHAINS_URI} /restconf/config/service-function-chain:service-function-chains/
+${SERVICE_CHAINS_FILE} ../../../variables/sfc/service-function-chains.json
+${SERVICE_CHAIN100_URI} /restconf/config/service-function-chain:service-function-chains/service-function-chain/SFC100
+${SERVICE_CHAIN100_FILE} ../../../variables/sfc/sfc_chain_100.json
+${SERVICE_CHAIN100_SFIDS_URI} /restconf/config/service-function-chain:service-function-chains/service-function-chain/SFC100/sfc-service-function/ids-abstract100
+${SERVICE_CHAIN100_SFIDS_FILE} ../../../variables/sfc/sfc_chain_100_sfids.json
+
+*** Test Cases ***
+Put Service Function Chains
+ [Documentation] Add Service Function Chains from JSON file
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_CHAINS_FILE}
+ ${jsonbody} To Json ${body}
+ ${chains} Get From Dictionary ${jsonbody} service-function-chains
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${chain} Get From Dictionary ${result} service-function-chains
+ Lists Should be Equal ${chain} ${chains}
+
+Delete All Service Function Chains
+ [Documentation] Delete all Service Function Chains
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Get one Service Function Chain
+ [Documentation] Get one Service Function Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${elements}= Create List SFC1 dpi-abstract1 napt44-abstract1 firewall-abstract1
+ Check For Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1 ${elements}
+
+Get A Non-existing Service Function Chain
+ [Documentation] Get A Non-existing Service Function Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}service-function-chain/non-existing-sfc
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete A Service Function Chain
+ [Documentation] Delete A Service Function Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}service-function-chain/SFC1
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1
+ ${elements}= Create List SFC1 dpi-abstract1 napt44-abstract1 firewall-abstract1
+ Check For Elements Not At URI ${SERVICE_CHAINS_URI} ${elements}
+
+Delete A Non-existing Service Function Chain
+ [Documentation] Delete A Non existing Service Function Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_CHAINS_FILE}
+ ${jsonbody} To Json ${body}
+ ${chains} Get From Dictionary ${jsonbody} service-function-chains
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/non-existing-sfc
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${chain} Get From Dictionary ${result} service-function-chains
+ Lists Should be Equal ${chain} ${chains}
+
+Put one Service Function Chain
+ [Documentation] Put one Service Function Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAIN100_URI} ${SERVICE_CHAIN100_FILE}
+ ${elements}= Create List SFC100 dpi-abstract100 napt44-abstract100 firewall-abstract100
+ Check For Elements At URI ${SERVICE_CHAIN100_URI} ${elements}
+ Check For Elements At URI ${SERVICE_CHAINS_URI} ${elements}
+
+Get one Service Function From Chain
+ [Documentation] Get one Service Function From Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${elements}= Create List dpi-abstract1 "order":0 service-function-type:dpi
+ Check For Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1/sfc-service-function/dpi-abstract1 ${elements}
+
+Get A Non-existing Service Function From Chain
+ [Documentation] Get A Non-existing Service Function From Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}service-function-chain/SFC1/sfc-service-function/non-existing-sft
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete A Service Function From Chain
+ [Documentation] Delete A Service Function From Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1/sfc-service-function/dpi-abstract1
+ ${resp} RequestsLibrary.Get session ${SERVICE_CHAINS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} SFC1
+ ${elements}= Create List dpi-abstract1 service-function-type:dpi
+ Check For Elements Not At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1/ ${elements}
+
+Delete A Non-existing Service Function From Chain
+ [Documentation] Delete A Non existing Service Function From Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1/sfc-service-function/non-existing-sft
+ ${elements}= Create List dpi-abstract1 napt44-abstract1 firewall-abstract1
+ Check For Elements At URI ${SERVICE_CHAINS_URI}service-function-chain/SFC1 ${elements}
+ Check For Elements At URI ${SERVICE_CHAINS_URI} ${elements}
+
+Put one Service Function into Chain
+ [Documentation] Put one Service Function Chain
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ Add Elements To URI From File ${SERVICE_CHAIN100_SFIDS_URI} ${SERVICE_CHAIN100_SFIDS_FILE}
+ ${elements}= Create List ids-abstract100 "order":3 service-function-type:ids
+ Check For Elements At URI ${SERVICE_CHAIN100_SFIDS_URI} ${elements}
+ Check For Elements At URI ${SERVICE_CHAIN100_URI} ${elements}
+ Check For Elements At URI ${SERVICE_CHAINS_URI} ${elements}
+
+Clean All Service Function Chains After Tests
+ [Documentation] Delete all Service Function Chains From Datastore After Tests
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Function Schedule Algorithm Types, Operates types from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_SCHED_TYPES_URI} /restconf/config/service-function-scheduler-type:service-function-scheduler-types/
+${SERVICE_SCHED_TYPES_FILE} ../../../variables/sfc/service-schedule-types.json
+${SERVICE_WSP_SCHED_TYPE_URI} /restconf/config/service-function-scheduler-type:service-function-scheduler-types/service-function-scheduler-type/service-function-scheduler-type:weighted-shortest-path
+${SERVICE_WSP_SCHED_TYPE_FILE} ../../../variables/sfc/service-wsp-schedule-type.json
+
+*** Test Cases ***
+Add Service Function Schedule Algorithm Types
+ [Documentation] Add Service Function Schedule Algorithm Types from JSON file
+ Add Elements To URI From File ${SERVICE_SCHED_TYPES_URI} ${SERVICE_SCHED_TYPES_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_SCHED_TYPES_FILE}
+ ${jsonbody} To Json ${body}
+ ${types} Get From Dictionary ${jsonbody} service-function-scheduler-types
+ ${resp} RequestsLibrary.Get session ${SERVICE_SCHED_TYPES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${type} Get From Dictionary ${result} service-function-scheduler-types
+ Lists Should be Equal ${type} ${types}
+
+Delete All Service Function Schedule Algorithm Types
+ [Documentation] Delete Service Function Schedule Algorithm Types
+ ${resp} RequestsLibrary.Get session ${SERVICE_SCHED_TYPES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ ${resp} RequestsLibrary.Get session ${SERVICE_SCHED_TYPES_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Get Ramdom Schedule Algorithm Type
+ [Documentation] Get Ramdom Schedule Algorithm Type
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_SCHED_TYPES_URI} ${SERVICE_SCHED_TYPES_FILE}
+ ${elements}= Create List random "enabled":false service-function-scheduler-type:random
+ Check For Elements At URI ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:random ${elements}
+ ${resp} RequestsLibrary.Get session ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:random
+
+Get A Non-existing Service Function Schedule Algorithm Type
+ [Documentation] Get A Non-existing Service Function Schedule Algorithm Type
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_SCHED_TYPES_URI} ${SERVICE_SCHED_TYPES_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:user-defined
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete Ramdom Schedule Algorithm Type
+ [Documentation] Delete Ramdom Schedule Algorithm Type
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_SCHED_TYPES_URI} ${SERVICE_SCHED_TYPES_FILE}
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:random
+ ${elements}= Create List random service-function-scheduler-type:random
+ Check For Elements Not At URI ${SERVICE_SCHED_TYPES_URI} ${elements}
+
+Delete A Non-existing Service Function Schedule Algorithm Type
+ [Documentation] Delete A Non existing Service Function Schedule Algorithm Type
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_SCHED_TYPES_URI} ${SERVICE_SCHED_TYPES_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_SCHED_TYPES_FILE}
+ ${jsonbody} To Json ${body}
+ ${types} Get From Dictionary ${jsonbody} service-function-scheduler-types
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:user-defined
+ ${resp} RequestsLibrary.Get session ${SERVICE_SCHED_TYPES_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${type} Get From Dictionary ${result} service-function-scheduler-types
+ Lists Should be Equal ${type} ${types}
+
+Put one Service Function Schedule Algorithm Type
+ [Documentation] Put one Service Function Schedule Algorithm Type
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_WSP_SCHED_TYPE_URI} ${SERVICE_WSP_SCHED_TYPE_FILE}
+ ${elements}= Create List weighted-shortest-path service-function-scheduler-type:weighted-shortest-path
+ Check For Elements At URI ${SERVICE_WSP_SCHED_TYPE_URI} ${elements}
+ Check For Elements At URI ${SERVICE_SCHED_TYPES_URI} ${elements}
+
+Clean Datastore After Tests
+ [Documentation] Delete All Service Function Schedule Algorithm Types From Datastore After Tests
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Function Paths, Operates paths from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_FUNCTION_PATHS_URI} /restconf/config/service-function-path:service-function-paths/
+${SERVICE_FUNCTION_PATHS_FILE} ../../../variables/sfc/service-function-paths.json
+${SERVICE_FUNCTION_PATH400_URI} /restconf/config/service-function-path:service-function-paths/service-function-path/SFC1-400
+${SERVICE_FUNCTION_PATH400_FILE} ../../../variables/sfc/sfp_sfc1_path400.json
+
+*** Test Cases ***
+Add Service Function Paths
+ [Documentation] Add Service Function Paths from JSON file
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTION_PATHS_FILE}
+ ${jsonbody} To Json ${body}
+ ${paths} Get From Dictionary ${jsonbody} service-function-paths
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${path} Get From Dictionary ${result} service-function-paths
+ Lists Should be Equal ${path} ${paths}
+
+Delete All Service Function Paths
+ [Documentation] Delete all Service Function Paths
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Get one Service Function Path
+ [Documentation] Get one Service Function Path
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
+ ${elements}= Create List SFC1-100 "service-chain-name":"SFC1"
+ Check For Elements At URI ${SERVICE_FUNCTION_PATHS_URI}service-function-path/SFC1-100 ${elements}
+
+Get A Non-existing Service Function Path
+ [Documentation] Get A Non-existing Service Function Path
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}service-function-path/non-existing-sfp
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete A Service Function Path
+ [Documentation] Delete A Service Function Path
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}service-function-path/SFC1-100
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}service-function-path/SFC1-100
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}service-function-path/SFC1-100
+ Should Be Equal As Strings ${resp.status_code} 404
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} SFC1-100
+
+Delete A Non-existing Empty Service Function Path
+ [Documentation] Delete A Non existing Service Function Path
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTION_PATHS_FILE}
+ ${jsonbody} To Json ${body}
+ ${paths} Get From Dictionary ${jsonbody} service-function-paths
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}service-function-path/non-existing-sfp
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${result} To JSON ${resp.content}
+ ${path} Get From Dictionary ${result} service-function-paths
+ Lists Should be Equal ${path} ${paths}
+
+Put one Service Function
+ [Documentation] Put one Service Function
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATH400_URI} ${SERVICE_FUNCTION_PATH400_FILE}
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATH400_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} SFC1-400
+ ${resp} RequestsLibrary.Get session ${SERVICE_FUNCTION_PATHS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} SFC1-400
+
+Clean All Service Function Paths After Tests
+ [Documentation] Delete all Service Function Paths From Datastore After Tests
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Functions, Operates functions from Restconf APIs.
+Suite Setup Create Session session http://${CONTROLLER}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Variables ../../../variables/Variables.py
+Resource ../../../libraries/Utils.txt
+
+*** Variables ***
+${SERVICE_FUNCTIONS_URI} /restconf/config/service-function:service-functions/
+${SERVICE_FUNCTIONS_FILE} ../../../variables/sfc/service-functions.json
+${SERVICE_FORWARDERS_URI} /restconf/config/service-function-forwarder:service-function-forwarders/
+${SERVICE_FORWARDERS_FILE} ../../../variables/sfc/service-function-forwarders.json
+${SERVICE_NODES_URI} /restconf/config/service-node:service-nodes/
+${SERVICE_NODES_FILE} ../../../variables/sfc/service-nodes.json
+${SERVICE_CHAINS_URI} /restconf/config/service-function-chain:service-function-chains/
+${SERVICE_CHAINS_FILE} ../../../variables/sfc/service-function-chains.json
+${SERVICE_FUNCTION_PATHS_URI} /restconf/config/service-function-path:service-function-paths/
+${SERVICE_FUNCTION_PATHS_FILE} ../../../variables/sfc/service-function-paths.json
+
+${SERVICE_SCHED_TYPES_URI} /restconf/config/service-function-scheduler-type:service-function-scheduler-types/
+${SERVICE_SCHED_TYPE_URI_BASE} ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:
+${SERVICE_RANDOM_SCHED_TYPE_URI} ${SERVICE_SCHED_TYPE_URI_BASE}random
+${SERVICE_RANDOM_SCHED_TYPE_FILE} ../../../variables/sfc/service-random-schedule-type.json
+${SERVICE_ROUNDROBIN_SCHED_TYPE_URI} ${SERVICE_SCHED_TYPE_URI_BASE}round-robin
+${SERVICE_ROUNDROBIN_SCHED_TYPE_FILE} ../../../variables/sfc/service-roundrobin-schedule-type.json
+${SERVICE_LOADBALANCE_SCHED_TYPE_URI} ${SERVICE_SCHED_TYPE_URI_BASE}load-balance
+${SERVICE_LOADBALANCE_SCHED_TYPE_FILE} ../../../variables/sfc/service-loadbalance-schedule-type.json
+${SERVICE_SHORTESTPATH_SCHED_TYPE_URI} ${SERVICE_SCHED_TYPE_URI_BASE}shortest-path
+${SERVICE_SHORTESTPATH_SCHED_TYPE_FILE} ../../../variables/sfc/service-loadbalance-schedule-type.json
+
+${RENDERED_SERVICE_PATHS_URI} /restconf/config/rendered-service-path:rendered-service-paths/
+${OPERATIONAL_RSPS_URI} /restconf/operational/rendered-service-path:rendered-service-paths/
+${OPERATIONS_CREATE_RSP_URI} /restconf/operations/rendered-service-path:create-rendered-path/
+${OPERATIONS_DELETE_RSP_URI} /restconf/operations/rendered-service-path:delete-rendered-path
+${CREATE_RSP1_INPUT} {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-1"}}
+${CREATE_RSP2_INPUT} {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-2"}}
+${CREATE_RSP3_INPUT} {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-3"}}
+${CREATE_RSP4_INPUT} {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-4"}}
+${CREATE_RSP5_INPUT} {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-5"}}
+${CREATE_RSP6_INPUT} {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-6"}}
+${CREATE_RSP_FAILURE_INPUT} {"input":{"parent-service-function-path":"SFC1-empty","name":"SFC1-empty-Path-1"}}
+${DELETE_RSP1_INPUT} {"input":{"name":"SFC1-100-Path-1"}}
+${DELETE_RSP2_INPUT} {"input":{"name":"SFC1-100-Path-2"}}
+${DELETE_RSP3_INPUT} {"input":{"name":"SFC1-100-Path-3"}}
+${DELETE_RSP4_INPUT} {"input":{"name":"SFC1-100-Path-4"}}
+${DELETE_RSP5_INPUT} {"input":{"name":"SFC1-100-Path-5"}}
+${DELETE_RSP6_INPUT} {"input":{"name":"SFC1-100-Path-6"}}
+
+*** Test Cases ***
+Basic Environment Setup Tests
+ [Documentation] Prepare Basic Test Environment
+ Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
+
+Create and Get Rendered Service Path
+ [Documentation] Create and Get Rendered Service Path Through RESTConf APIs
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${elements}= Create List SFC1-100-Path-1 "parent-service-function-path":"SFC1-100" "hop-number":0 "service-index":255 "hop-number":1 "service-index":254 "hop-number":2 "service-index":253
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
+
+Create Get Rendered Service Path Failure
+ [Documentation] Create Rendered Service Path Failure Cases
+ ${resp} RequestsLibrary.Post session ${OPERATIONS_CREATE_RSP_URI} data=${CREATE_RSP_FAILURE_INPUT} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 500
+
+Get Rendered Service Path By Name
+ [Documentation] Get Rendered Service Path By Name Through RESTConf APIs
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${elements}= Create List SFC1-100-Path-1 "parent-service-function-path":"SFC1-100" "hop-number":0 "service-index":255 "hop-number":1 "service-index":254 "hop-number":2 "service-index":253
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
+
+Get Non Existing Rendered Service Path
+ [Documentation] Get Non Existing Rendered Service Path Through RESTConf APIs
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/non-existing-rsp
+ Should Be Equal As Strings ${resp.status_code} 404
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} non-existing-rsp
+
+Delete one Rendered Service Path By Name
+ [Documentation] Delete One Rendered Service Path By Name Through RESTConf APIs
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} SFC1-100-Path-1
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
+ Should Be Equal As Strings ${resp.status_code} 404
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} SFC1-100-Path-1
+
+Delete Non Existing Rendered Service Path By Name
+ [Documentation] Delete One Rendered Service Path By Name Through RESTConf APIs
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.content} SFC1-100-Path-1
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP2_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} {"rendered-service-paths":{}}
+
+Get Rendered Service Path Hop
+ [Documentation] Get Rendered Service Path By Name Through RESTConf APIs
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${elements}= Create List "hop-number":0 "service-index":255 "service-function-name":"dpi
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/ ${elements}
+ ${elements}= Create List "hop-number":1 "service-index":254 "service-function-name":"napt44
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/ ${elements}
+ ${elements}= Create List "hop-number":2 "service-index":253 "service-function-name":"firewall
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/ ${elements}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/3/
+ Should Be Equal As Strings ${resp.status_code} 404
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+
+Generate RSPs with Random Schedule Algorithm type
+ [Documentation] Generate RSPs with Random Schedule Algorithm type Through RESTConf APIs
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_RANDOM_SCHED_TYPE_URI} ${SERVICE_RANDOM_SCHED_TYPE_FILE}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${elements}= Create List "hop-number":0 "service-index":255 "service-function-name":"dpi
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/ ${elements}
+ ${elements}= Create List "hop-number":1 "service-index":254 "service-function-name":"napt44
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/ ${elements}
+ ${elements}= Create List "hop-number":2 "service-index":253 "service-function-name":"firewall
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/ ${elements}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP2_INPUT}
+ ${elements}= Create List "hop-number":0 "service-index":255 "service-function-name":"dpi
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/0/ ${elements}
+ ${elements}= Create List "hop-number":1 "service-index":254 "service-function-name":"napt44
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/1/ ${elements}
+ ${elements}= Create List "hop-number":2 "service-index":253 "service-function-name":"firewall
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/2/ ${elements}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP2_INPUT}
+
+Generate RSPs with Round Robin Schedule Algorithm type
+ [Documentation] Generate RSPs with Round Robin Schedule Algorithm type
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_ROUNDROBIN_SCHED_TYPE_URI} ${SERVICE_ROUNDROBIN_SCHED_TYPE_FILE}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP2_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP3_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP4_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP5_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP6_INPUT}
+ ${path1_hop0} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/
+ ${path1_hop1} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/
+ ${path1_hop2} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/
+ ${path2_hop0} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/0/
+ ${path2_hop1} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/1/
+ ${path2_hop2} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/2/
+ ${path3_hop0} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-3/rendered-service-path-hop/0/
+ ${path3_hop1} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-3/rendered-service-path-hop/1/
+ ${path3_hop2} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-3/rendered-service-path-hop/2/
+ ${path4_hop0} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-4/rendered-service-path-hop/0/
+ ${path4_hop1} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-4/rendered-service-path-hop/1/
+ ${path4_hop2} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-4/rendered-service-path-hop/2/
+ ${path5_hop0} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-5/rendered-service-path-hop/0/
+ ${path5_hop1} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-5/rendered-service-path-hop/1/
+ ${path5_hop2} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-5/rendered-service-path-hop/2/
+ ${path6_hop0} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-6/rendered-service-path-hop/0/
+ ${path6_hop1} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-6/rendered-service-path-hop/1/
+ ${path6_hop2} Get JSON Elements From URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-6/rendered-service-path-hop/2/
+ Should Be Equal ${path1_hop0} ${path4_hop0}
+ Should Not Be Equal ${path1_hop0} ${path2_hop0}
+ Should Be Equal ${path1_hop1} ${path4_hop1}
+ Should Not Be Equal ${path1_hop1} ${path2_hop1}
+ Should Be Equal ${path1_hop2} ${path4_hop2}
+ Should Not Be Equal ${path1_hop2} ${path2_hop2}
+ Should Be Equal ${path2_hop0} ${path5_hop0}
+ Should Not Be Equal ${path2_hop0} ${path3_hop0}
+ Should Be Equal ${path2_hop1} ${path5_hop1}
+ Should Not Be Equal ${path2_hop1} ${path3_hop1}
+ Should Be Equal ${path2_hop2} ${path5_hop2}
+ Should Not Be Equal ${path2_hop2} ${path3_hop2}
+ Should Be Equal ${path3_hop0} ${path6_hop0}
+ Should Not Be Equal ${path3_hop0} ${path1_hop0}
+ Should Be Equal ${path3_hop1} ${path6_hop1}
+ Should Not Be Equal ${path3_hop1} ${path1_hop1}
+ Should Be Equal ${path3_hop2} ${path6_hop2}
+ Should Not Be Equal ${path3_hop2} ${path1_hop2}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP2_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP3_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP4_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP5_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP6_INPUT}
+
+Generate RSPs with Shortest Path Schedule Algorithm type
+ [Documentation] Generate RSPs with Shortest Path Schedule Algorithm type Through RESTConf APIs
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Add Elements To URI From File ${SERVICE_SHORTESTPATH_SCHED_TYPE_URI} ${SERVICE_SHORTESTPATH_SCHED_TYPE_FILE}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${elements}= Create List "hop-number":0 "service-index":255 "service-function-name":"dpi
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/ ${elements}
+ ${elements}= Create List "hop-number":1 "service-index":254 "service-function-name":"napt44
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/ ${elements}
+ ${elements}= Create List "hop-number":2 "service-index":253 "service-function-name":"firewall
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/ ${elements}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${fwd_hop1} Extract Value From Content ${resp.content} service-function-forwarder
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${fwd_hop2} Extract Value From Content ${resp.content} service-function-forwarder
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${fwd_hop3} Extract Value From Content ${resp.content} service-function-forwarder
+ Should Be Equal ${fwd_hop1} ${fwd_hop2}
+ Should Be Equal ${fwd_hop2} ${fwd_hop3}
+ Post Elements To URI As JSON ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP2_INPUT}
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/0/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${fwd_hop1} Extract Value From Content ${resp.content} service-function-forwarder
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/1/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${fwd_hop2} Extract Value From Content ${resp.content} service-function-forwarder
+ ${resp} RequestsLibrary.Get session ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/2/
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${fwd_hop3} Extract Value From Content ${resp.content} service-function-forwarder
+ Should Be Equal ${fwd_hop1} ${fwd_hop2}
+ Should Be Equal ${fwd_hop2} ${fwd_hop3}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+ Post Elements To URI As JSON ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP2_INPUT}
+
+Clean Datastore After Tests
+ [Documentation] Clean All Items In Datastore After Tests
+ Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Remove All Elements At URI ${SERVICE_NODES_URI}
+ Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Remove All Elements At URI ${SERVICE_SCHED_TYPES_URI}
+ Remove All Elements At URI ${SERVICE_FUNCTION_PATHS_URI}
+
+*** Keywords ***
+Post Elements To URI As JSON
+ [Arguments] ${uri} ${data}
+ ${resp} RequestsLibrary.Post session ${uri} data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get JSON Elements From URI
+ [Arguments] ${uri}
+ ${resp} RequestsLibrary.Get session ${uri}
+ ${value} To Json ${resp.content}
+ [Return] ${value}
--- /dev/null
+{
+ "service-function-chains": {
+ "service-function-chain": [
+ {
+ "name": "SFC1",
+ "sfc-service-function": [
+ {
+ "name": "dpi-abstract1",
+ "type": "service-function-type:dpi",
+ "order" : 0
+ },
+ {
+ "name": "napt44-abstract1",
+ "type": "service-function-type:napt44",
+ "order" : 1
+ },
+ {
+ "name": "firewall-abstract1",
+ "type": "service-function-type:firewall",
+ "order" : 2
+ }
+ ]
+ },
+ {
+ "name": "SFC2",
+ "sfc-service-function": [
+ {
+ "name": "firewall-abstract2",
+ "type": "service-function-type:firewall",
+ "order" : 0
+ },
+ {
+ "name": "napt44-abstract2",
+ "type": "service-function-type:napt44",
+ "order" : 1
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "service-function-forwarders": {
+ "service-function-forwarder": [
+ {
+ "name": "SFF-bootstrap",
+ "service-node": "OVSDB1",
+ "rest-uri": "http://localhost:5000",
+ "sff-data-plane-locator": [
+ {
+ "name": "eth0",
+ "data-plane-locator": {
+ "port": 5000,
+ "ip": "192.168.1.1",
+ "transport": "service-locator:vxlan-gpe"
+ }
+ }
+ ],
+ "service-function-dictionary": [
+ {
+ "sff-sf-data-plane-locator": {
+ "port": 5000,
+ "ip": "10.1.1.1"
+ },
+ "name": "SF1",
+ "type": "service-function-type:dpi"
+ },
+ {
+ "sff-sf-data-plane-locator": {
+ "port": 5000,
+ "ip": "10.1.1.2"
+ },
+ "name": "SF2",
+ "type": "service-function-type:firewall"
+ }
+ ],
+ "connected-sff-dictionary": [
+ {
+ "sff-sff-data-plane-locator": {
+ "port": 5000,
+ "ip": "192.168.1.2"
+ },
+ "name": "br-int-ovs-2"
+ }
+ ]
+ },
+ {
+ "name": "br-int-ovs-2",
+ "service-node": "OVSDB2",
+ "rest-uri": "http://localhost:5000",
+ "sff-data-plane-locator": [
+ {
+ "name": "eth0",
+ "data-plane-locator": {
+ "port": 5000,
+ "ip": "192.168.1.2",
+ "transport": "service-locator:vxlan-gpe"
+ }
+ }
+ ],
+ "service-function-dictionary": [
+ {
+ "sff-sf-data-plane-locator": {
+ "port": 5000,
+ "ip": "10.1.1.5"
+ },
+ "name": "SF5",
+ "type": "service-function-type:dpi"
+ },
+ {
+ "sff-sf-data-plane-locator": {
+ "port": 5000,
+ "ip": "10.1.1.6"
+ },
+ "name": "SF6",
+ "type": "service-function-type:napt44"
+ }
+ ],
+ "connected-sff-dictionary": [
+ {
+ "sff-sff-data-plane-locator": {
+ "port": 5000,
+ "ip": "10.1.1.2"
+ },
+ "name": "SFF-bootstrap"
+ }
+ ]
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-function-paths": {
+ "service-function-path": [
+ {
+ "name": "SFC1-100",
+ "service-chain-name": "SFC1"
+ },
+ {
+ "name": "SFC1-200",
+ "service-chain-name": "SFC1"
+ },
+ {
+ "name": "SFC1-300",
+ "service-chain-name": "SFC1"
+ },
+ {
+ "name": "SFC2-100",
+ "service-chain-name": "SFC2"
+ },
+ {
+ "name": "SFC2-200",
+ "service-chain-name": "SFC2"
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-functions": {
+ "service-function": [
+ {
+ "rest-uri": "http://localhost:10002",
+ "ip-mgmt-address": "10.3.1.103",
+ "sf-data-plane-locator": [
+ {
+ "name": "preferred",
+ "port": 10002,
+ "ip": "10.3.1.103",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "napt44-103-2",
+ "type": "service-function-type:napt44",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10001",
+ "ip-mgmt-address": "10.3.1.103",
+ "sf-data-plane-locator": [
+ {
+ "name": "master",
+ "port": 10001,
+ "ip": "10.3.1.103",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "napt44-103-1",
+ "type": "service-function-type:napt44",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10002",
+ "ip-mgmt-address": "10.3.1.102",
+ "sf-data-plane-locator": [
+ {
+ "name": "1",
+ "port": 10002,
+ "ip": "10.3.1.102",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "dpi-102-2",
+ "type": "service-function-type:dpi",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10002",
+ "ip-mgmt-address": "10.3.1.101",
+ "sf-data-plane-locator": [
+ {
+ "name": "2",
+ "port": 10002,
+ "ip": "10.3.1.101",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "firewall-101-2",
+ "type": "service-function-type:firewall",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10002",
+ "ip-mgmt-address": "10.3.1.104",
+ "sf-data-plane-locator": [
+ {
+ "name": "3",
+ "port": 10020,
+ "ip": "10.3.1.104",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "napt44-104",
+ "type": "service-function-type:napt44",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10001",
+ "ip-mgmt-address": "10.3.1.102",
+ "sf-data-plane-locator": [
+ {
+ "name": "4",
+ "port": 10001,
+ "ip": "10.3.1.102",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "dpi-102-1",
+ "type": "service-function-type:dpi",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10001",
+ "ip-mgmt-address": "10.3.1.104",
+ "sf-data-plane-locator": [
+ {
+ "name": "my-locator",
+ "port": 10001,
+ "ip": "10.3.1.104",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "firewall-104",
+ "type": "service-function-type:firewall",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10003",
+ "ip-mgmt-address": "10.3.1.102",
+ "sf-data-plane-locator": [
+ {
+ "name": "101",
+ "port": 10003,
+ "ip": "10.3.1.102",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "dpi-102-3",
+ "type": "service-function-type:dpi",
+ "nsh-aware": true
+ },
+ {
+ "rest-uri": "http://localhost:10001",
+ "ip-mgmt-address": "10.3.1.101",
+ "sf-data-plane-locator": [
+ {
+ "name": "007",
+ "port": 10001,
+ "ip": "10.3.1.101",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "name": "firewall-101-1",
+ "type": "service-function-type:firewall",
+ "nsh-aware": true
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-function-scheduler-type": [
+ {
+ "type": "service-function-scheduler-type:load-balance",
+ "enabled": true,
+ "name": "load-balance"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-nodes": {
+ "service-node": [
+ {
+ "name": "node-101",
+ "service-function": [
+ "firewall-101-2",
+ "firewall-101-1"
+ ],
+ "ip-mgmt-address": "10.3.1.101"
+ },
+ {
+ "name": "node-102",
+ "service-function": [
+ "dpi-102-1",
+ "dpi-102-2",
+ "dpi-102-3"
+ ],
+ "ip-mgmt-address": "10.3.1.102"
+ },
+ {
+ "name": "node-103",
+ "service-function": [
+ "napt44-103-1",
+ "napt44-103-2"
+ ],
+ "ip-mgmt-address": "10.3.1.103"
+ },
+ {
+ "name": "node-104",
+ "service-function": [
+ "firewall-104",
+ "napt44-104"
+ ],
+ "ip-mgmt-address": "10.3.1.104"
+ }
+ ]
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "service-function-scheduler-type": [
+ {
+ "type": "service-function-scheduler-type:random",
+ "enabled": true,
+ "name": "random"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-function-scheduler-type": [
+ {
+ "type": "service-function-scheduler-type:round-robin",
+ "enabled": true,
+ "name": "round-robin"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-function-scheduler-types": {
+ "service-function-scheduler-type": [
+ {
+ "name": "random",
+ "type": "service-function-scheduler-type:random",
+ "enabled": false
+ },
+ {
+ "name": "round-robin",
+ "type": "service-function-scheduler-type:round-robin",
+ "enabled": true
+ },
+ {
+ "name": "load-balance",
+ "type": "service-function-scheduler-type:load-balance",
+ "enabled": false
+ },
+ {
+ "name": "shortest-path",
+ "type": "service-function-scheduler-type:shortest-path",
+ "enabled": false
+ }
+ ]
+ }
+}
+
--- /dev/null
+{
+ "service-function-scheduler-type": [
+ {
+ "type": "service-function-scheduler-type:shortest-path",
+ "enabled": true,
+ "name": "shortest-path"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-function-scheduler-type": [
+ {
+ "type": "service-function-scheduler-type:weighted-shortest-path",
+ "enabled": false,
+ "name": "weighted-shortest-path"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-function": [
+ {
+ "name": "dpi-102-100",
+ "type": "service-function-type:dpi",
+ "nsh-aware": true,
+ "sf-data-plane-locator": [
+ {
+ "name": "dpl-100",
+ "port": 10100,
+ "ip": "10.3.1.102",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ],
+ "ip-mgmt-address": "10.3.1.102",
+ "rest-uri": "http://localhost:10100"
+ }
+ ]
+}
--- /dev/null
+{
+ "sf-data-plane-locator": [
+ {
+ "name": "dpl-101",
+ "port": 10101,
+ "ip": "10.3.1.102",
+ "service-function-forwarder": "SFF-bootstrap"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-function-chain": [
+ {
+ "name": "SFC100",
+ "sfc-service-function": [
+ {
+ "name": "dpi-abstract100",
+ "order": 0,
+ "type": "service-function-type:firewall"
+ },
+ {
+ "name": "napt44-abstract100",
+ "order": 1,
+ "type": "service-function-type:dpi"
+ },
+ {
+ "name": "firewall-abstract100",
+ "order": 2,
+ "type": "service-function-type:napt44"
+ }
+ ]
+ }
+ ]
+}
--- /dev/null
+{
+ "sfc-service-function": [
+ {
+ "name": "ids-abstract100",
+ "order": 3,
+ "type": "service-function-type:ids"
+ }
+ ]
+}
--- /dev/null
+{
+ "sff-sff-data-plane-locator": {
+ "ip": "10.1.1.1",
+ "port": 6000
+ }
+}
--- /dev/null
+{
+ "connected-sff-dictionary": [
+ {
+ "name": "SFF100",
+ "sff-interfaces": [
+ {
+ "sff-interface": "dpl-100"
+ }
+ ],
+ "sff-sff-data-plane-locator": {
+ "port": 6000,
+ "ip": "10.1.1.2"
+ },
+ "failmode": "service-function-forwarder:open"
+ }
+ ]
+}
--- /dev/null
+{
+ "sff-data-plane-locator": [
+ {
+ "name": "dpl-101",
+ "data-plane-locator": {
+ "ip": "192.168.1.1",
+ "port": 6101,
+ "transport": "service-locator:vxlan-gpe"
+ }
+ }
+ ]
+}
--- /dev/null
+{
+ "data-plane-locator": {
+ "ip": "192.168.1.1",
+ "port": 5000,
+ "transport": "service-locator:vxlan-gpe"
+ }
+}
--- /dev/null
+{
+ "service-function-forwarder": [
+ {
+ "name": "ovs-100",
+ "service-node": "OVSDB2",
+ "rest-uri": "http://localhost:6000",
+ "sff-data-plane-locator": [
+ {
+ "name": "eth0",
+ "data-plane-locator": {
+ "port": 6000,
+ "ip": "192.168.1.2",
+ "transport": "service-locator:vxlan-gpe"
+ }
+ }
+ ],
+ "service-function-dictionary": [
+ {
+ "sff-sf-data-plane-locator": {
+ "port": 6000,
+ "ip": "10.1.1.7"
+ },
+ "name": "SF7",
+ "type": "service-function-type:dpi"
+ }
+ ]
+ }
+ ]
+}
--- /dev/null
+{
+ "sff-sf-data-plane-locator": {
+ "ip": "10.1.1.1",
+ "port": 6000
+ }
+}
--- /dev/null
+{
+ "service-function-dictionary": [
+ {
+ "name": "SF100",
+ "sff-sf-data-plane-locator": {
+ "ip": "10.1.1.1",
+ "port": 5100
+ },
+ "type": "service-function-type:napt44"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-function-path": [
+ {
+ "name": "SFC1-400",
+ "service-chain-name": "SFC1"
+ }
+ ]
+}
--- /dev/null
+{
+ "service-node": [
+ {
+ "name": "node-100",
+ "ip-mgmt-address": "10.3.1.100",
+ "service-function": [
+ "dpi-100-1",
+ "firewall-102-1"
+ ]
+ }
+ ]
+}