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