2 Variables ../variables/Variables.py
3 Variables ../variables/topoprocessing/Topologies.py
4 Variables ../variables/topoprocessing/TopologyRequests.py
5 Library RequestsLibrary
8 Resource KarafKeywords.robot
12 ${CONFIGURATION_XML} ${CURDIR}/../suites/topoprocessing/configuration.xml
13 ${OPERATIONAL_XML} ${CURDIR}/../suites/topoprocessing/operational.xml
14 ${REMOTE_FILE} ${WORKSPACE}/${BUNDLEFOLDER}/etc/opendaylight/karaf/80-topoprocessing-config.xml
18 [Arguments] ${request} ${overlay_topology_url}
19 [Documentation] Send a simple HTTP PUT request to Configurational datastore
20 ${resp} Put Request session ${CONFIG_API}/${overlay_topology_url} data=${request}
21 Log ${CONFIG_API}/${overlay_topology_url}
22 Should Be Equal As Strings ${resp.status_code} 200
23 Wait For Karaf Log Correlation configuration successfully read
24 Wait For Karaf Log Transaction successfully written
26 Basic Request Get And Test
27 [Arguments] ${overlay_topology_url} ${should_contain} ${times}
28 [Documentation] Send a simple HTTP GET request to a given URL and test if response contains the expected item X times
29 ${resp} Basic Request Get ${overlay_topology_url}
30 Should Contain X Times ${resp.content} ${should_contain} ${times}
34 [Arguments] ${overlay_topology_url}
35 [Documentation] Send a simple HTTP GET request to a given URL
36 ${resp} Get Request session ${OPERATIONAL_API}/${overlay_topology_url}
37 Should Be Equal As Strings ${resp.status_code} 200
40 Send Basic Request And Test If Contain X Times
41 [Arguments] ${request} ${overlay_topology_url} ${should_contain} ${times}
42 [Documentation] Send a basic HTTP PUT request to a given URL and test if response contains the expexted item X times
43 Basic Request Put ${request} ${overlay_topology_url}
44 ${resp} Wait Until Keyword Succeeds 40x 250ms Basic Request Get And Test ${overlay_topology_url} ${should_contain}
49 Send Basic Delete Request
51 [Documentation] Sends a HTTP/DELETE request to a given URL
52 ${resp} Delete Request session ${CONFIG_API}/${url}
53 Log Deleting ${CONFIG_API}/${url}
57 [Arguments] ${topology-id} ${node-id}
58 [Documentation] Deletes a node from an underlay topology
59 ${resp} Send Basic Delete Request network-topology:network-topology/topology/${topology-id}/node/${node-id}
63 [Documentation] Setup karaf enviroment for following tests
64 Log ---- Setup Environment ----
65 Open Connection ${ODL_SYSTEM_IP}
66 Flexible Controller Login
67 Put File ${CONFIGURATION_XML} ${REMOTE_FILE}
69 Issue Command On Karaf Console log:set DEBUG org.opendaylight.topoprocessing
70 Install a Feature odl-restconf-noauth timeout=30
71 Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${SEND_ACCEPT_XML_HEADERS}
72 ${features} Issue Command On Karaf Console feature:list -i
73 ${lines} Get Lines Containing String ${features} odl-topoprocessing-framework
74 ${length} Get Length ${lines}
75 Install a Feature odl-openflowplugin-nsf-model odl-topoprocessing-framework odl-topoprocessing-network-topology odl-topoprocessing-inventory odl-mdsal-models odl-ovsdb-southbound-impl timeout=120
76 Run Keyword If ${length} == 0 Wait For Karaf Log Registering Topology Request Listener 60
77 Prepare New Feature Installation
78 Insert Underlay topologies
81 [Documentation] Revert startup changes
82 Log ---- Clean Environment ----
83 Open Connection ${ODL_SYSTEM_IP}
84 Flexible Controller Login
85 Put File ${OPERATIONAL_XML} ${REMOTE_FILE}
89 Delete Overlay Topology
90 [Arguments] ${overlay_topology}
91 [Documentation] Delete overlay topologies from datastore
92 Log ---- Test Teardown ----
93 Log Deleting overlay topology from ${CONFIG_API}/${overlay_topology}
94 ${resp} Delete Request session ${CONFIG_API}/${overlay_topology}
95 Should Be Equal As Strings ${resp.status_code} 200
97 Refresh Underlay Topologies And Delete Overlay Topology
98 [Arguments] ${overlay_topology}
99 [Documentation] Deletes given overlay topology from datastore and overwrites the underlaying ones with initial topologies
100 Delete Overlay Topology ${overlay_topology}
101 Insert Underlay Topologies
103 Prepare New Feature Installation
104 [Documentation] Clears karaf logs and CONFIGURATION datastore
105 ${resp} Delete Request session ${CONFIG_API}/network-topology:network-topology
106 ${resp} Delete Request session ${CONFIG_API}/opendaylight-inventory:nodes
107 Issue Command On Karaf Console log:clear
109 Insert Underlay Topologies
110 [Documentation] Insert underlay topologies used by following tests
111 Log Inserting underlay topologies
112 # Network underlay topologies
113 : FOR ${index} IN RANGE 1 7
114 \ ${resp} Put Request session ${CONFIG_API}/${TOPOLOGY_URL}/network-topo:${index} data=${NETWORK_UNDERLAY_TOPOLOGY_${index}}
115 \ Log ${resp.content}
116 \ Should Be Equal As Strings ${resp.status_code} 200
117 # Openflow underlay nodes
118 ${resp} Put Request session ${CONFIG_API}/opendaylight-inventory:nodes data=${OPENFLOW_UNDERLAY_NODES}
120 Should Be Equal As Strings ${resp.status_code} 200
121 # Openflow underlay topologies
122 : FOR ${index} IN RANGE 1 7
123 \ ${resp} Put Request session ${CONFIG_API}/${TOPOLOGY_URL}/openflow-topo:${index} data=${OPENFLOW_UNDERLAY_TOPOLOGY_${index}}
124 \ Log ${resp.content}
125 \ Should Be Equal As Strings ${resp.status_code} 200
126 Issue Command On Karaf Console log:clear
129 Prepare Unification Inside Topology Request
130 [Arguments] ${request_template} ${model} ${correlation_item} ${underlay_topo1}
131 [Documentation] Prepare topology request for unification inside from template
132 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlations/output-model
133 ${request_template} Set Element Text ${request_template} aggregation-only xpath=.//correlations/correlation/type
134 ${request_template} Set Element Text ${request_template} ${correlation_item} xpath=.//correlation/correlation-item
135 ${request_template} Set Element Text ${request_template} unification xpath=.//correlation/aggregation/aggregation-type
136 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlation/aggregation/mapping[1]/input-model
137 ${request_template} Set Element Text ${request_template} ${underlay_topo1} xpath=.//correlation/aggregation/mapping[1]/underlay-topology
138 ${request_template} Element to String ${request_template}
139 [Return] ${request_template}
141 Prepare Unification Topology Request
142 [Arguments] ${request_template} ${model} ${correlation_item} ${underlay_topo1} ${underlay_topo2}
143 [Documentation] Prepare topology request for unification on two topologies from template
144 ${request_template} Prepare Unification Inside Topology Request ${request_template} ${model} ${correlation_item} ${underlay_topo1}
145 ${request_template} Set Element Text ${request_template} ${underlay_topo2} xpath=.//correlation/aggregation/mapping[2]/underlay-topology
146 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlation/aggregation/mapping[2]/input-model
147 ${request_template} Element to String ${request_template}
148 [Return] ${request_template}
150 Prepare Unification Filtration Topology Request
151 [Arguments] ${request_template} ${model} ${correlation_item} ${target_field1} ${underlay_topo1} ${target_field2}
152 ... ${underlay_topo2}
153 [Documentation] Prepare topology request for unification on two topologies from template
154 ${request_template} Prepare Unification Filtration Inside Topology Request ${request_template} ${model} ${correlation_item} ${target_field1} ${underlay_topo1}
155 ${request_template} Set Element Text ${request_template} ${underlay_topo2} xpath=.//correlation/aggregation/mapping[2]/underlay-topology
156 Insert Target Field ${request_template} 2 ${target_field2} 1
157 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlation/aggregation/mapping[2]/input-model
158 ${request_template} Element to String ${request_template}
159 [Return] ${request_template}
161 Prepare Unification Filtration Inside Topology Request
162 [Arguments] ${request_template} ${model} ${correlation_item} ${target-field} ${underlay_topo}
163 [Documentation] Prepare topology request for unification filtration inside from template
164 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlations/output-model
165 ${request_template} Set Element Text ${request_template} filtration-aggregation xpath=.//correlations/correlation/type
166 ${request_template} Set Element Text ${request_template} ${correlation_item} xpath=.//correlation/correlation-item
167 ${request_template} Set Element Text ${request_template} unification xpath=.//correlation/aggregation/aggregation-type
168 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlation/aggregation/mapping[1]/input-model
169 ${request_template} Set Element Text ${request_template} ${underlay_topo} xpath=.//correlation/aggregation/mapping[1]/underlay-topology
170 Insert Target Field ${request_template} 1 ${target-field} 1
171 ${request_template} Set Element Text ${request_template} ${underlay_topo} xpath=.//correlation/filtration/underlay-topology
172 ${request_template} Element to String ${request_template}
173 [Return] ${request_template}
176 [Arguments] ${request_template} ${mapping} ${filter_id}
177 ${request_template} Add Element ${request_template} ${APPLY_FILTERS} xpath=.//correlation/aggregation/mapping[${mapping}]
178 ${request_template} Set Element Text ${request_template} ${filter_id} xpath=.//correlation/aggregation/mapping[${mapping}]/apply-filters
179 [Return] ${request_template}
181 Prepare Filtration Topology Request
182 [Arguments] ${request_template} ${model} ${correlation_item} ${underlay_topo}
183 [Documentation] Prepare topology request for filtration from template
184 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlations/output-model
185 ${request_template} Set Element Text ${request_template} ${correlation_item} xpath=.//correlation/correlation-item
186 ${request_template} Set Element Text ${request_template} ${underlay_topo} xpath=.//correlation/filtration/underlay-topology
187 [Return] ${request_template}
190 [Arguments] ${request_template} ${mapping_index} ${target_field_path} ${matching_key}
191 [Documentation] Add target field to request
192 ${target_field_template} Set Element Text ${TARGET_FIELD} ${target_field_path} xpath=.//target-field-path
193 ${target_field_template} Set Element Text ${target_field_template} ${matching_key} xpath=.//matching-key
194 ${request_template} Add Element ${request_template} ${target_field_template} xpath=.//correlation/aggregation/mapping[${mapping_index}]
195 ${request_template} Element to String ${request_template}
196 [Return] ${request_template}
199 [Arguments] ${request_template} ${filter_template} ${target_field}
200 [Documentation] Add filter to filtration
201 ${request_template} Add Element ${request_template} ${filter_template} xpath=.//correlation/filtration
202 ${model} Get Element Text ${request_template} xpath=.//correlations/output-model
203 ${request_template} Set Element Text ${request_template} ${model} xpath=.//correlation/filtration/filter/input-model
204 ${request_template} Set Element Text ${request_template} ${target_field} xpath=.//correlation/filtration/filter/target-field
205 [Return] ${request_template}
207 Insert Filter With ID
208 [Arguments] ${request_template} ${filter_template} ${target_field} ${filter_id}
209 [Documentation] Add filter to filtration with specified id
210 ${request_template} Insert Filter ${request_template} ${filter_template} ${target_field}
211 ${request_template} Set Element Text ${request_template} ${filter_id} xpath=.//correlation/filtration/filter/filter-id
212 [Return] ${request_template}
215 [Arguments] ${request_template} ${ip_address}
216 [Documentation] Set filter ipv4 address
217 ${request_template} Set Element Text ${request_template} ${ip_address} xpath=.//correlation/filtration/filter/ipv4-address-filter/ipv4-address
218 ${request_template} Element to String ${request_template}
219 [Return] ${request_template}
221 Set Range Number Filter
222 [Arguments] ${request_template} ${min_number} ${max_number}
223 [Documentation] Set filter minimum and maximum number values
224 ${request_template} Set Element Text ${request_template} ${min_number} xpath=.//correlation/filtration/filter/range-number-filter/min-number-value
225 ${request_template} Set Element Text ${request_template} ${max_number} xpath=.//correlation/filtration/filter/range-number-filter/max-number-value
226 ${request_template} Element to String ${request_template}
227 [Return] ${request_template}
229 Set Range String Filter
230 [Arguments] ${request_template} ${min_value} ${max_value}
231 [Documentation] Set filter minimum and maximum string values
232 ${request_template} Set Element Text ${request_template} ${min_value} xpath=.//correlation/filtration/filter/range-string-filter/min-string-value
233 ${request_template} Set Element Text ${request_template} ${max_value} xpath=.//correlation/filtration/filter/range-string-filter/max-string-value
234 ${request_template} Element to String ${request_template}
235 [Return] ${request_template}
237 Set Specific Number Filter
238 [Arguments] ${request_template} ${number}
239 [Documentation] Set filter number value
240 ${request_template} Set Element Text ${request_template} ${number} xpath=.//correlation/filtration/filter/specific-number-filter/specific-number
241 ${request_template} Element to String ${request_template}
242 [Return] ${request_template}
244 Set Specific String Filter
245 [Arguments] ${request_template} ${string_value}
246 [Documentation] Set filter string value
247 ${request_template} Set Element Text ${request_template} ${string_value} xpath=.//correlation/filtration/filter/specific-string-filter/specific-string
248 ${request_template} Element to String ${request_template}
249 [Return] ${request_template}
252 [Arguments] ${request_template} ${ip_address}
253 [Documentation] Set filter ipv6 address
254 ${request_template} Set Element Text ${request_template} ${ip_address} xpath=.//correlation/filtration/filter/ipv6-address-filter/ipv6-address
255 ${request_template} Element to String ${request_template}
256 [Return] ${request_template}
259 [Arguments] ${request_template} ${script_language} ${script}
260 [Documentation] Set filter script
261 ${request_template} Set Element Text ${request_template} ${script_language} xpath=.//correlation/filtration/filter/script-filter/scripting/language
262 ${request_template} Set Element Text ${request_template} ${script} xpath=.//correlation/filtration/filter/script-filter/scripting/script
263 ${request_template} Element to String ${request_template}
264 [Return] ${request_template}
266 Insert Link Computation Inside
267 [Arguments] ${request_template} ${link_computation_template} ${input_model} ${underlay_topology}
268 [Documentation] Add link computation to request
269 ${request_template} Add Element ${request_template} ${link_computation_template} xpath=.
270 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/node-info/input-model
271 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/link-info/input-model
272 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/output-model
273 ${request_template} Set Element Text ${request_template} ${underlay_topology} xpath=.//link-computation/link-info/link-topology
274 ${request_template} Set Element Attribute ${request_template} xmlns:n urn:opendaylight:topology:correlation xpath=./link-computation
275 ${request_template} Element to String ${request_template}
276 [Return] ${request_template}
278 Insert Link Computation
279 [Arguments] ${request_template} ${link_computation_template} ${input_model} ${underlay_topology_1} ${underlay_topology_2}
280 [Documentation] Add link computation to request
281 ${request_template} Add Element ${request_template} ${link_computation_template} xpath=.
282 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/node-info/input-model
283 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/link-info[1]/input-model
284 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/link-info[2]/input-model
285 ${request_template} Set Element Text ${request_template} ${input_model} xpath=.//link-computation/output-model
286 ${request_template} Set Element Text ${request_template} ${underlay_topology_1} xpath=.//link-computation/link-info[1]/link-topology
287 ${request_template} Set Element Text ${request_template} ${underlay_topology_2} xpath=.//link-computation/link-info[2]/link-topology
288 ${request_template} Set Element Attribute ${request_template} xmlns:n urn:opendaylight:topology:correlation xpath=./link-computation
289 ${request_template} Element to String ${request_template}
290 [Return] ${request_template}
292 Insert Scripting into Request
293 [Arguments] ${request} ${language} ${script}
294 [Documentation] Insert Scripting into Request under aggregation node
295 ${request} Add Element ${request} ${SCRIPTING} xpath=.//correlation/aggregation
296 ${request} Set Element Text ${request} ${script} xpath=.//correlation/aggregation/scripting/script
297 ${request} Set Element Text ${request} ${language} xpath=.//correlation/aggregation/scripting/language
298 ${request} Element to String ${request}
302 [Arguments] ${node-id} ${ovs-version}=23 ${router-id-ipv4}=10.0.0.1
303 [Documentation] Create an isis node element with id and ip
304 ${request} Set Element Text ${NODE_ISIS} ${node-id} xpath=.//node-id
305 ${request} Set Element Text ${request} ${ovs-version} xpath=.//ovs-version
306 ${request} Set Element Text ${request} ${router-id-ipv4} xpath=.//igp-node-attributes/isis-node-attributes/ted/te-router-id-ipv4
307 ${request} Element to String ${request}
311 [Arguments] ${node-id} ${ip-address}=10.0.0.1 ${serial-number}=27
312 [Documentation] Create an Openflow node element with id and ip
313 ${request} Set Element Text ${NODE_OPENFLOW} ${node-id} xpath=.//id
314 ${request} Set Element Text ${request} ${ip-address} xpath=.//ip-address
315 ${request} Set Element Text ${request} ${serial-number} xpath=.//serial-number
316 ${request} Element to String ${request}
319 Create OVSDB Termination Point
320 [Arguments] ${tp-id} ${ofport}
321 [Documentation] Create an OVSDB termination point element with id and port
322 ${request} Set Element Text ${TERMINATION_POINT_OVSDB} ${tp-id} xpath=.//tp-id
323 ${request} Set Element Text ${request} ${ofport} xpath=.//ofport
324 ${request} Element to String ${request}
327 Create Openflow Node Connector
328 [Arguments] ${nc-id} ${port-number}
329 [Documentation] Create an Openflow node connector element with id and port number
330 ${request} Set Element Text ${NODE_CONNECTOR_OPENFLOW} ${nc-id} xpath=.//id
331 ${request} Set Element Text ${request} ${port-number} xpath=.//port-number
332 ${request} Element to String ${request}
336 [Arguments] ${link-id} ${source-node} ${dest-node} ${name} ${metric}
337 ${request} Set Element Text ${LINK} ${link-id} xpath=.//link-id
338 ${request} Set Element Text ${request} ${source-node} xpath=.//source/source-node
339 ${request} Set Element Text ${request} ${dest-node} xpath=.//destination/dest-node
340 ${request} Set Element Text ${request} ${name} xpath=.//igp-link-attributes/name
341 ${request} Set Element Text ${request} ${metric} xpath=.//igp-link-attributes/metric
342 ${request} Element to String ${request}
345 Extract Node from Topology
346 [Arguments] ${topology} ${supp_node_id}
347 [Documentation] Returns node that contains supporting node with ID specified in argument supp_node_id
348 ${xpath} Set Variable .//node/supporting-node[node-ref='${supp_node_id}']/..
349 ${node} Get Element ${topology} xpath=${xpath}
350 ${node} Element to String ${node}
353 Extract Termination Point from Topology
354 [Arguments] ${model} ${topology} ${topo_id} ${node_id} ${tp_id}
355 [Documentation] Returns termination point that contains supporting termination point from specified topology, node and with specified id
356 Check Supported Model ${model}
357 ${xpath} Set Variable If '${model}' == 'network-topology-model' or '${model}' == 'opendaylight-inventory-model' .//termination-point[tp-ref='/network-topology:network-topology/topology/${topo_id}/node/${node_id}/termination-point/${tp_id}'] .//termination-point/supporting-termination-point[tp-ref='${tp_id}']/..
358 ${tp} Get Element ${topology} xpath=${xpath}
359 ${tp} Element to String ${tp}
362 Extract Link from Topology
363 [Arguments] ${model} ${topology} ${topo_id} ${link_id}
364 [Documentation] Returns link that contains supporting link
365 Check Supported Model ${model}
366 ${xpath} Set Variable If '${model}' == 'network-topology-model' or '${model}' == 'opendaylight-inventory-model' .//link/supporting-link[link-ref='/network-topology/topology/${topo_id}/link/${link_id}']/.. .//link/supporting-link[tp-ref='${tp_id}']/..
367 ${link} Get Element ${topology} xpath=${xpath}
368 ${link} Element to String ${link}
371 Check Supported Model
373 [Documentation] Checks if model is supported.
374 Run Keyword If '${model}' != 'network-topology-model' and '${model}' != 'i2rs-model' and '${model}' != 'opendaylight-inventory-model' Fail Not supported model
376 Check Aggregated Node in Topology
377 [Arguments] ${model} ${topology} ${tp_count} @{supp_node_ids}
378 [Documentation] Checks number of termination points and concrete supporting nodes in aggregated node and returns overlay node id. Model should be 'network-topology-model', 'opendaylight-inventory-model' or 'i2rs-model'.
379 Check Supported Model ${model}
380 ${node_id} Get From List ${supp_node_ids} 0
381 ${aggregated_node} Extract Node from Topology ${topology} ${node_id}
382 ${supp_node_count} Get Length ${supp_node_ids}
383 Should Contain X Times ${aggregated_node} <supporting-node> ${supp_node_count}
384 Should Contain X Times ${aggregated_node} <termination-point> ${tp_count}
385 Should Contain X Times ${aggregated_node} <tp-ref> ${tp_count}
386 : FOR ${supp_node_id} IN @{supp_node_ids}
387 \ Element Text Should Be ${aggregated_node} ${supp_node_id} xpath=.//supporting-node[node-ref='${supp_node_id}']/node-ref
388 ${overlay_node_id} Get Element Text ${aggregated_node} xpath=./node-id
389 [Return] ${overlay_node_id}
391 Check Aggregated Termination Point in Node
392 [Arguments] ${model} ${topology} ${topology_id} ${node_id} ${tp_id} @{supp_tp_ids}
393 [Documentation] Checks supporting termination points in aggregated termination point. Model should be 'network-topology-model', 'opendaylight-inventory-model' or 'i2rs-model'.
394 Check Supported Model ${model}
395 ${tp} Extract Termination Point from Topology ${model} ${topology} ${topology_id} ${node_id} ${tp_id}
396 ${supp_tp_count} Get Length ${supp_tp_ids}
397 Should Contain X Times ${tp} <tp-ref> ${supp_tp_count}
398 : FOR ${supp_tp_id} IN @{supp_tp_ids}
399 \ Should Contain X Times ${tp} ${supp_tp_id}</tp-ref> 1
401 Check Filtered Nodes in Topology
402 [Arguments] ${topology} ${tp_count} @{node_ids}
403 [Documentation] Checks nodes in filtered topology
404 ${node_count} Get Length ${node_ids}
405 Should Contain X Times ${topology} <node> ${node_count}
406 Should Contain X Times ${topology} <supporting-node> ${node_count}
407 Should Contain X Times ${topology} <termination-point> ${tp_count}
408 : FOR ${node_id} IN @{node_ids}
409 \ Element Text Should Be ${topology} ${node_id} xpath=.//node/supporting-node[node-ref='${node_id}']/node-ref
411 Check Filtered Termination Points in Node
412 [Arguments] ${topology} ${supp_node_id} @{supp_tp_ids}
413 [Documentation] Checks termination points in filtered topology
414 ${node} Extract Node from Topology ${topology} ${supp_node_id}
415 ${supp_tp_count} Get Length ${supp_tp_ids}
416 Should Contain X Times ${node} <supporting-node> 1
417 Should Contain X Times ${node} <termination-point> ${supp_tp_count}
418 Should Contain X Times ${node} <tp-ref> ${supp_tp_count}
419 : FOR ${supp_tp_id} IN @{supp_tp_ids}
420 \ Should Contain X Times ${node} ${supp_tp_id} 1
422 Check Filtered Links In Topology
423 [Arguments] ${topology} @{supp_link_ids}
424 [Documentation] Checks links in filtered topology
425 ${supp_link_count} Get Length ${supp_link_ids}
426 Should Contain X Times ${topology} <link> ${supp_link_count}
427 Should Contain X Times ${topology} <link-ref> ${supp_link_count}
428 : FOR ${supp_link_id} IN @{supp_link_ids}
429 \ Should Contain X Times ${topology} ${supp_link_id}</link-ref> 1
431 Check Overlay Link Source And Destination
432 [Arguments] ${model} ${topology} ${topo_id} ${link_id} ${expected_source} ${expected_destination}
433 [Documentation] Checks if the overlay link's source and destination specified by a supporting link ref matches given source and destination
434 ${link} Extract Link from Topology ${model} ${topology} ${topo_id} ${link_id}
435 ${link_source} Get Element Text ${link} xpath=.//source-node
436 ${link_destination} Get Element Text ${link} xpath=.//dest-node
437 Should Be Equal As Strings ${link_source} ${expected_source}
438 Should Be Equal As Strings ${link_destination} ${expected_destination}