change get_field to awk command to make tests less reliant on devstack
[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 Create Network
22     [Arguments]    ${network_name}    ${additional_args}=${EMPTY}    ${verbose}=TRUE
23     [Documentation]    Create Network with neutron request.
24     ${devstack_conn_id}=    Get ControlNode Connection
25     Switch Connection    ${devstack_conn_id}
26     ${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}'
27     ${output}=    Write Commands Until Prompt    ${command}    30s
28     Log    ${output}
29     [Return]    ${output}
30
31 List Networks
32     [Documentation]    List networks and return output with neutron client.
33     ${devstack_conn_id}=    Get ControlNode Connection
34     Switch Connection    ${devstack_conn_id}
35     ${output}=    Write Commands Until Prompt    neutron net-list    30s
36     Close Connection
37     Log    ${output}
38     [Return]    ${output}
39
40 List Subnets
41     [Documentation]    List subnets and return output with neutron client.
42     ${devstack_conn_id}=    Get ControlNode Connection
43     Switch Connection    ${devstack_conn_id}
44     ${output}=    Write Commands Until Prompt    neutron subnet-list    30s
45     Close Connection
46     Log    ${output}
47     [Return]    ${output}
48
49 Delete Network
50     [Arguments]    ${network_name}
51     [Documentation]    Delete Network with neutron request.
52     ${devstack_conn_id}=    Get ControlNode Connection
53     Switch Connection    ${devstack_conn_id}
54     ${output}=    Write Commands Until Prompt    neutron -v net-delete ${network_name}    30s
55     Close Connection
56     Log    ${output}
57     Should Contain    ${output}    Deleted network: ${network_name}
58
59 Create SubNet
60     [Arguments]    ${network_name}    ${subnet}    ${range_ip}
61     [Documentation]    Create SubNet for the Network with neutron request.
62     ${devstack_conn_id}=    Get ControlNode Connection
63     Switch Connection    ${devstack_conn_id}
64     ${output}=    Write Commands Until Prompt    neutron -v subnet-create ${network_name} ${range_ip} --name ${subnet}    30s
65     Close Connection
66     Log    ${output}
67     Should Contain    ${output}    Created a new subnet
68
69 Create Port
70     [Arguments]    ${network_name}    ${port_name}
71     [Documentation]    Create Port with neutron request.
72     ${devstack_conn_id}=    Get ControlNode Connection
73     Switch Connection    ${devstack_conn_id}
74     ${output}=    Write Commands Until Prompt    neutron -v port-create ${network_name} --name ${port_name}    30s
75     Close Connection
76     Log    ${output}
77     Should Contain    ${output}    Created a new port
78
79 Delete Port
80     [Arguments]    ${port_name}
81     [Documentation]    Delete Port with neutron request.
82     ${devstack_conn_id}=    Get ControlNode Connection
83     Switch Connection    ${devstack_conn_id}
84     ${output}=    Write Commands Until Prompt    neutron -v port-delete ${port_name}    30s
85     Close Connection
86     Log    ${output}
87     Should Contain    ${output}    Deleted port: ${port_name}
88
89 List Ports
90     [Documentation]    List ports and return output with neutron client.
91     ${devstack_conn_id}=    Get ControlNode Connection
92     Switch Connection    ${devstack_conn_id}
93     ${output}=    Write Commands Until Prompt    neutron port-list    30s
94     Close Connection
95     Log    ${output}
96     [Return]    ${output}
97
98 Verify Gateway Ips
99     [Documentation]    Verifies the Gateway Ips with dump flow.
100     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
101     Log    ${output}
102     : FOR    ${GatewayIpElement}    IN    @{GATEWAY_IPS}
103     \    Should Contain    ${output}    ${GatewayIpElement}
104
105 Verify Dhcp Ips
106     [Documentation]    Verifies the Dhcp Ips with dump flow.
107     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
108     Log    ${output}
109     : FOR    ${DhcpIpElement}    IN    @{DHCP_IPS}
110     \    Should Contain    ${output}    ${DhcpIpElement}
111
112 Verify No Dhcp Ips
113     [Documentation]    Verifies the Dhcp Ips with dump flow.
114     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
115     Log    ${output}
116     : FOR    ${DhcpIpElement}    IN    @{DHCP_IPS}
117     \    Should Not Contain    ${output}    ${DhcpIpElement}
118
119 Delete SubNet
120     [Arguments]    ${subnet}
121     [Documentation]    Delete SubNet for the Network with neutron request.
122     Log    ${subnet}
123     ${devstack_conn_id}=    Get ControlNode Connection
124     Switch Connection    ${devstack_conn_id}
125     ${output}=    Write Commands Until Prompt    neutron -v subnet-delete ${subnet}
126     Close Connection
127     Log    ${output}
128     Should Contain    ${output}    Deleted subnet: ${subnet}
129
130 Verify No Gateway Ips
131     [Documentation]    Verifies the Gateway Ips removed with dump flow.
132     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
133     Log    ${output}
134     : FOR    ${GatewayIpElement}    IN    @{GATEWAY_IPS}
135     \    Should Not Contain    ${output}    ${GatewayIpElement}
136
137 Delete Vm Instance
138     [Arguments]    ${vm_name}
139     [Documentation]    Delete Vm instances using instance names.
140     ${devstack_conn_id}=    Get ControlNode Connection
141     Switch Connection    ${devstack_conn_id}
142     ${output}=    Write Commands Until Prompt    nova force-delete ${vm_name}    40s
143     Close Connection
144
145 Get Net Id
146     [Arguments]    ${network_name}    ${devstack_conn_id}
147     [Documentation]    Retrieve the net id for the given network name to create specific vm instance
148     Switch Connection    ${devstack_conn_id}
149     ${output}=    Write Commands Until Prompt    neutron net-list | grep "${network_name}" | awk '{print $2}'    30s
150     Log    ${output}
151     ${splitted_output}=    Split String    ${output}    ${EMPTY}
152     ${net_id}=    Get from List    ${splitted_output}    0
153     Log    ${net_id}
154     [Return]    ${net_id}
155
156 Get Port Id
157     [Arguments]    ${port_name}    ${devstack_conn_id}
158     [Documentation]    Retrieve the port id for the given port name to attach specific vm instance to a particular port
159     Switch Connection    ${devstack_conn_id}
160     ${output}=    Write Commands Until Prompt    neutron port-list | grep "${port_name}" | awk '{print $2}'    30s
161     Log    ${output}
162     ${splitted_output}=    Split String    ${output}    ${EMPTY}
163     ${port_id}=    Get from List    ${splitted_output}    0
164     Log    ${port_id}
165     [Return]    ${port_id}
166
167 Get Router Id
168     [Arguments]    ${router1}    ${devstack_conn_id}
169     [Documentation]    Retrieve the net id for the given network name to create specific vm instance
170     Switch Connection    ${devstack_conn_id}
171     ${output}=    Write Commands Until Prompt    neutron router-list | grep "${router1}" | awk '{print $2}'    30s
172     Log    ${output}
173     ${splitted_output}=    Split String    ${output}    ${EMPTY}
174     ${router_id}=    Get from List    ${splitted_output}    0
175     Log    ${router_id}
176     [Return]    ${router_id}
177
178 Create Vm Instances
179     [Arguments]    ${net_name}    ${vm_instance_names}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano    ${sg}=default
180     [Documentation]    Create X Vm Instance with the net id of the Netowrk.
181     ${devstack_conn_id}=    Get ControlNode Connection
182     Switch Connection    ${devstack_conn_id}
183     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
184     : FOR    ${VmElement}    IN    @{vm_instance_names}
185     \    ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic net-id=${net_id} ${VmElement} --security-groups ${sg}    30s
186     \    Log    ${output}
187     \    Wait Until Keyword Succeeds    25s    5s    Verify VM Is ACTIVE    ${VmElement}
188
189 Create Vm Instance With Port On Compute Node
190     [Arguments]    ${port_name}    ${vm_instance_name}    ${compute_node}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano
191     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
192     ${devstack_conn_id}=    Get ControlNode Connection
193     Switch Connection    ${devstack_conn_id}
194     ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
195     ${hostname_compute_node}=    Run Command On Remote System    ${compute_node}    hostname
196     ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic port-id=${port_id} ${vm_instance_name} --availability-zone nova:${hostname_compute_node}    30s
197     Log    ${output}
198     Wait Until Keyword Succeeds    25s    5s    Verify VM Is ACTIVE    ${vm_instance_name}
199
200 Verify VM Is ACTIVE
201     [Arguments]    ${vm_name}
202     [Documentation]    Run these commands to check whether the created vm instance is active or not.
203     ${output}=    Write Commands Until Prompt    nova show ${vm_name} | grep OS-EXT-STS:vm_state    30s
204     Log    ${output}
205     Should Contain    ${output}    active
206
207 View Vm Console
208     [Arguments]    ${vm_instance_names}
209     [Documentation]    View Console log of the created vm instances using nova show.
210     : FOR    ${VmElement}    IN    @{vm_instance_names}
211     \    ${output}=    Write Commands Until Prompt    nova show ${VmElement}
212     \    Log    ${output}
213     \    ${output}=    Write Commands Until Prompt    nova console-log ${VmElement}
214     \    Log    ${output}
215
216 Ping Vm From DHCP Namespace
217     [Arguments]    ${net_name}    ${vm_ip}
218     [Documentation]    Reach all Vm Instance with the net id of the Netowrk.
219     Log    ${vm_ip}
220     ${devstack_conn_id}=    Get ControlNode Connection
221     Switch Connection    ${devstack_conn_id}
222     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
223     Log    ${net_id}
224     ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
225     Log    ${output}
226     Close Connection
227     Should Contain    ${output}    64 bytes
228
229 Ping From DHCP Should Not Succeed
230     [Arguments]    ${net_name}    ${vm_ip}
231     [Documentation]    Should Not Reach Vm Instance with the net id of the Netowrk.
232     Log    ${vm_ip}
233     ${devstack_conn_id}=    Get ControlNode Connection
234     Switch Connection    ${devstack_conn_id}
235     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
236     Log    ${net_id}
237     ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
238     Close Connection
239     Log    ${output}
240     Should Not Contain    ${output}    64 bytes
241
242 Ping From Instance
243     [Arguments]    ${dest_vm}
244     [Documentation]    Ping to the expected destination ip.
245     ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${dest_vm}    ${OS_SYSTEM_PROMPT}
246     Log    ${output}
247     [Return]    ${output}
248
249 Curl Metadata Server
250     [Documentation]    Ping to the expected destination ip.
251     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
252     Write Commands Until Prompt    exit
253     Should Contain    ${output}    200
254
255 Close Vm Instance
256     [Documentation]    Exit the vm instance.
257     ${output}=    Write Commands Until Prompt    exit
258     Log    ${output}
259
260 Check If Console Is VmInstance
261     [Arguments]    ${console}=cirros
262     [Documentation]    Check if the session has been able to login to the VM instance
263     ${output}=    Write Commands Until Expected Prompt    id    ${OS_SYSTEM_PROMPT}
264     Should Contain    ${output}    ${console}
265
266 Exit From Vm Console
267     [Documentation]    Check if the session has been able to login to the VM instance and exit the instance
268     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance    cirros
269     Run Keyword If    ${rcode}    Write Commands Until Prompt    exit
270     Get OvsDebugInfo
271
272 Check Ping
273     [Arguments]    ${ip_address}
274     [Documentation]    Run Ping command on the IP available as argument
275     ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
276     Should Contain    ${output}    64 bytes
277
278 Check Metadata Access
279     [Documentation]    Try curl on the Metadataurl and check if it is okay
280     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
281     Should Contain    ${output}    200
282
283 Test Operations From Vm Instance
284     [Arguments]    ${net_name}    ${src_ip}    ${list_of_local_dst_ips}    ${l2_or_l3}=l2    ${list_of_external_dst_ips}=${NONE}    ${user}=cirros
285     ...    ${password}=cubswin:)
286     [Documentation]    Login to the vm instance using ssh in the network.
287     ${devstack_conn_id}=    Get ControlNode Connection
288     Switch Connection    ${devstack_conn_id}
289     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
290     ${output}=    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh ${user}@${src_ip} -o ConnectTimeout=10 -o StrictHostKeyChecking=no    d:
291     Log    ${output}
292     ${output}=    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
293     Log    ${output}
294     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
295     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ifconfig    ${OS_SYSTEM_PROMPT}
296     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route    ${OS_SYSTEM_PROMPT}
297     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    arp -an    ${OS_SYSTEM_PROMPT}
298     ${dest_vm}=    Get From List    ${list_of_local_dst_ips}    0
299     Log    ${dest_vm}
300     Run Keyword If    ${rcode}    Check Ping    ${dest_vm}
301     ${dest_dhcp}=    Get From List    ${list_of_local_dst_ips}    1
302     Log    ${dest_dhcp}
303     Run Keyword If    ${rcode}    Check Ping    ${dest_dhcp}
304     ${dest_vm}=    Get From List    ${list_of_local_dst_ips}    2
305     Log    ${dest_vm}
306     Run Keyword If    ${rcode}    Check Ping    ${dest_vm}
307     Run Keyword If    ${rcode}    Check Metadata Access
308     Run Keyword If    '${l2_or_l3}' == 'l3'    Ping Other Instances    ${list_of_external_dst_ips}
309     [Teardown]    Exit From Vm Console
310
311 Ping Other Instances
312     [Arguments]    ${list_of_external_dst_ips}
313     [Documentation]    Check reachability with other network's instances.
314     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
315     ${dest_vm}=    Get From List    ${list_of_external_dst_ips}    0
316     Log    ${dest_vm}
317     Run Keyword If    ${rcode}    Check Ping    ${dest_vm}
318     ${dest_dhcp}=    Get From List    ${list_of_external_dst_ips}    1
319     Log    ${dest_dhcp}
320     Run Keyword If    ${rcode}    Check Ping    ${dest_dhcp}
321     ${dest_vm}=    Get From List    ${list_of_external_dst_ips}    2
322     Log    ${dest_vm}
323     Run Keyword If    ${rcode}    Check Ping    ${dest_vm}
324
325 Create Router
326     [Arguments]    ${router_name}
327     [Documentation]    Create Router and Add Interface to the subnets.
328     ${devstack_conn_id}=    Get ControlNode Connection
329     Switch Connection    ${devstack_conn_id}
330     ${output}=    Write Commands Until Prompt    neutron -v router-create ${router_name}    30s
331     Close Connection
332     Should Contain    ${output}    Created a new router
333
334 Add Router Interface
335     [Arguments]    ${router_name}    ${interface_name}
336     ${devstack_conn_id}=    Get ControlNode Connection
337     Switch Connection    ${devstack_conn_id}
338     ${output}=    Write Commands Until Prompt    neutron -v router-interface-add ${router_name} ${interface_name}
339     Close Connection
340     Should Contain    ${output}    Added interface
341
342 Remove Interface
343     [Arguments]    ${router_name}    ${interface_name}
344     [Documentation]    Remove Interface to the subnets.
345     ${devstack_conn_id}=    Get ControlNode Connection
346     Switch Connection    ${devstack_conn_id}
347     ${output}=    Write Commands Until Prompt    neutron -v router-interface-delete ${router_name} ${interface_name}
348     Close Connection
349     Should Contain    ${output}    Removed interface from router
350
351 Delete Router
352     [Arguments]    ${router_name}
353     [Documentation]    Delete Router and Interface to the subnets.
354     ${devstack_conn_id}=    Get ControlNode Connection
355     Switch Connection    ${devstack_conn_id}
356     ${output}=    Write Commands Until Prompt    neutron -v router-delete ${router_name}    60s
357     Close Connection
358     Should Contain    ${output}    Deleted router:
359
360 Get DumpFlows And Ovsconfig
361     [Arguments]    ${openstack_node_ip}
362     [Documentation]    Get the OvsConfig and Flow entries from OVS from the Openstack Node
363     Log    ${openstack_node_ip}
364     SSHLibrary.Open Connection    ${openstack_node_ip}    prompt=${DEFAULT_LINUX_PROMPT}
365     Utils.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
366     SSHLibrary.Set Client Configuration    timeout=${default_devstack_prompt_timeout}
367     Write Commands Until Expected Prompt    ip -o link    ]>
368     Write Commands Until Expected Prompt    ip -o addr    ]>
369     Write Commands Until Expected Prompt    ip route    ]>
370     Write Commands Until Expected Prompt    arp -an    ]>
371     ${nslist}=    Write Commands Until Expected Prompt    ip netns list | awk '{print $1}'    ]>
372     @{lines}    Split To Lines    ${nslist}
373     : FOR    ${line}    IN    @{lines}
374     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip -o link    ]>
375     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip -o addr    ]>
376     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip route    ]>
377     Write Commands Until Expected Prompt    sudo ovs-vsctl show    ]>
378     Write Commands Until Expected Prompt    sudo ovs-vsctl list Open_vSwitch    ]>
379     Write Commands Until Expected Prompt    sudo ovs-ofctl show br-int -OOpenFlow13    ]>
380     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-flows br-int -OOpenFlow13    ]>
381     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-groups br-int -OOpenFlow13    ]>
382     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-group-stats br-int -OOpenFlow13    ]>
383
384 Get ControlNode Connection
385     ${control_conn_id}=    SSHLibrary.Open Connection    ${OS_CONTROL_NODE_IP}    prompt=${DEFAULT_LINUX_PROMPT_STRICT}
386     Utils.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
387     SSHLibrary.Set Client Configuration    timeout=30s
388     Source Password    force=yes
389     [Return]    ${control_conn_id}
390
391 Get OvsDebugInfo
392     [Documentation]    Get the OvsConfig and Flow entries from all Openstack nodes
393     Run Keyword If    0 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CONTROL_NODE_IP}
394     Run Keyword If    1 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_1_IP}
395     Run Keyword If    2 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_2_IP}
396
397 Show Debugs
398     [Arguments]    ${vm_indices}
399     [Documentation]    Run these commands for debugging, it can list state of VM instances and ip information in control node
400     ${devstack_conn_id}=    Get ControlNode Connection
401     Switch Connection    ${devstack_conn_id}
402     ${output}=    Write Commands Until Prompt    sudo ip netns list
403     Log    ${output}
404     : FOR    ${index}    IN    @{vm_indices}
405     \    ${output}=    Write Commands Until Prompt    nova show ${index}    30s
406     \    Log    ${output}
407     Close Connection
408     List Networks
409     List Subnets
410     List Ports
411
412 Create Security Group
413     [Arguments]    ${sg_name}    ${desc}
414     ${devstack_conn_id}=    Get ControlNode Connection
415     Switch Connection    ${devstack_conn_id}
416     ${output}=    Write Commands Until Prompt    nova secgroup-create ${sg_name} ${desc}    40s
417     Close Connection
418
419 Create Security Rule
420     [Arguments]    ${direction}    ${protocol}    ${min_port}    ${max_port}    ${remote_ip}    ${sg_name}
421     ${devstack_conn_id}=    Get ControlNode Connection
422     Switch Connection    ${devstack_conn_id}
423     ${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}
424     Close Connection