.vagrant
.tox/
*.egg-info/
+.*.marks
--- /dev/null
+*** Settings ***
+Documentation Test suite for symmetric RSP using bidirectional field of SF type.
+Suite Setup Init Suite
+Suite Teardown End Suite
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library HttpLibrary.HTTP
+Resource ../../../variables/sfc/Variables.robot
+Resource ../../../libraries/Utils.robot
+Resource ../../../libraries/TemplatedRequests.robot
+
+*** Variables ***
+${VERSION_DIR} master
+${SUITE_DIR} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/symmetricRSP
+${SERVICE_NODES_FILE} ${SUITE_DIR}/service_nodes.json
+${SERVICE_FUNCTION_TYPES_FILE} ${SUITE_DIR}/service_function_types.json
+${SERVICE_FUNCTIONS_FILE} ${SUITE_DIR}/service_functions.json
+${SERVICE_FORWARDERS_FILE} ${SUITE_DIR}/service_function_forwarders.json
+${SERVICE_CHAINS_FILE} ${SUITE_DIR}/service_function_chains.json
+${SERVICE_FUNCTION_PATHS_FILE} ${SUITE_DIR}/service_function_paths.json
+${CREATE_RSP1_INPUT} {"input":{"parent-service-function-path":"SFP1","name":"RSP1"}}
+${CREATE_RSP2_INPUT} {"input":{"parent-service-function-path":"SFP2","name":"RSP2"}}
+${CREATE_RSP3_INPUT} {"input":{"parent-service-function-path":"SFP3","name":"RSP3"}}
+${DELETE_RSP1_INPUT} {"input":{"name":"RSP1"}}
+${DELETE_RSP2_INPUT} {"input":{"name":"RSP2"}}
+${DELETE_RSP3_INPUT} {"input":{"name":"RSP3"}}
+
+*** Test Cases ***
+Create symmetric RSP with bidirectional flag set true in one SF type
+ Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${elements}= Create List RSP1 RSP1-Reverse
+ Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
+ [Teardown] Post Elements To URI ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+
+Create non-symmetric RSP with bidirectional flag set false or not set in all SFs
+ Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP2_INPUT}
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Log ${resp.content}
+ Should Contain ${resp.content} RSP2
+ Should Not Contain ${resp.content} RSP2-Reverse
+ [Teardown] Post Elements To URI ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP2_INPUT}
+
+Create non-symmetric RSP overriding bidirectional flag with SFP symmetric flag
+ Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP3_INPUT}
+ # Note that SFP3 uses SFC1, which contains a dpi-bidirectional, but it's
+ # overriden with symmetric flag in SFP set to false
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Log ${resp.content}
+ Should Contain ${resp.content} RSP3
+ Should Not Contain ${resp.content} RSP3-Reverse
+ [Teardown] Post Elements To URI ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP3_INPUT}
+
+*** Keywords ***
+Init Suite
+ [Documentation] Create session and initialize ODL version specific variables
+ Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+ log ${ODL_STREAM}
+ Basic Environment Setup
+
+Basic Environment Setup
+ [Documentation] Provision all elements except RSPs
+ Clean Datastore
+ 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_FUNCTION_TYPES_URI} ${SERVICE_FUNCTION_TYPES_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}
+
+End Suite
+ Clean Datastore
+ Delete All Sessions
+
+Clean Datastore
+ [Documentation] Remove All Elements
+ Remove All Elements If Exist ${SERVICE_FUNCTIONS_URI}
+ Remove All Elements If Exist ${SERVICE_FORWARDERS_URI}
+ Remove All Elements If Exist ${SERVICE_NODES_URI}
+ Remove All Elements If Exist ${SERVICE_CHAINS_URI}
+ Remove All Elements If Exist ${SERVICE_FUNCTION_PATHS_URI}
integration/test/csit/suites/sfc/SFC_Basic/060__sfc_service_paths.robot
integration/test/csit/suites/sfc/SFC_Basic/070__sfc_rendered_service_paths.robot
integration/test/csit/suites/sfc/SFC_Basic/080__sfc_simple_clustering.robot
+integration/test/csit/suites/sfc/SFC_Basic/130__sfc_symmetric_RSP.robot
*** Variables ***
# Generic Service Chains and Function URIs
+${SERVICE_FUNCTION_TYPES_URI} /restconf/config/service-function-type:service-function-types/
${SERVICE_FUNCTIONS_URI} /restconf/config/service-function:service-functions/
${SERVICE_FUNCTION_ACLS_URI} /restconf/config/ietf-access-control-list:access-lists/
${SERVICE_CLASSIFIERS_URI} /restconf/config/service-function-classifier:service-function-classifiers/
--- /dev/null
+{
+ "service-function-chains": {
+ "service-function-chain": [
+ {
+ "name": "SFC1",
+ "sfc-service-function": [
+ {
+ "name": "dpi-abstract1",
+ "type": "dpi-bidirectional"
+ },
+ {
+ "name": "firewall-abstract1",
+ "type": "firewall"
+ }
+ ]
+ },
+ {
+ "name": "SFC2",
+ "sfc-service-function": [
+ {
+ "name": "dpi-abstract2",
+ "type": "dpi-non-bidirectional"
+ },
+ {
+ "name": "firewall-abstract1",
+ "type": "firewall"
+ }
+ ]
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-function-forwarders": {
+ "service-function-forwarder": [
+ {
+ "name": "Classifier1",
+ "service-node": "classifier1",
+ "service-function-forwarder-ovs:ovs-bridge": {
+ "bridge-name": "br-sfc"
+ },
+ "sff-data-plane-locator": [
+ {
+ "name": "sff0-dpl",
+ "data-plane-locator": {
+ "transport": "service-locator:vxlan-gpe",
+ "port": 6633,
+ "ip": "192.168.1.10"
+ },
+ "service-function-forwarder-ovs:ovs-options": {
+ "remote-ip": "flow",
+ "dst-port": "6633",
+ "key": "flow",
+ "nsp": "flow",
+ "nsi": "flow",
+ "nshc1": "flow",
+ "nshc2": "flow",
+ "nshc3": "flow",
+ "nshc4": "flow"
+ }
+ }
+ ]
+ },
+ {
+ "name": "SFF1",
+ "service-node": "sff1",
+ "service-function-forwarder-ovs:ovs-bridge": {
+ "bridge-name": "br-sfc"
+ },
+ "sff-data-plane-locator": [
+ {
+ "name": "sff1-dpl",
+ "data-plane-locator": {
+ "transport": "service-locator:vxlan-gpe",
+ "port": 6633,
+ "ip": "192.168.1.20"
+ },
+ "service-function-forwarder-ovs:ovs-options": {
+ "remote-ip": "flow",
+ "dst-port": "6633",
+ "key": "flow",
+ "nsp": "flow",
+ "nsi": "flow",
+ "nshc1": "flow",
+ "nshc2": "flow",
+ "nshc3": "flow",
+ "nshc4": "flow"
+ }
+ }
+ ],
+ "service-function-dictionary": [
+ {
+ "name": "dpi-1",
+ "sff-sf-data-plane-locator": {
+ "sf-dpl-name": "dpi-1-dpl",
+ "sff-dpl-name": "sff1-dpl"
+ }
+ }
+ ]
+ },
+ {
+ "name": "SFF2",
+ "service-node": "sff2",
+ "service-function-forwarder-ovs:ovs-bridge": {
+ "bridge-name": "br-sfc"
+ },
+ "sff-data-plane-locator": [
+ {
+ "name": "sff2-dpl",
+ "data-plane-locator": {
+ "transport": "service-locator:vxlan-gpe",
+ "port": 6633,
+ "ip": "192.168.1.50"
+ },
+ "service-function-forwarder-ovs:ovs-options": {
+ "remote-ip": "flow",
+ "dst-port": "6633",
+ "key": "flow",
+ "nsp": "flow",
+ "nsi": "flow",
+ "nshc1": "flow",
+ "nshc2": "flow",
+ "nshc3": "flow",
+ "nshc4": "flow"
+ }
+ }
+ ],
+ "service-function-dictionary": [
+ {
+ "name": "firewall-1",
+ "sff-sf-data-plane-locator": {
+ "sf-dpl-name": "firewall-1-dpl",
+ "sff-dpl-name": "sff2-dpl"
+ }
+ }
+ ]
+ },
+ {
+ "name": "Classifier2",
+ "service-node": "classifier2",
+ "service-function-forwarder-ovs:ovs-bridge": {
+ "bridge-name": "br-sfc"
+ },
+ "sff-data-plane-locator": [
+ {
+ "name": "sff3-dpl",
+ "data-plane-locator": {
+ "transport": "service-locator:vxlan-gpe",
+ "port": 6633,
+ "ip": "192.168.1.60"
+ },
+ "service-function-forwarder-ovs:ovs-options": {
+ "remote-ip": "flow",
+ "dst-port": "6633",
+ "key": "flow",
+ "nsp": "flow",
+ "nsi": "flow",
+ "nshc1": "flow",
+ "nshc2": "flow",
+ "nshc3": "flow",
+ "nshc4": "flow"
+ }
+ }
+ ]
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-function-paths": {
+ "service-function-path": [
+ {
+ "name": "SFP1",
+ "service-chain-name": "SFC1",
+ "starting-index": 255,
+ "context-metadata": "NSH1",
+ "service-path-hop": [
+ {
+ "hop-number": 0,
+ "service-function-name": "dpi-1"
+ }
+ ]
+ },
+ {
+ "name": "SFP2",
+ "service-chain-name": "SFC2",
+ "starting-index": 255,
+ "context-metadata": "NSH1",
+ "service-path-hop": [
+ {
+ "hop-number": 0,
+ "service-function-name": "dpi-2"
+ }
+ ]
+ },
+ {
+ "name": "SFP3",
+ "service-chain-name": "SFC1",
+ "starting-index": 255,
+ "symmetric": "false",
+ "context-metadata": "NSH1",
+ "service-path-hop": [
+ {
+ "hop-number": 0,
+ "service-function-name": "dpi-2"
+ }
+ ]
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-function-types": {
+ "service-function-type": [
+ {
+ "type": "dpi-bidirectional",
+ "bidirectional": "true",
+ "nsh-aware": "true"
+ },
+ {
+ "type": "dpi-non-bidirectional",
+ "bidirectional": "false",
+ "nsh-aware": "true"
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-functions": {
+ "service-function": [
+ {
+ "name": "dpi-1",
+ "ip-mgmt-address": "192.168.1.30",
+ "rest-uri": "http://192.168.1.30:5000",
+ "type": "dpi-bidirectional",
+ "sf-data-plane-locator": [
+ {
+ "name": "dpi-1-dpl",
+ "port": 6633,
+ "ip": "192.168.1.30",
+ "transport": "service-locator:vxlan-gpe",
+ "service-function-forwarder": "SFF1"
+ }
+ ]
+ },
+ {
+ "name": "firewall-1",
+ "ip-mgmt-address": "192.168.1.40",
+ "rest-uri": "http://192.168.1.40:5000",
+ "type": "firewall",
+ "sf-data-plane-locator": [
+ {
+ "name": "firewall-1-dpl",
+ "port": 6633,
+ "ip": "192.168.1.40",
+ "transport": "service-locator:vxlan-gpe",
+ "service-function-forwarder": "SFF2"
+ }
+ ]
+ },
+ {
+ "name": "dpi-2",
+ "ip-mgmt-address": "192.168.1.35",
+ "rest-uri": "http://192.168.1.35:5000",
+ "type": "dpi-non-bidirectional",
+ "sf-data-plane-locator": [
+ {
+ "name": "dpi-2-dpl",
+ "port": 6633,
+ "ip": "192.168.1.35",
+ "transport": "service-locator:vxlan-gpe",
+ "service-function-forwarder": "SFF1"
+ }
+ ]
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-nodes": {
+ "service-node": [
+ {
+ "name": "classifier1",
+ "service-function": [
+ ],
+ "ip-mgmt-address": "192.168.1.10"
+ },
+ {
+ "name": "sff1",
+ "service-function": [
+ ],
+ "ip-mgmt-address": "192.168.1.20"
+ },
+ {
+ "name": "sf1",
+ "service-function": [
+ "dpi-1"
+ ],
+ "ip-mgmt-address": "192.168.1.30"
+ },
+ {
+ "name": "sf2",
+ "service-function": [
+ "firewall-1"
+ ],
+ "ip-mgmt-address": "192.168.1.40"
+ },
+ {
+ "name": "sf3",
+ "service-function": [
+ "dpi-2"
+ ],
+ "ip-mgmt-address": "192.168.1.35"
+ },
+ {
+ "name": "sff2",
+ "service-function": [
+ ],
+ "ip-mgmt-address": "192.168.1.50"
+ },
+ {
+ "name": "classifier2",
+ "service-function": [
+ ],
+ "ip-mgmt-address": "192.168.1.60"
+ }
+ ]
+ }
+}