ede3e594e15b284d3c2628a2dd3da5621be7c031
[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          CompareStream.robot
9 Resource          KarafKeywords.robot
10 Resource          SetupUtils.robot
11 Resource          Utils.robot
12
13 *** Variables ***
14 ${CONFIGURATION_XML}    ${CURDIR}/../suites/topoprocessing/configuration.xml
15 ${OPERATIONAL_XML}    ${CURDIR}/../suites/topoprocessing/operational.xml
16 ${CONFIGURATION_CFG}    ${CURDIR}/../suites/topoprocessing/configuration.cfg
17 ${OPERATIONAL_CFG}    ${CURDIR}/../suites/topoprocessing/operational.cfg
18 ${REMOTE_XML_FILE}    ${WORKSPACE}/${BUNDLEFOLDER}/etc/opendaylight/karaf/80-topoprocessing-config.xml
19 ${REMOTE_CFG_FILE}    ${WORKSPACE}/${BUNDLEFOLDER}/etc/org.opendaylight.topoprocessing.cfg
20 ${OUTPUT_TOPO_NAME}    topo:1
21 ${OVERLAY_TOPO_URL}    ${TOPOLOGY_URL}/${OUTPUT_TOPO_NAME}
22
23 *** Keywords ***
24 Basic Request Put
25     [Arguments]    ${request}    ${overlay_topology_url}
26     [Documentation]    Send a simple HTTP PUT request to Configurational datastore
27     ${resp}    Put Request    session    ${CONFIG_API}/${overlay_topology_url}    data=${request}
28     Log    ${CONFIG_API}/${overlay_topology_url}
29     Should Match    "${resp.status_code}"    "20?"
30     Wait For Karaf Log    Correlation configuration successfully read
31     Wait For Karaf Log    Transaction successfully written
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 Delete Request
41     [Arguments]    ${url}
42     [Documentation]    Sends a HTTP/DELETE request to a given URL
43     ${resp}    Delete Request    session    ${CONFIG_API}/${url}
44     Log    Deleting ${CONFIG_API}/${url}
45     [Return]    ${resp}
46
47 Delete Underlay Node
48     [Arguments]    ${topology-id}    ${node-id}
49     [Documentation]    Deletes a node from an underlay topology
50     ${resp}    Send Basic Delete Request    ${TOPOLOGY_URL}/${topology-id}/node/${node-id}
51     [Return]    ${resp}
52
53 Delete Underlay Termination Point
54     [Arguments]    ${topology-id}    ${node-id}    ${tp-id}
55     [Documentation]    Deletes a termination point from an underlay topology
56     ${resp}    Send Basic Delete Request    ${TOPOLOGY_URL}/${topology-id}/node/${node-id}/termination-point/${tp-id}
57     [Return]    ${resp}
58
59 Delete Underlay Link
60     [Arguments]    ${topology-id}    ${link-id}
61     [Documentation]    Deletes a link from an underlay topology
62     ${resp}    Send Basic Delete Request    ${TOPOLOGY_URL}/${topology-id}/link/${link-id}
63     [Return]    ${resp}
64
65 Setup Environment
66     [Documentation]    Setup karaf enviroment for following tests
67     Log    ---- Setup Environment ----
68     SetupUtils.Setup_Utils_For_Setup_And_Teardown
69     Open Connection    ${ODL_SYSTEM_IP}
70     Flexible Controller Login
71     Put File    ${CONFIGURATION_CFG}    ${REMOTE_CFG_FILE}
72     Close Connection
73     Wait Until Keyword Succeeds    2x    2s    Issue Command On Karaf Console    log:set DEBUG org.opendaylight.topoprocessing
74     Create Session    session    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}    headers=${SEND_ACCEPT_XML_HEADERS}
75     Prepare New Feature Installation
76     Insert Underlay topologies
77
78 Install Features
79     [Arguments]    ${features}    ${timeout}=180
80     [Documentation]    Install features according to tested distribution
81     Install Features for Other Distributions    ${features}    ${timeout}
82
83 Install Features for Beryllium Distribution
84     [Arguments]    ${features}    ${timeout}
85     [Documentation]    Will wait for features to install only once per run
86     Install a Feature    ${features}    timeout=${timeout}
87     Set Global Variable If It Does Not Exist    \${WAIT_FOR_FEATURES_TO_INSTALL}    ${TRUE}
88     Run Keyword If    ${WAIT_FOR_FEATURES_TO_INSTALL}    Run Keywords    Wait For Karaf Log    Registering Topology Request Listener    ${timeout}
89     ...    AND    Set Global Variable    \${WAIT_FOR_FEATURES_TO_INSTALL}    ${FALSE}
90
91 Install Features for Other Distributions
92     [Arguments]    ${features}    ${timeout}
93     [Documentation]    Will wait for features to install only if no topoprocessing feature was installed
94     ${installed_features}    Issue Command On Karaf Console    feature:list -i
95     ${lines}    Get Lines Containing String    ${installed_features}    odl-topoprocessing-framework
96     ${length}    Get Length    ${lines}
97     Install a Feature    ${features}    timeout=${timeout}
98     Run Keyword If    ${length} == 0    Wait For Karaf Log    Registering Topology Request Listener    ${timeout}
99
100 Clean Environment
101     [Documentation]    Revert startup changes
102     Log    ---- Clean Environment ----
103     Open Connection    ${ODL_SYSTEM_IP}
104     Flexible Controller Login
105     Put File    ${OPERATIONAL_CFG}    ${REMOTE_CFG_FILE}
106     Close Connection
107     Delete All Sessions
108
109 Delete Overlay Topology
110     [Documentation]    Delete overlay topologies from datastore
111     Run Keyword If Test Failed    Print Output Topo
112     Log    ---- Test Teardown ----
113     Log    Deleting overlay topology from ${CONFIG_API}/${OVERLAY_TOPO_URL}
114     ${resp}    Delete Request    session    ${CONFIG_API}/${OVERLAY_TOPO_URL}
115     Should Be Equal As Strings    ${resp.status_code}    200
116
117 Print Output Topo
118     [Documentation]    Waits a while to allow any hanging transactions to finnish and then logs the output topology
119     Log    ---- Output Topo Dump After Cooldown----
120     Sleep    2s
121     ${resp}    Wait Until Keyword Succeeds    5x    250ms    Basic Request Get    ${OVERLAY_TOPO_URL}
122     Log    ${resp.content}
123
124 Refresh Underlay Topologies And Delete Overlay Topology
125     [Documentation]    Deletes given overlay topology from datastore and overwrites the underlaying ones with initial topologies
126     Delete Overlay Topology
127     Insert Underlay Topologies
128
129 Prepare New Feature Installation
130     [Documentation]    Clears karaf logs and CONFIGURATION datastore
131     ${resp}    Delete Request    session    ${CONFIG_API}/network-topology:network-topology
132     ${resp}    Delete Request    session    ${CONFIG_API}/opendaylight-inventory:nodes
133     Issue Command On Karaf Console    log:clear
134
135 Insert Underlay Topologies
136     [Documentation]    Insert underlay topologies used by following tests
137     Log    Inserting underlay topologies
138     # Network underlay topologies
139     : FOR    ${index}    IN RANGE    1    7
140     \    ${resp}    Put Request    session    ${CONFIG_API}/${TOPOLOGY_URL}/network-topo:${index}    data=${NETWORK_UNDERLAY_TOPOLOGY_${index}}
141     \    Log    ${resp.content}
142     \    Should Match    "${resp.status_code}"    "20?"
143     # Openflow underlay nodes
144     ${resp}    Put Request    session    ${CONFIG_API}/opendaylight-inventory:nodes    data=${OPENFLOW_UNDERLAY_NODES}
145     Log    ${resp.content}
146     Should Match    "${resp.status_code}"    "20?"
147     # Openflow underlay topologies
148     : FOR    ${index}    IN RANGE    1    7
149     \    ${resp}    Put Request    session    ${CONFIG_API}/${TOPOLOGY_URL}/openflow-topo:${index}    data=${OPENFLOW_UNDERLAY_TOPOLOGY_${index}}
150     \    Log    ${resp.content}
151     \    Should Match    "${resp.status_code}"    "20?"
152     Issue Command On Karaf Console    log:clear
153     Log    ${resp.content}
154
155 Prepare Unification Inside Topology Request
156     [Arguments]    ${request_template}    ${model}    ${correlation_item}    ${underlay_topo1}
157     [Documentation]    Prepare topology request for unification inside from template
158     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlations/output-model
159     ${request_template}    Set Element Text    ${request_template}    aggregation-only    xpath=.//correlations/correlation/type
160     ${request_template}    Set Element Text    ${request_template}    ${correlation_item}    xpath=.//correlation/correlation-item
161     ${request_template}    Set Element Text    ${request_template}    unification    xpath=.//correlation/aggregation/aggregation-type
162     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlation/aggregation/mapping[1]/input-model
163     ${request_template}    Set Element Text    ${request_template}    ${underlay_topo1}    xpath=.//correlation/aggregation/mapping[1]/underlay-topology
164     ${request_template}    Element to String    ${request_template}
165     [Return]    ${request_template}
166
167 Prepare Unification Topology Request
168     [Arguments]    ${request_template}    ${model}    ${correlation_item}    ${underlay_topo1}    ${underlay_topo2}
169     [Documentation]    Prepare topology request for unification on two topologies from template
170     ${request_template}    Prepare Unification Inside Topology Request    ${request_template}    ${model}    ${correlation_item}    ${underlay_topo1}
171     ${request_template}    Set Element Text    ${request_template}    ${underlay_topo2}    xpath=.//correlation/aggregation/mapping[2]/underlay-topology
172     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlation/aggregation/mapping[2]/input-model
173     ${request_template}    Element to String    ${request_template}
174     [Return]    ${request_template}
175
176 Prepare Unification Filtration Topology Request
177     [Arguments]    ${request_template}    ${model}    ${correlation_item}    ${target_field1}    ${underlay_topo1}    ${target_field2}
178     ...    ${underlay_topo2}
179     [Documentation]    Prepare topology request for unification on two topologies from template
180     ${request_template}    Prepare Unification Filtration Inside Topology Request    ${request_template}    ${model}    ${correlation_item}    ${target_field1}    ${underlay_topo1}
181     ${request_template}    Set Element Text    ${request_template}    ${underlay_topo2}    xpath=.//correlation/aggregation/mapping[2]/underlay-topology
182     Insert Target Field    ${request_template}    2    ${target_field2}    1
183     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlation/aggregation/mapping[2]/input-model
184     ${request_template}    Element to String    ${request_template}
185     [Return]    ${request_template}
186
187 Prepare Unification Filtration Inside Topology Request
188     [Arguments]    ${request_template}    ${model}    ${correlation_item}    ${target-field}    ${underlay_topo}
189     [Documentation]    Prepare topology request for unification filtration inside from template
190     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlations/output-model
191     ${request_template}    Set Element Text    ${request_template}    filtration-aggregation    xpath=.//correlations/correlation/type
192     ${request_template}    Set Element Text    ${request_template}    ${correlation_item}    xpath=.//correlation/correlation-item
193     ${request_template}    Set Element Text    ${request_template}    unification    xpath=.//correlation/aggregation/aggregation-type
194     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlation/aggregation/mapping[1]/input-model
195     ${request_template}    Set Element Text    ${request_template}    ${underlay_topo}    xpath=.//correlation/aggregation/mapping[1]/underlay-topology
196     Insert Target Field    ${request_template}    1    ${target-field}    1
197     ${request_template}    Set Element Text    ${request_template}    ${underlay_topo}    xpath=.//correlation/filtration/underlay-topology
198     ${request_template}    Element to String    ${request_template}
199     [Return]    ${request_template}
200
201 Insert Apply Filters
202     [Arguments]    ${request_template}    ${mapping}    ${filter_id}
203     ${request_template}    Add Element    ${request_template}    ${APPLY_FILTERS}    xpath=.//correlation/aggregation/mapping[${mapping}]
204     ${request_template}    Set Element Text    ${request_template}    ${filter_id}    xpath=.//correlation/aggregation/mapping[${mapping}]/apply-filters
205     [Return]    ${request_template}
206
207 Prepare Filtration Topology Request
208     [Arguments]    ${request_template}    ${model}    ${correlation_item}    ${underlay_topo}
209     [Documentation]    Prepare topology request for filtration from template
210     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlations/output-model
211     ${request_template}    Set Element Text    ${request_template}    ${correlation_item}    xpath=.//correlation/correlation-item
212     ${request_template}    Set Element Text    ${request_template}    ${underlay_topo}    xpath=.//correlation/filtration/underlay-topology
213     [Return]    ${request_template}
214
215 Insert Target Field
216     [Arguments]    ${request_template}    ${mapping_index}    ${target_field_path}    ${matching_key}
217     [Documentation]    Add target field to request
218     ${target_field_template}    Set Element Text    ${TARGET_FIELD}    ${target_field_path}    xpath=.//target-field-path
219     ${target_field_template}    Set Element Text    ${target_field_template}    ${matching_key}    xpath=.//matching-key
220     ${request_template}    Add Element    ${request_template}    ${target_field_template}    xpath=.//correlation/aggregation/mapping[${mapping_index}]
221     ${request_template}    Element to String    ${request_template}
222     [Return]    ${request_template}
223
224 Insert Filter
225     [Arguments]    ${request_template}    ${filter_template}    ${target_field}
226     [Documentation]    Add filter to filtration
227     ${request_template}    Add Element    ${request_template}    ${filter_template}    xpath=.//correlation/filtration
228     ${model}    Get Element Text    ${request_template}    xpath=.//correlations/output-model
229     ${request_template}    Set Element Text    ${request_template}    ${model}    xpath=.//correlation/filtration/filter/input-model
230     ${request_template}    Set Element Text    ${request_template}    ${target_field}    xpath=.//correlation/filtration/filter/target-field
231     [Return]    ${request_template}
232
233 Insert Filter With ID
234     [Arguments]    ${request_template}    ${filter_template}    ${target_field}    ${filter_id}
235     [Documentation]    Add filter to filtration with specified id
236     ${request_template}    Insert Filter    ${request_template}    ${filter_template}    ${target_field}
237     ${request_template}    Set Element Text    ${request_template}    ${filter_id}    xpath=.//correlation/filtration/filter/filter-id
238     [Return]    ${request_template}
239
240 Set IPV4 Filter
241     [Arguments]    ${request_template}    ${ip_address}
242     [Documentation]    Set filter ipv4 address
243     ${request_template}    Set Element Text    ${request_template}    ${ip_address}    xpath=.//correlation/filtration/filter/ipv4-address-filter/ipv4-address
244     ${request_template}    Element to String    ${request_template}
245     [Return]    ${request_template}
246
247 Set Range Number Filter
248     [Arguments]    ${request_template}    ${min_number}    ${max_number}
249     [Documentation]    Set filter minimum and maximum number values
250     ${request_template}    Set Element Text    ${request_template}    ${min_number}    xpath=.//correlation/filtration/filter/range-number-filter/min-number-value
251     ${request_template}    Set Element Text    ${request_template}    ${max_number}    xpath=.//correlation/filtration/filter/range-number-filter/max-number-value
252     ${request_template}    Element to String    ${request_template}
253     [Return]    ${request_template}
254
255 Set Range String Filter
256     [Arguments]    ${request_template}    ${min_value}    ${max_value}
257     [Documentation]    Set filter minimum and maximum string values
258     ${request_template}    Set Element Text    ${request_template}    ${min_value}    xpath=.//correlation/filtration/filter/range-string-filter/min-string-value
259     ${request_template}    Set Element Text    ${request_template}    ${max_value}    xpath=.//correlation/filtration/filter/range-string-filter/max-string-value
260     ${request_template}    Element to String    ${request_template}
261     [Return]    ${request_template}
262
263 Set Specific Number Filter
264     [Arguments]    ${request_template}    ${number}
265     [Documentation]    Set filter number value
266     ${request_template}    Set Element Text    ${request_template}    ${number}    xpath=.//correlation/filtration/filter/specific-number-filter/specific-number
267     ${request_template}    Element to String    ${request_template}
268     [Return]    ${request_template}
269
270 Set Specific String Filter
271     [Arguments]    ${request_template}    ${string_value}
272     [Documentation]    Set filter string value
273     ${request_template}    Set Element Text    ${request_template}    ${string_value}    xpath=.//correlation/filtration/filter/specific-string-filter/specific-string
274     ${request_template}    Element to String    ${request_template}
275     [Return]    ${request_template}
276
277 Set IPV6 Filter
278     [Arguments]    ${request_template}    ${ip_address}
279     [Documentation]    Set filter ipv6 address
280     ${request_template}    Set Element Text    ${request_template}    ${ip_address}    xpath=.//correlation/filtration/filter/ipv6-address-filter/ipv6-address
281     ${request_template}    Element to String    ${request_template}
282     [Return]    ${request_template}
283
284 Set Script Filter
285     [Arguments]    ${request_template}    ${script_language}    ${script}
286     [Documentation]    Set filter script
287     ${request_template}    Set Element Text    ${request_template}    ${script_language}    xpath=.//correlation/filtration/filter/script-filter/scripting/language
288     ${request_template}    Set Element Text    ${request_template}    ${script}    xpath=.//correlation/filtration/filter/script-filter/scripting/script
289     ${request_template}    Element to String    ${request_template}
290     [Return]    ${request_template}
291
292 Insert Link Computation Inside
293     [Arguments]    ${request_template}    ${link_computation_template}    ${input_model}    ${underlay_topology}
294     [Documentation]    Add link computation to request
295     ${request_template}    Add Element    ${request_template}    ${link_computation_template}    xpath=.
296     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/node-info/input-model
297     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/link-info/input-model
298     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/output-model
299     ${request_template}    Set Element Text    ${request_template}    ${underlay_topology}    xpath=.//link-computation/link-info/link-topology
300     ${request_template}    Set Element Attribute    ${request_template}    xmlns:n    urn:opendaylight:topology:correlation    xpath=./link-computation
301     ${request_template}    Element to String    ${request_template}
302     [Return]    ${request_template}
303
304 Insert Link Computation
305     [Arguments]    ${request_template}    ${link_computation_template}    ${input_model}    ${underlay_topology_1}    ${underlay_topology_2}
306     [Documentation]    Add link computation to request
307     ${request_template}    Add Element    ${request_template}    ${link_computation_template}    xpath=.
308     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/node-info/input-model
309     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/link-info[1]/input-model
310     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/link-info[2]/input-model
311     ${request_template}    Set Element Text    ${request_template}    ${input_model}    xpath=.//link-computation/output-model
312     ${request_template}    Set Element Text    ${request_template}    ${underlay_topology_1}    xpath=.//link-computation/link-info[1]/link-topology
313     ${request_template}    Set Element Text    ${request_template}    ${underlay_topology_2}    xpath=.//link-computation/link-info[2]/link-topology
314     ${request_template}    Set Element Attribute    ${request_template}    xmlns:n    urn:opendaylight:topology:correlation    xpath=./link-computation
315     ${request_template}    Element to String    ${request_template}
316     [Return]    ${request_template}
317
318 Insert Scripting into Request
319     [Arguments]    ${request}    ${language}    ${script}
320     [Documentation]    Insert Scripting into Request under aggregation node
321     ${request}    Add Element    ${request}    ${SCRIPTING}    xpath=.//correlation/aggregation
322     ${request}    Set Element Text    ${request}    ${script}    xpath=.//correlation/aggregation/scripting/script
323     ${request}    Set Element Text    ${request}    ${language}    xpath=.//correlation/aggregation/scripting/language
324     ${request}    Element to String    ${request}
325     [Return]    ${request}
326
327 Create Isis Node
328     [Arguments]    ${node-id}    ${ovs-version}=23    ${router-id-ipv4}=10.0.0.1
329     [Documentation]    Create an isis node element with id and ip
330     ${request}    Set Element Text    ${NODE_ISIS}    ${node-id}    xpath=.//node-id
331     ${request}    Set Element Text    ${request}    ${ovs-version}    xpath=.//ovs-version
332     ${request}    Set Element Text    ${request}    ${router-id-ipv4}    xpath=.//igp-node-attributes/isis-node-attributes/ted/te-router-id-ipv4
333     ${request}    Element to String    ${request}
334     [Return]    ${request}
335
336 Create Openflow Node
337     [Arguments]    ${node-id}    ${ip-address}=10.0.0.1    ${serial-number}=27
338     [Documentation]    Create an Openflow node element with id and ip
339     ${request}    Set Element Text    ${NODE_OPENFLOW}    ${node-id}    xpath=.//id
340     ${request}    Set Element Text    ${request}    ${ip-address}    xpath=.//ip-address
341     ${request}    Set Element Text    ${request}    ${serial-number}    xpath=.//serial-number
342     ${request}    Element to String    ${request}
343     [Return]    ${request}
344
345 Create OVSDB Termination Point
346     [Arguments]    ${tp-id}    ${ofport}
347     [Documentation]    Create an OVSDB termination point element with id and port
348     ${request}    Set Element Text    ${TERMINATION_POINT_OVSDB}    ${tp-id}    xpath=.//tp-id
349     ${request}    Set Element Text    ${request}    ${ofport}    xpath=.//ofport
350     ${request}    Element to String    ${request}
351     [Return]    ${request}
352
353 Create Openflow Node Connector
354     [Arguments]    ${nc-id}    ${port-number}
355     [Documentation]    Create an Openflow node connector element with id and port number
356     ${request}    Set Element Text    ${NODE_CONNECTOR_OPENFLOW}    ${nc-id}    xpath=.//id
357     ${request}    Set Element Text    ${request}    ${port-number}    xpath=.//port-number
358     ${request}    Element to String    ${request}
359     [Return]    ${request}
360
361 Create Link
362     [Arguments]    ${link-id}    ${source-node}    ${dest-node}    ${name}    ${metric}
363     ${request}    Set Element Text    ${LINK}    ${link-id}    xpath=.//link-id
364     ${request}    Set Element Text    ${request}    ${source-node}    xpath=.//source/source-node
365     ${request}    Set Element Text    ${request}    ${dest-node}    xpath=.//destination/dest-node
366     ${request}    Set Element Text    ${request}    ${name}    xpath=.//igp-link-attributes/name
367     ${request}    Set Element Text    ${request}    ${metric}    xpath=.//igp-link-attributes/metric
368     ${request}    Element to String    ${request}
369     [Return]    ${request}
370
371 Extract Node from Topology
372     [Arguments]    ${topology}    ${supp_node_id}
373     [Documentation]    Returns node that contains supporting node with ID specified in argument supp_node_id
374     ${xpath}    Set Variable    .//node/supporting-node[node-ref='${supp_node_id}']/..
375     ${node}    Get Element    ${topology}    xpath=${xpath}
376     ${node}    Element to String    ${node}
377     [Return]    ${node}
378
379 Extract Termination Point from Topology
380     [Arguments]    ${model}    ${topology}    ${topo_id}    ${node_id}    ${tp_id}
381     [Documentation]    Returns termination point that contains supporting termination point from specified topology, node and with specified id
382     Check Supported Model    ${model}
383     ${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}']/..
384     ${tp}    Get Element    ${topology}    xpath=${xpath}
385     ${tp}    Element to String    ${tp}
386     [Return]    ${tp}
387
388 Extract Link from Topology
389     [Arguments]    ${model}    ${topology}    ${topo_id}    ${link_id}
390     [Documentation]    Returns link that contains supporting link
391     Check Supported Model    ${model}
392     ${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}']/..
393     ${link}    Get Element    ${topology}    xpath=${xpath}
394     ${link}    Element to String    ${link}
395     [Return]    ${link}
396
397 Check Supported Model
398     [Arguments]    ${model}
399     [Documentation]    Checks if model is supported.
400     Run Keyword If    '${model}' != 'network-topology-model' and '${model}' != 'i2rs-model' and '${model}' != 'opendaylight-inventory-model'    Fail    Not supported model
401
402 Check Aggregated Node in Topology
403     [Arguments]    ${model}    ${topology}    ${tp_count}    @{supp_node_ids}
404     [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'.
405     Check Supported Model    ${model}
406     ${node_id}    Get From List    ${supp_node_ids}    0
407     ${aggregated_node}    Extract Node from Topology    ${topology}    ${node_id}
408     ${supp_node_count}    Get Length    ${supp_node_ids}
409     Should Contain X Times    ${aggregated_node}    <supporting-node>    ${supp_node_count}
410     Should Contain X Times    ${aggregated_node}    <termination-point>    ${tp_count}
411     Should Contain X Times    ${aggregated_node}    <tp-ref>    ${tp_count}
412     : FOR    ${supp_node_id}    IN    @{supp_node_ids}
413     \    Element Text Should Be    ${aggregated_node}    ${supp_node_id}    xpath=.//supporting-node[node-ref='${supp_node_id}']/node-ref
414     ${overlay_node_id}    Get Element Text    ${aggregated_node}    xpath=./node-id
415     [Return]    ${overlay_node_id}
416
417 Check Aggregated Termination Point in Node
418     [Arguments]    ${model}    ${topology}    ${topology_id}    ${node_id}    ${tp_id}    @{supp_tp_ids}
419     [Documentation]    Checks supporting termination points in aggregated termination point. Model should be 'network-topology-model', 'opendaylight-inventory-model' or 'i2rs-model'.
420     Check Supported Model    ${model}
421     ${tp}    Extract Termination Point from Topology    ${model}    ${topology}    ${topology_id}    ${node_id}    ${tp_id}
422     ${supp_tp_count}    Get Length    ${supp_tp_ids}
423     Should Contain X Times    ${tp}    <tp-ref>    ${supp_tp_count}
424     : FOR    ${supp_tp_id}    IN    @{supp_tp_ids}
425     \    Should Contain X Times    ${tp}    ${supp_tp_id}</tp-ref>    1
426
427 Check Filtered Nodes in Topology
428     [Arguments]    ${topology}    ${tp_count}    @{node_ids}
429     [Documentation]    Checks nodes in filtered topology
430     : FOR    ${node_id}    IN    @{node_ids}
431     \    Element Text Should Be    ${topology}    ${node_id}    xpath=.//node/supporting-node[node-ref='${node_id}']/node-ref
432
433 Check Filtered Termination Points in Node
434     [Arguments]    ${topology}    ${supp_node_id}    @{supp_tp_ids}
435     [Documentation]    Checks termination points in filtered topology
436     ${node}    Extract Node from Topology    ${topology}    ${supp_node_id}
437     ${supp_tp_count}    Get Length    ${supp_tp_ids}
438     Should Contain X Times    ${node}    <supporting-node>    1
439     Should Contain X Times    ${node}    <termination-point>    ${supp_tp_count}
440     Should Contain X Times    ${node}    <tp-ref>    ${supp_tp_count}
441     : FOR    ${supp_tp_id}    IN    @{supp_tp_ids}
442     \    Should Contain X Times    ${node}    ${supp_tp_id}    1
443
444 Check Filtered Links In Topology
445     [Arguments]    ${topology}    @{supp_link_ids}
446     [Documentation]    Checks links in filtered topology
447     : FOR    ${supp_link_id}    IN    @{supp_link_ids}
448     \    Should Contain X Times    ${topology}    ${supp_link_id}</link-ref>    1
449
450 Check Overlay Link Source And Destination
451     [Arguments]    ${model}    ${topology}    ${topo_id}    ${link_id}    ${expected_source}    ${expected_destination}
452     [Documentation]    Checks if the overlay link's source and destination specified by a supporting link ref matches given source and destination
453     ${link}    Extract Link from Topology    ${model}    ${topology}    ${topo_id}    ${link_id}
454     ${link_source}    Get Element Text    ${link}    xpath=.//source-node
455     ${link_destination}    Get Element Text    ${link}    xpath=.//dest-node
456     Should Be Equal As Strings    ${link_source}    ${expected_source}
457     Should Be Equal As Strings    ${link_destination}    ${expected_destination}
458
459 Output Topo Should Be Complete
460     [Arguments]    ${node_count}=-1    ${supporting-node_count}=-1    ${node-ref_count}=-1    ${tp_count}=-1    ${tp-ref_count}=-1    ${link_count}=-1
461     ...    ${link-ref_count}=-1
462     [Documentation]    Verifies that the output topology contains the expected amount of essential elements
463     ${resp}    Wait Until Keyword Succeeds    5x    250ms    Basic Request Get    ${OVERLAY_TOPO_URL}
464     Should Contain    ${resp.content}    <topology-id>${OUTPUT_TOPO_NAME}</topology-id>
465     Run Keyword If    ${node_count}>-1    Should Contain X Times    ${resp.content}    <node>    ${node_count}
466     Run Keyword If    ${supporting-node_count}>-1    Should Contain X Times    ${resp.content}    <supporting-node>    ${supporting-node_count}
467     Run Keyword If    ${node-ref_count}>-1    Should Contain X Times    ${resp.content}    <node-ref>    ${node-ref_count}
468     Run Keyword If    ${link_count}>-1    Should Contain X Times    ${resp.content}    <link>    ${link_count}
469     Run Keyword If    ${link-ref_count}>-1    Should Contain X Times    ${resp.content}    <link-ref>    ${link-ref_count}
470     Run Keyword If    ${tp_count}>-1    Should Contain X Times    ${resp.content}    <termination-point>    ${tp_count}
471     Run Keyword If    ${tp-ref_count}>-1    Should Contain X Times    ${resp.content}    <tp-ref>    ${tp-ref_count}
472     Log    ---- Output Topo ----
473     Log    ${resp.content}
474     [Return]    ${resp}
475
476 Set Global Variable If It Does Not Exist
477     [Arguments]    ${name}    ${value}
478     ${status}    ${message} =    Run Keyword And Ignore Error    Variable Should Exist    ${name}
479     Run Keyword If    "${status}" == "FAIL"    Set Global Variable    ${name}    ${value}