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