Test Option for min max with server create
[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           Collections
4 Library           SSHLibrary
5 Library           OperatingSystem
6 Resource          DataModels.robot
7 Resource          Utils.robot
8 Resource          SSHKeywords.robot
9 Resource          L2GatewayOperations.robot
10 Resource          ../variables/Variables.robot
11 Resource          ../variables/netvirt/Variables.robot
12 Variables         ../variables/netvirt/Modules.py
13
14 *** Keywords ***
15 Get Tenant ID From Security Group
16     [Documentation]    Returns tenant ID by reading it from existing default security-group.
17     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group show default | grep "| tenant_id" | awk '{print $4}'
18     Log    ${output}
19     Should Not Be True    ${rc}
20     [Return]    ${output}
21
22 Get Tenant ID From Network
23     [Arguments]    ${network_uuid}
24     [Documentation]    Returns tenant ID by reading it from existing network.
25     ${resp}=    Get_From_Uri    uri=${CONFIG_API}/neutron:neutron/networks/network/${network_uuid}/    accept=${ACCEPT_EMPTY}    session=session
26     ${tenant_id}=    Utils.Extract Value From Content    ${resp}    /network/0/tenant-id    strip
27     [Return]    ${tenant_id}
28
29 Create Network
30     [Arguments]    ${network_name}    ${additional_args}=${EMPTY}    ${verbose}=TRUE
31     [Documentation]    Create Network with neutron request.
32     ${rc}    ${output}=    Run And Return Rc And Output    openstack network create ${network_name} ${additional_args}
33     Log    ${output}
34     Should Not Be True    ${rc}
35     [Return]    ${output}
36
37 Update Network
38     [Arguments]    ${network_name}    ${additional_args}=${EMPTY}
39     [Documentation]    Update Network with neutron request.
40     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v net-update ${network_name} ${additional_args}    openstack network set ${network_name} ${additional_args}
41     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
42     Log    ${output}
43     Should Not Be True    ${rc}
44     [Return]    ${output}
45
46 Show Network
47     [Arguments]    ${network_name}
48     [Documentation]    Show Network with neutron request.
49     ${rc}    ${output}=    Run And Return Rc And Output    openstack network show ${network_name}
50     Log    ${output}
51     Should Not Be True    ${rc}
52     [Return]    ${output}
53
54 List Networks
55     [Documentation]    List networks and return output with neutron client.
56     ${rc}    ${output}=    Run And Return Rc And Output    openstack network list
57     Log    ${output}
58     Should Not Be True    ${rc}
59     [Return]    ${output}
60
61 List Subnets
62     [Documentation]    List subnets and return output with neutron client.
63     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet list
64     Log    ${output}
65     Should Not Be True    ${rc}
66     [Return]    ${output}
67
68 Delete Network
69     [Arguments]    ${network_name}
70     [Documentation]    Delete Network with neutron request.
71     ${rc}    ${output}=    Run And Return Rc And Output    openstack network delete ${network_name}
72     Log    ${output}
73     Should Not Be True    ${rc}
74
75 Create SubNet
76     [Arguments]    ${network_name}    ${subnet}    ${range_ip}    ${additional_args}=${EMPTY}
77     [Documentation]    Create SubNet for the Network with neutron request.
78     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet create --network ${network_name} --subnet-range ${range_ip} ${subnet} ${additional_args}
79     Log    ${output}
80     Should Not Be True    ${rc}
81
82 Update SubNet
83     [Arguments]    ${subnet_name}    ${additional_args}=${EMPTY}
84     [Documentation]    Update subnet with neutron request.
85     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v subnet-update ${subnet_name} ${additional_args}    openstack subnet set ${subnet_name} ${additional_args}
86     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
87     Log    ${output}
88     Should Not Be True    ${rc}
89     [Return]    ${output}
90
91 Show SubNet
92     [Arguments]    ${subnet_name}
93     [Documentation]    Show subnet with neutron request.
94     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet show ${subnet_name}
95     Log    ${output}
96     Should Not Be True    ${rc}
97     [Return]    ${output}
98
99 Create Port
100     [Arguments]    ${network_name}    ${port_name}    ${sg}=default    ${additional_args}=${EMPTY}    ${allowed_address_pairs}=${EMPTY}
101     [Documentation]    Create Port with neutron request.
102     # if allowed_address_pairs is not empty we need to create the arguments to pass to the port create command. They are
103     # in a different format with the neutron vs openstack cli.
104     ${address_pair_length}=    Get Length    ${allowed_address_pairs}
105     ${allowed_pairs_argv}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton' and '${address_pair_length}'=='2'    --allowed-address-pairs type=dict list=true ip_address=@{allowed_address_pairs}[0] ip_address=@{allowed_address_pairs}[1]
106     ${allowed_pairs_argv}=    Set Variable If    '${OPENSTACK_BRANCH}'!='stable/newton' and '${address_pair_length}'=='2'    --allowed-address ip-address=@{allowed_address_pairs}[0] --allowed-address ip-address=@{allowed_address_pairs}[1]    ${allowed_pairs_argv}
107     ${allowed_pairs_argv}=    Set Variable If    '${address_pair_length}'=='0'    ${EMPTY}    ${allowed_pairs_argv}
108     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v port-create ${network_name} --name ${port_name} --security-group ${sg} ${additional_args} ${allowed_pairs_argv}    openstack port create --network ${network_name} ${port_name} --security-group ${sg} ${additional_args} ${allowed_pairs_argv}
109     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
110     Log    ${output}
111     Should Not Be True    ${rc}
112
113 Update Port
114     [Arguments]    ${port_name}    ${additional_args}=${EMPTY}
115     [Documentation]    Update port with neutron request.
116     ${rc}    ${output}=    Run And Return Rc And Output    openstack port set ${port_name} ${additional_args}
117     Log    ${output}
118     Should Not Be True    ${rc}
119     [Return]    ${output}
120
121 Show Port
122     [Arguments]    ${port_name}
123     [Documentation]    Show port with neutron request.
124     ${rc}    ${output}=    Run And Return Rc And Output    openstack port show ${port_name}
125     Log    ${output}
126     Should Not Be True    ${rc}
127     [Return]    ${output}
128
129 Delete Port
130     [Arguments]    ${port_name}
131     [Documentation]    Delete Port with neutron request.
132     ${rc}    ${output}=    Run And Return Rc And Output    openstack port delete ${port_name}
133     Log    ${output}
134     Should Not Be True    ${rc}
135
136 List Ports
137     [Documentation]    List ports and return output with neutron client.
138     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list
139     Log    ${output}
140     Should Not Be True    ${rc}
141     [Return]    ${output}
142
143 List Nova VMs
144     [Documentation]    List VMs and return output with nova client.
145     ${rc}    ${output}=    Run And Return Rc And Output    openstack server list
146     Log    ${output}
147     Should Not Be True    ${rc}
148     [Return]    ${output}
149
150 Create And Associate Floating IPs
151     [Arguments]    ${external_net}    @{vm_list}
152     [Documentation]    Create and associate floating IPs to VMs with nova request
153     ${ip_list}=    Create List    @{EMPTY}
154     : FOR    ${vm}    IN    @{vm_list}
155     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack floating ip create ${external_net}
156     \    Log    ${output}
157     \    Should Not Be True    ${rc}
158     \    @{ip}    Get Regexp Matches    ${output}    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
159     \    ${ip_length}    Get Length    ${ip}
160     \    Run Keyword If    ${ip_length}>0    Append To List    ${ip_list}    @{ip}[0]
161     \    ...    ELSE    Append To List    ${ip_list}    None
162     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack server add floating ip ${vm} @{ip}[0]
163     \    Log    ${output}
164     \    Should Not Be True    ${rc}
165     [Return]    ${ip_list}
166
167 Verify Gateway Ips
168     [Documentation]    Verifies the Gateway Ips with dump flow.
169     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
170     Log    ${output}
171     : FOR    ${GatewayIpElement}    IN    @{GATEWAY_IPS}
172     \    Should Contain    ${output}    ${GatewayIpElement}
173
174 Verify Dhcp Ips
175     [Documentation]    Verifies the Dhcp Ips with dump flow.
176     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
177     Log    ${output}
178     : FOR    ${DhcpIpElement}    IN    @{DHCP_IPS}
179     \    Should Contain    ${output}    ${DhcpIpElement}
180
181 Verify No Dhcp Ips
182     [Documentation]    Verifies the Dhcp Ips with dump flow.
183     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
184     Log    ${output}
185     : FOR    ${DhcpIpElement}    IN    @{DHCP_IPS}
186     \    Should Not Contain    ${output}    ${DhcpIpElement}
187
188 Delete SubNet
189     [Arguments]    ${subnet}
190     [Documentation]    Delete SubNet for the Network with neutron request.
191     Log    ${subnet}
192     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet delete ${subnet}
193     Log    ${output}
194     Should Not Be True    ${rc}
195
196 Verify No Gateway Ips
197     [Documentation]    Verifies the Gateway Ips removed with dump flow.
198     ${output}=    Write Commands Until Prompt    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
199     Log    ${output}
200     : FOR    ${GatewayIpElement}    IN    @{GATEWAY_IPS}
201     \    Should Not Contain    ${output}    ${GatewayIpElement}
202
203 Delete Vm Instance
204     [Arguments]    ${vm_name}
205     [Documentation]    Delete Vm instances using instance names.
206     ${rc}    ${output}=    Run And Return Rc And Output    openstack server delete ${vm_name}
207     Log    ${output}
208     Log    ${rc}
209
210 Get Net Id
211     [Arguments]    ${network_name}    ${devstack_conn_id}
212     [Documentation]    Retrieve the net id for the given network name to create specific vm instance
213     ${rc}    ${output}=    Run And Return Rc And Output    openstack network list | grep "${network_name}" | awk '{print $2}'
214     Log    ${output}
215     Should Not Be True    ${rc}
216     ${splitted_output}=    Split String    ${output}    ${EMPTY}
217     ${net_id}=    Get from List    ${splitted_output}    0
218     Log    ${net_id}
219     [Return]    ${net_id}
220
221 Get Subnet Id
222     [Arguments]    ${subnet_name}    ${devstack_conn_id}
223     [Documentation]    Retrieve the subnet id for the given subnet name
224     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet show "${subnet_name}" | grep " id " | awk '{print $4}'
225     Log    ${output}
226     Should Not Be True    ${rc}
227     ${splitted_output}=    Split String    ${output}    ${EMPTY}
228     ${subnet_id}=    Get from List    ${splitted_output}    0
229     Log    ${subnet_id}
230     [Return]    ${subnet_id}
231
232 Get Port Id
233     [Arguments]    ${port_name}    ${devstack_conn_id}
234     [Documentation]    Retrieve the port id for the given port name to attach specific vm instance to a particular port
235     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list | grep "${port_name}" | awk '{print $2}'
236     Log    ${output}
237     Should Not Be True    ${rc}
238     ${splitted_output}=    Split String    ${output}    ${EMPTY}
239     ${port_id}=    Get from List    ${splitted_output}    0
240     Log    ${port_id}
241     [Return]    ${port_id}
242
243 Get Router Id
244     [Arguments]    ${router1}    ${devstack_conn_id}
245     [Documentation]    Retrieve the router id for the given router name
246     ${rc}    ${output}=    Run And Return Rc And Output    openstack router list -f table | grep "${router1}" | awk '{print $2}'
247     Log    ${output}
248     Should Not Be True    ${rc}
249     ${splitted_output}=    Split String    ${output}    ${EMPTY}
250     ${router_id}=    Get from List    ${splitted_output}    0
251     Log    ${router_id}
252     [Return]    ${router_id}
253
254 Create Vm Instances
255     [Arguments]    ${net_name}    ${vm_instance_names}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default    ${min}=1
256     ...    ${max}=1
257     [Documentation]    Create X Vm Instance with the net id of the Netowrk.
258     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
259     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
260     : FOR    ${VmElement}    IN    @{vm_instance_names}
261     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic net-id=${net_id} ${VmElement} --security-group ${sg} --min ${min} --max ${max}
262     \    Should Not Be True    ${rc}
263     \    Log    ${output}
264
265 Create Vm Instance With Port
266     [Arguments]    ${port_name}    ${vm_instance_name}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default
267     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
268     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
269     ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
270     ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic port-id=${port_id} ${vm_instance_name} --security-groups ${sg}
271     Log    ${output}
272
273 Create Vm Instance With Ports
274     [Arguments]    ${port_name}    ${port2_name}    ${vm_instance_name}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default
275     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
276     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
277     ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
278     ${port2_id}=    Get Port Id    ${port2_name}    ${devstack_conn_id}
279     ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic port-id=${port_id} --nic port-id=${port2_id} ${vm_instance_name} --security-group ${sg}
280     Log    ${output}
281     Should Not Be True    ${rc}
282
283 Create Vm Instance With Port On Compute Node
284     [Arguments]    ${port_name}    ${vm_instance_name}    ${compute_node}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default
285     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
286     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
287     ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
288     ${hostname_compute_node}=    Run Command On Remote System    ${compute_node}    hostname
289     ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic port-id=${port_id} --security-group ${sg} --availability-zone nova:${hostname_compute_node} ${vm_instance_name}
290     Log    ${output}
291     Should Not Be True    ${rc}
292
293 Verify VM Is ACTIVE
294     [Arguments]    ${vm_name}
295     [Documentation]    Run these commands to check whether the created vm instance is active or not.
296     ${rc}    ${output}=    Run And Return Rc And Output    openstack server show ${vm_name} | grep OS-EXT-STS:vm_state
297     Log    ${output}
298     Should Not Be True    ${rc}
299     Should Contain    ${output}    active
300
301 Poll VM Is ACTIVE
302     [Arguments]    ${vm_name}    ${retry}=600s    ${retry_interval}=5s
303     [Documentation]    Run these commands to check whether the created vm instance is active or not.
304     Wait Until Keyword Succeeds    ${retry}    ${retry_interval}    Verify VM Is ACTIVE    ${vm_name}
305
306 Collect VM IP Addresses
307     [Arguments]    ${fail_on_none}    @{vm_list}
308     [Documentation]    Using nova console-log on the provided ${vm_list} to search for the string "obtained" which
309     ...    correlates to the instance receiving it's IP address via DHCP. Also retrieved is the ip of the nameserver
310     ...    if available in the console-log output. The keyword will also return a list of the learned ips as it
311     ...    finds them in the console log output, and will have "None" for Vms that no ip was found.
312     ${ip_list}    Create List    @{EMPTY}
313     : FOR    ${vm}    IN    @{vm_list}
314     \    ${rc}    ${vm_ip_line}=    Run And Return Rc And Output    openstack console log show ${vm} | grep -i "obtained"
315     \    Log    ${vm_ip_line}
316     \    Log    ${rc}
317     \    @{vm_ip}    Get Regexp Matches    ${vm_ip_line}    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
318     \    ${vm_ip_length}    Get Length    ${vm_ip}
319     \    Run Keyword If    ${vm_ip_length}>0    Append To List    ${ip_list}    @{vm_ip}[0]
320     \    ...    ELSE    Append To List    ${ip_list}    None
321     \    ${rc}    ${dhcp_ip_line}=    Run And Return Rc And Output    openstack console log show ${vm} | grep "^nameserver"
322     \    Log    ${dhcp_ip_line}
323     \    Log    ${rc}
324     \    ${dhcp_ip}    Get Regexp Matches    ${dhcp_ip_line}    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
325     \    ${dhcp_ip_length}    Get Length    ${dhcp_ip}
326     \    Run Keyword If    ${dhcp_ip_length}<=0    Append To List    ${dhcp_ip}    None
327     \    Log    ${dhcp_ip}
328     \    ${vm_console_output}=    Run    openstack console log show ${vm}
329     \    Log    ${vm_console_output}
330     ${dhcp_length}    Get Length    ${dhcp_ip}
331     Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${ip_list}    None
332     Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${dhcp_ip}    None
333     Should Be True    ${dhcp_length} <= 1
334     Return From Keyword If    ${dhcp_length}==0    ${ip_list}    ${EMPTY}
335     [Return]    ${ip_list}    ${dhcp_ip}
336
337 Collect VM IPv6 SLAAC Addresses
338     [Arguments]    ${fail_on_none}    ${prefix}    @{vm_list}
339     [Documentation]    Using nova console-log on the provided ${vm_list} to search for the string "inet6" which
340     ...    correlates to the instance generated IPv6 address, based on the ${prefix} received from ODL (SLAAC mode).
341     ${ip_list}    Create List    @{EMPTY}
342     : FOR    ${vm}    IN    @{vm_list}
343     \    Log    ${vm}
344     \    ${rc}    ${vm_ip_line}=    Run And Return Rc And Output    nova console-log ${vm} | grep -i "inet6"
345     \    Log    ${vm_ip_line}
346     \    Log    ${rc}
347     \    @{vm_ip_list}    Get Regexp Matches    ${vm_ip_line}    ${prefix}
348     \    ${vm_ip_length}    Get Length    ${vm_ip_list}
349     \    Run Keyword If    ${vm_ip_length}>0    Append To List    ${ip_list}    @{vm_ip_list}[0]
350     \    ...    ELSE    Append To List    ${ip_list}    None
351     \    Log    ${ip_list}
352     Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${ip_list}    None
353     Log    ${ip_list}
354     [Return]    ${ip_list}
355
356 View Vm Console
357     [Arguments]    ${vm_instance_names}
358     [Documentation]    View Console log of the created vm instances using nova show.
359     : FOR    ${VmElement}    IN    @{vm_instance_names}
360     \    ${rc}    ${output}=    Run And Return Rc And Output    nova show ${VmElement}
361     \    Log    ${output}
362     \    Should Not Be True    ${rc}
363     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack console log show ${VmElement}
364     \    Log    ${output}
365     \    Should Not Be True    ${rc}
366
367 Ping Vm From DHCP Namespace
368     [Arguments]    ${net_name}    ${vm_ip}
369     [Documentation]    Reach all Vm Instance with the net id of the Netowrk.
370     Log    ${vm_ip}
371     ${devstack_conn_id}=    Get ControlNode Connection
372     Switch Connection    ${devstack_conn_id}
373     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
374     Log    ${net_id}
375     ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
376     Log    ${output}
377     Close Connection
378     Should Contain    ${output}    64 bytes
379
380 Ping From DHCP Should Not Succeed
381     [Arguments]    ${net_name}    ${vm_ip}
382     [Documentation]    Should Not Reach Vm Instance with the net id of the Netowrk.
383     Return From Keyword If    "skip_if_${SECURITY_GROUP_MODE}" in @{TEST_TAGS}
384     Log    ${vm_ip}
385     ${devstack_conn_id}=    Get ControlNode Connection
386     Switch Connection    ${devstack_conn_id}
387     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
388     Log    ${net_id}
389     ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
390     Close Connection
391     Log    ${output}
392     Should Not Contain    ${output}    64 bytes
393
394 Ping Vm From Control Node
395     [Arguments]    ${vm_floating_ip}    ${additional_args}=${EMPTY}
396     [Documentation]    Ping VM floating IP from control node
397     Log    ${vm_floating_ip}
398     ${devstack_conn_id}=    Get ControlNode Connection
399     Switch Connection    ${devstack_conn_id}
400     ${output}=    Write Commands Until Prompt    ping ${additional_args} -c 3 ${vm_floating_ip}    20s
401     Log    ${output}
402     Close Connection
403     Should Contain    ${output}    64 bytes
404
405 Ping From Instance
406     [Arguments]    ${dest_vm_ip}
407     [Documentation]    Ping to the expected destination ip.
408     ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${dest_vm_ip}    ${OS_SYSTEM_PROMPT}
409     Log    ${output}
410     [Return]    ${output}
411
412 Curl Metadata Server
413     [Documentation]    Ping to the expected destination ip.
414     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
415     Write Commands Until Prompt    exit
416     Should Contain    ${output}    200
417
418 Close Vm Instance
419     [Documentation]    Exit the vm instance.
420     ${output}=    Write Commands Until Prompt    exit
421     Log    ${output}
422
423 Check If Console Is VmInstance
424     [Arguments]    ${console}=cirros
425     [Documentation]    Check if the session has been able to login to the VM instance
426     ${output}=    Write Commands Until Expected Prompt    id    ${OS_SYSTEM_PROMPT}
427     Should Contain    ${output}    ${console}
428
429 Exit From Vm Console
430     [Documentation]    Check if the session has been able to login to the VM instance and exit the instance
431     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance    cirros
432     Run Keyword If    ${rcode}    Write Commands Until Prompt    exit
433     Close Connection
434
435 Check Ping
436     [Arguments]    ${ip_address}    ${ttl}=64
437     [Documentation]    Run Ping command on the IP available as argument
438     ${ethertype}=    Get Regexp Matches    ${ip_address}    ${IP_REGEX}
439     ${output}=    Run Keyword If    ${ethertype}    Write Commands Until Expected Prompt    ping -t ${ttl} -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
440     ...    ELSE    Write Commands Until Expected Prompt    ping6 -t ${ttl} -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
441     Should Contain    ${output}    64 bytes
442
443 Check No Ping
444     [Arguments]    ${ip_address}    ${ttl}=64
445     [Documentation]    Run Ping command to the IP given as argument, executing 3 times and expecting NOT to see "64 bytes"
446     ${output}=    Write Commands Until Expected Prompt    ping -t ${ttl} -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
447     Should Not Contain    ${output}    64 bytes
448
449 Check Metadata Access
450     [Documentation]    Try curl on the Metadataurl and check if it is okay
451     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
452     Should Contain    ${output}    200
453
454 Execute Command on VM Instance
455     [Arguments]    ${net_name}    ${vm_ip}    ${cmd}    ${user}=cirros    ${password}=cubswin:)
456     [Documentation]    Login to the vm instance using ssh in the network, executes a command inside the VM and returns the ouput.
457     ${devstack_conn_id} =    Get ControlNode Connection
458     Switch Connection    ${devstack_conn_id}
459     ${net_id} =    Get Net Id    ${net_name}    ${devstack_conn_id}
460     Log    ${vm_ip}
461     ${output} =    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh ${user}@${vm_ip} -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null    password:
462     Log    ${output}
463     ${output} =    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
464     Log    ${output}
465     ${rcode} =    Run Keyword And Return Status    Check If Console Is VmInstance
466     ${output} =    Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ${cmd}    ${OS_SYSTEM_PROMPT}
467     [Teardown]    Exit From Vm Console
468     [Return]    ${output}
469
470 Test Operations From Vm Instance
471     [Arguments]    ${net_name}    ${src_ip}    ${dest_ips}    ${user}=cirros    ${password}=cubswin:)    ${ttl}=64
472     ...    ${ping_should_succeed}=True    ${check_metadata}=True
473     [Documentation]    Login to the vm instance using ssh in the network.
474     ${devstack_conn_id}=    Get ControlNode Connection
475     Switch Connection    ${devstack_conn_id}
476     Log    ${src_ip}
477     ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
478     ${output}=    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ${user}@${src_ip} -o UserKnownHostsFile=/dev/null    password:
479     Log    ${output}
480     ${output}=    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
481     Log    ${output}
482     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
483     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ifconfig    ${OS_SYSTEM_PROMPT}
484     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route -n    ${OS_SYSTEM_PROMPT}
485     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route -A inet6    ${OS_SYSTEM_PROMPT}
486     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    arp -an    ${OS_SYSTEM_PROMPT}
487     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ip -6 neigh    ${OS_SYSTEM_PROMPT}
488     : FOR    ${dest_ip}    IN    @{dest_ips}
489     \    Log    ${dest_ip}
490     \    ${string_empty}=    Run Keyword And Return Status    Should Be Empty    ${dest_ip}
491     \    Run Keyword If    ${string_empty}    Continue For Loop
492     \    Run Keyword If    ${rcode} and "${ping_should_succeed}" == "True"    Check Ping    ${dest_ip}    ttl=${ttl}
493     \    ...    ELSE    Check No Ping    ${dest_ip}    ttl=${ttl}
494     ${ethertype}=    Get Regexp Matches    ${src_ip}    ${IP_REGEX}
495     Run Keyword If    ${rcode} and "${check_metadata}" and ${ethertype} == "True"    Check Metadata Access
496     [Teardown]    Exit From Vm Console
497
498 Test Netcat Operations From Vm Instance
499     [Arguments]    ${net_name}    ${vm_ip}    ${dest_ip}    ${additional_args}=${EMPTY}    ${port}=12345    ${user}=cirros
500     ...    ${password}=cubswin:)
501     [Documentation]    Use Netcat to test TCP/UDP connections to the controller
502     ${client_data}    Set Variable    Test Client Data
503     ${server_data}    Set Variable    Test Server Data
504     ${devstack_conn_id}=    Get ControlNode Connection
505     Switch Connection    ${devstack_conn_id}
506     Log    ${vm_ip}
507     ${output}=    Write Commands Until Prompt    ( ( echo "${server_data}" | sudo timeout 60 nc -l ${additional_args} ${port} ) & )
508     Log    ${output}
509     ${output}=    Write Commands Until Prompt    sudo netstat -nlap | grep ${port}
510     Log    ${output}
511     ${nc_output}=    Execute Command on VM Instance    ${net_name}    ${vm_ip}    sudo echo "${client_data}" | nc -v -w 5 ${additional_args} ${dest_ip} ${port}
512     Log    ${nc_output}
513     ${output}=    Execute Command on VM Instance    ${net_name}    ${vm_ip}    sudo route -n
514     Log    ${output}
515     ${output}=    Execute Command on VM Instance    ${net_name}    ${vm_ip}    sudo arp -an
516     Log    ${output}
517     Should Match Regexp    ${nc_output}    ${server_data}
518
519 Ping Other Instances
520     [Arguments]    ${list_of_external_dst_ips}
521     [Documentation]    Check reachability with other network's instances.
522     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
523     : FOR    ${dest_ip}    IN    @{list_of_external_dst_ips}
524     \    Log    ${dest_ip}
525     \    Check Ping    ${dest_ip}
526
527 Create Router
528     [Arguments]    ${router_name}
529     [Documentation]    Create Router and Add Interface to the subnets.
530     ${rc}    ${output}=    Run And Return Rc And Output    openstack router create ${router_name}
531     Should Not Be True    ${rc}
532
533 List Router
534     [Documentation]    List Router and return output with neutron client.
535     ${rc}    ${output}=    Run And Return Rc And Output    openstack router list -f value
536     Log    ${output}
537     Should Not Be True    ${rc}
538     [Return]    ${output}
539
540 Add Router Interface
541     [Arguments]    ${router_name}    ${interface_name}
542     ${rc}    ${output}=    Run And Return Rc And Output    openstack router add subnet ${router_name} ${interface_name}
543     Should Not Be True    ${rc}
544
545 Show Router Interface
546     [Arguments]    ${router_name}
547     [Documentation]    List Router interface associated with given Router and return output with neutron client.
548     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list --router ${router_name} -f value
549     Log    ${output}
550     Should Not Be True    ${rc}
551     [Return]    ${output}
552
553 Add Router Gateway
554     [Arguments]    ${router_name}    ${external_network_name}
555     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v router-gateway-set ${router_name} ${external_network_name}    openstack router set ${router_name} --external-gateway ${external_network_name}
556     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
557     Should Not Be True    ${rc}
558
559 Remove Interface
560     [Arguments]    ${router_name}    ${interface_name}
561     [Documentation]    Remove Interface to the subnets.
562     ${rc}    ${output}=    Run And Return Rc And Output    openstack router remove subnet ${router_name} ${interface_name}
563     Should Not Be True    ${rc}
564
565 Update Router
566     [Arguments]    ${router_name}    ${cmd}
567     [Documentation]    Update the router with the command. Router name and command should be passed as argument.
568     ${rc}    ${output} =    Run And Return Rc And Output    openstack router set ${router_name} ${cmd}
569     Should Not Be True    ${rc}
570
571 Show Router
572     [Arguments]    ${router_name}    ${options}
573     [Documentation]    Show information of a given router. Router name and optional fields should be sent as arguments.
574     ${rc}    ${output} =    Run And Return Rc And Output    openstack router show ${router_name}
575     Log    ${output}
576
577 Delete Router
578     [Arguments]    ${router_name}
579     [Documentation]    Delete Router and Interface to the subnets.
580     ${rc}    ${output}=    Run And Return Rc And Output    openstack router delete ${router_name}
581     Should Not Be True    ${rc}
582
583 Get DumpFlows And Ovsconfig
584     [Arguments]    ${openstack_node_ip}
585     [Documentation]    Get the OvsConfig and Flow entries from OVS from the Openstack Node
586     Log    ${openstack_node_ip}
587     SSHLibrary.Open Connection    ${openstack_node_ip}    prompt=${DEFAULT_LINUX_PROMPT}
588     SSHKeywords.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
589     SSHLibrary.Set Client Configuration    timeout=${default_devstack_prompt_timeout}
590     Write Commands Until Expected Prompt    ip -o link    ${DEFAULT_LINUX_PROMPT_STRICT}
591     Write Commands Until Expected Prompt    ip -o addr    ${DEFAULT_LINUX_PROMPT_STRICT}
592     Write Commands Until Expected Prompt    ip route    ${DEFAULT_LINUX_PROMPT_STRICT}
593     Write Commands Until Expected Prompt    arp -an    ${DEFAULT_LINUX_PROMPT_STRICT}
594     ${nslist}=    Write Commands Until Expected Prompt    ip netns list | awk '{print $1}'    ${DEFAULT_LINUX_PROMPT_STRICT}
595     @{lines}    Split To Lines    ${nslist}
596     : FOR    ${line}    IN    @{lines}
597     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip -o link    ${DEFAULT_LINUX_PROMPT_STRICT}
598     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip -o addr    ${DEFAULT_LINUX_PROMPT_STRICT}
599     \    Write Commands Until Expected Prompt    sudo ip netns exec ${line} ip route    ${DEFAULT_LINUX_PROMPT_STRICT}
600     Write Commands Until Expected Prompt    sudo ovs-vsctl show    ${DEFAULT_LINUX_PROMPT_STRICT}
601     Write Commands Until Expected Prompt    sudo ovs-vsctl list Open_vSwitch    ${DEFAULT_LINUX_PROMPT_STRICT}
602     Write Commands Until Expected Prompt    sudo ovs-ofctl show br-int -OOpenFlow13    ${DEFAULT_LINUX_PROMPT_STRICT}
603     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-flows br-int -OOpenFlow13    ${DEFAULT_LINUX_PROMPT_STRICT}
604     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-groups br-int -OOpenFlow13    ${DEFAULT_LINUX_PROMPT_STRICT}
605     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-group-stats br-int -OOpenFlow13    ${DEFAULT_LINUX_PROMPT_STRICT}
606
607 Get Karaf Log Type From Test Start
608     [Arguments]    ${ip}    ${test_name}    ${type}    ${user}=${ODL_SYSTEM_USER}    ${password}=${ODL_SYSTEM_PASSWORD}    ${prompt}=${ODL_SYSTEM_PROMPT}
609     ...    ${log_file}=${WORKSPACE}/${BUNDLEFOLDER}/data/log/karaf.log
610     ${cmd}    Set Variable    sed '1,/ROBOT MESSAGE: Starting test ${test_name}/d' ${log_file} | grep '${type}'
611     ${output}    Run Command On Controller    ${ip}    ${cmd}    ${user}    ${password}    ${prompt}
612     Log    ${output}
613
614 Get Karaf Log Types From Test Start
615     [Arguments]    ${ip}    ${test_name}    ${types}    ${user}=${ODL_SYSTEM_USER}    ${password}=${ODL_SYSTEM_PASSWORD}    ${prompt}=${ODL_SYSTEM_PROMPT}
616     ...    ${log_file}=${WORKSPACE}/${BUNDLEFOLDER}/data/log/karaf.log
617     : FOR    ${type}    IN    @{types}
618     \    Get Karaf Log Type From Test Start    ${ip}    ${test_name}    ${type}    ${user}    ${password}
619     \    ...    ${prompt}    ${log_file}
620
621 Get Karaf Log Events From Test Start
622     [Arguments]    ${test_name}    ${user}=${ODL_SYSTEM_USER}    ${password}=${ODL_SYSTEM_PASSWORD}    ${prompt}=${ODL_SYSTEM_PROMPT}
623     ${log_types} =    Create List    ERROR    WARN    Exception
624     Run Keyword If    0 < ${NUM_ODL_SYSTEM}    Get Karaf Log Types From Test Start    ${ODL_SYSTEM_IP}    ${test_name}    ${log_types}
625     Run Keyword If    1 < ${NUM_ODL_SYSTEM}    Get Karaf Log Types From Test Start    ${ODL_SYSTEM_2_IP}    ${test_name}    ${log_types}
626     Run Keyword If    2 < ${NUM_ODL_SYSTEM}    Get Karaf Log Types From Test Start    ${ODL_SYSTEM_3_IP}    ${test_name}    ${log_types}
627
628 Get ControlNode Connection
629     ${control_conn_id}=    SSHLibrary.Open Connection    ${OS_CONTROL_NODE_IP}    prompt=${DEFAULT_LINUX_PROMPT_STRICT}
630     SSHKeywords.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
631     SSHLibrary.Set Client Configuration    timeout=30s
632     [Return]    ${control_conn_id}
633
634 Get OvsDebugInfo
635     [Documentation]    Get the OvsConfig and Flow entries from all Openstack nodes
636     Run Keyword If    0 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CONTROL_NODE_IP}
637     Run Keyword If    1 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_1_IP}
638     Run Keyword If    2 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_2_IP}
639
640 Get Test Teardown Debugs
641     [Arguments]    ${test_name}=${TEST_NAME}
642     Get OvsDebugInfo
643     Run Keyword And Ignore Error    Get Model Dump    ${HA_PROXY_IP}    ${netvirt_data_models}
644     Get Karaf Log Events From Test Start    ${test_name}
645
646 Show Debugs
647     [Arguments]    @{vm_indices}
648     [Documentation]    Run these commands for debugging, it can list state of VM instances and ip information in control node
649     ${devstack_conn_id}=    Get ControlNode Connection
650     Switch Connection    ${devstack_conn_id}
651     ${output}=    Write Commands Until Prompt    sudo ip netns list
652     Log    ${output}
653     Close Connection
654     : FOR    ${index}    IN    @{vm_indices}
655     \    ${rc}    ${output}=    Run And Return Rc And Output    nova show ${index}
656     \    Log    ${output}
657     \    Log    ${rc}
658     List Nova VMs
659     List Networks
660     List Subnets
661     List Ports
662
663 Neutron Security Group Show
664     [Arguments]    ${SecurityGroupRuleName}
665     [Documentation]    Displays the neutron security group configurations that belongs to a given neutron security group name
666     ${cmd}=    Set Variable    openstack security group show ${SecurityGroupRuleName}
667     Log    ${cmd}
668     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
669     Log    ${output}
670     Should Not Be True    ${rc}
671     [Return]    ${output}
672
673 Neutron Port Show
674     [Arguments]    ${PortName}
675     [Documentation]    Display the port configuration that belong to a given neutron port
676     ${cmd}=    Set Variable    openstack port show ${PortName}
677     Log    ${cmd}
678     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
679     Log    ${output}
680     Should Not Be True    ${rc}
681     [Return]    ${output}
682
683 Neutron Security Group Create
684     [Arguments]    ${SecurityGroupName}    ${additional_args}=${EMPTY}
685     [Documentation]    Create a security group with specified name ,description & protocol value according to security group template
686     ${devstack_conn_id}=    Get ControlNode Connection
687     Switch Connection    ${devstack_conn_id}
688     ${cmd}=    Set Variable    openstack security group create ${SecurityGroupName} ${additional_args}
689     Log    ${cmd}
690     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
691     Log    ${output}
692     Should Not Be True    ${rc}
693     ${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}
694     Log    ${sgp_id}
695     [Return]    ${output}    ${sgp_id}
696
697 Neutron Security Group Update
698     [Arguments]    ${SecurityGroupName}    ${additional_args}=${EMPTY}
699     [Documentation]    Updating security groups
700     ${cmd}=    Set Variable    openstack security group set ${SecurityGroupName} ${additional_args}
701     Log    ${cmd}
702     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
703     Log    ${output}
704     Should Not Be True    ${rc}
705     [Return]    ${output}
706
707 Delete SecurityGroup
708     [Arguments]    ${sg_name}
709     [Documentation]    Delete Security group
710     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group delete ${sg_name}
711     Log    ${output}
712     Should Not Be True    ${rc}
713
714 Neutron Security Group Rule Create
715     [Arguments]    ${Security_group_name}    &{Kwargs}
716     [Documentation]    Creates neutron security rule with Openstack CLI 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]} ..."
717     Run Keyword If    ${Kwargs}    Log    ${Kwargs}
718     ${description}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    description    default=${None}
719     ${direction}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    direction    default=${None}
720     ${ethertype}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    ethertype    default=${None}
721     ${port_range_max}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    port_range_max    default=${None}
722     ${port_range_min}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    port_range_min    default=${None}
723     ${protocol}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    protocol    default=${None}
724     ${remote_group_id}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    remote_group_id    default=${None}
725     ${remote_ip_prefix}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    remote_ip_prefix    default=${None}
726     ${cmd}=    Set Variable    openstack security group rule create ${Security_group_name}
727     ${cmd}=    Run Keyword If    '${description}'!='None'    Catenate    ${cmd}    --description ${description}
728     ...    ELSE    Catenate    ${cmd}
729     ${cmd}=    Run Keyword If    '${direction}'!='None'    Catenate    ${cmd}    --${direction}
730     ...    ELSE    Catenate    ${cmd}
731     ${cmd}=    Run Keyword If    '${ethertype}'!='None'    Catenate    ${cmd}    --ethertype ${ethertype}
732     ...    ELSE    Catenate    ${cmd}
733     ${cmd}=    Run Keyword If    '${port_range_min}'!='None' and '${port_range_max}'!='None'    Catenate    ${cmd}    --dst-port ${port_range_min}:${port_range_max}
734     ...    ELSE IF    '${port_range_max}'!='None'    Catenate    ${cmd}    --dst-port ${port_range_max}
735     ...    ELSE IF    '${port_range_min}'!='None'    Catenate    ${cmd}    --dst-port ${port_range_min}
736     ...    ELSE    Catenate    ${cmd}
737     ${cmd}=    Run Keyword If    '${protocol}'!='None'    Catenate    ${cmd}    --protocol ${protocol}
738     ...    ELSE    Catenate    ${cmd}
739     ${cmd}=    Run Keyword If    '${remote_group_id}'!='None'    Catenate    ${cmd}    --remote-group ${remote_group_id}
740     ...    ELSE    Catenate    ${cmd}
741     ${cmd}=    Run Keyword If    '${remote_ip_prefix}'!='None'    Catenate    ${cmd}    --src-ip ${remote_ip_prefix}
742     ...    ELSE    Catenate    ${cmd}
743     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
744     ${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}
745     Log    ${rule_id}
746     Should Not Be True    ${rc}
747     [Return]    ${output}    ${rule_id}
748
749 Neutron Security Group Rule Create Legacy Cli
750     [Arguments]    ${Security_group_name}    &{Kwargs}
751     [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]} ..."
752     Run Keyword If    ${Kwargs}    Log    ${Kwargs}
753     ${description}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    description    default=${None}
754     ${direction}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    direction    default=${None}
755     ${ethertype}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    ethertype    default=${None}
756     ${port_range_max}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    port_range_max    default=${None}
757     ${port_range_min}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    port_range_min    default=${None}
758     ${protocol}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    protocol    default=${None}
759     ${remote_group_id}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    remote_group_id    default=${None}
760     ${remote_ip_prefix}    Run Keyword If    ${Kwargs}    Pop From Dictionary    ${Kwargs}    remote_ip_prefix    default=${None}
761     ${cmd}=    Set Variable    neutron security-group-rule-create ${Security_group_name}
762     ${cmd}=    Run Keyword If    '${description}'!='None'    Catenate    ${cmd}    --description ${description}
763     ...    ELSE    Catenate    ${cmd}
764     ${cmd}=    Run Keyword If    '${direction}'!='None'    Catenate    ${cmd}    --direction ${direction}
765     ...    ELSE    Catenate    ${cmd}
766     ${cmd}=    Run Keyword If    '${ethertype}'!='None'    Catenate    ${cmd}    --ethertype ${ethertype}
767     ...    ELSE    Catenate    ${cmd}
768     ${cmd}=    Run Keyword If    '${port_range_max}'!='None'    Catenate    ${cmd}    --port_range_max ${port_range_max}
769     ...    ELSE    Catenate    ${cmd}
770     ${cmd}=    Run Keyword If    '${port_range_min}'!='None'    Catenate    ${cmd}    --port_range_min ${port_range_min}
771     ...    ELSE    Catenate    ${cmd}
772     ${cmd}=    Run Keyword If    '${protocol}'!='None'    Catenate    ${cmd}    --protocol ${protocol}
773     ...    ELSE    Catenate    ${cmd}
774     ${cmd}=    Run Keyword If    '${remote_group_id}'!='None'    Catenate    ${cmd}    --remote_group_id ${remote_group_id}
775     ...    ELSE    Catenate    ${cmd}
776     ${cmd}=    Run Keyword If    '${remote_ip_prefix}'!='None'    Catenate    ${cmd}    --remote_ip_prefix ${remote_ip_prefix}
777     ...    ELSE    Catenate    ${cmd}
778     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
779     ${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}
780     Log    ${rule_id}
781     Should Not Be True    ${rc}
782     [Return]    ${output}    ${rule_id}
783
784 Security Group Create Without Default Security Rules
785     [Arguments]    ${sg_name}    ${additional_args}=${EMPTY}
786     [Documentation]    Create Neutron Security Group with no default rules, using specified name and optional arguments.
787     Neutron Security Group Create    ${sg_name}    ${additional_args}
788     Delete All Security Group Rules    ${sg_name}
789
790 Delete All Security Group Rules
791     [Arguments]    ${sg_name}
792     [Documentation]    Delete all security rules from a specified security group
793     ${rc}    ${sg_rules_output}=    Run And Return Rc And Output    openstack security group rule list ${sg_name} -cID -fvalue
794     Log    ${sg_rules_output}
795     Should Not Be True    ${rc}
796     @{sg_rules}=    Split String    ${sg_rules_output}    \n
797     : FOR    ${rule}    IN    @{sg_rules}
798     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack security group rule delete ${rule}
799     \    Log    ${output}
800     \    Should Not Be True    ${rc}
801
802 Create Allow All SecurityGroup
803     [Arguments]    ${sg_name}    ${ether_type}=IPv4
804     [Documentation]    Allow all TCP/UDP/ICMP packets for this suite
805     Neutron Security Group Create    ${sg_name}
806     Neutron Security Group Rule Create    ${sg_name}    direction=ingress    ethertype=${ether_type}    port_range_max=65535    port_range_min=1    protocol=tcp
807     Neutron Security Group Rule Create    ${sg_name}    direction=egress    ethertype=${ether_type}    port_range_max=65535    port_range_min=1    protocol=tcp
808     Neutron Security Group Rule Create    ${sg_name}    direction=ingress    ethertype=${ether_type}    protocol=icmp
809     Neutron Security Group Rule Create    ${sg_name}    direction=egress    ethertype=${ether_type}    protocol=icmp
810     Neutron Security Group Rule Create    ${sg_name}    direction=ingress    ethertype=${ether_type}    port_range_max=65535    port_range_min=1    protocol=udp
811     Neutron Security Group Rule Create    ${sg_name}    direction=egress    ethertype=${ether_type}    port_range_max=65535    port_range_min=1    protocol=udp
812
813 Create Neutron Port With Additional Params
814     [Arguments]    ${network_name}    ${port_name}    ${additional_args}=${EMPTY}
815     [Documentation]    Create Port With given additional parameters
816     ${cmd}=    Set Variable    neutron -v port-create ${network_name} --name ${port_name} ${additional_args}
817     Log    ${cmd}
818     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
819     Log    ${output}
820     Should Not Be True    ${rc}
821     ${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}
822     Log    ${port_id}
823     [Return]    ${OUTPUT}    ${port_id}
824
825 Get Ports MacAddr
826     [Arguments]    ${portName_list}
827     [Documentation]    Retrieve the port MacAddr for the given list of port name and return the MAC address list.
828     ${MacAddr-list}    Create List
829     : FOR    ${portName}    IN    @{portName_list}
830     \    ${macAddr}=    OpenStackOperations.Get Port Mac    ${portName}    ${devstack_conn_id}
831     \    Append To List    ${MacAddr-list}    ${macAddr}
832     [Return]    ${MacAddr-list}
833
834 Get Port Ip
835     [Arguments]    ${port_name}
836     [Documentation]    Keyword would return the IP of the ${port_name} received.
837     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list | grep "${port_name}" | awk -F\\' '{print $2}'
838     Log    ${output}
839     ${splitted_output}=    Split String    ${output}    ${EMPTY}
840     ${port_ip}=    Get from List    ${splitted_output}    0
841     Log    ${port_ip}
842     Should Not Be True    ${rc}
843     [Return]    ${port_ip}
844
845 Get Port Mac
846     [Arguments]    ${port_name}    ${conn_id}=${devstack_conn_id}
847     [Documentation]    Keyword would return the MAC ID of the ${port_name} received.
848     ${rc}    ${output}=    Run And Return Rc And Output    openstack port show ${port_name} | grep mac_address | awk '{print $4}'
849     Log    ${output}
850     ${splitted_output}=    Split String    ${output}    ${EMPTY}
851     ${port_mac}=    Get from List    ${splitted_output}    0
852     Log    ${port_mac}
853     Should Not Be True    ${rc}
854     [Return]    ${port_mac}
855
856 Create L2Gateway
857     [Arguments]    ${bridge_name}    ${intf_name}    ${gw_name}
858     [Documentation]    Keyword to create an L2 Gateway ${gw_name} for bridge ${bridge_name} connected to interface ${intf_name} (Using Neutron CLI).
859     ${rc}    ${l2gw_output}=    Run And Return Rc And Output    ${L2GW_CREATE} name=${bridge_name},interface_names=${intf_name} ${gw_name}
860     Log    ${l2gw_output}
861     [Return]    ${l2gw_output}
862
863 Create L2Gateway Connection
864     [Arguments]    ${gw_name}    ${net_name}
865     [Documentation]    Keyword would create a new L2 Gateway Connection for ${gw_name} to ${net_name} (Using Neutron CLI).
866     ${rc}    ${l2gw_output}=    Run And Return Rc And Output    ${L2GW_CONN_CREATE} ${gw_name} ${net_name}
867     Log    ${l2gw_output}
868     Should Not Be True    ${rc}
869     [Return]    ${l2gw_output}
870
871 Get All L2Gateway
872     [Documentation]    Keyword to return all the L2 Gateways available (Using Neutron CLI).
873     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET_YAML}
874     Should Not Be True    ${rc}
875     [Return]    ${output}
876
877 Get All L2Gateway Connection
878     [Documentation]    Keyword to return all the L2 Gateway connections available (Using Neutron CLI).
879     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET_CONN_YAML}
880     Should Not Be True    ${rc}
881     [Return]    ${output}
882
883 Get L2Gateway
884     [Arguments]    ${gw_id}
885     [Documentation]    Keyword to check if the ${gw_id} is available in the L2 Gateway list (Using Neutron CLI).
886     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_SHOW} ${gw_id}
887     Log    ${output}
888     Should Not Be True    ${rc}
889     [Return]    ${output}
890
891 Get L2gw Id
892     [Arguments]    ${l2gw_name}
893     [Documentation]    Keyword to retrieve the L2 Gateway ID for the ${l2gw_name} (Using Neutron CLI).
894     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET} | grep "${l2gw_name}" | awk '{print $2}'
895     Log    ${output}
896     Should Not Be True    ${rc}
897     ${splitted_output}=    Split String    ${output}    ${EMPTY}
898     ${l2gw_id}=    Get from List    ${splitted_output}    0
899     Log    ${l2gw_id}
900     [Return]    ${l2gw_id}
901
902 Get L2gw Connection Id
903     [Arguments]    ${l2gw_name}
904     [Documentation]    Keyword to retrieve the L2 Gateway Connection ID for the ${l2gw_name} (Using Neutron CLI).
905     ${l2gw_id}=    OpenStackOperations.Get L2gw Id    ${l2gw_name}
906     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET_CONN} | grep "${l2gw_id}" | awk '{print $2}'
907     Log    ${output}
908     Should Not Be True    ${rc}
909     ${splitted_output}=    Split String    ${output}    ${EMPTY}
910     ${splitted_output}=    Split String    ${output}    ${EMPTY}
911     ${l2gw_conn_id}=    Get from List    ${splitted_output}    0
912     Log    ${l2gw_conn_id}
913     [Return]    ${l2gw_conn_id}
914
915 Neutron Port List Rest
916     [Documentation]    Keyword to get all ports details in Neutron (Using REST).
917     ${resp} =    RequestsLibrary.Get Request    session    ${PORT_URL}
918     Log    ${resp.content}
919     Should Be Equal As Strings    ${resp.status_code}    200
920     [Return]    ${resp.content}
921
922 Get Neutron Port Rest
923     [Arguments]    ${port_id}
924     [Documentation]    Keyword to get the specific port details in Neutron (Using REST).
925     ${resp} =    RequestsLibrary.Get Request    session    ${CONFIG_API}/${GET_PORT_URL}/${port_id}
926     Log    ${resp.content}
927     Should Be Equal As Strings    ${resp.status_code}    200
928     [Return]    ${resp.content}
929
930 Update Port Rest
931     [Arguments]    ${port_id}    ${json_data}
932     [Documentation]    Keyword to update ${port_id} with json data received in ${json_data} (Using REST).
933     Log    ${json_data}
934     ${resp} =    RequestsLibrary.Put Request    session    ${CONFIG_API}/${GET_PORT_URL}/${port_id}    ${json_data}
935     Log    ${resp.content}
936     Should Be Equal As Strings    ${resp.status_code}    200
937     [Return]    ${resp.content}
938
939 Create And Configure Security Group
940     [Arguments]    ${sg-name}
941     [Documentation]    Create Security Group with given name, and default allow rules for TCP/UDP/ICMP protocols.
942     Neutron Security Group Create    ${sg-name}
943     Neutron Security Group Rule Create    ${sg-name}    direction=ingress    port_range_max=65535    port_range_min=1    protocol=tcp    remote_ip_prefix=0.0.0.0/0
944     Neutron Security Group Rule Create    ${sg-name}    direction=egress    port_range_max=65535    port_range_min=1    protocol=tcp    remote_ip_prefix=0.0.0.0/0
945     Neutron Security Group Rule Create    ${sg-name}    direction=ingress    protocol=icmp    remote_ip_prefix=0.0.0.0/0
946     Neutron Security Group Rule Create    ${sg-name}    direction=egress    protocol=icmp    remote_ip_prefix=0.0.0.0/0
947     Neutron Security Group Rule Create    ${sg-name}    direction=ingress    port_range_max=65535    port_range_min=1    protocol=udp    remote_ip_prefix=0.0.0.0/0
948     Neutron Security Group Rule Create    ${sg-name}    direction=egress    port_range_max=65535    port_range_min=1    protocol=udp    remote_ip_prefix=0.0.0.0/0
949
950 Add Security Group To VM
951     [Arguments]    ${vm}    ${sg}
952     [Documentation]    Add the security group provided to the given VM.
953     ${rc}    ${output}=    Run And Return Rc And Output    openstack server add security group ${vm} ${sg}
954     Log    ${output}
955     Should Not Be True    ${rc}
956
957 Remove Security Group From VM
958     [Arguments]    ${vm}    ${sg}
959     [Documentation]    Remove the security group provided to the given VM.
960     ${devstack_conn_id}=    Get ControlNode Connection
961     Switch Connection    ${devstack_conn_id}
962     ${output}=    Write Commands Until Prompt    openstack server remove security group ${vm} ${sg}
963     Log    ${output}
964     Close Connection
965
966 Create SFC Flow Classifier
967     [Arguments]    ${name}    ${src_ip}    ${dest_ip}    ${protocol}    ${dest_port}    ${neutron_src_port}
968     [Documentation]    Create a flow classifier for SFC
969     ${cmd}=    Set Variable    neutron flow-classifier-create --ethertype IPv4 --source-ip-prefix ${src_ip}/32 --destination-ip-prefix ${dest_ip}/32 --protocol ${protocol} --destination-port ${dest_port}:${dest_port} --logical-source-port ${neutron_src_port} ${name}
970     Log    ${cmd}
971     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
972     Log    ${output}
973     Should Not Be True    ${rc}
974     Should Contain    ${output}    Created a new flow_classifier
975     [Return]    ${output}
976
977 Delete SFC Flow Classifier
978     [Arguments]    ${name}
979     [Documentation]    Delete a SFC flow classifier
980     ${devstack_conn_id}=    Get ControlNode Connection
981     Switch Connection    ${devstack_conn_id}
982     ${cmd}=    Set Variable    neutron flow-classifier-delete ${name}
983     Log    ${cmd}
984     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
985     Log    ${output}
986     Should Not Be True    ${rc}
987     Should Contain    ${output}    Deleted flow_classifier
988     [Return]    ${output}
989
990 Create SFC Port Pair
991     [Arguments]    ${name}    ${port_in}    ${port_out}
992     [Documentation]    Creates a neutron port pair for SFC
993     ${devstack_conn_id}=    Get ControlNode Connection
994     Switch Connection    ${devstack_conn_id}
995     ${cmd}=    Set Variable    neutron port-pair-create --ingress=${port_in} --egress=${port_out} ${name}
996     Log    ${cmd}
997     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
998     Log    ${output}
999     Should Not Be True    ${rc}
1000     Should Contain    ${output}    Created a new port_pair
1001     [Return]    ${output}
1002
1003 Delete SFC Port Pair
1004     [Arguments]    ${name}
1005     [Documentation]    Delete a SFC port pair
1006     ${cmd}=    Set Variable    neutron port-pair-delete ${name}
1007     Log    ${cmd}
1008     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
1009     Log    ${output}
1010     Should Not Be True    ${rc}
1011     Should Contain    ${output}    Deleted port_pair
1012     [Return]    ${output}
1013
1014 Create SFC Port Pair Group
1015     [Arguments]    ${name}    ${port_pair}
1016     [Documentation]    Creates a port pair group with a single port pair for SFC
1017     ${cmd}=    Set Variable    neutron port-pair-group-create --port-pair ${port_pair} ${name}
1018     Log    ${cmd}
1019     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
1020     Log    ${output}
1021     Should Not Be True    ${rc}
1022     Should Contain    ${output}    Created a new port_pair_group
1023     [Return]    ${output}
1024
1025 Create SFC Port Pair Group With Two Pairs
1026     [Arguments]    ${name}    ${port_pair1}    ${port_pair2}
1027     [Documentation]    Creates a port pair group with two port pairs for SFC
1028     ${cmd}=    Set Variable    neutron port-pair-group-create --port-pair ${port_pair1} --port-pair ${port_pair2} ${name}
1029     Log    ${cmd}
1030     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
1031     Log    ${output}
1032     Should Not Be True    ${rc}
1033     Should Contain    ${output}    Created a new port_pair_group
1034     [Return]    ${output}
1035
1036 Delete SFC Port Pair Group
1037     [Arguments]    ${name}
1038     [Documentation]    Delete a SFC port pair group
1039     ${devstack_conn_id}=    Get ControlNode Connection
1040     ${cmd}=    Set Variable    neutron port-pair-group-delete ${name}
1041     Log    ${cmd}
1042     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
1043     Log    ${output}
1044     Should Not Be True    ${rc}
1045     Should Contain    ${output}    Deleted port_pair_group
1046     [Return]    ${output}
1047
1048 Create SFC Port Chain
1049     [Arguments]    ${name}    ${pg1}    ${pg2}    ${fc}
1050     [Documentation]    Creates a port pair chain with two port groups and a singel classifier.
1051     ${cmd}=    Set Variable    neutron port-chain-create --port-pair-group ${pg1} --port-pair-group ${pg2} --flow-classifier ${fc} ${name}
1052     Log    ${cmd}
1053     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
1054     Log    ${output}
1055     Should Not Be True    ${rc}
1056     Should Contain    ${output}    Created a new port_chain
1057     [Return]    ${output}
1058
1059 Delete SFC Port Chain
1060     [Arguments]    ${name}
1061     [Documentation]    Delete a SFC port chain
1062     ${cmd}=    Set Variable    neutron port-chain-delete ${name}
1063     Log    ${cmd}
1064     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
1065     Log    ${output}
1066     Should Not Be True    ${rc}
1067     Should Contain    ${output}    Deleted port_chain
1068     [Return]    ${output}
1069
1070 Reboot Nova VM
1071     [Arguments]    ${vm_name}
1072     [Documentation]    Reboot NOVA VM
1073     ${rc}    ${output}=    Run And Return Rc And Output    openstack server reboot --wait ${vm_name}
1074     Log    ${output}
1075     Should Not Be True    ${rc}
1076     Wait Until Keyword Succeeds    35s    10s    Verify VM Is ACTIVE    ${vm_name}
1077
1078 Remove RSA Key From KnowHosts
1079     [Arguments]    ${vm_ip}
1080     [Documentation]    Remove RSA
1081     ${devstack_conn_id}=    Get ControlNode Connection
1082     Switch Connection    ${devstack_conn_id}
1083     ${output}=    Write Commands Until Prompt    sudo cat /root/.ssh/known_hosts    30s
1084     Log    ${output}
1085     ${output}=    Write Commands Until Prompt    sudo ssh-keygen -f "/root/.ssh/known_hosts" -R ${vm_ip}    30s
1086     Log    ${output}
1087     ${output}=    Write Commands Until Prompt    sudo cat "/root/.ssh/known_hosts"    30s
1088
1089 Wait For Routes To Propogate
1090     [Arguments]    ${networks}    ${subnets}
1091     [Documentation]    Check propagated routes
1092     ${devstack_conn_id} =    Get ControlNode Connection
1093     Switch Connection    ${devstack_conn_id}
1094     : FOR    ${INDEX}    IN RANGE    0    1
1095     \    ${net_id}=    Get Net Id    @{networks}[${INDEX}]    ${devstack_conn_id}
1096     \    ${is_ipv6}=    Get Regexp Matches    @{subnets}[${INDEX}]    ${IP6_REGEX}
1097     \    ${length}=    Get Length    ${is_ipv6}
1098     \    ${cmd}=    Set Variable If    ${length} == 0    ip route    ip -6 route
1099     \    ${output}=    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ${cmd}    ]>
1100     \    Should Contain    ${output}    @{subnets}[${INDEX}]