Script to cache Juju LXC images 56/7956/2
authorAdam Israel <adam.israel@canonical.com>
Mon, 16 Sep 2019 14:19:48 +0000 (10:19 -0400)
committermadavi <jm00553988@techmahindra.com>
Tue, 17 Sep 2019 06:21:46 +0000 (08:21 +0200)
This script is needed by Gerrit 7836, in order to cache the LXC images
optimized for faster deployment of charms.

Change-Id: I8e46110d9d3de8eda17b06da8b26adad33cb9124
Signed-off-by: Adam Israel <adam.israel@canonical.com>
installers/update-juju-lxc-images [new file with mode: 0755]

diff --git a/installers/update-juju-lxc-images b/installers/update-juju-lxc-images
new file mode 100755 (executable)
index 0000000..88be127
--- /dev/null
@@ -0,0 +1,136 @@
+#!/bin/bash
+#   Copyright 2019 Canonical Ltd.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+#
+# This script will create lxd images that will be used by the
+# lxd provider in juju 2.1+ It is for use with the lxd provider for local
+# development and preinstalls a common set of production packages.
+#
+# This is important, as between them, basenode and layer-basic install ~111
+# packages, before we even get to any packages installed by your charm.
+#
+# It also installs some helpful development tools, and pre-downloads some
+# commonly used packages.
+#
+# This dramatically speeds up the install hooks for lxd deploys. On my slow
+# laptop, average install hook time went from ~7min down to ~1 minute.
+function usage() {
+    echo -e "usage: update-juju-lxc-images [Optional flags]"
+    echo -e "This script will automatically cache all LTS series by default (trusty, xenial, bionic)"
+    echo -e ""
+    echo -e "Optional flags"
+    echo -e "=================="
+    echo -e "--trusty                                   It will download only the trusty series"
+    echo -e "--xenial                                   It will download only the xenial series"
+    echo -e "--bionic                                   It will download only the bionic series"
+    echo -e ""
+    echo -e "Help flags"
+    echo -e "=================="
+    echo -e "-h | --help                                Print full help."
+    exit
+}
+
+FLAGS=0
+trusty=0
+xenial=0
+bionic=0
+while :; do
+    case $1 in
+        --trusty)
+            FLAGS=1
+            trusty=1
+            ;;
+        --xenial)
+            FLAGS=1
+            xenial=1
+            ;;
+        --bionic)
+            FLAGS=1
+            bionic=1
+            ;;
+        -h|--help)
+            usage
+            ;;
+        *)
+             break
+    esac
+    shift
+done
+
+
+set -eux
+
+# The basic charm layer also installs all the things. 47 packages.
+LAYER_BASIC="gcc build-essential python3-pip python3-setuptools python3-yaml"
+
+# the basic layer also installs virtualenv, but the name changed in xenial.
+TRUSTY_PACKAGES="python-virtualenv"
+XENIAL_PACKAGES="virtualenv"
+BIONIC_PACKAGES="virtualenv"
+
+# Predownload common packages used by your charms in development
+DOWNLOAD_PACKAGES=
+
+CLOUD_INIT_PACKAGES="curl cpu-checker bridge-utils cloud-utils tmux ubuntu-fan"
+
+PACKAGES="$LAYER_BASIC $DOWNLOAD_PACKAGES"
+
+JUJU_FULL_VERSION=`juju version` # 2.4.4-bionic-amd64
+JUJU_VERSION=`echo $JUJU_FULL_VERSION | awk -F"-" '{print $1}'`
+OS_VERSION=`echo $JUJU_FULL_VERSION | awk -F"-" '{print $2}'`
+ARCH=`echo $JUJU_FULL_VERSION | awk -F"-" '{print $3}'`
+
+function cache() {
+    series=$1
+    container=juju-${series}-base
+    alias=juju/$series/amd64
+
+    lxc delete $container -f || true
+    lxc launch ubuntu:$series $container
+    sleep 15  # wait for network
+
+    lxc exec $container -- apt-get update -y
+    lxc exec $container -- apt-get upgrade -y
+    lxc exec $container -- apt-get install -y $CLOUD_INIT_PACKAGES $PACKAGES $2
+
+    # Install juju agent
+    echo "Installing Juju agent $JUJU_FULL_VERSION"
+    # TODO: verify if the version exists
+
+    lxc exec $container -- mkdir -p /var/lib/juju/tools/$JUJU_FULL_VERSION/
+
+    lxc exec $container -- curl -sS --connect-timeout 20 --noproxy \* --insecure -o /var/lib/juju/tools/$JUJU_FULL_VERSION/tools.tar.gz  https://streams.canonical.com/juju/tools/agent/$JUJU_VERSION/juju-$JUJU_VERSION-ubuntu-$ARCH.tgz
+
+    lxc exec $container -- tar zxf /var/lib/juju/tools/$JUJU_FULL_VERSION/tools.tar.gz -C /var/lib/juju/tools/$JUJU_FULL_VERSION || true
+
+    # Cache pip packages so installation into venv is faster?
+    # pip3 download --cache-dir ~/.cache/pip charmhelpers
+
+    lxc stop $container
+
+    lxc image delete $alias || true
+    lxc publish $container --alias $alias description="$series juju dev image ($(date +%Y%m%d))"
+
+    lxc delete $container -f || true
+}
+
+# Enable caching of the serie(s) you're developing for.
+if [ $FLAGS == 0 ]; then
+    cache xenial "$XENIAL_PACKAGES"
+else
+    [ $trusty == 1 ] && cache trusty "$TRUSTY_PACKAGES"
+    [ $xenial == 1 ] && cache xenial "$XENIAL_PACKAGES"
+    [ $bionic == 1 ] && cache bionic "$BIONIC_PACKAGES"
+fi