ARM64: Add support for aarch64 architecture 83/18883/6
authorPaul Vaduva <Paul.Vaduva@enea.com>
Thu, 25 Aug 2016 11:18:22 +0000 (13:18 +0200)
committerPaul Vaduva <Paul.Vaduva@enea.com>
Wed, 31 Aug 2016 16:18:44 +0000 (18:18 +0200)
Added support for arm64 architecture so that yardstick framework
can be ran on arm-pod1 the armband CI pod. The modifications include
testing for presence of arm64 architecture nodes in the pod and running
arm64 specific code (building yardstick server image on arm64 version of
ubuntu cloud.
Openstack doesn't boot 3.13 kernel(arm64) so it was replaced with 3.19
kernel(also arm64), available for vivid cloud image of ubuntu.
The Dockerfile for building the ci image was also mofied to add necessary
tools for cross-building an arm64 image on amd64 host (the jumpserver)
The jira case for this commit is ARMBAND-40.

Change-Id: I906d4adbcf2ec2c0f1d695d9916ede42f4151080
Signed-off-by: Paul Vaduva <Paul.Vaduva@enea.com>
tests/ci/docker/yardstick-ci/Dockerfile
tests/ci/prepare_env.sh
tests/ci/yardstick-verify
tools/ubuntu-server-cloudimg-modify.sh
tools/yardstick-img-modify

index da755d1..5387bab 100644 (file)
@@ -17,8 +17,19 @@ ENV REPOS_DIR /home/opnfv/repos
 # Yardstick repo
 ENV YARDSTICK_REPO_DIR ${REPOS_DIR}/yardstick
 ENV RELENG_REPO_DIR ${REPOS_DIR}/releng
+RUN sed -i -e 's/^deb /deb [arch=amd64] /g' /etc/apt/sources.list
+RUN sed -i -e 's/^deb-src /# deb-src /g' /etc/apt/sources.list
+RUN echo "\n\
+deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ trusty main universe multiverse restricted \n\
+deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main universe multiverse restricted \n\
+deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ trusty-security main universe multiverse restricted \n\
+deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ trusty-proposed main universe multiverse restricted" >> /etc/apt/sources.list
+RUN echo "vm.mmap_min_addr = 0" > /etc/sysctl.d/mmap_min_addr.conf
+RUN dpkg --add-architecture arm64
 
 RUN apt-get update && apt-get install -y \
+    qemu-user-static \
+    libc6:arm64 \
     wget \
     expect \
     curl \
index 8c0a8ba..668d82c 100755 (executable)
@@ -84,6 +84,15 @@ if [ "$INSTALLER_TYPE" == "fuel" ]; then
     sshpass -p r00tme scp 2>/dev/null $ssh_options \
     root@${INSTALLER_IP}:~/.ssh/id_rsa /root/.ssh/id_rsa &> /dev/null
 
+    ARCH_SCRIPT="test -f /etc/fuel_openstack_arch && grep -q arm64 /etc/fuel_openstack_arch"
+    YARD_IMG_ARCH=amd64
+    sshpass -p r00tme ssh $ssh_options -l root $INSTALLER_IP "${ARCH_SCRIPT}" && YARD_IMG_ARCH=arm64
+    export YARD_IMG_ARCH
+
+    if ! grep -q "Defaults env_keep += \"YARD_IMG_ARCH\"" "/etc/sudoers"; then
+        sudo echo "Defaults env_keep += \"YARD_IMG_ARCH YARDSTICK_REPO_DIR\"" >> /etc/sudoers
+    fi
+
     sshpass -p r00tme ssh 2>/dev/null $ssh_options \
         root@${INSTALLER_IP} fuel node>fuel_node
 
index 859c92c..5ac0850 100755 (executable)
@@ -44,7 +44,13 @@ DISPATCHER_TYPE=file
 DISPATCHER_FILE_NAME="/tmp/yardstick.out"
 DISPATCHER_HTTP_TARGET="http://testresults.opnfv.org/test/api/v1/results"
 DISPATCHER_INFLUXDB_TARGET=
-
+UCA_HOST="cloud-images.ubuntu.com"
+if [ $YARD_IMG_ARCH = "arm64" ]; then
+    export VIVID_IMG_URL="http://${UCA_HOST}/vivid/current/vivid-server-cloudimg-arm64.tar.gz"
+    if ! grep -q "Defaults env_keep += \"VIVID_IMG_URL\"" "/etc/sudoers"; then
+        sudo echo "Defaults env_keep += \"VIVID_IMG_URL\"" >> /etc/sudoers
+    fi
+fi
 while getopts "r:i:h" OPTION; do
     case $OPTION in
         h)
