*** Settings ***
Documentation Common Keywords for the SFC Test suites.
Library Collections
-Resource ../../../libraries/Utils.robot
+Resource ../Utils.robot
*** Variables ***
*** Keywords ***
-Post Elements To URI As JSON
- [Arguments] ${uri} ${data}
- ${resp} = RequestsLibrary.Post Request session ${uri} data=${data} headers=${headers}
- BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
-
Get JSON Elements From URI
[Arguments] ${uri}
${resp} = RequestsLibrary.Get Request session ${uri}
Check Classifier Flows
${flowList} = DockerSfc.Get Flows In Docker Containers
BuiltIn.log ${flowList}
- BuiltIn.Should Contain Match ${flowList} *actions=pop_nsh*
- BuiltIn.Should Contain Match ${flowList} *actions=push_nsh*
+ BuiltIn.Should Contain ${flowList} *actions=pop_nsh*
+ BuiltIn.Should Contain ${flowList} *actions=push_nsh*
Check Service Function Types Added
[Arguments] ${elements}
[Return] ${value}
Create Sfp And Wait For Rsp Creation
- [Arguments] ${sfp_file_name} ${created_sfps}
+ [Arguments] ${sfp_file_name}
[Documentation] Given an SFP name, create it and wait for the associated RSPs to be created
Utils.Add Elements To URI From File And Verify ${SERVICE_FUNCTION_PATHS_URI} ${sfp_file_name}
- BuiltIn.Run Keyword If len(${created_sfps}) > 0 BuiltIn.Wait Until Keyword Succeeds 60s 2s Utils.Check For Elements At URI ${SERVICE_FUNCTION_PATHS_STATE_URI}
- ... ${created_sfps}
+ ${sfp_dict} = Utils.Json Parse From File ${sfp_file_name}
+ ${sfps} = Collections.Get_From_Dictionary ${sfp_dict} service-function-paths
+ ${sfp_json_list} = Collections.Get_From_Dictionary ${sfps} service-function-path
+ ${list_length} = BuiltIn.Get Length ${sfp_json_list}
+ # Each SFP state entry returned from ODL will have either 2 or 3 name elements, 2 for non-symmetric 3 for symmetric RSP
+ : FOR ${i} IN RANGE ${list_length}
+ \ ${sfp_entry_dict} = Collections.Get From List ${sfp_json_list} ${i}
+ \ ${sfp_name} = Collections.Get_From_Dictionary ${sfp_entry_dict} name
+ \ ${status} ${symmetric} = BuiltIn.Run Keyword And Ignore Error Collections.Get_From_Dictionary ${sfp_entry_dict} symmetric
+ \ ${symmetric} = BuiltIn.Set Variable If "${status}" == "FAIL" False ${symmetric}
+ \ ${num_names} = BuiltIn.Set Variable If "${symmetric}" == "False" 2 3
+ \ BuiltIn.Wait Until Keyword Succeeds 60s 2s Utils.Check For Specific Number Of Elements At URI ${SERVICE_FUNCTION_PATH_STATE_URI}${sfp_name} name
+ \ ... ${num_names}
Delete Sfp And Wait For Rsps Deletion
[Arguments] ${sfp_name}
Add Elements To URI From File
[Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${session}=session
+ [Documentation] Put data from a file to a URI
${body} OperatingSystem.Get File ${data_file}
${resp} RequestsLibrary.Put Request ${session} ${dest_uri} data=${body} headers=${headers}
Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
Add Elements To URI From File And Verify
[Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${session}=session
+ [Documentation] Put data from a file to a URI and verify the HTTP response
${body} OperatingSystem.Get File ${data_file}
- ${resp} RequestsLibrary.Put Request ${session} ${dest_uri} data=${body} headers=${headers}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- ${resp} RequestsLibrary.Get Request ${session} ${dest_uri}
- Should Not Be Equal ${resp.status_code} 404
+ Add Elements to URI And Verify ${dest_uri} ${body} ${headers} ${session}
Add Elements To URI And Verify
- [Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${session}=session
- ${resp} RequestsLibrary.Put Request ${session} ${dest_uri} ${data_file} headers=${headers}
+ [Arguments] ${dest_uri} ${data} ${headers}=${headers} ${session}=session
+ [Documentation] Put data to a URI and verify the HTTP response
+ ${resp} RequestsLibrary.Put Request ${session} ${dest_uri} ${data} headers=${headers}
Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
${resp} RequestsLibrary.Get Request ${session} ${dest_uri}
Should Not Be Equal ${resp.status_code} 404
Builtin.Log ${response.text}
Builtin.Fail The request failed with code ${response.status_code}
+Get URI And Verify
+ [Arguments] ${uri} ${session}=session ${headers}=${NONE}
+ [Documentation] Issue a GET request and verify a successfull HTTP return.
+ ... Issues a GET request for ${uri} in ${session} using headers from ${headers}.
+ ${response} = RequestsLibrary.Get Request ${session} ${uri} ${headers}
+ Builtin.Log ${response.status_code}
+ Should Contain ${ALLOWED_STATUS_CODES} ${response.status_code}
+
No Content From URI
[Arguments] ${session} ${uri} ${headers}=${NONE}
[Documentation] Issue a GET request and return on error 404 (No content) or will fail and log the content.
*** 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 Cleanup Suite
Library SSHLibrary
Resource ../../../libraries/KarafKeywords.robot
Resource ../../../libraries/DataModels.robot
Resource ../../../libraries/SFC/DockerSfc.robot
+Resource ../../../libraries/Utils.robot
Variables ../../../variables/sfc/Modules.py
-*** Variables ***
-${CREATE_RSP1_INPUT} {"input":{"parent-service-function-path":"SFP1","name":"RSP1"}}
-${CREATE_RSP_FAILURE_INPUT} {"input":{"parent-service-function-path":"SFC1-empty","name":"RSP1-empty-Path-1"}}
-@{SF_NAMES} "name":"firewall-1" "name":"dpi-1"
-@{INTERFACE_NAMES} v-ovsnsn6g1 v-ovsnsn1g1
-
*** 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}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Added ${SF_NAMES}
- Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
- Add Elements To URI From File ${SERVICE_METADATA_URI} ${SERVICE_METADATA_FILE}
- Add Elements To URI From File ${SERVICE_FUNCTION_PATHS_URI} ${SERVICE_FUNCTION_PATHS_FILE}
- Add Elements To URI From File ${SERVICE_FUNCTION_ACLS_URI} ${SERVICE_FUNCTION_ACLS_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 RSP1 "parent-service-function-path":"SFP1" "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}
Create and Get Classifiers
- [Documentation] Apply json file descriptions of ACLs and Classifiers
- Add Elements To URI From File ${SERVICE_CLASSIFIERS_URI} ${SERVICE_CLASSIFIERS_FILE}
- ${classifiers}= Create List "service-function-classifiers" "service-function-classifier" "type":"ietf-access-control-list:ipv4-acl" "scl-service-function-forwarder"
+ [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"
- Check For Elements At URI ${SERVICE_CLASSIFIERS_URI} ${classifiers}
- Wait Until Keyword Succeeds 60s 2s Check Classifier Flows
+ Utils.Check For Elements At URI ${SERVICE_CLASSIFIERS_URI} ${classifiers}
+ BuiltIn.Wait Until Keyword Succeeds 60s 2s SfcKeywords.Check Classifier Flows
*** Keywords ***
Init Suite
[Documentation] Connect Create session and initialize ODL version specific variables
- Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+ RequestsLibrary.Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
SSHLibrary.Open Connection ${TOOLS_SYSTEM_IP} timeout=3s
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}= Set Variable sudo route add -net ${docker_nw} netmask ${docker_mask} gw ${TOOLS_SYSTEM_IP}
- Run Command On Remote System ${ODL_SYSTEM_IP} ${route_to_docker_net} ${ODL_SYSTEM_USER} prompt=${ODL_SYSTEM_PROMPT}
+ ${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 ./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}
- Wait Until Keyword Succeeds 60s 2s Check For Elements At URI ${OVSDB_TOPOLOGY_URI} ${INTERFACE_NAMES}
- ${docker_name_list}= DockerSfc.Get Docker Names As List
- Set Suite Variable ${DOCKER_NAMES_LIST} ${docker_name_list}
- log ${ODL_STREAM}
- Set Suite Variable ${CONFIG_DIR} ${CURDIR}/../../../variables/sfc/master/full-deploy
- Set Suite Variable ${SERVICE_FUNCTIONS_FILE} ${CONFIG_DIR}/service-functions.json
- Set Suite Variable ${SERVICE_FORWARDERS_FILE} ${CONFIG_DIR}/service-function-forwarders.json
- Set Suite Variable ${SERVICE_NODES_FILE} ${CONFIG_DIR}/service-nodes.json
- Set Suite Variable ${SERVICE_CHAINS_FILE} ${CONFIG_DIR}/service-function-chains.json
- Set Suite Variable ${SERVICE_FUNCTION_PATHS_FILE} ${CONFIG_DIR}/service-function-paths.json
- Set Suite Variable ${SERVICE_METADATA_FILE} ${CONFIG_DIR}/service-function-metadata.json
- Set Suite Variable ${SERVICE_FUNCTION_ACLS_FILE} ${CONFIG_DIR}/service-function-acls.json
- Set Suite Variable ${SERVICE_CLASSIFIERS_FILE} ${CONFIG_DIR}/service-function-classifiers.json
- Switch Ips In Json Files ${CONFIG_DIR} ${DOCKER_NAMES_LIST}
+ 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
- Get Model Dump ${ODL_SYSTEM_IP} ${sfc_data_models}
- Remove All Elements At URI ${SERVICE_CLASSIFIERS_URI}
- Remove All Elements At URI ${SERVICE_FUNCTION_ACLS_URI}
- Remove All Elements At URI ${SERVICE_FUNCTIONS_URI}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Removed ${SF_NAMES}
- 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}
- Remove All Elements At URI ${SERVICE_METADATA_URI}
+ 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
- Delete All Sessions
+ RequestsLibrary.Delete All Sessions
SSHLibrary.Close Connection
*** Settings ***
-Documentation Test suite for SFC Service Functions, Operates functions from Restconf APIs. Logical SFF
+Documentation Test suite for SFC Rendered Service Paths. Logical SFF
Suite Setup Init Suite
-Suite Teardown Delete All Sessions
-Test Setup Create All Elements
-Test Teardown Delete All Elements
+Suite Teardown Delete All Elements
Library SSHLibrary
Library Collections
Library OperatingSystem
Resource ../../../libraries/Utils.robot
Resource ../../../libraries/TemplatedRequests.robot
-*** Variables ***
-${VERSION_DIR} master
-${SERVICE_FUNCTIONS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-functions-logicalsff.json
-${SERVICE_FORWARDERS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-function-forwarders-logicallsff.json
-${SERVICE_CHAINS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-function-chains-logicalsff.json
-${SERVICE_FUNCTION_PATHS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-function-paths-logicalsff.json
-${CREATE_RSP1_INPUT} {"input":{"name": "RSP1","parent-service-function-path": "SFP1","symmetric": "true"}}
-${CREATE_RSP2_INPUT} {"input":{"name": "RSP2","parent-service-function-path": "SFP2","symmetric": "true"}}
-${CREATE_RSP_FAILURE_INPUT} {"input":{"name": "RSP1","parent-service-function-path": "SFP3","symmetric": "true"}}
-${DELETE_RSP1_INPUT} {"input":{"name":"RSP1"}}
-${DELETE_RSP1_REVERSE_INPUT} {"input":{"name":"RSP1-Reverse"}}
-${DELETE_RSP2_INPUT} {"input":{"name":"RSP2"}}
-@{SF_NAMES} "name":"firewall-1" "name":"dpi-1"
-
*** Test Cases ***
Basic Environment Setup Tests
[Documentation] Prepare Basic Test Environment. Logical SFF
- Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_FILE}
- Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Added ${SF_NAMES}
- 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. Logical SFF
- [Tags] include
- Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- ${elements1}= Create List RSP1 "parent-service-function-path":"SFP1" "service-chain-name":"SFC1" "hop-number":0 "service-index":255
- ... "hop-number":1 "service-index":254 "service-function-forwarder":"sfflogical1" "sfc-encapsulation":"service-locator:nsh"
- ${elements2}= Create List RSP1-Reverse "parent-service-function-path":"SFP1" "service-chain-name":"SFC1" "hop-number":0 "service-index":255
- ... "hop-number":1 "service-index":254 "service-function-forwarder":"sfflogical1" "sfc-encapsulation":"service-locator:nsh"
- ${elements}= Combine Lists ${elements1} ${elements2}
- Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
-
-Create Get Rendered Service Path Failure
- [Documentation] Create Rendered Service Path Failure Cases. Logical SFF
- ${resp} RequestsLibrary.Post Request session ${OPERATIONS_CREATE_RSP_URI} data=${CREATE_RSP_FAILURE_INPUT} headers=${headers}
- Should Be Equal As Strings ${resp.status_code} 500
+ Utils.Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_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}
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
Get Rendered Service Path By Name
[Documentation] Get Rendered Service Path By Name Through RESTConf APIs. Logical SFF
- Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- ${elements}= Create List RSP1 "parent-service-function-path":"SFP1" "hop-number":0 "service-index":255 "hop-number":1
- ... "service-index":254
- 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. Logical SFF
- Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/non-existing-rsp
- Should Be Equal As Strings ${resp.status_code} 404
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- Should Not Contain ${resp.content} non-existing-rsp
+ # 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_name_rev} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME}
+ Utils.Get URI And Verify ${OPERATIONAL_RSP_URI}${rsp_name_rev}
+ ${elements} = Create List "parent-service-function-path":"${SFP_NAME}" "hop-number":0 "service-index":255 "hop-number":1 "service-index":254
+ Utils.Check For Elements At URI ${OPERATIONAL_RSPS_URI} ${elements}
Delete one Rendered Service Path By Name
[Documentation] Delete One Rendered Service Path By Name Through RESTConf APIs. Logical SFF
- Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1-Reverse
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- Should Contain ${resp.content} RSP1-Reverse
- Post Elements To URI ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_REVERSE_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1-Reverse
- Should Be Equal As Strings ${resp.status_code} 404
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- Should Not Contain ${resp.content} RSP1-Reverse
-
-Delete Non Existing Rendered Service Path By Name
- [Documentation] Delete One Rendered Service Path By Name Through RESTConf APIs. Logical SFF
- Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- Should Contain ${resp.content} RSP1
- Post Elements To URI ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP2_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- Should Not Contain ${resp.content} {"rendered-service-paths":{}}
+ # First verify that the RSPs exist
+ ${rsp_name} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME}
+ Utils.Get URI And Verify ${OPERATIONAL_RSP_URI}${rsp_name}
+ ${rsp_name_rev} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME} True
+ Utils.Get URI And Verify ${OPERATIONAL_RSP_URI}${rsp_name_rev}
+ # Delete the SFP, which will delete the RSPs
+ SfcKeywords.Delete Sfp And Wait For Rsps Deletion ${SFP_NAME}
Get Rendered Service Path Hop
[Documentation] Get Rendered Service Path By Name Through RESTConf APIs. Logical SFF
- Post Elements To URI ${OPERATIONS_CREATE_RSP_URI} ${CREATE_RSP1_INPUT}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1/rendered-service-path-hop/0/
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- ${elements}= Create List "hop-number":0 "service-index":255 "service-function-name":"dpi-1
- Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1/rendered-service-path-hop/0/ ${elements}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1/rendered-service-path-hop/1/
- Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- ${elements}= Create List "hop-number":1 "service-index":254 "service-function-name":"firewall-1
- Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1/rendered-service-path-hop/1/ ${elements}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1/rendered-service-path-hop/2/
- Should Be Equal As Strings ${resp.status_code} 404
- Post Elements To URI ${OPERATIONS_DELETE_RSP_URI} ${DELETE_RSP1_INPUT}
+ # Create the SFP, which will create the RSPs
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
+ ${rsp_name} = SfcKeywords.Get Rendered Service Path Name ${SFP_NAME}
+ ${elements} = BuiltIn.Create List "hop-number":0 "service-index":255 "service-function-name":"dpi-1
+ Utils.Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/${rsp_name}/rendered-service-path-hop/0/ ${elements}
+ ${elements} = BuiltIn.Create List "hop-number":1 "service-index":254 "service-function-name":"firewall-1
+ Utils.Check For Elements At URI ${OPERATIONAL_RSPS_URI}rendered-service-path/${rsp_name}/rendered-service-path-hop/1/ ${elements}
+ ${resp} = RequestsLibrary.Get Request session ${OPERATIONAL_RSPS_URI}rendered-service-path/RSP1/rendered-service-path-hop/2/
+ BuiltIn.Should Be Equal As Strings ${resp.status_code} 404
*** 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}
+ RequestsLibrary.Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS}
+ BuiltIn.log ${ODL_STREAM}
+ BuiltIn.Set Suite Variable ${SFP_NAME} SFP1
+ BuiltIn.Set Suite Variable ${VERSION_DIR} master
+ BuiltIn.Set Suite Variable ${SERVICE_FUNCTIONS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-functions-logicalsff.json
+ BuiltIn.Set Suite Variable ${SERVICE_FORWARDERS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-function-forwarders-logicallsff.json
+ BuiltIn.Set Suite Variable ${SERVICE_CHAINS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-function-chains-logicalsff.json
+ BuiltIn.Set Suite Variable ${SERVICE_FUNCTION_PATHS_FILE} ${CURDIR}/../../../variables/sfc/${VERSION_DIR}/service-function-paths-logicalsff.json
+ BuiltIn.Set Suite Variable @{SF_NAMES} "name":"firewall-1" "name":"dpi-1"
Delete All Elements
[Documentation] Delete all provisioned elements
- Remove All Elements If Exist ${RENDERED_SERVICE_PATHS_URI}
- Remove All Elements If Exist ${SERVICE_FUNCTION_PATHS_URI}
- Remove All Elements If Exist ${SERVICE_CHAINS_URI}
- Remove All Elements If Exist ${SERVICE_FORWARDERS_URI}
- Remove All Elements If Exist ${SERVICE_FUNCTIONS_URI}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Removed ${SF_NAMES}
-
-Create All Elements
- [Documentation] Delete all provisioned elements
- Add Elements To URI From File ${SERVICE_FUNCTIONS_URI} ${SERVICE_FUNCTIONS_FILE}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Added ${SF_NAMES}
- Add Elements To URI From File ${SERVICE_FORWARDERS_URI} ${SERVICE_FORWARDERS_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}
+ Utils.Remove All Elements If Exist ${SERVICE_FUNCTION_PATHS_URI}
+ Utils.Remove All Elements If Exist ${SERVICE_CHAINS_URI}
+ Utils.Remove All Elements If Exist ${SERVICE_FORWARDERS_URI}
+ Utils.Remove All Elements If Exist ${SERVICE_FUNCTIONS_URI}
+ BuiltIn.Wait Until Keyword Succeeds 60s 2s SfcKeywords.Check Service Function Types Removed ${SF_NAMES}
+ RequestsLibrary.Delete All Sessions
+++ /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 ../../../libraries/SFC/SfcKeywords.robot
-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"}}
-@{SF_NAMES} "name":"firewall-1" "name":"dpi-1" "name":"dpi-2"
-
-*** 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}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Added ${SF_NAMES}
- 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}
- Wait Until Keyword Succeeds 60s 2s Check Service Function Types Removed ${SF_NAMES}
- 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}
BuiltIn.Wait Until Keyword Succeeds 60s 2s SfcKeywords.Check Service Function Types Added ${SERVICE_FUNCTION_NAMES}
Utils.Add Elements To URI From File ${SERVICE_CHAINS_URI} ${SERVICE_CHAINS_FILE}
# Creates SFPs: SFC1-100, SFC1-200, SFC1-300, SFC2-100, and SFC2-200
- ${created_sfps} = BuiltIn.Create List "SFC1-100" "SFC1-200" "SFC1-300" "SFC2-100" "SFC2-200"
- SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE} ${created_sfps}
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
Get Rendered Service Path By Name
[Documentation] Get The Rendered Service Path Created in "Basic Environment Setup Tests" By Name Via RESTConf APIs
Utils.Add Elements To URI From File ${SERVICE_RANDOM_SCHED_TYPE_URI} ${SERVICE_RANDOM_SCHED_TYPE_FILE}
SfcKeywords.Delete All Sfps And Wait For Rsps Deletion
# Create the SFPs which will create the RSPs with the Random scheduler
- ${created_sfps} = BuiltIn.Create List "SFC1-100" "SFC1-200" "SFC1-300" "SFC2-100" "SFC2-200"
- SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE} ${created_sfps}
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
${sfp_name} = BuiltIn.Set Variable SFC1-100
${rsp_name} = SfcKeywords.Get Rendered Service Path Name ${sfp_name}
${elements} = BuiltIn.Create List "hop-number":0 "service-index":255 "service-function-name":"dpi
Utils.Add Elements To URI From File ${SERVICE_ROUNDROBIN_SCHED_TYPE_URI} ${SERVICE_ROUNDROBIN_SCHED_TYPE_FILE}
SfcKeywords.Delete All Sfps And Wait For Rsps Deletion
# Create the SFPs which will create the RSPs with the Random scheduler
- ${created_sfps} = BuiltIn.Create List "SFC1-100" "SFC1-200" "SFC1-300" "SFC2-100" "SFC2-200"
- SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE} ${created_sfps}
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
${rsp1_name} = SfcKeywords.Get Rendered Service Path Name SFC1-100
${rsp2_name} = SfcKeywords.Get Rendered Service Path Name SFC1-200
${rsp3_name} = SfcKeywords.Get Rendered Service Path Name SFC1-300
Utils.Add Elements To URI From File ${SERVICE_SHORTESTPATH_SCHED_TYPE_URI} ${SERVICE_SHORTESTPATH_SCHED_TYPE_FILE}
SfcKeywords.Delete All Sfps And Wait For Rsps Deletion
# Create the SFPs which will create the RSPs with the Random scheduler
- ${created_sfps} = BuiltIn.Create List "SFC1-100" "SFC1-200" "SFC1-300" "SFC2-100" "SFC2-200"
- SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE} ${created_sfps}
+ SfcKeywords.Create Sfp And Wait For Rsp Creation ${SERVICE_FUNCTION_PATHS_FILE}
${rsp1_name} = SfcKeywords.Get Rendered Service Path Name SFC1-100
${rsp2_name} = SfcKeywords.Get Rendered Service Path Name SFC1-200
${rsp3_name} = SfcKeywords.Get Rendered Service Path Name SFC1-300
# Generic Service Chains and Function URIs
${REST_CONFIG} /restconf/config
${REST_OPER} /restconf/operational
-${REST_RPC} /restconf/operations
${SERVICE_FUNCTION_TYPES_URI} ${REST_CONFIG}/service-function-type:service-function-types/
${SERVICE_FUNCTIONS_URI} ${REST_CONFIG}/service-function:service-functions/
${SERVICE_FUNCTION_URI} ${REST_CONFIG}/service-function:service-functions/service-function/
${SERVICE_METADATA_URI} ${REST_CONFIG}/service-function-path-metadata:service-function-metadata/
${OPERATIONAL_RSPS_URI} ${REST_OPER}/rendered-service-path:rendered-service-paths/
${OPERATIONAL_RSP_URI} ${OPERATIONAL_RSPS_URI}rendered-service-path/
-${OPERATIONS_CREATE_RSP_URI} ${REST_RPC}/rendered-service-path:create-rendered-path/
-${OPERATIONS_DELETE_RSP_URI} ${REST_RPC}/rendered-service-path:delete-rendered-path/
-${RENDERED_SERVICE_PATHS_URI} ${REST_CONFIG}/rendered-service-path:rendered-service-paths/
${OVSDB_TOPOLOGY_URI} ${REST_OPER}/network-topology:network-topology/topology/ovsdb:1
{
"rule-name": "ACE1",
"actions": {
- "service-function-acl:rendered-service-path": "RSP1"
+ "service-function-acl:rendered-service-path": "$RSP1"
},
"matches": {
"destination-ipv4-network": "192.168.2.0/24",
{
"rule-name": "ACE2",
"actions": {
- "service-function-acl:rendered-service-path": "RSP1-Reverse"
+ "service-function-acl:rendered-service-path": "$RSP1_Reverse"
},
"matches": {
"destination-ipv4-network": "192.168.2.0/24",