*** Settings ***
-Documentation Test suite for SFC Service Functions, Operates functions from Restconf APIs.
+Documentation Test suite for SFC Rendered Service Paths and Classifiers.
Suite Setup Init Suite
-Suite Teardown Delete All Sessions
+Suite Teardown Cleanup Suite
Library SSHLibrary
Library Collections
Library OperatingSystem
Library RequestsLibrary
-Variables ../../../variables/Variables.py
+Library ../../../libraries/SFC/SfcUtils.py
+Resource ../../../libraries/SFC/SfcKeywords.robot
Resource ../../../variables/sfc/Variables.robot
-Resource ../../../libraries/Utils.robot
+Resource ../../../libraries/SSHKeywords.robot
Resource ../../../libraries/TemplatedRequests.robot
-*** Variables ***
-${CREATE_RSP1_INPUT} {"input":{"parent-service-function-path":"SFP-1","name":"SFP-1-Path-1"}}
-${CREATE_RSP_FAILURE_INPUT} {"input":{"parent-service-function-path":"SFC1-empty","name":"SFC1-empty-Path-1"}}
+Resource ../../../libraries/KarafKeywords.robot
+Resource ../../../libraries/DataModels.robot
+Resource ../../../libraries/SFC/DockerSfc.robot
+Resource ../../../libraries/Utils.robot
+Variables ../../../variables/sfc/Modules.py
+
*** 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}
+ [Documentation] Prepare Basic Test Environment. Full Deploy
+ Utils.Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
+ Utils.Add Elements To URI From File ${SERVICE_NODES_URI} ${SERVICE_NODES_FILE}
+ Utils.Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
+ BuiltIn.Wait Until Keyword Succeeds 60s 2s SfcKeywords.Check Service Function Types Added ${SF_NAMES}
+ Utils.Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
+ Utils.Add Elements To URI From File ${SERVICE_METADATA_URI} ${SERVICE_METADATA_FILE}
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
+ ${rsp_name} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME}
+ ${rsp_rev_name} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME} True
+ ${mapping} = BuiltIn.Create Dictionary RSP1=${rsp_name} RSP1_Reverse=${rsp_rev_name}
+ ${sf_acl_text} = TemplatedRequests.Resolve_Text_From_Template_File folder=${CONFIG_DIR} file_name=${SERVICE_FUNCTION_ACLS_FILE} mapping=${mapping}
+ Utils.Add Elements To URI And Verify ${SERVICE_FUNCTION_ACLS_URI} ${sf_acl_text}
-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 Request session ${OPERATIONAL_RSPS_URI}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- ${elements}= Create List SFP-1-Path-1 "parent-service-function-path":"SFP-1" "hop-number":0 "service-index":255 "hop-number":1
+Get Rendered Service Path By Name
+ [Documentation] Get Rendered Service Path By Name Through RESTConf APIs. Full Deploy
+ # The RSP should be symetric, so 2 should be created for the SFP
+ ${rsp_name} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME}
+ Utils.Get URI And Verify ${OPERATIONAL_RSP_URI}${rsp_name}
+ ${rsp_rev_name} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME} True
+ Utils.Get URI And Verify ${OPERATIONAL_RSP_URI}${rsp_rev_name}
+ ${elements} = BuiltIn.Create List ${rsp_name} "parent-service-function-path":"${SFP_NAME}" "hop-number":0 "service-index":255 "hop-number":1
... "service-index":254
- Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
+ Utils.Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
-Clean Datastore After Tests
- [Documentation] Clean All Items In Datastore After Tests
- Sleep 1
- 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_FUNCTION_PATHS_URI}
+Create and Get Classifiers
+ [Documentation] Apply json file descriptions of ACLs and Classifiers. Full Deploy
+ Utils.Add Elements To URI From File ${SERVICE_CLASSIFIERS_URI} ${SERVICE_CLASSIFIERS_FILE}
+ ${classifiers}= BuiltIn.Create List "service-function-classifiers" "service-function-classifier" "type":"ietf-access-control-list:ipv4-acl" "scl-service-function-forwarder"
+ Append To List ${classifiers} "name":"Classifier2" "name":"ACL2"
+ Append To List ${classifiers} "name":"Classifier1" "name":"ACL1"
+ Utils.Check For Elements At URI ${SERVICE_CLASSIFIERS_URI} ${classifiers}
+ BuiltIn.Wait Until Keyword Succeeds 60s 2s SfcKeywords.Check Classifier Flows
*** Keywords ***
-Post Elements To URI As JSON
- [Arguments] ${uri} ${data}
- ${resp} RequestsLibrary.Post Request session ${uri} data=${data} headers=${headers}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
-
-Get JSON Elements From URI
- [Arguments] ${uri}
- ${resp} RequestsLibrary.Get Request session ${uri}
- ${value} To Json ${resp.content}
- [Return] ${value}
-
Init Suite
[Documentation] Connect Create session and initialize ODL version specific variables
+ RequestsLibrary.Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
SSHLibrary.Open Connection ${TOOLS_SYSTEM_IP} timeout=3s
- Utils.Flexible Mininet Login
+ SSHKeywords.Flexible Mininet Login
+ ${docker_cidr} = DockerSfc.Get Docker Bridge Subnet
+ ${docker_nw} = SfcUtils.Get Network From Cidr ${docker_cidr}
+ ${docker_mask} = SfcUtils.Get Mask From Cidr ${docker_cidr}
+ ${route_to_docker_net} = BuiltIn.Set Variable sudo route add -net ${docker_nw} netmask ${docker_mask} gw ${TOOLS_SYSTEM_IP}
+ Utils.Run Command On Remote System ${ODL_SYSTEM_IP} ${route_to_docker_net} ${ODL_SYSTEM_USER} prompt=${ODL_SYSTEM_PROMPT}
SSHLibrary.Put File ${CURDIR}/docker-ovs.sh . mode=0755
SSHLibrary.Put File ${CURDIR}/Dockerfile . mode=0755
SSHLibrary.Put File ${CURDIR}/setup-docker-image.sh . mode=0755
- ${result} SSHLibrary.Execute Command ./setup-docker-image.sh > >(tee myFile.log) 2> >(tee myFile.log) return_stderr=True return_stdout=True return_rc=True
- log ${result}
- Should be equal as integers ${result[2]} 0
- ${result} SSHLibrary.Execute Command ./docker-ovs.sh spawn --nodes=6 --guests=1 --tun=vxlan-gpe --odl=${ODL_SYSTEM_IP} > >(tee myFile2.log) 2> >(tee myFile2.log) return_stderr=True return_stdout=True return_rc=True
- log ${result}
- Should be equal as integers ${result[2]} 0
- SSHLibrary.Close Connection
- Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
- log ${ODL_STREAM}
- Run Keyword If '${ODL_STREAM}' == 'stable-lithium' Set Suite Variable ${VERSION_DIR} lithium
- ... ELSE Set Suite Variable ${VERSION_DIR} master
- Set Suite Variable ${SERVICE_FUNCTIONS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-functions.json
- Set Suite Variable ${SERVICE_FORWARDERS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-function-forwarders.json
- Set Suite Variable ${SERVICE_NODES_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-nodes.json
- Set Suite Variable ${SERVICE_CHAINS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-function-chains.json
- Set Suite Variable ${SERVICE_FUNCTION_PATHS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-function-paths.json
- Set Suite Variable ${SERVICE_RANDOM_SCHED_TYPE_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-random-schedule-type.json
- Set Suite Variable ${SERVICE_ROUNDROBIN_SCHED_TYPE_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/full-deploy/service-roundrobin-schedule-type.json
+ ${result} = SSHLibrary.Execute Command ./setup-docker-image.sh > >(tee myFile.log) 2> >(tee myFile.log) return_stderr=True return_stdout=True return_rc=True
+ BuiltIn.log ${result}
+ BuiltIn.Should be equal as integers ${result[2]} 0
+ BuiltIn.Set Suite Variable @{INTERFACE_NAMES} v-ovsnsn6g1 v-ovsnsn1g1
+ DockerSfc.Docker Ovs Start nodes=6 guests=1 tunnel=vxlan-gpe odl_ip=${ODL_SYSTEM_IP}
+ BuiltIn.Wait Until Keyword Succeeds 60s 2s Utils.Check For Elements At URI ${OVSDB_TOPOLOGY_URI} ${INTERFACE_NAMES}
+ ${docker_name_list} = DockerSfc.Get Docker Names As List
+ BuiltIn.Set Suite Variable ${DOCKER_NAMES_LIST} ${docker_name_list}
+ BuiltIn.log ${ODL_STREAM}
+ BuiltIn.Set Suite Variable ${SFP_NAME} SFP1
+ BuiltIn.Set Suite Variable ${CONFIG_DIR} ${CURDIR}/../../../variables/sfc/master/full-deploy
+ BuiltIn.Set Suite Variable ${SERVICE_FUNCTIONS_FILE} ${CONFIG_DIR}/service-functions.json
+ BuiltIn.Set Suite Variable ${SERVICE_FORWARDERS_FILE} ${CONFIG_DIR}/service-function-forwarders.json
+ BuiltIn.Set Suite Variable ${SERVICE_NODES_FILE} ${CONFIG_DIR}/service-nodes.json
+ BuiltIn.Set Suite Variable ${SERVICE_CHAINS_FILE} ${CONFIG_DIR}/service-function-chains.json
+ BuiltIn.Set Suite Variable ${SERVICE_FUNCTION_PATHS_FILE} ${CONFIG_DIR}/service-function-paths.json
+ BuiltIn.Set Suite Variable ${SERVICE_METADATA_FILE} ${CONFIG_DIR}/service-function-metadata.json
+ BuiltIn.Set Suite Variable ${SERVICE_FUNCTION_ACLS_FILE} service-function-acls.json
+ BuiltIn.Set Suite Variable ${SERVICE_CLASSIFIERS_FILE} ${CONFIG_DIR}/service-function-classifiers.json
+ BuiltIn.Set Suite Variable @{SF_NAMES} "firewall-1" "dpi-1"
+ SfcKeywords.Switch Ips In Json Files ${CONFIG_DIR} ${DOCKER_NAMES_LIST}
+Cleanup Suite
+ [Documentation] Clean up all docker containers created and delete sessions
+ DataModels.Get Model Dump ${ODL_SYSTEM_IP} ${sfc_data_models}
+ Utils.Remove All Elements At URI ${SERVICE_CLASSIFIERS_URI}
+ Utils.Remove All Elements At URI ${SERVICE_FUNCTION_ACLS_URI}
+ SfcKeywords.Delete Sfp And Wait For Rsps Deletion ${SFP_NAME}
+ Utils.Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
+ BuiltIn.Wait Until Keyword Succeeds 60s 2s SfcKeywords.Check Service Function Types Removed ${SF_NAMES}
+ Utils.Remove All Elements At URI ${SERVICE_FORWARDERS_URI}
+ Utils.Remove All Elements At URI ${SERVICE_NODES_URI}
+ Utils.Remove All Elements At URI ${SERVICE_CHAINS_URI}
+ Utils.Remove All Elements At URI ${SERVICE_METADATA_URI}
+ DockerSfc.Docker Ovs Clean log_file=myFile4.log
+ RequestsLibrary.Delete All Sessions
+ SSHLibrary.Close Connection