--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Function ACL, Operates functions from Restconf APIs.
+Suite Setup Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Test Setup Remove All Elements If Exist ${SERVICE_FUNCTION_ACL_URI}
+Test Teardown Remove All Elements At URI ${SERVICE_FUNCTION_ACL_URI}
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Resource ../../../variables/Variables.robot
+Resource ../../../libraries/Utils.robot
+
+*** Variables ***
+${SERVICE_FUNCTION_ACL_URI} /restconf/config/ietf-access-control-list:access-lists/
+${SERVICE_FUNCTION_ACL_FILE} ${CURDIR}/../../../variables/sfc/master/service-function-acl.json
+
+*** Test Cases ***
+Add ACL
+ [Documentation] Add Service Function ACL from JSON file
+ Add Elements To URI From File ${SERVICE_FUNCTION_ACL_URI} ${SERVICE_FUNCTION_ACL_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTION_ACL_FILE}
+ ${jsonbody} To Json ${body}
+ ${functions} Get From Dictionary ${jsonbody} access-lists
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_FUNCTION_ACL_URI}
+ ${result} To JSON ${resp.content}
+ Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
+ ${function} Get From Dictionary ${result} access-lists
+ Lists Should be Equal ${function} ${functions}
+
+Delete All ACLs
+ [Documentation] Delete all ACL
+ ${body} OperatingSystem.Get File ${SERVICE_FUNCTION_ACL_FILE}
+ Add Elements To URI From File ${SERVICE_FUNCTION_ACL_URI} ${SERVICE_FUNCTION_ACL_FILE}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_FUNCTION_ACL_URI}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Remove All Elements At URI ${SERVICE_FUNCTION_ACL_URI}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_FUNCTION_ACL_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+ [Teardown] NONE
+
+Get one ACL
+ [Documentation] Get one ACL
+ Add Elements To URI From File ${SERVICE_FUNCTION_ACL_URI} ${SERVICE_FUNCTION_ACL_FILE}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_FUNCTION_ACL_URI}acl/ietf-access-control-list:ipv4-acl/ACL1
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get A Non-existing ACL
+ [Documentation] Get A Non-existing ACL
+ Add Elements To URI From File ${SERVICE_FUNCTION_ACL_URI} ${SERVICE_FUNCTION_ACL_FILE}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_FUNCTION_ACL_URI}acl/unexisting-acl
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete An ACL
+ [Documentation] Delete an ACL
+ Add Elements To URI From File ${SERVICE_FUNCTION_ACL_URI} ${SERVICE_FUNCTION_ACL_FILE}
+ Remove All Elements At URI ${SERVICE_FUNCTION_ACL_URI}acl/ietf-access-control-list:ipv4-acl/ACL1
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_FUNCTION_ACL_URI}
+ Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
+ Should Not Contain ${resp.content} ACL1
--- /dev/null
+*** Settings ***
+Documentation Test suite for SFC Service Function Classifiers, Operates functions from Restconf APIs.
+Suite Setup Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+Suite Teardown Delete All Sessions
+Test Setup Remove All Elements If Exist ${SERVICE_CLASSIFIER_URI}
+Test Teardown Remove All Elements At URI ${SERVICE_CLASSIFIER_URI}
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Resource ../../../variables/Variables.robot
+Resource ../../../libraries/Utils.robot
+
+*** Variables ***
+${SERVICE_CLASSIFIER_URI} /restconf/config/service-function-classifier:service-function-classifiers/
+${SERVICE_CLASSIFIER_FILE} ${CURDIR}/../../../variables/sfc/master/service-function-classifiers.json
+
+*** Test Cases ***
+Add Service Function Classifier
+ [Documentation] Add Service Function Classifiers from JSON file
+ Add Elements To URI From File ${SERVICE_CLASSIFIER_URI} ${SERVICE_CLASSIFIER_FILE}
+ ${body} OperatingSystem.Get File ${SERVICE_CLASSIFIER_FILE}
+ ${jsonbody} To Json ${body}
+ ${functions} Get From Dictionary ${jsonbody} service-function-classifiers
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_CLASSIFIER_URI}
+ ${result} To JSON ${resp.content}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${function} Get From Dictionary ${result} service-function-classifiers
+ Lists Should be Equal ${function} ${functions}
+
+Delete All Classifiers
+ [Documentation] Delete all Classifiers
+ ${body} OperatingSystem.Get File ${SERVICE_CLASSIFIER_FILE}
+ Add Elements To URI From File ${SERVICE_CLASSIFIER_URI} ${SERVICE_CLASSIFIER_FILE}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_CLASSIFIER_URI}
+ Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
+ Remove All Elements At URI ${SERVICE_CLASSIFIER_URI}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_CLASSIFIER_URI}
+ Should Be Equal As Strings ${resp.status_code} 404
+ [Teardown] NONE
+
+Get one Classifier
+ [Documentation] Get one Classifier
+ Add Elements To URI From File ${SERVICE_CLASSIFIER_URI} ${SERVICE_CLASSIFIER_FILE}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_CLASSIFIER_URI}service-function-classifier/Classifier1
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Get A Non-existing Classifier
+ [Documentation] Get A Non-existing Classifier
+ Add Elements To URI From File ${SERVICE_CLASSIFIER_URI} ${SERVICE_CLASSIFIER_FILE}
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_CLASSIFIER_URI}service-function-classifier/unexisting-classifier
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete a Classifier
+ [Documentation] Delete a classifier
+ Add Elements To URI From File ${SERVICE_CLASSIFIER_URI} ${SERVICE_CLASSIFIER_FILE}
+ Remove All Elements At URI ${SERVICE_CLASSIFIER_URI}service-function-classifier/Classifier1
+ ${resp} RequestsLibrary.Get Request session ${SERVICE_CLASSIFIER_URI}
+ Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
+ Should Not Contain ${resp.content} Classifier1
integration/test/csit/suites/sfc/SFC_Basic/090__sfc_service_functions_logical.robot
integration/test/csit/suites/sfc/SFC_Basic/100__sfc_service_forwarders_logical.robot
integration/test/csit/suites/sfc/SFC_Basic/110__sfc_rendered_service_paths_logical.robot
+integration/test/csit/suites/sfc/SFC_Basic/120__sfc_service_function_acl.robot
integration/test/csit/suites/sfc/SFC_Basic/130__sfc_symmetric_RSP.robot
+integration/test/csit/suites/sfc/SFC_Basic/140__sfc_service_function_classifier.robot
--- /dev/null
+{
+ "access-lists": {
+ "acl": [
+ {
+ "acl-name": "ACL1",
+ "acl-type": "ietf-access-control-list:ipv4-acl",
+ "access-list-entries": {
+ "ace": [
+ {
+ "rule-name": "ACE1",
+ "actions": {
+ "service-function-acl:rendered-service-path": "RSP1"
+ },
+ "matches": {
+ "destination-ipv4-network": "192.168.2.0/24",
+ "source-ipv4-network": "192.168.2.0/24",
+ "protocol": "6",
+ "source-port-range": {
+ "lower-port": 0
+ },
+ "destination-port-range": {
+ "lower-port": 80
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "acl-name": "ACL2",
+ "acl-type": "ietf-access-control-list:ipv4-acl",
+ "access-list-entries": {
+ "ace": [
+ {
+ "rule-name": "ACE2",
+ "actions": {
+ "service-function-acl:rendered-service-path": "RSP1-Reverse"
+ },
+ "matches": {
+ "destination-ipv4-network": "192.168.2.0/24",
+ "source-ipv4-network": "192.168.2.0/24",
+ "protocol": "6",
+ "source-port-range": {
+ "lower-port": 80
+ },
+ "destination-port-range": {
+ "lower-port": 0
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
--- /dev/null
+{
+ "service-function-classifiers": {
+ "service-function-classifier": [
+ {
+ "name": "Classifier1",
+ "scl-service-function-forwarder": [
+ {
+ "name": "Classifier1",
+ "interface": "veth-br"
+ }
+ ],
+ "acl": {
+ "name": "ACL1",
+ "type": "ietf-access-control-list:ipv4-acl"
+ }
+ },
+ {
+ "name": "Classifier2",
+ "scl-service-function-forwarder": [
+ {
+ "name": "Classifier2",
+ "interface": "veth-br"
+ }
+ ],
+ "acl": {
+ "name": "ACL2",
+ "type": "ietf-access-control-list:ipv4-acl"
+ }
+ }
+ ]
+ }
+}