Add basic test case for SFC, mainly Restconf Operations
authorJohnson Li <johnson.li@intel.com>
Thu, 21 May 2015 05:08:13 +0000 (13:08 +0800)
committerJohnson Li <johnson.li@intel.com>
Thu, 21 May 2015 05:08:13 +0000 (13:08 +0800)
Add Some integration test cases for the Service Function
Chain Project. These cases mainly verify the Restconf
APIs works well or not.

Change Log:
Manually rebase, fix conflicts in Utils.txt
Add new Keywords to Utils.txt and use these words
Rename *.txt to *.robot and remove __init__.txt
Use Keywords from Library Utils.txt
Use Public RequestsLibrary to send requests
Add Test Cases for SFP and RSP

Signed-off-by: Johnson Li <johnson.li@intel.com>
32 files changed:
test/csit/libraries/Utils.txt
test/csit/suites/sfc/SFC_Basic/010__sfc_service_functions.robot [new file with mode: 0644]
test/csit/suites/sfc/SFC_Basic/020__sfc_service_forwarders.robot [new file with mode: 0644]
test/csit/suites/sfc/SFC_Basic/030__sfc_service_nodes.robot [new file with mode: 0644]
test/csit/suites/sfc/SFC_Basic/040__sfc_service_chains.robot [new file with mode: 0644]
test/csit/suites/sfc/SFC_Basic/050__sfc_service_schedule_types.robot [new file with mode: 0644]
test/csit/suites/sfc/SFC_Basic/060__sfc_service_paths.robot [new file with mode: 0644]
test/csit/suites/sfc/SFC_Basic/070__sfc_rendered_service_paths.robot [new file with mode: 0644]
test/csit/variables/sfc/service-function-chains.json [new file with mode: 0644]
test/csit/variables/sfc/service-function-forwarders.json [new file with mode: 0644]
test/csit/variables/sfc/service-function-paths.json [new file with mode: 0644]
test/csit/variables/sfc/service-functions.json [new file with mode: 0644]
test/csit/variables/sfc/service-loadbalance-schedule-type.json [new file with mode: 0644]
test/csit/variables/sfc/service-nodes.json [new file with mode: 0644]
test/csit/variables/sfc/service-random-schedule-type.json [new file with mode: 0644]
test/csit/variables/sfc/service-roundrobin-schedule-type.json [new file with mode: 0644]
test/csit/variables/sfc/service-schedule-types.json [new file with mode: 0644]
test/csit/variables/sfc/service-shortestpath-schedule-type.json [new file with mode: 0644]
test/csit/variables/sfc/service-wsp-schedule-type.json [new file with mode: 0644]
test/csit/variables/sfc/sf_dpi_102_100.json [new file with mode: 0644]
test/csit/variables/sfc/sf_dpl_101.json [new file with mode: 0644]
test/csit/variables/sfc/sfc_chain_100.json [new file with mode: 0644]
test/csit/variables/sfc/sfc_chain_100_sfids.json [new file with mode: 0644]
test/csit/variables/sfc/sff_csd_locator.json [new file with mode: 0644]
test/csit/variables/sfc/sff_csd_sff100.json [new file with mode: 0644]
test/csit/variables/sfc/sff_dpl_101.json [new file with mode: 0644]
test/csit/variables/sfc/sff_dpl_locator.json [new file with mode: 0644]
test/csit/variables/sfc/sff_ovs_100.json [new file with mode: 0644]
test/csit/variables/sfc/sff_sfd_locator.json [new file with mode: 0644]
test/csit/variables/sfc/sff_sfd_sf100.json [new file with mode: 0644]
test/csit/variables/sfc/sfp_sfc1_path400.json [new file with mode: 0644]
test/csit/variables/sfc/sn_node_100.json [new file with mode: 0644]