@@ -80,7 +86,8 @@ cleanup()
         return
     fi
 
-    for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-trusty-server -e Ubuntu-14.04 | awk '{print $2}'); do
+    for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-trusty-server -e Ubuntu-14.04 \
+        -e yardstick-vivid-kernel | awk '{print $2}'); do
         echo "Deleting image $image..."
         glance image-delete $image || true
     done
@@ -232,12 +239,43 @@ load_yardstick_image()
 {
     echo
     echo "========== Loading yardstick cloud image =========="
+    EXTRA_PARAMS=""
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        VIVID_IMAGE="/tmp/vivid-server-cloudimg-arm64.tar.gz"
+        VIVID_KERNEL="/tmp/vivid-server-cloudimg-arm64-vmlinuz-generic"
+        cd /tmp
+        if [ ! -f $VIVID_IMAGE ]; then
+            wget $VIVID_IMG_URL
+        fi
+        if [ ! -f $VIVID_KERNEL ]; then
+            tar zxf $VIVID_IMAGE $(basename $VIVID_KERNEL)
+        fi
+        create_vivid_kernel=$(glance --os-image-api-version 1 image-create \
+                --name yardstick-vivid-kernel \
+                --is-public true --disk-format qcow2 \
+                --container-format bare \
+                --file $VIVID_KERNEL)
+
+        GLANCE_KERNEL_ID=$(echo "$create_vivid_kernel" | grep " id " | awk '{print $(NF-1)}')
+        if [ -z "$GLANCE_KERNEL_ID" ]; then
+            echo 'Failed uploading kernel to cloud'.
+            exit 1
+        fi
+
+        command_line="root=/dev/vdb1 console=tty0 console=ttyS0 console=ttyAMA0 rw"
 
-    output=$(glance --os-image-api-version 1 image-create \
+        EXTRA_PARAMS="--property kernel_id=$GLANCE_KERNEL_ID --property os_command_line=\"$command_line\""
+
+        rm -f $VIVID_KERNEL $VIVID_IMAGE
+        cd $YARDSTICK_REPO_DIR
+    fi
+    output=$(eval glance --os-image-api-version 1 image-create \
         --name yardstick-trusty-server \
         --is-public true --disk-format qcow2 \
         --container-format bare \
+        $EXTRA_PARAMS \
         --file $QCOW_IMAGE)
+
     echo "$output"
 
     GLANCE_IMAGE_ID=$(echo "$output" | grep " id " | awk '{print $(NF-1)}')
@@ -436,10 +474,18 @@ main()
 
     build_yardstick_image
     load_yardstick_image
-    load_cirros_image
-    load_ubuntu_image
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        sed -i 's/image: cirros-0.3.3/image: TestVM/g' tests/opnfv/test_cases/opnfv_yardstick_tc002.yaml \
+        samples/ping.yaml
+        #We have overlapping IP with the real network
+        for filename in tests/opnfv/test_cases/*; do
+            sed -i "s/cidr: '10.0.1.0\/24'/cidr: '10.3.1.0\/24'/g" $filename
+        done
+    else
+        load_cirros_image
+        load_ubuntu_image
+    fi
     create_nova_flavor
-
     install_storperf
     run_test
     remove_storperf
index 2e8399a..3ef0608 100755 (executable)
@@ -24,9 +24,13 @@ if [ $# -eq 1 ]; then
 fi
 
 # iperf3 only available for trusty in backports
-grep trusty /etc/apt/sources.list && \
-    echo "deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
-
+if [grep -q trusty /etc/apt/sources.list ]; then
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        echo "deb [arch=arm64] http://ports.ubuntu.com/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
+    else
+        echo "deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
+    fi
+fi
 # Workaround for building on CentOS (apt-get is not working with http sources)
 # sed -i 's/http/ftp/' /etc/apt/sources.list
 
@@ -41,8 +45,18 @@ password: RANDOM
 chpasswd: { expire: False }
 ssh_pwauth: True
 EOF
-
 apt-get update
+if [ $YARD_IMG_ARCH = "arm64" ]; then
+apt-get install -y \
+    linux-headers-$(echo $VIVID_KERNEL_VERSION | cut -d'-' -f3,4,5) \
+    unzip
+#resize root parition (/dev/vdb1) It is supposed to be default but the image is booted differently for arm64
+cat <<EOF >/etc/cloud/cloud.cfg.d/15_growpart.cfg
+#cloud-config
+bootcmd:
+ - [growpart, /dev/vdb, 1]
+EOF
+fi
 apt-get install -y \
     fio \
     git \
@@ -59,15 +73,37 @@ apt-get install -y \
     stress \
     sysstat
 
-git clone https://github.com/kdlucas/byte-unixbench.git /opt/tempT
+if [ $YARD_IMG_ARCH = "arm64" ]; then
+    wget https://github.com/kdlucas/byte-unixbench/archive/master.zip
+    unzip master.zip && rm master.zip
+    mkdir /opt/tempT
+    mv byte-unixbench-master/UnixBench /opt/tempT
+    sed -i -e 's/OPTON += -march=native -mtune=native/OPTON += -march=armv8-a -mtune=generic/g' \
+    -e 's/OPTON += -march=native/OPTON += -march=armv8-a/g' /opt/tempT/UnixBench/Makefile
+else
+    git clone https://github.com/kdlucas/byte-unixbench.git /opt/tempT
+fi
 make --directory /opt/tempT/UnixBench/
 
-git clone https://github.com/beefyamoeba5/ramspeed.git /opt/tempT/RAMspeed
+if [ $YARD_IMG_ARCH = "arm64" ]; then
+    wget https://github.com/beefyamoeba5/ramspeed/archive/master.zip
+    unzip master.zip && rm master.zip
+    mkdir /opt/tempT/RAMspeed
+    mv ramspeed-master/* /opt/tempT/RAMspeed/
+else
+    git clone https://github.com/beefyamoeba5/ramspeed.git /opt/tempT/RAMspeed
+fi
 cd /opt/tempT/RAMspeed/ramspeed-2.6.0
 mkdir temp
 bash build.sh
 
-git clone https://github.com/beefyamoeba5/cachestat.git /opt/tempT/Cachestat
+if [ $YARD_IMG_ARCH = "arm64" ]; then
+    wget https://github.com/beefyamoeba5/cachestat/archive/master.zip
+    unzip master.zip && rm master.zip
+    mv cachestat-master/cachestat /opt/tempT
+else
+    git clone https://github.com/beefyamoeba5/cachestat.git /opt/tempT/Cachestat
+fi
 
 # restore symlink
 ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf
index 13d4360..b9ecbdd 100755 (executable)
@@ -38,11 +38,10 @@ test $(id -u) -eq 0 || die "should invoke using sudo"
 cmd=$1
 test -x $cmd
 mountdir="/mnt/yardstick"
-
 workspace=${WORKSPACE:-"/tmp/workspace/yardstick"}
 host=${HOST:-"cloud-images.ubuntu.com"}
 release=${RELEASE:-"trusty"}
-image_path="${release}/current/${release}-server-cloudimg-amd64-disk1.img"
+image_path="${release}/current/${release}-server-cloudimg-${YARD_IMG_ARCH}-disk1.img"
 image_url=${IMAGE_URL:-"https://${host}/${image_path}"}
 md5sums_path="${release}/current/MD5SUMS"
 md5sums_url=${MD5SUMS_URL:-"https://${host}/${md5sums_path}"}
@@ -64,30 +63,61 @@ download() {
         wget -nc --progress=dot:giga $image_url
         grep $filename MD5SUMS | md5sum -c
     fi
+
+    for i in $(seq 0 9); do
+        [ -a /dev/loop$i ] || mknod -m 660 /dev/loop$i b 7 $i
+    done
+
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        cd /tmp
+        if [ ! -f /tmp/vivid-server-cloudimg-arm64-kernel-info.txt ]; then
+            wget http://cloud-images.ubuntu.com/vivid/current/vivid-server-cloudimg-arm64-kernel-info.txt
+        fi
+        export VIVID_KERNEL_VERSION=$(cut -d$'\t' -f4 vivid-server-cloudimg-arm64-kernel-info.txt)
+        mkdir -p /tmp/vivid-modules
+        if [ ! -f "/tmp/vivid-server-cloudimg-arm64.tar.gz" ]; then
+            wget $VIVID_IMG_URL
+        fi
+        if [ ! -f "/tmp/vivid-server-cloudimg-arm64.img" ]; then
+            tar zxvf vivid-server-cloudimg-arm64.tar.gz vivid-server-cloudimg-arm64.img
+        fi
+        mkdir -p /mnt/vivid
+        mount /tmp/vivid-server-cloudimg-arm64.img /mnt/vivid
+        cp -r /mnt/vivid/lib/modules/$(echo $VIVID_KERNEL_VERSION | cut -d'-' -f3,4,5) /tmp/vivid-modules
+        umount /mnt/vivid
+        rm /tmp/vivid-server-cloudimg-arm64.img
+        cd $workspace
+    fi
     qemu-img convert $filename $raw_imgfile
     cd -
 }
 
 # mount image
 setup() {
+    # qemu-img resize $raw_imgfile +5GB
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        echo -e "d\nn\np\n1\n\n\nw" | fdisk $raw_imgfile
+    fi
     mkdir -p $mountdir
 
-    for i in $(seq 0 9); do
-        [ -a /dev/loop$i ] || mknod -m 660 /dev/loop$i b 7 $i
-    done
-
     loopdevice=$(kpartx -l $raw_imgfile | head -1 | cut -f1 -d ' ')
 
     kpartx -av $raw_imgfile
-
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        e2fsck -f /dev/mapper/$loopdevice
+        resize2fs /dev/mapper/$loopdevice
+    fi
     # for trouble shooting
     sleep 2
     dmsetup ls
     fdisk -l /dev/${loopdevice:0:5} || true
-
     mount /dev/mapper/$loopdevice $mountdir
     mount -t proc none $mountdir/proc
 
+    if [ $YARD_IMG_ARCH = "arm64" ]; then
+        cp -r /tmp/vivid-modules/$(echo $VIVID_KERNEL_VERSION | cut -d'-' -f3,4,5) "$mountdir/lib/modules"
+        cp $(which "qemu-aarch64-static") "$mountdir/usr/bin"
+    fi
     cp $cmd $mountdir/$(basename $cmd)
 }
 
@@ -120,6 +150,7 @@ cleanup() {
     # designed to be idempotent
     mount | grep $mountdir/proc && umount $mountdir/proc
     mount | grep $mountdir && umount $mountdir
+    mount | grep "/mnt/vivid" && umount "/mnt/vivid"
     if [ -f $raw_imgfile ]; then
         kpartx -dv $raw_imgfile || true
     fi