2 ##############################################################################
3 # Copyright (c) 2015 Red Hat Inc. and others.
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 ##############################################################################
14 echo "==============================="
19 echo run BuildAndTestOVS -h for help
22 while getopts "a:dg:hi:p:tu:v" opt; do
25 kernel_major=${OPTARG}
38 kernel_minor=${OPTARG}
47 OVS_REPO_URL=${OPTARG}
55 # Default Config options
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
67 if [[ $KMOD =~ "yes" ]]; then
73 if [ -z $OVS_REPO_URL ]; then
74 OVS_REPO_URL=https://github.com/openvswitch/ovs.git
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 ===================
83 echo Will use default kernel in ovs test vm
86 if [ -z ${WORKSPACE+1} ]; then
87 # We are not being run by Jenkins.
88 export WORKSPACE=$HOME/opnfv/ovsnfv
91 git clone https://git.opnfv.org/ovsnfv
94 export BUILD_BASE=$WORKSPACE/build
96 if [ ! -d $BUILD_BASE ]
101 if [ ! -f $BUILD_BASE/config ]; then
102 touch $BUILD_BASE/config
105 export PATH=$PATH:$WORKSPACE/ci:$BUILD_BASE
106 source $BUILD_BASE/config
109 export TOPDIR=$BUILD_BASE
111 export TMP_RELEASE_DIR=$TOPDIR/release
112 if [ ! -d $TMP_RELEASE_DIR ]; then
113 mkdir -p $TMP_RELEASE_DIR
116 export CACHE_DIR=$TOPDIR/cache
117 if [ ! -d $CACHE_DIR ]; then
120 export TMPDIR=$TOPDIR/scratch
121 if [ ! -d $SCRATCH_DIR ]; then
122 mkdir -p $SCRATCH_DIR
125 rdo_images_uri=https://ci.centos.org/artifacts/rdo/images/liberty/delorean/stable
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"
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
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
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'
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
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
160 # clean up stack user previously build instack disk images
161 ssh -T ${SSH_OPTIONS[@]} stack@localhost "rm -f instack*.qcow2"
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
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
183 # ensure openvswitch is installed
184 if ! rpm -q openvswitch > /dev/null; then
185 sudo yum install -y openvswitch
188 # ensure libvirt is installed
189 if ! rpm -q libvirt-daemon-kvm > /dev/null; then
190 sudo yum install -y libvirt-daemon-kvm
193 # clean this up incase it's there
194 sudo rm -f /tmp/instack.answers
196 # ensure that no previous undercloud VMs are running
198 # and rebuild the bare undercloud VMs
199 ssh -T ${SSH_OPTIONS[@]} stack@localhost <<EOI
201 NODE_COUNT=5 NODE_CPU=2 NODE_MEM=8192 TESTENV_ARGS="--baremetal-bridge-names 'brbm brbm1 brbm2 brbm3'" instack-virt-setup
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
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'})
218 if [ -z "$UNDERCLOUD" ]; then
219 echo "\n\nNever got IP for Instack. Can Not Continue."
223 echo -e "${blue}\rInstack VM has IP $UNDERCLOUD${reset}"
226 # ensure that we can ssh to the undercloud
228 while ! ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "echo ''" > /dev/null && [ $CNT -gt 0 ]; do
235 # yum update undercloud and reboot.
236 ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
244 ssh -T ${SSH_OPTIONS[@]} stack@localhost <<EOI
249 # yum repo, triple-o package and ssh key setup for the undercloud
250 echo "Install epel-release on undercloud"
251 ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
254 if ! rpm -q epel-release > /dev/null; then
255 yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
258 yum -y install yum-plugin-priorities
259 curl -o /etc/yum.repos.d/delorean.repo http://trunk.rdoproject.org/centos7-liberty/current-passed-ci/delorean.repo
260 curl -o /etc/yum.repos.d/delorean-deps.repo http://trunk.rdoproject.org/centos7-liberty/delorean-deps.repo
262 cp /root/.ssh/authorized_keys /home/stack/.ssh/authorized_keys
263 chown stack:stack /home/stack/.ssh/authorized_keys
266 # If using special kernel version, install on undercloud vm.
268 if [ ! -z $kernel_version ]; then
269 echo "Install special kernel version $kernel_version on undercloud"
270 ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
272 yum -y install gcc ncurses ncurses-devel bc xz rpm-build
273 echo wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
274 wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
275 echo wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
276 wget --quiet http://mirrors.neterra.net/elrepo/kernel/el6/x86_64/RPMS/kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
277 echo rpm -i kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
278 rpm -i kernel-ml-$kernel_version-1.el6.elrepo.x86_64.rpm
279 echo rpm -i kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
280 rpm -i kernel-ml-devel-$kernel_version-1.el6.elrepo.x86_64.rpm
282 echo cd /lib/modules/$kernel_version-1.el6.elrepo.x86_64
283 cd /lib/modules/$kernel_version-1.el6.elrepo.x86_64
286 echo ln -s /usr/src/kernels/$kernel_version-1.el6.elrepo.x86_64 build
287 ln -s /usr/src/kernels/$kernel_version-1.el6.elrepo.x86_64 build
290 #echo ln -s ./build source
291 #ln -s ./build source
295 # Install latest stable kernel.
297 echo "Install devel-kernel and elrepo on undercloud"
298 ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <<EOI
299 echo Install latest stable kernel
301 yum install -y kernel kernel-devel
302 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
303 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
307 # copy instackenv file for future virt deployments
308 echo copy instackenv file for future virt deployments
309 if [ ! -d stack ]; then mkdir stack; fi
310 scp ${SSH_OPTIONS[@]} stack@$UNDERCLOUD:instackenv.json stack/instackenv.json
314 # If using special kernel version, reboot undercloud vm
316 echo If using special kernel version, reboot undercloud vm
317 if [ -z $kernel_version ]; then
318 ssh -T ${SSH_OPTIONS[@]} stack@localhost <<EOI
325 # Copy build and test scripts to undercloud vm.
326 # If special kernel is required, build rpm on undercloud vm otherwise build
329 echo Copy build and test scripts to undercloud vm.
330 echo BUILD_BASE is $BUILD_BASE
331 scp ${SSH_OPTIONS[@]} $BUILD_BASE/build_ovs_rpm.sh stack@$UNDERCLOUD:
332 scp ${SSH_OPTIONS[@]} $BUILD_BASE/test_ovs_rpm.sh stack@$UNDERCLOUD:
335 # build rpm on undercloud.
337 if [ ! -z $kernel_version ]; then
338 echo build rpm on undercloud with kernel version $kernel_version
339 ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
340 ./build_ovs_rpm.sh -a $kernel_major $setnocheck -g $TAG -i $kernel_minor -k -p $OVS_PATCH -u $OVS_REPO_URL
343 # build locally and copy RPMS to undercloud vm for testing
344 # and copy RPMS to temporary release dir.
346 echo build rpm on undercloud
347 ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
348 ./build_ovs_rpm.sh $setnocheck -g $TAG $setkmod -p $OVS_PATCH -u $OVS_REPO_URL
352 # Test rpm on undercloud vm
354 if [[ ! -z $TESTRPM ]]; then
355 echo Test rpm on undercloud vm
356 ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
357 ./test_ovs_rpm.sh $setkmod
361 # copy rpms from undercloud back to host
363 echo copy rpms from undercloud back to $TMP_RELEASE_DIR in host
364 scp ${SSH_OPTIONS[@]} stack@$UNDERCLOUD:rpmbuild/RPMS/x86_64/*.rpm $TMP_RELEASE_DIR