Build OVS with dpdk
[ovsnfv.git] / build / instack_ovs.sh
1 #!/bin/bash
2 ##############################################################################
3 # Copyright (c) 2015 Red Hat Inc. and others.
4 # therbert@redhat.com
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11 set -e
12 declare -i CNT
13
14 echo "==============================="
15 echo executing $0 $@
16 echo path is $PATH
17
18 usage() {
19     echo run BuildAndTestOVS -h for help
20 }
21
22 while getopts "a:dg:hi:p:tu:v" opt; do
23     case "$opt" in
24         a)
25             kernel_major=${OPTARG}
26             ;;
27         d)
28             DPDK="yes"
29             setdpdk="-d"
30             ;;
31         g)
32             TAG=${OPTARG}
33             ;;
34         h|\?)
35             usage
36             exit 1
37             ;;
38         i)
39             kernel_minor=${OPTARG}
40             ;;
41         p)
42             OVS_PATCH=${OPTARG}
43             ;;
44         t)
45             TESTRPM="yes"
46             ;;
47         u)
48             OVS_REPO_URL=${OPTARG}
49             ;;
50         v)
51             verbose="yes"
52             ;;
53     esac
54 done
55 #
56 # Default Config options
57 #
58 echo ===============================================
59 echo Default Configuration Options.
60 echo ===============================================
61 echo option NOCHECK is set to $NOCHECK
62 echo build DPDK option is set to $DPDK
63 echo DPDK Patch URL is set to $DPDK_PATCH
64 echo DPDK Version is set to $DPDK_VERSION
65 echo Option for OVS Kernel Module is set to $KMOD
66 echo ===============================================
67 if [[ $NOCHECK =~ "yes" ]]; then
68     setnocheck="-c"
69 fi
70 if [[ $KMOD =~ "yes" ]]; then
71     setkmod="-k"
72 fi
73
74
75
76 if [ -z $OVS_REPO_URL ]; then
77     OVS_REPO_URL=https://github.com/openvswitch/ovs.git
78 fi
79
80 if [ ! -z $kernel_major ] && [ ! -z $kernel_minor ]; then
81     kernel_version=$kernel_major.$kernel_minor
82     echo ===================
83     echo Will install kernel version: major is $kernel_major and minor is $kernel_minor
84     echo ===================
85 else
86     echo Will use default kernel in ovs test vm
87 fi
88
89 if [ -z ${WORKSPACE+1} ]; then
90     # We are not being run by Jenkins.
91     export WORKSPACE=$HOME/opnfv/ovsnfv
92     mkdir -p opnfv
93     cd opnfv
94     git clone https://git.opnfv.org/ovsnfv
95 fi
96
97 export BUILD_BASE=$WORKSPACE/build
98
99 if [ ! -d $BUILD_BASE ]
100 then
101     mkdir -p $BUILD_BASE
102 fi
103
104 if [ ! -f $BUILD_BASE/config ]; then
105     touch $BUILD_BASE/config
106 fi
107
108 export PATH=$PATH:$WORKSPACE/ci:$BUILD_BASE
109 source $BUILD_BASE/config
110
111 cd $BUILD_BASE
112 export TOPDIR=$BUILD_BASE
113
114 export TMP_RELEASE_DIR=$TOPDIR/release
115 if [ ! -d $TMP_RELEASE_DIR ]; then
116     mkdir -p $TMP_RELEASE_DIR
117 fi
118
119 export CACHE_DIR=$TOPDIR/cache
120 if [ ! -d $CACHE_DIR ]; then
121     mkdir -p $CACHE_DIR
122 fi
123 export TMPDIR=$TOPDIR/scratch
124 if [ ! -d $SCRATCH_DIR ]; then
125     mkdir -p $SCRATCH_DIR
126 fi
127
128 rdo_images_uri=https://ci.centos.org/artifacts/rdo/images/liberty/delorean/stable
129
130 vm_index=4
131 RDO_RELEASE=liberty
132 SSH_OPTIONS=(-o StrictHostKeyChecking=no -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null)
133 OPNFV_NETWORK_TYPES="admin_network private_network public_network storage_network"
134
135 # check for dependancy packages
136 for i in rpm-build createrepo libguestfs-tools python-docutils bsdtar; do
137     if ! rpm -q $i > /dev/null; then
138         sudo yum install -y $i
139     fi
140 done
141
142 # RDO Manager expects a stack user to exist, this checks for one
143 # and creates it if you are root
144 if ! id stack > /dev/null; then
145     sudo useradd stack;
146     sudo echo 'stack ALL=(root) NOPASSWD:ALL' | sudo tee -a /etc/sudoers.d/stack
147     sudo echo 'Defaults:stack !requiretty' | sudo tee -a /etc/sudoers.d/stack
148     sudo chmod 0440 /etc/sudoers.d/stack
149     echo 'Added user stack'
150 fi
151
152 # ensure that I can ssh as the stack user
153 if ! sudo grep "$(cat ~/.ssh/id_rsa.pub)" /home/stack/.ssh/authorized_keys; then
154     if ! sudo ls -d /home/stack/.ssh/ ; then
155         sudo mkdir /home/stack/.ssh
156         sudo chown stack:stack /home/stack/.ssh
157         sudo chmod 700 /home/stack/.ssh
158     fi
159     USER=$(whoami) sudo sh -c "cat ~$USER/.ssh/id_rsa.pub >> /home/stack/.ssh/authorized_keys"
160     sudo chown stack:stack /home/stack/.ssh/authorized_keys
161 fi
162
163 # clean up stack user previously build instack disk images
164 ssh -T ${SSH_OPTIONS[@]} stack@localhost "rm -f instack*.qcow2"
165
166 # Yum repo setup for building the undercloud
167 if ! rpm -q rdo-release > /dev/null && [ "$1" != "-master" ]; then
168     sudo yum -y install yum-plugin-priorities
169     sudo yum-config-manager --disable openstack-${RDO_RELEASE}
170     sudo curl -o /etc/yum.repos.d/delorean.repo http://trunk.rdoproject.org/centos7-liberty/current-passed-ci/delorean.repo
171     sudo curl -o /etc/yum.repos.d/delorean-deps.repo http://trunk.rdoproject.org/centos7-liberty/delorean-deps.repo
172     sudo rm -f /etc/yum.repos.d/delorean-current.repo
173 elif [ "$1" == "-master" ]; then
174     sudo yum -y install yum-plugin-priorities
175     sudo yum-config-manager --disable openstack-${RDO_RELEASE}
176     sudo curl -o /etc/yum.repos.d/delorean.repo http://trunk.rdoproject.org/centos7/current-passed-ci/delorean.repo
177     sudo curl -o /etc/yum.repos.d/delorean-deps.repo http://trunk.rdoproject.org/centos7-liberty/delorean-deps.repo
178     sudo rm -f /etc/yum.repos.d/delorean-current.repo
179 fi
180
181 # ensure the undercloud package is installed so we can build the undercloud
182 if ! rpm -q instack-undercloud > /dev/null; then
183     sudo yum install -y python-tripleoclient
184 fi
185
186 # ensure openvswitch is installed
187 if ! rpm -q openvswitch > /dev/null; then
188     sudo yum install -y openvswitch
189 fi
190
191 # ensure libvirt is installed
192 if ! rpm -q libvirt-daemon-kvm > /dev/null; then
193     sudo yum install -y libvirt-daemon-kvm
194 fi
195
196 # clean this up incase it's there
197 sudo rm -f /tmp/instack.answers
198
199 # ensure that no previous undercloud VMs are running
200 sudo ../ci/clean.sh
201 # and rebuild the bare undercloud VMs
202 ssh -T ${SSH_OPTIONS[@]} stack@localhost <<EOI
203     set -e
204     NODE_COUNT=5 NODE_CPU=2 NODE_MEM=8192 TESTENV_ARGS="--baremetal-bridge-names 'brbm brbm1 brbm2 brbm3'" instack-virt-setup
205 EOI
206
207 # let dhcp happen so we can get the ip
208 # just wait instead of checking until we see an address
209 # because there may be a previous lease that needs
210 # to be cleaned up
211 sleep 5
212
213 # get the undercloud ip address
214 UNDERCLOUD=$(grep instack /var/lib/libvirt/dnsmasq/default.leases | awk '{print $3}' | head -n 1)
215 if [ -z "$UNDERCLOUD" ]; then
216   #if not found then dnsmasq may be using leasefile-ro
217   instack_mac=$(ssh -T ${SSH_OPTIONS[@]} stack@localhost "virsh domiflist instack" | grep default | \
218                 grep -Eo "[0-9a-f\]+:[0-9a-f\]+:[0-9a-f\]+:[0-9a-f\]+:[0-9a-f\]+:[0-9a-f\]+")
219   UNDERCLOUD=$(arp -e | grep ${instack_mac} | awk {'print $1'})
220
221   if [ -z "$UNDERCLOUD" ]; then
222     echo "\n\nNever got IP for Instack. Can Not Continue."
223     exit 1
224   fi
225 else
226    echo -e "${blue}\rInstack VM has IP $UNDERCLOUD${reset}"
227 fi
228
229 # ensure that we can ssh to the undercloud
230 CNT=10
231 while ! ssh -T ${SSH_OPTIONS[@]}  "root@$UNDERCLOUD" "echo ''" > /dev/null && [ $CNT -gt 0 ]; do
232     echo -n "."
233     sleep 3
234     CNT=CNT-1
235 done
236 # TODO fail if CNT=0
237
238 # yum update undercloud and reboot.
239 ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
240     set -e
241
242     echo "----------------------------------------------------------------"
243     echo yum update and install pciutils prereqs for DPDK tools and samples.
244     echo
245     yum -y update
246     yum -y install pciutils libvirt
247 EOI
248
249 # reboot VM
250 ssh -T ${SSH_OPTIONS[@]} stack@localhost <<EOI
251     virsh reboot instack
252 EOI
253 sleep 30
254
255 # yum repo, triple-o package and ssh key setup for the undercloud
256 echo "Install epel-release on undercloud"
257 ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
258     set -e
259
260     if ! rpm -q epel-release > /dev/null; then
261         yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
262     fi
263
264     yum -y install yum-plugin-priorities
265     curl -o /etc/yum.repos.d/delorean.repo http://trunk.rdoproject.org/centos7-liberty/current-passed-ci/delorean.repo
266     curl -o /etc/yum.repos.d/delorean-deps.repo http://trunk.rdoproject.org/centos7-liberty/delorean-deps.repo
267
268     cp /root/.ssh/authorized_keys /home/stack/.ssh/authorized_keys
269     chown stack:stack /home/stack/.ssh/authorized_keys
270 EOI
271 #
272 # If using special kernel version, install on undercloud vm.
273 #
274 if [ ! -z $kernel_version ]; then
275     echo "Install special kernel version $kernel_version on undercloud"
276     ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
277     set -e
278     yum -y install gcc ncurses ncurses-devel bc xz rpm-build
279     echo wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
280     wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
281     echo wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
282     wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
283     echo rpm -i kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
284     rpm -i kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
285     echo rpm -i kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
286     rpm -i kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
287
288     echo cd /lib/modules/$kernel_version-1.el6.elrepo.x86_64
289     cd /lib/modules/$kernel_version-1.el6.elrepo.x86_64
290     echo rm -f build
291     rm -f build
292     echo ln -s /usr/src/kernels/$kernel_version-1.el6.elrepo.x86_64 build
293     ln -s /usr/src/kernels/$kernel_version-1.el6.elrepo.x86_64 build
294     #echo rm -f source
295     #rm -f source
296     #echo ln -s ./build source
297     #ln -s ./build source
298 EOI
299 else
300     #
301     # Install latest stable kernel.
302     #
303     echo "Install devel-kernel and elrepo on undercloud"
304     ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
305         echo Install latest stable kernel
306         set -e
307         yum install -y kernel kernel-devel
308         rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
309         rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
310 EOI
311 fi
312
313 # copy instackenv file for future virt deployments
314 echo copy instackenv file for future virt deployments
315 if [ ! -d stack ]; then mkdir stack; fi
316 scp ${SSH_OPTIONS[@]} stack@$UNDERCLOUD:instackenv.json stack/instackenv.json
317
318
319 #
320 # If using special kernel version, reboot undercloud vm
321 #
322 echo If using special kernel version, reboot undercloud vm
323 if [ -z $kernel_version ]; then
324     ssh -T ${SSH_OPTIONS[@]} stack@localhost <<EOI
325         virsh reboot instack
326 EOI
327     sleep 15
328 fi
329
330 #
331 # Copy build and test scripts to undercloud vm.
332 # If special kernel is required, build rpm on undercloud vm otherwise build
333 # it locally.
334 #
335 echo Copy build and test scripts to undercloud vm.
336 echo BUILD_BASE is $BUILD_BASE
337 scp ${SSH_OPTIONS[@]} $BUILD_BASE/build_ovs_rpm.sh stack@$UNDERCLOUD:
338 scp ${SSH_OPTIONS[@]} $BUILD_BASE/test_ovs_rpm.sh stack@$UNDERCLOUD:
339 #
340 # build dpdk rpm locally.
341 #
342 if [[ "$DPDK" =~ "yes" ]]; then
343     echo Build DPDK RPMs
344     ./build_dpdk_rpm.sh -g $DPDK_VERSION
345 fi
346 #
347 # Build rpm on undercloud if custom kernel module is required otherwise build
348 # locally.
349 #
350 if [ ! -z $kernel_version ]; then
351     echo build rpm on undercloud with kernel version $kernel_version
352     ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
353         ./build_ovs_rpm.sh -a $kernel_major $setnocheck -g $TAG -i $kernel_minor -k -p $OVS_PATCH -u $OVS_REPO_URL
354 EOI
355     scp ${SSH_OPTIONS[@]} stack@UNDERCLOUD:*.rpm $RPMDIR/RPMS/
356 elif [[ "$DPDK" =~ "yes" ]]; then
357     echo Build ovs with DPDK locally
358     #
359     # Build locally and copy RPMS to undercloud vm for testing
360     # and copy RPMS to temporary release dir.
361     #
362     ./build_ovs_rpm.sh $setnocheck -d -g $TAG -p $OVS_PATCH -u $OVS_REPO_URL
363 else
364     # Build locally and copy RPMS to undercloud vm for testing
365     # and copy RPMS to temporary release dir.
366     #
367     echo build OVS rpm locally
368     ./build_ovs_rpm.sh $setnocheck -g $TAG $setkmod -p $OVS_PATCH -u $OVS_REPO_URL
369 fi
370 #
371 # Test rpm on undercloud vm
372 # TODO: Undercloud VM doesn't support sse3 instruction needed set to run DPDK
373 #
374 if [ ! -z $TESTRPM ]; then
375     if [ -z $DPDK ]; then
376         echo "-----------------------------------------"
377         echo Test rpm on undercloud vm
378         echo Copy all RPMS to undercloud for testing.
379         echo
380         scp ${SSH_OPTIONS[@]} $RPMDIR/RPMS/x86_64/* stack@$UNDERCLOUD:
381         scp ${SSH_OPTIONS[@]} $RPMDIR/SOURCES/dpdk*.rpm stack@$UNDERCLOUD:
382         ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
383             ./test_ovs_rpm.sh $setdpdk $setkmod
384 EOI
385     else
386         echo "-----------------------------------------"
387         echo "TODO: Undercloud VM doesn't support sse3 instruction needed DPDK."
388         echo "DPDK is required, therefore test DPDK/OVS RPM in host"
389         echo
390         ./test_ovs_rpm.sh $setdpdk $setkmod
391     fi
392 fi
393
394 #
395 # If tests pass, copy rpms to release dir
396 #
397 echo copy rpms to release dir
398 echo copy rpms from undercloud back to $TMP_RELEASE_DIR in host
399 cp $RPMDIR/RPMS/x86_64/* $TMP_RELEASE_DIR
400
401 exit 0