#!/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 image copy ubuntu:$series local: --alias clean-$series 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 image delete clean-$series || 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