blob: a48fb1161ba3f6859a2748645a34d2e58909ff25 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
#!/bin/bash
set -o xtrace
set -o errexit
set -o pipefail
# Enable unbuffered output
export PYTHONUNBUFFERED=1
function test_ovn {
# NOTE(yoctozepto): could use real ini parsing but this is fine for now
local neutron_ml2_conf_path=/etc/kolla/neutron-server/ml2_conf.ini
ovn_nb_connection=$(sudo grep -P -o -e "(?<=^ovn_nb_connection = ).*" "$neutron_ml2_conf_path")
ovn_sb_connection=$(sudo grep -P -o -e "(?<=^ovn_sb_connection = ).*" "$neutron_ml2_conf_path")
# List OVN NB/SB entries
echo "OVN NB DB entries:"
# TODO(mnasiadka): Remove the first part of conditional in G cycle
if [ $IS_UPGRADE == "yes" ]; then
sudo ${container_engine} exec ovn_northd ovn-nbctl --db "$ovn_nb_connection" show
else
sudo ${container_engine} exec ovn_northd ovn-nbctl show
fi
echo "OVN SB DB entries:"
# TODO(mnasiadka): Remove the first part of conditional in G cycle
if [ $IS_UPGRADE == "yes" ]; then
sudo ${container_engine} exec ovn_northd ovn-sbctl --db "$ovn_sb_connection" show
else
sudo ${container_engine} exec ovn_northd ovn-sbctl show
fi
OVNNB_STATUS=$(sudo ${container_engine} exec ovn_nb_db ovs-appctl -t /var/run/ovn/ovnnb_db.ctl cluster/status OVN_Northbound)
OVNSB_STATUS=$(sudo ${container_engine} exec ovn_sb_db ovs-appctl -t /var/run/ovn/ovnsb_db.ctl cluster/status OVN_Southbound)
if [[ $(grep -o "at tcp:" <<< ${OVNNB_STATUS} | wc -l) != "3" ]]; then
echo "ERR: NB Cluster does not have 3 nodes"
echo "Output: ${OVNNB_STATUS}"
exit 1
fi
if [[ $(grep -o "at tcp:" <<< ${OVNSB_STATUS} | wc -l) != "3" ]]; then
echo "ERR: SB Cluster does not have 3 nodes"
echo "Output: ${OVNSB_STATUS}"
exit 1
fi
echo "OVS entries"
sudo ${container_engine} exec openvswitch_vswitchd ovs-vsctl list open
}
function test_octavia {
. /etc/kolla/admin-openrc.sh
. ~/openstackclient-venv/bin/activate
echo "Testing OVN Octavia provider"
echo "Smoke test"
openstack loadbalancer list
# Create a server to act as a backend
openstack server create --wait --image cirros --flavor c1.tiny --key-name mykey --network demo-net lb_member --wait
member_fip=$(openstack floating ip create public1 -f value -c floating_ip_address)
openstack server add floating ip lb_member ${member_fip}
member_ip=$(openstack floating ip show ${member_fip} -f value -c fixed_ip_address)
# Dummy HTTP server.
attempts=12
for i in $(seq 1 ${attempts}); do
if ssh -v -o BatchMode=yes -o StrictHostKeyChecking=no cirros@${member_fip} 'nohup sh -c "while true; do echo -e \"HTTP/1.1 200 OK\n\n $(date)\" | sudo nc -l -p 8000; done &"'; then
break
elif [[ $i -eq ${attempts} ]]; then
echo "Failed to access server via SSH after ${attempts} attempts"
echo "Console log:"
openstack console log show lb_member
return 1
else
echo "Cannot access server - retrying"
fi
sleep 10
done
echo "Creating Octavia OVN LB:"
openstack loadbalancer create --vip-network-id demo-net --provider ovn --name test_ovn_lb --wait
openstack loadbalancer listener create --protocol TCP --protocol-port 8000 --name test_ovn_lb_listener --wait test_ovn_lb
openstack loadbalancer pool create --protocol TCP --lb-algorithm SOURCE_IP_PORT --listener test_ovn_lb_listener --name test_ovn_lb_pool --wait
subnet_id=$(openstack subnet list -c ID -f value --name demo-subnet)
openstack loadbalancer member create --address ${member_ip} --subnet-id ${subnet_id} --protocol-port 8000 --wait test_ovn_lb_pool
echo "Add a floating IP to the load balancer."
lb_fip=$(openstack floating ip create public1 -f value -c name)
lb_vip=$(openstack loadbalancer show test_ovn_lb -f value -c vip_address)
attempt=0
while [[ $(openstack port list --fixed-ip ip-address=$lb_vip -f value -c ID) == "" ]]; do
echo "Port for LB with VIP ip addr $lb_vip not available yet"
attempt=$((attempt+1))
if [[ $attempt -eq 10 ]]; then
echo "ERROR: Port for LB with VIP ip addr failed to become available"
openstack port list --fixed-ip ip-address=$lb_vip
return 1
fi
sleep $attempt
done
lb_port_id=$(openstack port list --fixed-ip ip-address=$lb_vip -f value -c ID)
openstack floating ip set $lb_fip --port $lb_port_id
echo "OVN NB entries for LB:"
# TODO(mnasiadka): Remove the first part of conditional in G cycle
if [ $IS_UPGRADE == "yes" ]; then
sudo ${container_engine} exec ovn_northd ovn-nbctl --db "$ovn_nb_connection" list load_balancer
else
sudo ${container_engine} exec ovn_northd ovn-nbctl list load_balancer
fi
echo "OVN NB entries for NAT:"
# TODO(mnasiadka): Remove the first part of conditional in G cycle
if [ $IS_UPGRADE == "yes" ]; then
sudo ${container_engine} exec ovn_northd ovn-nbctl --db "$ovn_nb_connection" list nat
else
sudo ${container_engine} exec ovn_northd ovn-nbctl list nat
fi
echo "Attempt to access the load balanced HTTP server."
attempts=12
curl_args=(
--include
--location
--fail
)
for i in $(seq 1 ${attempts}); do
if curl "${curl_args[@]}" $lb_fip:8000; then
break
elif [[ $i -eq ${attempts} ]]; then
echo "Failed to access load balanced service after ${attempts} attempts"
return 1
else
echo "Cannot access load balancer - retrying"
fi
sleep 10
done
echo "Cleaning up"
openstack loadbalancer delete test_ovn_lb --cascade --wait
openstack floating ip delete ${lb_fip}
openstack server remove floating ip lb_member ${member_fip}
openstack floating ip delete ${member_fip}
openstack server delete --wait lb_member
}
function test_ovn_logged {
test_ovn
test_octavia
}
function test_ovn_setup {
echo "Testing OVN and Octavia OVN provider"
test_ovn_logged &> /tmp/logs/ansible/test-ovn
result=$?
if [[ $result != 0 ]]; then
echo "Testing OVN failed. See ansible/test-ovn for details"
else
echo "Successfully tested OVN. See ansible/test-ovn for details"
fi
return $result
}
container_engine=${1:-docker}
test_ovn_setup
|