Add nova show and ports debug
[integration/test.git] / csit / libraries / OpenStackOperations.robot
1 *** Settings ***
2 Documentation     Openstack library. This library is useful for tests to create network, subnet, router and vm instances
3 Library           SSHLibrary
4 Resource          Utils.robot
5 Variables         ../variables/Variables.py
6
7 *** Keywords ***
8 Source Password
9     [Arguments]    ${force}=no    ${source_pwd}=yes
10     [Documentation]    Sourcing the Openstack PAsswords for neutron configurations
11     Run Keyword If    '${source_pwd}' == 'yes' or '${force}' == 'yes'    Write Commands Until Prompt    cd ${DEVSTACK_DEPLOY_PATH}; source openrc admin admin
12
13 Get Tenant ID From Security Group
14     [Documentation]    Returns tenant ID by reading it from existing default security-group.
15     ${devstack_conn_id}=    Get ControlNode Connection
16     Switch Connection    ${devstack_conn_id}
17     ${output}=    Write Commands Until Prompt    neutron security-group-show default | grep "| tenant_id" | awk '{print $4}'
18     Log    ${output}
19     [Return]    ${output}
20
21 Get Tenant ID From Network
22     [Arguments]    ${network_uuid}
23     [Documentation]    Returns tenant ID by reading it from existing network.
24     ${resp}=    Get_From_Uri    uri=${CONFIG_API}/neutron:neutron/networks/network/${network_uuid}/    accept=${ACCEPT_EMPTY}    session=session
25     ${tenant_id}=    Utils.Extract Value From Content    ${resp}    /network/0/tenant-id    strip
26     [Return]    ${tenant_id}
27
28 Create Network
29     [Arguments]    ${network_name}    ${additional_args}=${EMPTY}    ${verbose}=TRUE
30     [Documentation]    Create Network with neutron request.
31     ${devstack_conn_id}=    Get ControlNode Connection
32     Switch Connection    ${devstack_conn_id}
33     ${command}    Set Variable If    "${verbose}" == "TRUE"    neutron -v net-create ${network_name} ${additional_args}    neutron net-create ${network_name} ${additional_args} | grep -w id | awk '{print $4}'
34     ${output}=    Write Commands Until Prompt    ${command}    30s
35     Log    ${output}
36     [Return]    ${output}
37
38 List Networks
39     [Documentation]    List networks and return output with neutron client.
40     ${devstack_conn_id}=    Get ControlNode Connection
41     Switch Connection    ${devstack_conn_id}
42     ${output}=    Write Commands Until Prompt    neutron net-list    30s
43     Close Connection
44     Log    ${output}
45     [Return]    ${output}
46
47 List Subnets
48     [Documentation]    List subnets and return output with neutron client.
49     ${devstack_conn_id}=    Get ControlNode Connection
50     Switch Connection    ${devstack_conn_id}
51     ${output}=    Write Commands Until Prompt    neutron subnet-list    30s
52     Close Connection
53     Log    ${output}
54     [Return]    ${output}
55
56 Delete Network
57     [Arguments]    ${network_name}
58     [Documentation]    Delete Network with neutron request.
59     ${devstack_conn_id}=    Get ControlNode Connection
60     Switch Connection    ${devstack_conn_id}
61     ${output}=    Write Commands Until Prompt    neutron -v net-delete ${network_name}    30s
62     Close Connection
63     Log    ${output}
64     Should Match Regexp    ${output}    Deleted network: ${network_name}|Deleted network\\(s\\): ${network_name}
65
66 Create SubNet
67     [Arguments]    ${network_name}    ${subnet}    ${range_ip}    ${additional_args}=${EMPTY}
68     [Documentation]    Create SubNet for the Network with neutron request.
69     ${devstack_conn_id}=    Get ControlNode Connection
70     Switch Connection    ${devstack_conn_id}
71     ${output}=    Write Commands Until Prompt    neutron -v subnet-create ${network_name} ${range_ip} --name ${subnet} ${additional_args}    30s
72     Close Connection
73     Log    ${output}
74     Should Contain    ${output}    Created a new subnet
75
76 Create Port
77     [Arguments]    ${network_name}    ${port_name}    ${sg}=default
78     [Documentation]    Create Port with neutron request.
79     ${devstack_conn_id}=    Get ControlNode Connection
80     Switch Connection    ${devstack_conn_id}
81     ${output}=    Write Commands Until Prompt    neutron -v port-create ${network_name} --name ${port_name} --security-group ${sg}    30s
82     Close Connection
83     Log    ${output}
84     Should Contain    ${output}    Created a new port
85
86 Delete Port
87     [Arguments]    ${port_name}
88     [Documentation]    Delete Port with neutron request.
89     ${devstack_conn_id}=    Get ControlNode Connection
90     Switch Connection    ${devstack_conn_id}
91     ${output}=    Write Commands Until Prompt    neutron -v port-delete ${port_name}    30s
92     Close Connection
93     Log    ${output}
94     Should Match Regexp    ${output}    Deleted port: ${port_name}|Deleted port\\(s\\): ${port_name}
95
96 List Ports
97     [Documentation]    List ports and return output with neutron client.
98     ${devstack_conn_id}=    Get ControlNode Connection
99     Switch Connection    ${devstack_conn_id}
100     ${output}=    Write Commands Until Prompt    neutron port-list    30s
101     Close Connection
102     Log    ${output}
103     [Return]    ${output}
104
105 List Nova VMs
106     [Documentation]    List VMs and return output with nova client.
107     ${devstack_conn_id}=    Get ControlNode Connection
108     Switch Connection    ${devstack_conn_id}
109     ${output}=    Write Commands Until Prompt    nova list    30s
110     Close Connection
111     Log    ${output}
112     [Return]    ${output}
113
114 Create And Associate Floating IPs
115     [Arguments]    ${external_net}    @{vm_list}
116     [Documentation]    Create and associate floating IPs to VMs with nova request
117     ${devstack_conn_id}=    Get ControlNode Connection
118     Switch Connection    ${devstack_conn_id}
119     ${ip_list}=    Create List    @{EMPTY}
120     : FOR    ${vm}    IN    @{vm_list}
121     \    ${output}=    Write Commands Until Prompt    nova floating-ip-create ${external_net} | grep "${external_net}"    30s
122     \    Log    ${output}
123     \    @{output_words}    Split String    ${output}
124     \    Append To List    ${ip_list}    @{output_words}[3]
125     \    ${output}=    Write Commands Until Prompt    nova floating-ip-associate ${vm} @{output_words}[3]    30s
126     \    Log    ${output}
127     [Return]    ${ip_list}
128
129 Verify Gateway Ips
130     [Documentation]    Verifies the Gateway Ips with dump flow.
131     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
132     Log    ${output}
133     : FOR    ${GatewayIpElement}    IN    @{GATEWAY_IPS}
134     \    Should Contain    ${output}    ${GatewayIpElement}
135
136 Verify Dhcp Ips
137     [Documentation]    Verifies the Dhcp Ips with dump flow.
138     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
139     Log    ${output}
140     : FOR    ${DhcpIpElement}    IN    @{DHCP_IPS}
141     \    Should Contain    ${output}    ${DhcpIpElement}
142
143 Verify No Dhcp Ips
144     [Documentation]    Verifies the Dhcp Ips with dump flow.
145     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
146     Log    ${output}
147     : FOR    ${DhcpIpElement}    IN    @{DHCP_IPS}
148     \    Should Not Contain    ${output}    ${DhcpIpElement}
149
150 Delete SubNet
151     [Arguments]    ${subnet}
152     [Documentation]    Delete SubNet for the Network with neutron request.
153     Log    ${subnet}
154     ${devstack_conn_id}=    Get ControlNode Connection
155     Switch Connection    ${devstack_conn_id}
156     ${output}=    Write Commands Until Prompt    neutron -v subnet-delete ${subnet}
157     Close Connection
158     Log    ${output}
159     Should Match Regexp    ${output}    Deleted subnet: ${subnet}|Deleted subnet\\(s\\): ${subnet}
160
161 Verify No Gateway Ips
162     [Documentation]    Verifies the Gateway Ips removed with dump flow.
163     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
164     Log    ${output}
165     : FOR    ${GatewayIpElement}    IN    @{GATEWAY_IPS}
166     \    Should Not Contain    ${output}    ${GatewayIpElement}
167
168 Delete Vm Instance
169     [Arguments]    ${vm_name}
170     [Documentation]    Delete Vm instances using instance names.
171     ${devstack_conn_id}=    Get ControlNode Connection
172     Switch Connection    ${devstack_conn_id}
173     ${output}=    Write Commands Until Prompt    nova force-delete ${vm_name}    40s
174     Close Connection
175
176 Get Net Id
177     [Arguments]    ${network_name}    ${devstack_conn_id}
178     [Documentation]    Retrieve the net id for the given network name to create specific vm instance
179     Switch Connection    ${devstack_conn_id}
180     ${output}=    Write Commands Until Prompt    neutron net-list | grep "${network_name}" | awk '{print $2}'    30s
181     Log    ${output}
182     ${splitted_output}=    Split String    ${output}    ${EMPTY}
183     ${net_id}=    Get from List    ${splitted_output}    0
184     Log    ${net_id}
185     [Return]    ${net_id}
186
187 Get Port Id
188     [Arguments]    ${port_name}    ${devstack_conn_id}
189     [Documentation]    Retrieve the port id for the given port name to attach specific vm instance to a particular port
190     Switch Connection    ${devstack_conn_id}
191     ${output}=    Write Commands Until Prompt    neutron port-list | grep "${port_name}" | awk '{print $2}'    30s
192     Log    ${output}
193     ${splitted_output}=    Split String    ${output}    ${EMPTY}
194     ${port_id}=    Get from List    ${splitted_output}    0
195     Log    ${port_id}
196     [Return]    ${port_id}
197
198 Get Router Id
199     [Arguments]    ${router1}    ${devstack_conn_id}
200     [Documentation]    Retrieve the net id for the given network name to create specific vm instance
201     Switch Connection    ${devstack_conn_id}
202     ${output}=    Write Commands Until Prompt    neutron router-list | grep "${router1}" | awk '{print $2}'    30s
203     Log    ${output}
204     ${splitted_output}=    Split String    ${output}    ${EMPTY}
205     ${router_id}=    Get from List    ${splitted_output}    0
206     Log    ${router_id}
207     [Return]    ${router_id}
208
209 Create Vm Instances
210     [Arguments]    ${net_name}    ${vm_instance_names}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano    ${sg}=default
211     [Documentation]    Create X Vm Instance with the net id of the Netowrk.
212     ${devstack_conn_id}=    Get ControlNode Connection
213     Switch Connection    ${devstack_conn_id}
214     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
215     : FOR    ${VmElement}    IN    @{vm_instance_names}
216     \    ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic net-id=${net_id} ${VmElement} --security-groups ${sg}    30s
217     \    Log    ${output}
218
219 Create Vm Instance With Port On Compute Node
220     [Arguments]    ${port_name}    ${vm_instance_name}    ${compute_node}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano    ${sg}=default
221     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
222     ${devstack_conn_id}=    Get ControlNode Connection
223     Switch Connection    ${devstack_conn_id}
224     ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
225     ${hostname_compute_node}=    Run Command On Remote System    ${compute_node}    hostname
226     ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic port-id=${port_id} ${vm_instance_name} --security-groups ${sg} --availability-zone nova:${hostname_compute_node}    30s
227     Log    ${output}
228     Wait Until Keyword Succeeds    25s    5s    Verify VM Is ACTIVE    ${vm_instance_name}
229
230 Verify VM Is ACTIVE
231     [Arguments]    ${vm_name}
232     [Documentation]    Run these commands to check whether the created vm instance is active or not.
233     ${devstack_conn_id}=    Get ControlNode Connection
234     Switch Connection    ${devstack_conn_id}
235     ${output}=    Write Commands Until Prompt    nova show ${vm_name} | grep OS-EXT-STS:vm_state    30s
236     Log    ${output}
237     Should Contain    ${output}    active
238
239 Verify VMs Received DHCP Lease
240     [Arguments]    @{vm_list}
241     [Documentation]    Using nova console-log on the provided ${vm_list} to search for the string "obtained" which
242     ...    correlates to the instance receiving it's IP address via DHCP. This should provide a good indication
243     ...    that the instance is fully up and ready.
244     ${devstack_conn_id}=    Get ControlNode Connection
245     Switch Connection    ${devstack_conn_id}
246     ${ip_list}    Create List
247     : FOR    ${vm}    IN    @{vm_list}
248     \    ${output}=    Write Commands Until Prompt    nova console-log ${vm} | grep -i "obtained"    30s
249     \    ${dhcp_ip_line}=    Write Commands Until Prompt    nova console-log ${vm} | grep "^nameserver"    30s
250     \    Log    ${output}
251     \    @{output_words}    Split String    ${output}
252     \    @{dhcp_output_words}    Split String    ${dhcp_ip_line}
253     \    Should Contain    ${output}    obtained
254     \    Append To List    ${ip_list}    @{output_words}[2]
255     [Return]    ${ip_list}    @{dhcp_output_words}[1]
256
257 View Vm Console
258     [Arguments]    ${vm_instance_names}
259     [Documentation]    View Console log of the created vm instances using nova show.
260     : FOR    ${VmElement}    IN    @{vm_instance_names}
261     \    ${output}=    Write Commands Until Prompt    nova show ${VmElement}
262     \    Log    ${output}
263     \    ${output}=    Write Commands Until Prompt    nova console-log ${VmElement}
264     \    Log    ${output}
265
266 Ping Vm From DHCP Namespace
267     [Arguments]    ${net_name}    ${vm_ip}
268     [Documentation]    Reach all Vm Instance with the net id of the Netowrk.
269     Log    ${vm_ip}
270     ${devstack_conn_id}=    Get ControlNode Connection
271     Switch Connection    ${devstack_conn_id}
272     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
273     Log    ${net_id}
274     ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
275     Log    ${output}
276     Close Connection
277     Should Contain    ${output}    64 bytes
278
279 Ping From DHCP Should Not Succeed
280     [Arguments]    ${net_name}    ${vm_ip}
281     [Documentation]    Should Not Reach Vm Instance with the net id of the Netowrk.
282     Log    ${vm_ip}
283     ${devstack_conn_id}=    Get ControlNode Connection
284     Switch Connection    ${devstack_conn_id}
285     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
286     Log    ${net_id}
287     ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
288     Close Connection
289     Log    ${output}
290     Should Not Contain    ${output}    64 bytes
291
292 Ping Vm From Control Node
293     [Arguments]    ${vm_floating_ip}
294     [Documentation]    Ping VM floating IP from control node
295     Log    ${vm_floating_ip}
296     ${devstack_conn_id}=    Get ControlNode Connection
297     Switch Connection    ${devstack_conn_id}
298     ${output}=    Write Commands Until Prompt    ping -c 3 ${vm_floating_ip}    20s
299     Log    ${output}
300     Close Connection
301     Should Contain    ${output}    64 bytes
302
303 Ping From Instance
304     [Arguments]    ${dest_vm_ip}
305     [Documentation]    Ping to the expected destination ip.
306     ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${dest_vm_ip}    ${OS_SYSTEM_PROMPT}
307     Log    ${output}
308     [Return]    ${output}
309
310 Curl Metadata Server
311     [Documentation]    Ping to the expected destination ip.
312     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
313     Write Commands Until Prompt    exit
314     Should Contain    ${output}    200
315
316 Close Vm Instance
317     [Documentation]    Exit the vm instance.
318     ${output}=    Write Commands Until Prompt    exit
319     Log    ${output}
320
321 Check If Console Is VmInstance
322     [Arguments]    ${console}=cirros
323     [Documentation]    Check if the session has been able to login to the VM instance
324     ${output}=    Write Commands Until Expected Prompt    id    ${OS_SYSTEM_PROMPT}
325     Should Contain    ${output}    ${console}
326
327 Exit From Vm Console
328     [Documentation]    Check if the session has been able to login to the VM instance and exit the instance
329     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance    cirros
330     Run Keyword If    ${rcode}    Write Commands Until Prompt    exit
331     Get OvsDebugInfo
332
333 Check Ping
334     [Arguments]    ${ip_address}
335     [Documentation]    Run Ping command on the IP available as argument
336     ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
337     Should Contain    ${output}    64 bytes
338
339 Check Metadata Access
340     [Documentation]    Try curl on the Metadataurl and check if it is okay
341     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
342     Should Contain    ${output}    200
343
344 Execute Command on VM Instance
345     [Arguments]    ${net_name}    ${vm_ip}    ${cmd}    ${user}=cirros    ${password}=cubswin:)
346     [Documentation]    Login to the vm instance using ssh in the network, executes a command inside the VM and returns the ouput.
347     ${devstack_conn_id} =    Get ControlNode Connection
348     Switch Connection    ${devstack_conn_id}
349     ${net_id} =    Get Net Id    ${net_name}    ${devstack_conn_id}
350     Log    ${vm_ip}
351     ${output} =    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh ${user}@${vm_ip} -o ConnectTimeout=10 -o StrictHostKeyChecking=no    d:
352     Log    ${output}
353     ${output} =    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
354     Log    ${output}
355     ${rcode} =    Run Keyword And Return Status    Check If Console Is VmInstance
356     ${output} =    Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ${cmd}    ${OS_SYSTEM_PROMPT}
357     [Teardown]    Exit From Vm Console
358     [Return]    ${output}
359
360 Test Operations From Vm Instance
361     [Arguments]    ${net_name}    ${src_ip}    ${dest_ips}    ${user}=cirros    ${password}=cubswin:)
362     [Documentation]    Login to the vm instance using ssh in the network.
363     ${devstack_conn_id}=    Get ControlNode Connection
364     Switch Connection    ${devstack_conn_id}
365     Log    ${src_ip}
366     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
367     ${output}=    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ${user}@${src_ip}    d:
368     Log    ${output}
369     ${output}=    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
370     Log    ${output}
371     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
372     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ifconfig    ${OS_SYSTEM_PROMPT}
373     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route    ${OS_SYSTEM_PROMPT}
374     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    arp -an    ${OS_SYSTEM_PROMPT}
375     : FOR    ${dest_ip}    IN    @{dest_ips}
376     \    Log    ${dest_ip}
377     \    ${string_empty}=    Run Keyword And Return Status    Should Be Empty    ${dest_ip}
378     \    Run Keyword If    ${string_empty}    Continue For Loop
379     \    Run Keyword If    ${rcode}    Check Ping    ${dest_ip}
380     Run Keyword If    ${rcode}    Check Metadata Access
381     [Teardown]    Exit From Vm Console
382
383 Ping Other Instances
384     [Arguments]    ${list_of_external_dst_ips}
385     [Documentation]    Check reachability with other network's instances.
386     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
387     : FOR    ${dest_ip}    IN    @{list_of_external_dst_ips}
388     \    Log    ${dest_ip}
389     \    Check Ping    ${dest_ip}
390
391 Create Router
392     [Arguments]    ${router_name}
393     [Documentation]    Create Router and Add Interface to the subnets.
394     ${devstack_conn_id}=    Get ControlNode Connection
395     Switch Connection    ${devstack_conn_id}
396     ${output}=    Write Commands Until Prompt    neutron -v router-create ${router_name}    30s
397     Close Connection
398     Should Contain    ${output}    Created a new router
399
400 Add Router Interface
401     [Arguments]    ${router_name}    ${interface_name}
402     ${devstack_conn_id}=    Get ControlNode Connection
403     Switch Connection    ${devstack_conn_id}
404     ${output}=    Write Commands Until Prompt    neutron -v router-interface-add ${router_name} ${interface_name}
405     Close Connection
406     Should Contain    ${output}    Added interface
407
408 Add Router Gateway
409     [Arguments]    ${router_name}    ${network_name}
410     ${devstack_conn_id}=    Get ControlNode Connection
411     Switch Connection    ${devstack_conn_id}
412     ${output}=    Write Commands Until Prompt    neutron -v router-gateway-set ${router_name} ${network_name}
413     Close Connection
414     Should Contain    ${output}    Set gateway
415
416 Remove Interface
417     [Arguments]    ${router_name}    ${interface_name}
418     [Documentation]    Remove Interface to the subnets.
419     ${devstack_conn_id}=    Get ControlNode Connection
420     Switch Connection    ${devstack_conn_id}
421     ${output}=    Write Commands Until Prompt    neutron -v router-interface-delete ${router_name} ${interface_name}
422     Close Connection
423     Should Contain    ${output}    Removed interface from router
424
425 Update Router
426     [Arguments]    ${router_name}    ${cmd}
427     [Documentation]    Update the router with the command. Router name and command should be passed as argument.
428     ${devstack_conn_id} =    Get ControlNode Connection
429     Switch Connection    ${devstack_conn_id}
430     ${output} =    Write Commands Until Prompt    neutron router-update ${router_name} ${cmd}    30s
431     Close Connection
432     Should Contain    ${output}    Updated
433
434 Show Router
435     [Arguments]    ${router_name}    ${options}
436     [Documentation]    Show information of a given router. Router name and optional fields should be sent as arguments.
437     ${devstack_conn_id} =    Get ControlNode Connection
438     Switch Connection    ${devstack_conn_id}
439     ${output} =    Write Commands Until Prompt    neutron router-show ${router_name} ${options}    30s
440     Log    ${output}
441     Close Connection
442
443 Delete Router
444     [Arguments]    ${router_name}
445     [Documentation]    Delete Router and Interface to the subnets.
446     ${devstack_conn_id}=    Get ControlNode Connection
447     Switch Connection    ${devstack_conn_id}
448     ${output}=    Write Commands Until Prompt    neutron -v router-delete ${router_name}    60s
449     Close Connection
450     Should Match Regexp    ${output}    Deleted router: ${router_name}|Deleted router\\(s\\): ${router_name}
451
452 Get DumpFlows And Ovsconfig
453     [Arguments]    ${openstack_node_ip}
454     [Documentation]    Get the OvsConfig and Flow entries from OVS from the Openstack Node
455     Log    ${openstack_node_ip}
456     SSHLibrary.Open Connection    ${openstack_node_ip}    prompt=${DEFAULT_LINUX_PROMPT}
457     Utils.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
458     SSHLibrary.Set Client Configuration    timeout=${default_devstack_prompt_timeout}
459     Write Commands Until Expected Prompt    ip -o link    ]>
460     Write Commands Until Expected Prompt    ip -o addr    ]>
461     Write Commands Until Expected Prompt    ip route    ]>
462     Write Commands Until Expected Prompt    arp -an    ]>
463     ${nslist}=    Write Commands Until Expected Prompt    ip netns list | awk '{print $1}'    ]>
464     @{lines}    Split To Lines    ${nslist}
465     : FOR    ${line}    IN    @{lines}
466     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip -o link    ]>
467     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip -o addr    ]>
468     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip route    ]>
469     Write Commands Until Expected Prompt    sudo ovs-vsctl show    ]>
470     Write Commands Until Expected Prompt    sudo ovs-vsctl list Open_vSwitch    ]>
471     Write Commands Until Expected Prompt    sudo ovs-ofctl show br-int -OOpenFlow13    ]>
472     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-ports-desc br-int -OOpenFlow13    ]>
473     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-flows br-int -OOpenFlow13    ]>
474     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-groups br-int -OOpenFlow13    ]>
475     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-group-stats br-int -OOpenFlow13    ]>
476
477 Get ControlNode Connection
478     ${control_conn_id}=    SSHLibrary.Open Connection    ${OS_CONTROL_NODE_IP}    prompt=${DEFAULT_LINUX_PROMPT_STRICT}
479     Utils.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
480     SSHLibrary.Set Client Configuration    timeout=30s
481     Source Password    force=yes
482     [Return]    ${control_conn_id}
483
484 Get OvsDebugInfo
485     [Documentation]    Get the OvsConfig and Flow entries from all Openstack nodes
486     Run Keyword If    0 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CONTROL_NODE_IP}
487     Run Keyword If    1 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_1_IP}
488     Run Keyword If    2 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_2_IP}
489
490 Show Debugs
491     [Arguments]    @{vm_indices}
492     [Documentation]    Run these commands for debugging, it can list state of VM instances and ip information in control node
493     ${devstack_conn_id}=    Get ControlNode Connection
494     Switch Connection    ${devstack_conn_id}
495     ${output}=    Write Commands Until Prompt    sudo ip netns list
496     Log    ${output}
497     : FOR    ${index}    IN    @{vm_indices}
498     \    ${output}=    Write Commands Until Prompt    nova show ${index}    30s
499     \    Log    ${output}
500     Close Connection
501     List Nova VMs
502     List Networks
503     List Subnets
504     List Ports
505
506 Create Security Group
507     [Arguments]    ${sg_name}    ${desc}
508     ${devstack_conn_id}=    Get ControlNode Connection
509     Switch Connection    ${devstack_conn_id}
510     ${output}=    Write Commands Until Prompt    nova secgroup-create ${sg_name} ${desc}    40s
511     Close Connection
512
513 Create Security Rule
514     [Arguments]    ${direction}    ${protocol}    ${min_port}    ${max_port}    ${remote_ip}    ${sg_name}
515     ${devstack_conn_id}=    Get ControlNode Connection
516     Switch Connection    ${devstack_conn_id}
517     ${output}=    Write Commands Until Prompt    neutron security-group-rule-create --direction ${direction} --protocol ${protocol} --port-range-min ${min_port} --port-range-max ${max_port} --remote-ip-prefix ${remote_ip} ${sg_name}
518     Close Connection
519
520 Neutron Security Group Show
521     [Arguments]    ${SecurityGroupRuleName}    ${additional_args}=${EMPTY}
522     [Documentation]    Displays the neutron security group configurations that belongs to a given neutron security group name
523     ${devstack_conn_id}=    Get ControlNode Connection
524     Switch Connection    ${devstack_conn_id}
525     ${cmd}=    Set Variable    neutron security-group-show ${SecurityGroupRuleName} ${additional_args}
526     Log    ${cmd}
527     ${output}=    Write Commands Until Prompt    ${cmd}    30s
528     Log    ${output}
529     Close Connection
530     [Return]    ${output}
531
532 Neutron Port Show
533     [Arguments]    ${PortName}    ${additional_args}=${EMPTY}
534     [Documentation]    Display the port configuration that belong to a given neutron port
535     ${devstack_conn_id}=    Get ControlNode Connection
536     Switch Connection    ${devstack_conn_id}
537     ${cmd}=    Set Variable    neutron port-show ${PortName} ${additional_args}
538     Log    ${cmd}
539     ${output}=    Write Commands Until Prompt    ${cmd}    30s
540     Log    ${output}
541     Close Connection
542     [Return]    ${output}
543
544 Neutron Security Group Create
545     [Arguments]    ${SecurityGroupName}    ${additional_args}=${EMPTY}
546     [Documentation]    Create a security group with specified name ,description & protocol value according to security group template
547     ${devstack_conn_id}=    Get ControlNode Connection
548     Switch Connection    ${devstack_conn_id}
549     ${cmd}=    Set Variable    neutron security-group-create ${SecurityGroupName} ${additional_args}
550     Log    ${cmd}
551     ${output}=    Write Commands Until Prompt    ${cmd}    30s
552     Log    ${output}
553     Should Contain    ${output}    Created a new security_group
554     ${sgp_id}=    Should Match Regexp    ${output}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
555     Log    ${sgp_id}
556     Close Connection
557     [Return]    ${output}    ${sgp_id}
558
559 Neutron Security Group Update
560     [Arguments]    ${SecurityGroupName}    ${additional_args}=${EMPTY}
561     [Documentation]    Updating security groups
562     ${devstack_conn_id}=    Get ControlNode Connection
563     Switch Connection    ${devstack_conn_id}
564     ${cmd}=    Set Variable    neutron security-group-update ${SecurityGroupName} ${additional_args}
565     Log    ${cmd}
566     ${output}=    Write Commands Until Prompt    ${cmd}    30s
567     Log    ${output}
568     Close Connection
569     [Return]    ${output}
570
571 Neutron Security Group Rule Create
572     [Arguments]    ${Security_group_name}    &{Kwargs}
573     [Documentation]    Creates neutron security rule with neutron request with or without optional params, here security group name is mandatory args, rule with optional params can be created by passing the optional args values ex: direction=${INGRESS_EGRESS}, Then these optional params are catenated with mandatory args, example of usage: "Neutron Security Group Rule Create ${SGP_SSH} direction=${RULE_PARAMS[0]} ethertype=${RULE_PARAMS[1]} ..."
574     ${devstack_conn_id}=    Get ControlNode Connection
575     Switch Connection    ${devstack_conn_id}
576     Run Keyword If    ${Kwargs}    Log    ${Kwargs}
577     ${description}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    description    default=${None}
578     ${direction}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    direction    default=${None}
579     ${ethertype}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    ethertype    default=${None}
580     ${port_range_max}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    port_range_max    default=${None}
581     ${port_range_min}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    port_range_min    default=${None}
582     ${protocol}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    protocol    default=${None}
583     ${remote_group_id}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    remote_group_id    default=${None}
584     ${remote_ip_prefix}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    remote_ip_prefix    default=${None}
585     ${cmd}=    Set Variable    neutron security-group-rule-create ${Security_group_name}
586     ${cmd}=    Run Keyword If    '${description}'!='None'    Catenate    ${cmd}    --description ${description}
587     ...    ELSE    Catenate    ${cmd}
588     ${cmd}=    Run Keyword If    '${direction}'!='None'    Catenate    ${cmd}    --direction ${direction}
589     ...    ELSE    Catenate    ${cmd}
590     ${cmd}=    Run Keyword If    '${ethertype}'!='None'    Catenate    ${cmd}    --ethertype ${ethertype}
591     ...    ELSE    Catenate    ${cmd}
592     ${cmd}=    Run Keyword If    '${port_range_max}'!='None'    Catenate    ${cmd}    --port_range_max ${port_range_max}
593     ...    ELSE    Catenate    ${cmd}
594     ${cmd}=    Run Keyword If    '${port_range_min}'!='None'    Catenate    ${cmd}    --port_range_min ${port_range_min}
595     ...    ELSE    Catenate    ${cmd}
596     ${cmd}=    Run Keyword If    '${protocol}'!='None'    Catenate    ${cmd}    --protocol ${protocol}
597     ...    ELSE    Catenate    ${cmd}
598     ${cmd}=    Run Keyword If    '${remote_group_id}'!='None'    Catenate    ${cmd}    --remote_group_id ${remote_group_id}
599     ...    ELSE    Catenate    ${cmd}
600     ${cmd}=    Run Keyword If    '${remote_ip_prefix}'!='None'    Catenate    ${cmd}    --remote_ip_prefix ${remote_ip_prefix}
601     ...    ELSE    Catenate    ${cmd}
602     ${output}=    Write Commands Until Prompt    ${cmd}    30s
603     ${rule_id}=    Should Match Regexp    ${output}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
604     Log    ${rule_id}
605     Should Contain    ${output}    Created a new security_group_rule
606     Close Connection
607     [Return]    ${output}    ${rule_id}
608
609 Create Neutron Port With Additional Params
610     [Arguments]    ${network_name}    ${port_name}    ${additional_args}=${EMPTY}
611     [Documentation]    Create Port With given additional parameters
612     ${devstack_conn_id}=    Get ControlNode Connection
613     Switch Connection    ${devstack_conn_id}
614     ${cmd}=    Set Variable    neutron -v port-create ${network_name} --name ${port_name} ${additional_args}
615     Log    ${cmd}
616     ${OUTPUT}=    Write Commands Until Prompt    ${cmd}    30s
617     Log    ${OUTPUT}
618     Should Contain    ${output}    Created a new port
619     ${port_id}=    Should Match Regexp    ${OUTPUT}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
620     Log    ${port_id}
621     Close Connection
622     [Return]    ${OUTPUT}    ${port_id}