2 Documentation Library containing Keywords used for SXP testing
4 Library RequestsLibrary
8 Resource CompareStream.robot
9 Resource KarafKeywords.robot
11 Resource TemplatedRequests.robot
12 Variables ../variables/Variables.py
15 ${REST_CONTEXT} /restconf/operations/sxp-controller
19 [Arguments] ${session} ${path} ${DATA}
20 [Documentation] Post request to Controller and checks response
21 ${resp} Post Request ${session} ${REST_CONTEXT}:${path} data=${DATA} headers=${HEADERS_XML}
26 Should be Equal As Strings ${resp.status_code} 200
27 ${content} Evaluate json.loads('''${resp.content}''') json
28 ${content} Get From Dictionary ${content} output
29 ${content} Get From Dictionary ${content} result
30 Should Be True ${content}
33 [Arguments] ${node} ${password}=${EMPTY} ${version}=version4 ${port}=64999 ${session}=session ${ip}=${EMPTY}
34 ... ${ssl_stores}=${EMPTY} ${retry_open_timer}=1
35 [Documentation] Add node via RPC to ODL
36 ${DATA} Add Node Xml ${node} ${port} ${password} ${version} ${ip}
37 ... keystores=${ssl_stores} retry_open_timer=${retry_open_timer}
38 Post To Controller ${session} add-node ${DATA}
41 [Arguments] ${node} ${session}=session
42 [Documentation] Delete connection via RPC from node
43 ${DATA} Delete Node Xml ${node}
44 Post To Controller ${session} delete-node ${DATA}
47 [Arguments] ${version} ${mode} ${ip} ${port} ${node}=127.0.0.1 ${password}=${EMPTY}
48 ... ${session}=session ${domain}=global ${security_mode}=${EMPTY}
49 [Documentation] Add connection via RPC to node
50 ${DATA} Add Connection Xml ${version} ${mode} ${ip} ${port} ${node}
51 ... ${password} ${domain} security_mode=${security_mode}
52 Post To Controller ${session} add-connection ${DATA}
55 [Arguments] ${node}=127.0.0.1 ${session}=session ${domain}=global
56 [Documentation] Gets all connections via RPC from node
57 ${DATA} Get Connections From Node Xml ${node} ${domain}
58 ${resp} Post Request ${session} ${REST_CONTEXT}:get-connections data=${DATA} headers=${HEADERS_XML}
59 Should be Equal As Strings ${resp.status_code} 200
60 [Return] ${resp.content}
63 [Arguments] ${ip} ${port} ${node}=127.0.0.1 ${session}=session ${domain}=global
64 [Documentation] Delete connection via RPC from node
65 ${DATA} Delete Connections Xml ${ip} ${port} ${node} ${domain}
66 Post To Controller ${session} delete-connection ${DATA}
69 [Arguments] ${node}=127.0.0.1 ${session}=session ${domain}=global
70 [Documentation] Delete all connections via RPC from node
71 ${resp} Get Connections ${node} ${session} ${domain}
72 @{connections} Parse Connections ${resp}
73 : FOR ${connection} IN @{connections}
74 \ Delete Connections ${connection['peer-address']} ${connection['tcp-port']} ${node} ${session} ${domain}
77 [Arguments] ${version} ${mode} ${ip} ${port}=64999 ${node}=127.0.0.1 ${state}=on
78 ... ${session}=session ${domain}=global
79 [Documentation] Verify that connection is ON
80 ${resp} Get Connections ${node} ${session} ${domain}
81 Should Contain Connection ${resp} ${ip} ${port} ${mode} ${version} ${state}
84 [Arguments] ${sgt} ${prefixes} ${node}=127.0.0.1 ${session}=session ${domain}=global
85 [Documentation] Add/Update one or more bindings via RPC to Master DB of the node
86 ${DATA} Add Bindings Xml ${node} ${domain} ${sgt} ${prefixes}
87 Post To Controller ${session} add-bindings ${DATA}
90 [Arguments] ${node}=127.0.0.1 ${session}=session ${domain}=global ${scope}=all
91 [Documentation] Gets all binding via RPC from Master DB of node
92 ${DATA} Get Bindings From Node Xml ${node} ${scope} ${domain}
93 ${resp} TemplatedRequests.Post_To_Uri ${REST_CONTEXT}:get-node-bindings data=${DATA} accept=${ACCEPT_JSON} content_type=${HEADERS_XML} session=${session}
97 [Arguments] ${node}=127.0.0.1 ${session}=session ${domain}=global
98 [Documentation] Delete all bindings via RPC from Master DB of node
99 ${resp} Get Bindings ${node} ${session} ${domain} local
100 @{bindings} Parse Bindings ${resp}
101 : FOR ${binding} IN @{bindings}
102 \ Clean Binding Default ${binding} ${node} ${session} ${domain}
104 Clean Binding Default
105 [Arguments] ${binding} ${node} ${session} ${domain}
106 [Documentation] Clean binding
107 Clean Binding ${binding['sgt']} ${binding['ip-prefix']} ${node} ${session}
109 Clean Binding At Most Be
110 [Arguments] ${binding} ${node} ${session} ${domain}
111 [Documentation] Clean binding
112 Clean Binding ${binding} ${binding['binding']} ${node} ${session}
115 [Arguments] ${sgt} ${prefixes} ${node} ${session} ${domain}=global
116 [Documentation] Used for nester FOR loop
117 : FOR ${prefix} IN @{prefixes}
118 \ Delete Binding Default ${sgt} ${prefix} ${node} ${domain} ${session}
120 Delete Binding Default
121 [Arguments] ${sgt} ${prefix} ${node} ${domain} ${session}
122 [Documentation] Delete binding via RPC
123 Delete Binding ${sgt} ${prefix} ${node} ${domain} ${session}
126 [Arguments] ${sgt} ${prefix} ${node} ${domain} ${session}
127 [Documentation] Delete binding via RPC
128 Delete Binding ${sgt['sgt']} ${prefix['ip-prefix']} ${node} ${domain} ${session}
131 [Arguments] ${sgt} ${prefix} ${node}=127.0.0.1 ${domain}=global ${session}=session
132 [Documentation] Delete binding via RPC from Master DB of node
133 ${DATA} Delete Binding Xml ${sgt} ${prefix} ${node} ${domain}
134 Post To Controller ${session} delete-entry ${DATA}
137 [Arguments] ${name} ${peers}= ${node}=127.0.0.1 ${session}=session
138 [Documentation] Adds new PeerGroup via RPC to Node
139 ${DATA} Add Peer Group Xml ${name} ${peers} ${node}
140 Post To Controller ${session} add-peer-group ${DATA}
143 [Arguments] ${name} ${node}=127.0.0.1 ${session}=session
144 [Documentation] Delete PeerGroup via RPC from Node
145 ${DATA} Delete Peer Group Xml ${name} ${node}
146 Post To Controller ${session} delete-peer-group ${DATA}
149 [Arguments] ${node}=127.0.0.1 ${session}=session
150 [Documentation] Gets all PeerGroups via RPC from node
151 ${DATA} Get Peer Groups From Node Xml ${node}
152 ${resp} Post Request ${session} ${REST_CONTEXT}:get-peer-groups data=${DATA} headers=${HEADERS_XML}
153 Should be Equal As Strings ${resp.status_code} 200
154 [Return] ${resp.content}
157 [Arguments] ${node}=127.0.0.1 ${session}=session
158 [Documentation] Delete all PeerGroups via RPC from node
159 ${resp} Get Peer Groups ${node} ${session}
160 @{prefixes} Parse Peer Groups ${resp}
161 : FOR ${group} IN @{prefixes}
162 \ Delete Peer Group ${group['name']} ${node} ${session}
165 [Arguments] ${name} ${type} ${entries} ${node}=127.0.0.1 ${session}=session ${policy}=auto-update
166 [Documentation] Add Filter via RPC from Node
167 ${DATA} Run_Keyword_If_At_Least_Else carbon Add Filter Xml ${name} ${type} ${entries}
168 ... ${node} ${policy}
169 ... ELSE Add Filter Xml ${name} ${type} ${entries} ${node}
170 Post To Controller ${session} add-filter ${DATA}
173 [Arguments] ${name} ${domains} ${entries} ${node}=127.0.0.1 ${filter_name}=base-domain-filter ${session}=session
174 [Documentation] Add Domain Filter via RPC from Node
175 ${DATA} Add Domain Filter Xml ${name} ${domains} ${entries} ${node} ${filter_name}
176 Post To Controller ${session} add-domain-filter ${DATA}
179 [Arguments] ${name} ${type} ${node}=127.0.0.1 ${session}=session
180 [Documentation] Delete Filter via RPC from Node
181 ${DATA} Delete Filter Xml ${name} ${type} ${node}
182 Post To Controller ${session} delete-filter ${DATA}
185 [Arguments] ${name} ${node}=127.0.0.1 ${filter_name}=base-domain-filter ${session}=session
186 [Documentation] Delete Filter via RPC from Node
187 ${DATA} Delete Domain Filter Xml ${name} ${node} ${filter_name}
188 Post To Controller ${session} delete-domain-filter ${DATA}
190 Should Contain Binding
191 [Arguments] ${resp} ${sgt} ${prefix} ${db_source}=any
192 [Documentation] Tests if data contains specified binding
193 ${out} Find Binding ${resp} ${sgt} ${prefix}
194 Should Be True ${out} Doesn't have ${sgt} ${prefix}
196 Should Not Contain Binding
197 [Arguments] ${resp} ${sgt} ${prefix} ${db_source}=any
198 [Documentation] Tests if data doesn't contains specified binding
199 ${out} Find Binding ${resp} ${sgt} ${prefix}
200 Should Not Be True ${out} Should't have ${sgt} ${prefix}
202 Should Contain Connection
203 [Arguments] ${resp} ${ip} ${port} ${mode} ${version} ${state}=none
204 [Documentation] Test if data contains specified connection
205 ${out} Find Connection ${resp} ${version} ${mode} ${ip} ${port}
207 Should Be True ${out} Doesn't have ${ip}:${port} ${mode} ${version}
209 Should Not Contain Connection
210 [Arguments] ${resp} ${ip} ${port} ${mode} ${version} ${state}=none
211 [Documentation] Test if data doesn't contains specified connection
212 ${out} Find Connection ${resp} ${version} ${mode} ${ip} ${port}
214 Should Not Be True ${out} Shouldn't have ${ip}:${port} ${mode} ${version}
216 Bindings Should Contain
217 [Arguments] ${sgt} ${prefix} ${db_source}=any
218 [Documentation] Retrieves bindings and verifies they contain given binding
220 Should Contain Binding ${resp} ${sgt} ${prefix} ${db_source}
222 Bindings Should Not Contain
223 [Arguments] ${sgt} ${prefix} ${db_source}=any
224 [Documentation] Retrieves bindings and verifies they do not contain given binding
226 Should Not Contain Binding ${resp} ${sgt} ${prefix} ${db_source}
228 Connections Should Contain
229 [Arguments] ${ip} ${port} ${mode} ${version} ${state}=none
230 [Documentation] Retrieves connections and verifies they contain given connection
231 ${resp} Get Connections
232 Should Contain Connection ${resp} ${ip} ${port} ${mode} ${version} ${state}
234 Connections Should Not Contain
235 [Arguments] ${ip} ${port} ${mode} ${version} ${state}=none
236 [Documentation] Retrieves connections and verifies they do not contain given connection
237 ${resp} Get Connections
238 Should Not Contain Connection ${resp} ${ip} ${port} ${mode} ${version} ${state}
240 Setup Topology Complex
241 [Arguments] ${version}=version4 ${PASSWORD}=none
242 : FOR ${node} IN RANGE 2 6
243 \ Add Connection ${version} both 127.0.0.1 64999 127.0.0.${node}
245 \ Add Connection ${version} both 127.0.0.${node} 64999 127.0.0.1
247 \ Wait Until Keyword Succeeds 15 1 Verify Connection ${version} both
248 \ ... 127.0.0.${node}
249 \ Add Bindings ${node}0 10.10.10.${node}0/32 127.0.0.${node}
250 \ Add Bindings ${node}0 10.10.${node}0.0/24 127.0.0.${node}
251 \ Add Bindings ${node}0 10.${node}0.0.0/16 127.0.0.${node}
252 \ Add Bindings ${node}0 ${node}0.0.0.0/8 127.0.0.${node}
253 Add Bindings 10 10.10.10.10/32 127.0.0.1
254 Add Bindings 10 10.10.10.0/24 127.0.0.1
255 Add Bindings 10 10.10.0.0/16 127.0.0.1
256 Add Bindings 10 10.0.0.0/8 127.0.0.1
258 Verify Snapshot Was Pushed
259 [Arguments] ${snapshot_string}=22-sxp-controller-one-node.xml
260 [Documentation] Will succeed if the ${snapshot_string} is found in the karaf logs
261 ${output} Run Command On Controller ${ODL_SYSTEM_IP} cat ${WORKSPACE}/${BUNDLEFOLDER}/data/log/karaf.log* | grep -c 'Successfully pushed configuration snapshot.*${snapshot_string}'
262 Should Not Be Equal As Strings ${output} 0
264 Prepare SSH Keys On Karaf
265 [Arguments] ${system}=${ODL_SYSTEM_IP} ${user}=${ODL_SYSTEM_USER} ${passwd}=${ODL_SYSTEM_PASSWORD} ${prompt}=${ODL_SYSTEM_PROMPT} ${system_workspace}=${WORKSPACE}
266 [Documentation] Executes client login on karaf VM in so that SSH keys will be generated by defualt karaf callback,
267 ... expecting echo affter succesfull login. TODO: test on multiple runs if this aproach reduce SSHExceptions in robotframework
268 ${stdout} Run Command On Remote System ${system} ${system_workspace}${/}${BUNDLEFOLDER}/bin/client echo READY ${user} ${passwd} prompt=${prompt}
269 Should Match "${stdout}" "*READY"
272 [Arguments] ${session}=session ${controller}=${ODL_SYSTEM_IP}
273 [Documentation] Create session to Controller
274 Verify Feature Is Installed odl-sxp-controller ${controller}
275 Create Session ${session} url=http://${controller}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML}
276 ${resp} RequestsLibrary.Get Request ${session} ${MODULES_API}
277 Should Be Equal As Strings ${resp.status_code} 200
278 Should Contain ${resp.content} ietf-restconf
281 [Documentation] Destroy created sessions
285 [Arguments] ${domain_name} ${node}=127.0.0.1 ${session}=session
286 [Documentation] Add Domain via RPC
287 ${DATA} Add Domain Xml ${node} ${domain_name}
288 Post To Controller ${session} add-domain ${DATA}
291 [Arguments] ${domain_name} ${node}=127.0.0.1 ${session}=session
292 [Documentation] Delete Domain via RPC
293 ${DATA} Delete Domain Xml ${node} ${domain_name}
294 Post To Controller ${session} delete-domain ${DATA}
297 [Arguments] ${sgt} ${prefixes} ${node}=127.0.0.1 ${session}=session ${domain}=global
298 [Documentation] Delete bindings via RPC from Master DB of node
299 ${DATA} Delete Bindings Xml ${node} ${domain} ${sgt} ${prefixes}
300 Post To Controller ${session} delete-bindings ${DATA}
303 [Arguments] ${sgt} ${start} ${size} ${node}=127.0.0.1
304 [Documentation] Add Bindings to Node specified by range
305 ${prefixes} Prefix Range ${start} ${size}
306 Add Bindings ${sgt} ${prefixes} ${node}
308 Delete Bindings Range
309 [Arguments] ${sgt} ${start} ${size} ${node}=127.0.0.1
310 [Documentation] Delete Bindings to Node specified by range
311 ${prefixes} Prefix Range ${start} ${size}
312 Delete Bindings ${sgt} ${prefixes} ${node}
315 [Arguments] ${sgt} ${start} ${end} ${node}=127.0.0.1
316 [Documentation] Check if Node contains Bindings specified by range
317 ${resp} Get Bindings ${node}
318 : FOR ${num} IN RANGE ${start} ${end}
319 \ ${ip} Get Ip From Number ${num}
320 \ Should Contain Binding ${resp} ${sgt} ${ip}/32
322 Check Binding Range Negative
323 [Arguments] ${sgt} ${start} ${end} ${node}=127.0.0.1
324 [Documentation] Check if Node does not contains Bindings specified by range
325 ${resp} Get Bindings ${node}
326 : FOR ${num} IN RANGE ${start} ${end}
327 \ ${ip} Get Ip From Number ${num}
328 \ Should Not Contain Binding ${resp} ${sgt} ${ip}/32
330 Setup SXP Environment
331 [Arguments] ${node_range}=2
332 [Documentation] Create session to Controller, node_range parameter specifies number of nodes to be created plus one
334 : FOR ${num} IN RANGE 1 ${node_range}
335 \ ${ip} Get Ip From Number ${num}
336 \ ${rnd_retry_time} = Evaluate random.randint(1, 10) modules=random
337 \ Add Node ${ip} retry_open_timer=${rnd_retry_time}
338 \ Wait Until Keyword Succeeds 20 1 Check Node Started ${ip}
341 [Arguments] ${node} ${port}=64999 ${system}=${ODL_SYSTEM_IP} ${session}=session ${ip}=${node}
342 [Documentation] Verify that SxpNode has data writed to Operational datastore
343 ${resp} RequestsLibrary.Get Request ${session} /restconf/operational/network-topology:network-topology/topology/sxp/node/${node}/
344 Should Be Equal As Strings ${resp.status_code} 200
345 ${rc} Run Command On Remote System ${system} netstat -tln | grep -q ${ip}:${port} && echo 0 || echo 1 ${ODL_SYSTEM_USER} ${ODL_SYSTEM_PASSWORD} prompt=${ODL_SYSTEM_PROMPT}
346 Should Be Equal As Strings ${rc} 0
348 Clean SXP Environment
349 [Arguments] ${node_range}=2
350 [Documentation] Destroy created sessions
351 : FOR ${num} IN RANGE 1 ${node_range}
352 \ ${ip} Get Ip From Number ${num}
356 Get Routing Configuration From Controller
357 [Arguments] ${session}
358 [Documentation] Get Routing configuration from config DS
359 ${resp} RequestsLibrary.Get Request ${session} /restconf/config/sxp-cluster-route:sxp-cluster-route/ headers=${ACCEPT_XML}
360 ${data} Set Variable If "${resp.status_code}" == "200" ${resp.content} ${EMPTY}
363 Put Routing Configuration To Controller
364 [Arguments] ${DATA} ${session}
365 [Documentation] Put Routing configuration to Config DS
366 ${resp} RequestsLibrary.Put Request ${session} /restconf/config/sxp-cluster-route:sxp-cluster-route/ data=${DATA} headers=${HEADERS_XML}
367 Should Match "${resp.status_code}" "20?"
369 Clean Routing Configuration To Controller
370 [Arguments] ${session}
371 [Documentation] Delete Routing configuration from Config DS
372 ${resp} RequestsLibrary.Get Request ${session} /restconf/config/sxp-cluster-route:sxp-cluster-route/ headers=${ACCEPT_XML}
373 Run Keyword If "${resp.status_code}" == "200" RequestsLibrary.Delete Request ${session} /restconf/config/sxp-cluster-route:sxp-cluster-route/