+++ /dev/null
-*** Settings ***
-Library SSHLibrary
-
-
-*** Variables ***
-${INTEGRATION_BRIDGE} br-int
-
-
-*** Keywords ***
-Docker Ovs Start
- [Documentation] Run the docker-ovs.sh script with specific input arguments. Run ./docker-ovs.sh --help for more info.
- [Arguments] ${nodes} ${guests} ${tunnel} ${odl_ip} ${log_file}=myFile2.log
- ${result} SSHLibrary.Execute Command
- ... ./docker-ovs.sh spawn --nodes=${nodes} --guests=${guests} --tun=${tunnel} --odl=${odl_ip} > >(tee ${log_file}) 2> >(tee ${log_file})
- ... return_stderr=True
- ... return_stdout=True
- ... return_rc=True
- log ${result}
- Should be equal as integers ${result[2]} 0
-
-Docker Ovs Clean
- [Documentation] Run the docker-ovs.sh script with --clean option to clean up all containers deployment. Run ./docker-ovs.sh --help for more info.
- [Arguments] ${log_file}=myFile3.log
- ${result} SSHLibrary.Execute Command
- ... ./docker-ovs.sh clean > >(tee ${log_file}) 2> >(tee ${log_file})
- ... return_stderr=True
- ... return_stdout=True
- ... return_rc=True
- log ${result}
- Should be equal as integers ${result[2]} 0
-
-Get Docker Ids
- [Documentation] Execute command docker ps and retrieve the existing containers ids
- ${output} ${rc} SSHLibrary.Execute Command
- ... sudo docker ps -q -a
- ... return_stdout=True
- ... return_stderr=False
- ... return_rc=True
- Should Be Equal As Numbers ${rc} 0
- RETURN ${output}
-
-Get Docker Ids Formatted
- [Documentation] Execute command docker ps with --format argument and retrieve the existing containers names
- [Arguments] ${format}
- ${output} ${rc} SSHLibrary.Execute Command
- ... sudo docker ps -a --format ${format}
- ... return_stdout=True
- ... return_stderr=False
- ... return_rc=True
- Should Be Equal As Numbers ${rc} 0
- RETURN ${output}
-
-Get Docker Names As List
- [Documentation] Returns a list with the names of all running containers inside the tools system
- ${docker_ps} DockerSfc.Get Docker Ids Formatted "{{.Names}}" -f status=running
- ${docker_name_list} Split String ${docker_ps} \n
- RETURN ${docker_name_list}
-
-Get Docker IP
- [Documentation] Obtain the IP address from a given container
- [Arguments] ${docker_name}
- ${output} ${rc} SSHLibrary.Execute Command
- ... sudo docker inspect -f '{{.NetworkSettings.IPAddress }}' ${docker_name}
- ... return_stdout=True
- ... return_stderr=False
- ... return_rc=True
- Should Be Equal As Numbers ${rc} 0
- RETURN ${output}
-
-Docker Exec
- [Documentation] Execute a command into a docker container.
- [Arguments] ${docker_name} ${command} ${return_contains}=${EMPTY} ${result_code}=0
- ${output} ${rc} SSHLibrary.Execute Command
- ... sudo docker exec ${docker_name} ${command}
- ... return_stdout=True
- ... return_stderr=False
- ... return_rc=True
- IF '${return_contains}'!='${EMPTY}'
- Should Contain ${output} ${return_contains}
- END
- Should Be Equal As Numbers ${rc} ${result_code}
- RETURN ${output}
-
-Multiple Docker Exec
- [Documentation] Execute a command in a list of dockers and return all the outputs in a list
- [Arguments] ${docker_name_list} ${command} ${return_contains}=${EMPTY} ${result_code}=0
- @{list_output} Create List
- FOR ${docker_id} IN @{docker_name_list}
- ${exec_output} Docker Exec ${docker_id} ${command} ${return_contains} ${result_code}
- Append To List ${list_output} ${exec_output}
- END
- RETURN ${list_output}
-
-Get Flows In Docker Containers
- ${docker_list} DockerSfc.Get Docker Names As List
- ${docker_flows} DockerSfc.Multiple Docker Exec
- ... ${docker_list}
- ... ovs-ofctl dump-flows -OOpenflow13 ${INTEGRATION_BRIDGE}
- ... OFPST_FLOW
- RETURN ${docker_flows}
-
-Get Docker Bridge Subnet
- [Documentation] Obtain the subnet used by docker bridge using the docker inspect tool
- ${output} ${rc} SSHLibrary.Execute Command
- ... sudo docker network inspect bridge --format {{.IPAM.Config}} | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}[\/][0-9]{1,2}"
- ... return_stdout=True
- ... return_stderr=False
- ... return_rc=True
- Should Be Equal As Numbers ${rc} 0
- RETURN ${output}
+++ /dev/null
-*** Settings ***
-Documentation Common Keywords for the SFC Test suites.
-
-Library Collections
-Resource ../CompareStream.robot
-Resource ../Utils.robot
-
-
-*** Keywords ***
-Get JSON Elements From URI
- [Arguments] ${uri}
- ${resp} = RequestsLibrary.Get Request session ${uri}
- RETURN ${resp.json()}
-
-Check Classifier Flows
- ${flowList} = DockerSfc.Get Flows In Docker Containers
- BuiltIn.log ${flowList}
- ${expected_nsh_pop} = BuiltIn.Set_Variable *actions=decap(),decap(),*
- ${expected_nsh_push} = BuiltIn.Set_Variable *actions=encap(nsh*
- Collections.Should Contain Match ${flowList} ${expected_nsh_pop}
- Collections.Should Contain Match ${flowList} ${expected_nsh_push}
-
-Check Service Function Types Added
- [Documentation] Check that the service function types are updated with the service function names
- [Arguments] ${elements}
- Utils.Check For Elements At URI ${SERVICE_FUNCTION_TYPES_URI} ${elements}
-
-Check Service Function Types Removed
- [Documentation] Check that the service function names are removed from the service function types
- [Arguments] ${elements}
- Utils.Check For Elements Not At URI ${SERVICE_FUNCTION_TYPES_URI} ${elements}
-
-Check Empty Service Function Paths State
- [Documentation] Check that the service function paths state is empty after deleting SFPs
- Utils.No Content From URI session ${SERVICE_FUNCTION_PATH_STATE_URI}
-
-Check Rendered Service Path Created
- [Documentation] Check that the Rendered Service Path is created
- [Arguments] ${sfp_name}
- ${sfp_name_elements_list} = BuiltIn.Create List ${sfp_name}
- Utils.Check For Elements At URI ${SERVICE_FUNCTION_PATHS_STATE_URI} ${sfp_name_elements_list}
-
-Check Rendered Service Path Deleted
- [Documentation] Check that the Rendered Service Path is deleted
- [Arguments] ${sfp_name}
- Utils.No Content From URI session ${SERVICE_FUNCTION_PATH_STATE_URI}/${sfp_name}
-
-Get Rendered Service Path Name
- [Documentation] Given an SFP name, do a get on ${SERVICE_FUNCTION_PATH_STATE_URI} to get the RSP name
- [Arguments] ${sfp_name} ${get_reverse}=False
- ${resp} = RequestsLibrary.Get Request session ${SERVICE_FUNCTION_PATH_STATE_URI}/${sfp_name}
- BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code}
- # should be like this: {"service-function-path-state":[{"name":"SFC1-100","sfp-rendered-service-path":[{"name":"SFC1-100-Path-183"}]}]}
- ${sfp_rendered_service_path_list} = Collections.Get_From_Dictionary
- ... ${resp.json()}
- ... service-function-path-state
- ${sfp_rendered_service_path_dict} = Collections.Get_From_List ${sfp_rendered_service_path_list} 0
- ${sfp_state_list} = Collections.Get_From_Dictionary
- ... ${sfp_rendered_service_path_dict}
- ... sfp-rendered-service-path
- ${list_length} = BuiltIn.Get Length ${sfp_state_list}
- # The "sfp-rendered-service-path" will only have 1 or 2 entries, depending on chain symmetry config.
- # The RSP name will be "<SfpName>-Path-<PathId>" and the optional symmetric name will be <SfpName>-Path-<PathId>-Reverse"
- ${value} = BuiltIn.Set Variable None
- FOR ${i} IN RANGE ${list_length}
- ${rsp_name_dict} = Collections.Get From List ${sfp_state_list} ${i}
- ${name} = Collections.Get_From_Dictionary ${rsp_name_dict} name
- @{matches} = String.Get Regexp Matches ${name} .*Reverse$
- ${matches_length} = BuiltIn.Get Length ${matches}
- ${value} = BuiltIn.Set Variable If
- ... "${get_reverse}" == "False" and 0 == ${matches_length}
- ... ${name}
- ... "${get_reverse}" == "True" and 0 < ${matches_length}
- ... ${name}
- ... "${value}" != "None"
- ... ${value}
- END
- RETURN ${value}
-
-Create Sfp And Wait For Rsp Creation
- [Documentation] Given an SFP name, create it and wait for the associated RSPs to be created
- [Arguments] ${sfp_file_name}
- Utils.Add Elements To URI From File And Verify ${SERVICE_FUNCTION_PATHS_URI} ${sfp_file_name}
- ${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}
- END
-
-Delete Sfp And Wait For Rsps Deletion
- [Documentation] Given an SFP name, delete it and wait for the associated SFP state and RSPs to be deleted
- [Arguments] ${sfp_name}
- Utils.Remove All Elements At URI And Verify ${SERVICE_FUNCTION_PATH_URI}/${sfp_name}
- BuiltIn.Wait Until Keyword Succeeds 60s 2s Check Rendered Service Path Deleted ${sfp_name}
-
-Delete All Sfps And Wait For Rsps Deletion
- [Documentation] Delete all SFPs and wait for the RSPs to be deleted
- Utils.Remove All Elements At URI And Verify ${SERVICE_FUNCTION_PATHS_URI}
- BuiltIn.Wait Until Keyword Succeeds 60s 2s Check Empty Service Function Paths State
-
-Switch Ips In Json Files
- [Arguments] ${json_dir} ${container_names}
- ${normalized_dir} = OperatingSystem.Normalize Path ${json_dir}/*.json
- FOR ${cont_name} IN @{container_names}
- ${cont_ip} = Get Docker IP ${cont_name}
- OperatingSystem.Run sudo sed -i 's/${cont_name}/${cont_ip}/g' ${normalized_dir}
- END