index 204330f4a1644f1cb77f87e55db2e1dffb5afea8..38f284c334c3ced0e6d84eccf3b12055a4d95e2a 100644 (file)
@@ -184,3 +184,14 @@ Concatenate the String
     ${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
diff --git a/test/csit/suites/sfc/SFC_Basic/010__sfc_service_functions.robot b/test/csit/suites/sfc/SFC_Basic/010__sfc_service_functions.robot
new file mode 100644 (file)
index 0000000..08f9304
--- /dev/null
@@ -0,0 +1,125 @@
+*** 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}
diff --git a/test/csit/suites/sfc/SFC_Basic/020__sfc_service_forwarders.robot b/test/csit/suites/sfc/SFC_Basic/020__sfc_service_forwarders.robot
new file mode 100644 (file)
index 0000000..abf501a
--- /dev/null
@@ -0,0 +1,285 @@
+*** 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}
diff --git a/test/csit/suites/sfc/SFC_Basic/030__sfc_service_nodes.robot b/test/csit/suites/sfc/SFC_Basic/030__sfc_service_nodes.robot
new file mode 100644 (file)
index 0000000..1de5fb8
--- /dev/null
@@ -0,0 +1,87 @@
+*** 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}
diff --git a/test/csit/suites/sfc/SFC_Basic/040__sfc_service_chains.robot b/test/csit/suites/sfc/SFC_Basic/040__sfc_service_chains.robot
new file mode 100644 (file)
index 0000000..43aaf75
--- /dev/null
@@ -0,0 +1,133 @@
+*** 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}
diff --git a/test/csit/suites/sfc/SFC_Basic/050__sfc_service_schedule_types.robot b/test/csit/suites/sfc/SFC_Basic/050__sfc_service_schedule_types.robot
new file mode 100644 (file)
index 0000000..7991e26
--- /dev/null
@@ -0,0 +1,86 @@
+*** 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}
diff --git a/test/csit/suites/sfc/SFC_Basic/060__sfc_service_paths.robot b/test/csit/suites/sfc/SFC_Basic/060__sfc_service_paths.robot
new file mode 100644 (file)
index 0000000..dc330f9
--- /dev/null
@@ -0,0 +1,93 @@
+*** 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}
diff --git a/test/csit/suites/sfc/SFC_Basic/070__sfc_rendered_service_paths.robot b/test/csit/suites/sfc/SFC_Basic/070__sfc_rendered_service_paths.robot
new file mode 100644 (file)
index 0000000..bf55f8f
--- /dev/null
@@ -0,0 +1,261 @@
+*** 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}
diff --git a/test/csit/variables/sfc/service-function-chains.json b/test/csit/variables/sfc/service-function-chains.json
new file mode 100644 (file)
index 0000000..1274039
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "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
diff --git a/test/csit/variables/sfc/service-function-forwarders.json b/test/csit/variables/sfc/service-function-forwarders.json
new file mode 100644 (file)
index 0000000..a1758dc
--- /dev/null
@@ -0,0 +1,90 @@
+{
+  "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"
+          }
+        ]
+      }
+    ]
+  }
+}
diff --git a/test/csit/variables/sfc/service-function-paths.json b/test/csit/variables/sfc/service-function-paths.json
new file mode 100644 (file)
index 0000000..4b1eadf
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "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"
+      }
+    ]
+  }
+}
diff --git a/test/csit/variables/sfc/service-functions.json b/test/csit/variables/sfc/service-functions.json
new file mode 100644 (file)
index 0000000..8d42773
--- /dev/null
@@ -0,0 +1,141 @@
+{
+  "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
+      }
+    ]
+  }
+}
diff --git a/test/csit/variables/sfc/service-loadbalance-schedule-type.json b/test/csit/variables/sfc/service-loadbalance-schedule-type.json
new file mode 100644 (file)
index 0000000..e5780f3
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "service-function-scheduler-type": [
+        {
+            "type": "service-function-scheduler-type:load-balance",
+            "enabled": true,
+            "name": "load-balance"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/service-nodes.json b/test/csit/variables/sfc/service-nodes.json
new file mode 100644 (file)
index 0000000..36787c1
--- /dev/null
@@ -0,0 +1,39 @@
+{
+    "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
diff --git a/test/csit/variables/sfc/service-random-schedule-type.json b/test/csit/variables/sfc/service-random-schedule-type.json
new file mode 100644 (file)
index 0000000..63b413c
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "service-function-scheduler-type": [
+        {
+            "type": "service-function-scheduler-type:random",
+            "enabled": true,
+            "name": "random"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/service-roundrobin-schedule-type.json b/test/csit/variables/sfc/service-roundrobin-schedule-type.json
new file mode 100644 (file)
index 0000000..c716838
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "service-function-scheduler-type": [
+        {
+            "type": "service-function-scheduler-type:round-robin",
+            "enabled": true,
+            "name": "round-robin"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/service-schedule-types.json b/test/csit/variables/sfc/service-schedule-types.json
new file mode 100644 (file)
index 0000000..44aacd4
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "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
+      }
+    ]
+  }
+}
+
diff --git a/test/csit/variables/sfc/service-shortestpath-schedule-type.json b/test/csit/variables/sfc/service-shortestpath-schedule-type.json
new file mode 100644 (file)
index 0000000..5655917
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "service-function-scheduler-type": [
+        {
+            "type": "service-function-scheduler-type:shortest-path",
+            "enabled": true,
+            "name": "shortest-path"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/service-wsp-schedule-type.json b/test/csit/variables/sfc/service-wsp-schedule-type.json
new file mode 100644 (file)
index 0000000..85adbd0
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "service-function-scheduler-type": [
+        {
+            "type": "service-function-scheduler-type:weighted-shortest-path",
+            "enabled": false,
+            "name": "weighted-shortest-path"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sf_dpi_102_100.json b/test/csit/variables/sfc/sf_dpi_102_100.json
new file mode 100644 (file)
index 0000000..8acbc95
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "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"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sf_dpl_101.json b/test/csit/variables/sfc/sf_dpl_101.json
new file mode 100644 (file)
index 0000000..fb1ed3e
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "sf-data-plane-locator": [
+        {
+            "name": "dpl-101",
+            "port": 10101,
+            "ip": "10.3.1.102",
+            "service-function-forwarder": "SFF-bootstrap"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sfc_chain_100.json b/test/csit/variables/sfc/sfc_chain_100.json
new file mode 100644 (file)
index 0000000..f8702a1
--- /dev/null
@@ -0,0 +1,24 @@
+{
+    "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"
+                }
+            ]
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sfc_chain_100_sfids.json b/test/csit/variables/sfc/sfc_chain_100_sfids.json
new file mode 100644 (file)
index 0000000..d6d6025
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "sfc-service-function": [
+        {
+            "name": "ids-abstract100",
+            "order": 3,
+            "type": "service-function-type:ids"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sff_csd_locator.json b/test/csit/variables/sfc/sff_csd_locator.json
new file mode 100644 (file)
index 0000000..7ac28e7
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "sff-sff-data-plane-locator": {
+        "ip": "10.1.1.1",
+        "port": 6000
+    }
+}
diff --git a/test/csit/variables/sfc/sff_csd_sff100.json b/test/csit/variables/sfc/sff_csd_sff100.json
new file mode 100644 (file)
index 0000000..e2715bb
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "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"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sff_dpl_101.json b/test/csit/variables/sfc/sff_dpl_101.json
new file mode 100644 (file)
index 0000000..0fd51ef
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "sff-data-plane-locator": [
+        {
+            "name": "dpl-101",
+            "data-plane-locator": {
+                "ip": "192.168.1.1",
+                "port": 6101,
+                "transport": "service-locator:vxlan-gpe"
+            }
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sff_dpl_locator.json b/test/csit/variables/sfc/sff_dpl_locator.json
new file mode 100644 (file)
index 0000000..3da405b
--- /dev/null
@@ -0,0 +1,7 @@
+{
+    "data-plane-locator": {
+        "ip": "192.168.1.1",
+        "port": 5000,
+        "transport": "service-locator:vxlan-gpe"
+    }
+}
diff --git a/test/csit/variables/sfc/sff_ovs_100.json b/test/csit/variables/sfc/sff_ovs_100.json
new file mode 100644 (file)
index 0000000..b9fcad6
--- /dev/null
@@ -0,0 +1,29 @@
+{
+    "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"
+          }
+        ]
+      }
+    ]
+}
diff --git a/test/csit/variables/sfc/sff_sfd_locator.json b/test/csit/variables/sfc/sff_sfd_locator.json
new file mode 100644 (file)
index 0000000..50dc19d
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "sff-sf-data-plane-locator": {
+        "ip": "10.1.1.1",
+        "port": 6000
+    }
+}
diff --git a/test/csit/variables/sfc/sff_sfd_sf100.json b/test/csit/variables/sfc/sff_sfd_sf100.json
new file mode 100644 (file)
index 0000000..7449c96
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "service-function-dictionary": [
+        {
+            "name": "SF100",
+            "sff-sf-data-plane-locator": {
+                "ip": "10.1.1.1",
+                "port": 5100
+            },
+            "type": "service-function-type:napt44"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sfp_sfc1_path400.json b/test/csit/variables/sfc/sfp_sfc1_path400.json
new file mode 100644 (file)
index 0000000..9a17f8e
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "service-function-path": [
+        {
+            "name": "SFC1-400",
+            "service-chain-name": "SFC1"
+        }
+    ]
+}
diff --git a/test/csit/variables/sfc/sn_node_100.json b/test/csit/variables/sfc/sn_node_100.json
new file mode 100644 (file)
index 0000000..2562724
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "service-node": [
+        {
+            "name": "node-100",
+            "ip-mgmt-address": "10.3.1.100",
+            "service-function": [
+                "dpi-100-1",
+                "firewall-102-1"
+            ]
+        }
+    ]
+}