Update vagrant config to ubuntu 16.04LTS 81/23081/7
authorMats Wichmann <mats@linux.com>
Thu, 2 Nov 2017 19:27:37 +0000 (13:27 -0600)
committerMats Wichmann <mats@linux.com>
Fri, 3 Nov 2017 23:31:19 +0000 (17:31 -0600)
Provisions the current Ubuntu LTS release with a usable iotivity
build environment.

Also adds commented-out options to provision the other two
current (non-LTS) Ubuntu releases, 17.04 and 17.10

Change-Id: Ia5cda2e77d00de65367a57c1faaf226558a5e7b6
Signed-off-by: Mats Wichmann <mats@linux.com>
tools/vagrant/README.md
tools/vagrant/Vagrantfile
tools/vagrant/bootstrap.sh [deleted file]
tools/vagrant/iotivity-setup.sh

index cb28569..b8b392f 100644 (file)
@@ -1,19 +1,34 @@
 IoTivity Build VM from Vagrant
 ==============================
 
-Vagrant can use the files in this directory to provision an Ubuntu 12.04
-development environment for IoTivity.  To create a new VM type
+Vagrant can use the files in this directory to provision an Ubuntu
+16.04LTS development environment for IoTivity.  To create a new VM:
 
     % vagrant up
 
-in the current directory.  You can then connect to the VM with
+in the current directory.  The default provider on your given host
+may not be supported by the box to be used, which will give an error.
+If so specify a provider to use. e.g. to use virtualbox:
+
+   % vagrant up --provider virtualbox
+
+You can then connect to the VM with:
 
     % vagrant ssh
 
-On the newly provisioned VM, the IoTivity repo will be checked out in
-the `iotivity` directory in the vagrant user's home directory and
-configured to use the Arduino SDKs which are automatically downloaded
-and installed in the home directory and patched when the VM is provisioned.
+On the newly provisioned VM, the IoTivity git repo will be checked out
+in the `iotivity` directory in the vagrant user's home directory.
+
+Optional (currently disabled) features are provisioning for Android
+and Arduino building. Android will now correctly provision on first
+scons run where those build options are selected. Arduino building is
+no longer really supported on iotivity (use iotivity-constrained instead).
+
+Also optional, it should be able to configure for Ubuntu 17.04
+and 17.10, by changing which of the the stanzas in Vagrantfile is
+uncommented. Non-LTS Vagrant boxes vanish from the upstream as soon as
+they go out of support (nine months for Ubuntu), so these sections will
+go out of date quickly.
 
 Using Vagrant to build a VM might be useful for:
 
@@ -22,36 +37,42 @@ Using Vagrant to build a VM might be useful for:
 
 * Configuring a Linux build environment for Windows or Mac users
 
-* Configuring build VMs for build automation
+* Configuring VMs for build automation
 
-The bootstrap.sh and iotivity-setup.sh files can be used independent of
-Vagrant to configure a existing Ubuntu environment.  How to do so is left
-as an exercise for the reader.  (Hint: try `sudo bootstrap.sh &&
-iotivity-setup.sh`.)
+The Vagrantfile has only virtualbox provider-specific options. To use
+other provides such as vmware, libvirt, just copy this stanza and
+update (feel free to submit a patch!).  Note the default 2gb RAM
+leaves a working system, but not much spare in doing builds. Don't
+do parallel builds on this without bumping the memory up. Look for:
 
-For more information about Vagrant, please see https://docs.vagrantup.com/v2/
+  config.vm.provider "virtualbox" do |vb|
 
