Add tests of node removal processing during unification op.
[integration/test.git] / csit / libraries / TopoprocessingKeywords.robot
1 *** Settings ***
2 Variables         ../variables/Variables.py
3 Variables         ../variables/topoprocessing/Topologies.py
4 Variables         ../variables/topoprocessing/TopologyRequests.py
5 Library           RequestsLibrary
6 Library           SSHLibrary
7 Library           XML
8 Resource          KarafKeywords.robot
9 Resource          Utils.robot
10
11 *** Variables ***
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
15
16 *** Keywords ***
17 Basic Request Put
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
25
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}
31     [Return]    ${resp}
32
33 Basic Request Get
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
38     [Return]    ${resp}
39
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}
45     ...    ${times}
46     Log    ${resp.content}
47     [Return]    ${resp}
48
49 Send Basic Delete Request
50     [Documentation]    Sends a HTTP/DELETE request to a given URL
51     [Arguments]    ${url}
52     ${resp}    Delete Request    session    ${CONFIG_API}/${url}
53     Log    Deleting ${CONFIG_API}/${url}
54     [Return]    ${resp}
55
56 Delete Underlay Node
57     [Documentation]    Deletes a node from an underlay topology
58     [Arguments]    ${topology-id}    ${node-id}
59     ${resp}    Send Basic Delete Request    network-topology:network-topology/topology/${topology-id}/node/${node-id}
60     [Return]    ${resp}
61
62 Setup Environment
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}
68     Close Connection
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
79
80 Clean Environment
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}
86     Close Connection
87     Delete All Sessions
88
89 Test Teardown
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
96
97 Test Teardown With Underlay Topologies Refresh
98     [Arguments]    ${overlay_topology}
99     [Documentation]    Deletes given overlay topology from datastore and overwrites the underlaying ones with initial topologies
100     Test Teardown    ${overlay_topology}
101     Insert Underlay Topologies
102
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
108
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}
119     Log    ${resp.content}
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
127     Log    ${resp.content}
128
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}
140
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}
149
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}
160
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}
174
175 Insert Apply Filters
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}
180
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}
188
189 Insert Target Field
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}
197
198 Insert Filter
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}
206
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}
213
214 Set IPV4 Filter
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}
220
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}
228
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}
236
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}
243
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}
250
251 Set IPV6 Filter
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}
257
258 Set Script Filter
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}
265
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}
277
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}
291
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}
299     [Return]    ${request}
300
301 Create Isis Node
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}
308     [Return]    ${request}
309
310 Create Openflow Node
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}
317     [Return]    ${request}
318
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}
325     [Return]    ${request}
326
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}
333     [Return]    ${request}
334
335 Create Link
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}
343     [Return]    ${request}
344
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}
351     [Return]    ${node}
352
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}
360     [Return]    ${tp}
361
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}
369     [Return]    ${link}
370
371 Check Supported Model
372     [Arguments]    ${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
375
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}
390
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
400
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
410
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
421
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
430
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}