-Assumptions
-===========
-
-* The ${HOME}/.ssh/ directory contains config, id_rsa, id_rsa.pub, and
-  known_hosts, that when copied to the VM will allow connection to the
-  git repo.  (And that you don't mind those files being copied to the VM.)
+The Vagrantfile defaults to setting up bridged networking, so that the
+new image will be visible on the network for running iotivity tests
+against other iotivity machines. It will lead to a pausing question in
+the provisioning. If this is not wanted, comment this line out:
 
-* If a USER environment variable, it has the user name to use for git
-  otherwise, USERNAME has the user ID for git.  USER should work for
-  Linux and USERNAME works inside Git bash on Windows.
+  config.vm.network "public_network"
 
-To Do
-=====
+This directory will be available inside the box as /vagrant, so if
+you need to add something visible inside the box, just dropping it
+here should be sufficient (e.g. the proxy_config file mentioned in 
+comments in iotivity-setup.sh).
 
-* Everything is dumped into the top-level directory.  A cleaner layout
-  would be better (e.g., move the Arduino libraries to iotivity/extlibs).
+For more information about Vagrant, please see https://docs.vagrantup.com/v2/
 
-* Verify on more configurations (tested on Git bash under Windows)
+Assumptions
+===========
 
-* Try with Ubuntu 14.04
+* The ${HOME}/.ssh/ directory contains files config, id_rsa, id_rsa.pub,
+  and known_hosts which when copied to the VM will allow connection to
+  iotivity gerrit, which is where the master git repo lives. That implies
+  access to gerrit has been set up already on this machine.  Sub-assumption:
+  you don't mind these personal files being copied to the VM.
 
-* Have a more flexible way to determine the git user name
+* Your git username is obtainable by doing "ssh -G gerrit.iotivity.org".
+  It will fall back to the USER and then to USERNAME environment variables,
+  which may or may not be usable.  This information is part of the setup
+  (try "git remote -v" in the iotivity directory in the running box to see),
+  but can easily be changed if the guess is wrong.
 
-* Install Android NDK
index d4fc989..24050e6 100644 (file)
@@ -5,8 +5,24 @@
 VAGRANTFILE_API_VERSION = "2"
 
 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
-  # Every Vagrant virtual environment requires a box to build off of.
-  config.vm.box = "hashicorp/precise64"
+  # We are not trying to provision multiple boxes at once, this
+  # is just a trick to give a name other than "default" to the box.
+  # Pick the stanza you want. Warning: non-LTS releases vanish fast!
+  config.vm.define "iotivity1604" do |iotivity1604|
+    # Every Vagrant virtual environment requires a box to build off of.
+    iotivity1604.vm.box = "bento/ubuntu-16.04"
+    iotivity1604.vm.hostname = "iotivity1604"
+  end
+  #config.vm.define "iotivity1704" do |iotivity1704|
+  #  # Every Vagrant virtual environment requires a box to build off of.
+  #  iotivity1704.vm.box = "bento/ubuntu-17.04"
+  #  iotivity1704.vm.hostname = "iotivity1704"
+  #end
+  #config.vm.define "iotivity1710" do |iotivity1710|
+  #  # Every Vagrant virtual environment requires a box to build off of.
+  #  iotivity1710.vm.box = "bento/ubuntu-17.10"
+  #  iotivity1710.vm.hostname = "iotivity1710"
+  #end
 
   # Disable automatic box update checking. If you disable this, then
   # boxes will only be checked for updates when the user runs
@@ -25,24 +41,48 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   # Create a public network, which generally matched to bridged network.
   # Bridged networks make the machine appear as another physical device on
   # your network.
-  # config.vm.network "public_network"
+  # iotivity: to enable this box to participate in the network so other
+  # iotivity devices can see it, we want this:
+  config.vm.network "public_network"
+
+  #config.vm.post_up_message "This is a test message.  Try 'vagrant ssh'"
 
+  # Provider-specific configuration example:
+  config.vm.provider "virtualbox" do |vb|
+      # Display the VirtualBox GUI when booting
+      vb.gui = false
+      # Customize memory in VM - 2GB about minimum for full building/testing
+      vb.memory = "2048"
+  end
+
+  # Provision the VM:
+  # copies current user's files, maybe use a separate key for Vagrant?
   config.vm.provision :file, source: "~/.gitconfig", destination: ".gitconfig"
-  # maybe should have a separate key for Vagrant
   config.vm.provision :file, source: "~/.ssh/id_rsa", destination: ".ssh/id_rsa"
   config.vm.provision :file, source: "~/.ssh/id_rsa.pub", destination: ".ssh/id_rsa.pub"
   config.vm.provision :file, source: "~/.ssh/known_hosts", destination: ".ssh/known_hosts"
   config.vm.provision :file, source: "~/.ssh/config", destination: ".ssh/config"
 
-  # Simple script configuration
-  config.vm.provision :shell, path: "bootstrap.sh"
+  # Provision the needed distro packages
+  config.vm.provision :shell, inline: <<-SHELL
+    apt-get update
+    apt-get -qy upgrade
+    # for C/C++ development:
+    apt-get -qy install \
+        build-essential git scons ssh unzip valgrind \
+        doxygen libtool autoconf pkg-config gcovr \
+        libboost-all-dev libsqlite3-dev \
+        uuid-dev libglib2.0-dev libcurl4-gnutls-dev \
+        libbz2-dev
+    # for Android/Java development:
+    apt-get -qy install openjdk-8-jdk icedtea-plugin
+    apt-get clean
+  SHELL
+
+  # run a script to provision iotivity project itself
   config.vm.provision :shell do |shell|
     shell.path = "iotivity-setup.sh"
-    user = ENV['USER']
-    if (user.empty?)
-      user = ENV['USERNAME']
-    end
-    shell.args = "#{user}"
+    #shell.args = "-no-android -no-adruino"
     shell.privileged = false
   end
 end
diff --git a/tools/vagrant/bootstrap.sh b/tools/vagrant/bootstrap.sh
deleted file mode 100755 (executable)
index 7fd1760..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-apt-get update
-apt-get install -y git build-essential ia32-libs scons make g++ unzip
-apt-get install -y libboost-dev libboost-program-options-dev libcurl4-nss-dev
-
-# for Android development
-apt-get install -y openjdk-6-jdk
-apt-get install -y icedtea-plugin
-
-# for more pleasant development UX in the VM
-apt-get install -y vim
index 234fcf4..9bf3c7f 100755 (executable)
@@ -1,18 +1,20 @@
 #!/bin/bash
 
-# User ID to use with git
-GIT_USER=$1
-
 function die {
-       echo $1
-       exit 255
+    echo $1
+    exit 255
 }
 
 # if file $1 does not exist, call wget on $2
 function wget_if_not_exists {
-       test -f $1 || wget -q $2 || die "$1 does not exist and wget failed for $2"
+    test -f $1 || wget -q $2 || die "$1 does not exist and wget failed for $2"
 }
 
+# Try to figure out userid to use with git/gerrit
+export GIT_USER=`ssh -G gerrit.iotivity.org | grep "^user " | sed 's/^user //'`
+set ${GIT_USER:=${USER}}
+set ${GIT_USER:=${USERNAME}}
+
 # If you are behind a proxy, add all the environment variables required to
 # set the proxy appropriately for your environment.
 #source /vagrant/proxy_config
@@ -22,92 +24,114 @@ chmod 600 .ssh/id_rsa
 
 # Cannot use repo directory on host if host is Windows, because
 # Windows does not handle symlinks properly
+# Clone anonymously, then switch the origin URL - avoids key auth problems
+# during provisioning
 if [ ! -d "iotivity" ]
 then
-       git clone ssh://${GIT_USER}@gerrit.iotivity.org/iotivity || die "git failed"
-       scp -p -P 29418 ${GIT_USER}@gerrit.iotivity.org:hooks/commit-msg iotivity/.git/hooks/
+    git clone https://git.iotivity.org/iotivity.git
+    wget https://gerrit.iotivity.org/gerrit/tools/hooks/commit-msg -P iotivity/.git/hooks/
+    echo "Switching to guessed git user ${GIT_USER}"
+    echo "If incorrect, fix with following cmd using correct GIT_USER:"
+    echo "$ git remote set-url origin ssh://\${GIT_USER}@gerrit.iotivity.org/iotivity"
+    pushd iotivity
+    git remote set-url origin ssh://${GIT_USER}@gerrit.iotivity.org/iotivity
+    popd
 fi
 
-export TINYCBOR_DIR=iotivity/extlibs/tinycbor
-if [ ! -d ${CEREAL_DIR} ]
+export cborRevision='v0.4.1'
+export TINYCBOR_DIR=iotivity/extlibs/tinycbor/tinycbor
+if [ ! -d ${TINYCBOR_DIR} ]
 then
-       git clone https://github.com/01org/tinycbor ${CEREAL_DIR}
+    git clone https://github.com/01org/tinycbor.git ${TINYCBOR_DIR} -b ${cborRevision}
 fi
 
-#######################################
-# Android
-#######################################
-
-echo "Set up Android NDK"
-export ANDROID_NDK=${PWD}/iotivity/tools/android-ndk
-if [ ! -d ${ANDROID_NDK} ]
+export mbedtls_revision='mbedtls-2.4.2'
+export MBEDTLS_DIR=iotivity/extlibs/mbedtls/mbedtls
+if [ ! -d ${MBEDTLS_DIR} ]
 then
-       mkdir -p ${ANDROID_NDK}
-       pushd ${ANDROID_NDK}
-       wget_if_not_exists "android-ndk-r10e-linux-x86_64.bin" http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
-       chmod a+x android-ndk-r10e-linux-x86_64.bin
-       ./android-ndk-r10e-linux-x86_64.bin
-       popd
-fi
-
-echo "Set up Android NDK"
-export ANDROID_SDK=${PWD}/iotivity/tools/android-sdk-linux
-if [ ! -d ${ANDROID_SDK} ]
-then
-       pushd iotivity/tools
-       cd ..
-       wget_if_not_exists "android-sdk_r24.0.2-linux.tgz" http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
-       tar -xzf http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
-       popd
+    git clone https://github.com/ARMmbed/mbedtls.git ${MBEDTLS_DIR} -b ${mbedtls_revision}
 fi
 
 #######################################
-# Arduino Dependencies
+# Android pre-provision (optional)
 #######################################
+function android_setup {
+    echo "Set up Android NDK"
+    export ANDROID_NDK=${PWD}/iotivity/tools/android-ndk
+    if [ ! -d ${ANDROID_NDK} ]
+    then
+        mkdir -p ${ANDROID_NDK}
+        pushd ${ANDROID_NDK}
+        wget_if_not_exists "android-ndk-r10e-linux-x86_64.bin" http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
+        chmod a+x android-ndk-r10e-linux-x86_64.bin
+        ./android-ndk-r10e-linux-x86_64.bin
+        popd
+    fi
 
-# Arduino Mega
-echo "Set up Arduino Mega"
-export ARDUINO_MEGA_DIR=${PWD}/arduino-1.0.5
-if [ ! -d ${ARDUINO_MEGA_DIR} ]
-then
-       wget_if_not_exists "arduino-1.0.5-linux64.tgz" http://arduino.googlecode.com/files/arduino-1.0.5-linux64.tgz
-       tar -xzf arduino-1.0.5-linux64.tgz
-       wget_if_not_exists "Time-1.0.5.zip" http://playground.arduino.cc/uploads/Code/Time.zip
-       mv Time.zip Time-1.0.5.zip
-       mkdir -p ${ARDUINO_MEGA_DIR}/libraries/Time
-       pushd ${ARDUINO_MEGA_DIR}/libraries/Time
-       unzip ../../../Time-1.0.5.zip
-       cd ../..
-       patch -p5 < ../iotivity/tools/arduino/patches/arduino-1.0.5_linux.patch
-       popd
-fi
+    echo "Set up Android NDK"
+    export ANDROID_SDK=${PWD}/iotivity/tools/android-sdk-linux
+    if [ ! -d ${ANDROID_SDK} ]
+    then
+        pushd iotivity/tools
+        cd ..
+        wget_if_not_exists "android-sdk_r24.0.2-linux.tgz" http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
+        tar -xzf http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
+        popd
+    fi
+}
 
-# Arduino Due
-echo "Set up Arduino Due"
-ARDUINO_DUE_DIR=${PWD}/arduino-1.5.7
-if [ ! -d ${ARDUINO_DUE_DIR} ]
-then
-       wget_if_not_exists "download.php?f=%2Farduino-1.5.7-linux64.tgz" http://arduino.cc/download.php?f=/arduino-1.5.7-linux64.tgz
-       tar -xzf "download.php?f=%2Farduino-1.5.7-linux64.tgz"
-       wget_if_not_exists "Time-1.5.7.zip" http://www.pjrc.com/teensy/arduino_libraries/Time.zip
-       mv Time.zip Time-1.5.7.zip
-       mkdir -p ${ARDUINO_DUE_DIR}/libraries/Time
-       pushd ${ARDUINO_DUE_DIR}/libraries/Time
-       unzip ../../../Time-1.5.7.zip
-       cd ../..
-       patch -p5 < ../iotivity/tools/arduino/patches/arduino-1.5.7_linux.patch
-       popd
-fi
+#######################################
+# Arduino Dependencies (optional)
+#######################################
+function arduino_setup {
+    # Arduino Mega
+    echo "Set up Arduino Mega"
+    export ARDUINO_MEGA_DIR=${PWD}/arduino-1.0.5
+    if [ ! -d ${ARDUINO_MEGA_DIR} ]
+    then
+        wget_if_not_exists "arduino-1.0.5-linux64.tgz" http://arduino.googlecode.com/files/arduino-1.0.5-linux64.tgz
+        tar -xzf arduino-1.0.5-linux64.tgz
+        wget_if_not_exists "Time-1.0.5.zip" http://playground.arduino.cc/uploads/Code/Time.zip
+        mv Time.zip Time-1.0.5.zip
+        mkdir -p ${ARDUINO_MEGA_DIR}/libraries/Time
+        pushd ${ARDUINO_MEGA_DIR}/libraries/Time
+        unzip ../../../Time-1.0.5.zip
+        cd ../..
+        patch -p5 < ../iotivity/tools/arduino/patches/arduino-1.0.5_linux.patch
+        popd
+    fi
+
+    # Arduino Due
+    echo "Set up Arduino Due"
+    ARDUINO_DUE_DIR=${PWD}/arduino-1.5.7
+    if [ ! -d ${ARDUINO_DUE_DIR} ]
+    then
+        wget_if_not_exists "download.php?f=%2Farduino-1.5.7-linux64.tgz" http://arduino.cc/download.php?f=/arduino-1.5.7-linux64.tgz
+        tar -xzf "download.php?f=%2Farduino-1.5.7-linux64.tgz"
+        wget_if_not_exists "Time-1.5.7.zip" http://www.pjrc.com/teensy/arduino_libraries/Time.zip
+        mv Time.zip Time-1.5.7.zip
+        mkdir -p ${ARDUINO_DUE_DIR}/libraries/Time
+        pushd ${ARDUINO_DUE_DIR}/libraries/Time
+        unzip ../../../Time-1.5.7.zip
+        cd ../..
+        patch -p5 < ../iotivity/tools/arduino/patches/arduino-1.5.7_linux.patch
+        popd
+    fi
 
-# local.properties
-cat > iotivity/resource/csdk/local.properties <<EOF
-ifeq (\$(PLATFORM), arduinomega)
-       #Location of arduino sdk for Arduino Mega
-       ARDUINO_DIR := ${ARDUINO_MEGA_DIR}
-       ARDUINO_TOOLS_DIR := \$(ARDUINO_DIR)/hardware/tools/avr/bin
-else
-       #Location of arduino sdk for Arduino Due
-       ARDUINO_DIR := ${ARDUINO_DUE_DIR}
-       ARDUINO_TOOLS_DIR := \$(ARDUINO_DIR)/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin
-endif
+    # local.properties
+    cat > iotivity/resource/csdk/local.properties <<-EOF
+    ifeq (\$(PLATFORM), arduinomega)
+        #Location of arduino sdk for Arduino Mega
+        ARDUINO_DIR := ${ARDUINO_MEGA_DIR}
+        ARDUINO_TOOLS_DIR := \$(ARDUINO_DIR)/hardware/tools/avr/bin
+    else
+        #Location of arduino sdk for Arduino Due
+        ARDUINO_DIR := ${ARDUINO_DUE_DIR}
+        ARDUINO_TOOLS_DIR := \$(ARDUINO_DIR)/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin
+    endif
 EOF
+}
+
+# TODO: switch these off cmdline args
+#android_setup
+#arduino_setup