From 17f0ef63b9f386cd8402f78af7bd4f1a930b391f Mon Sep 17 00:00:00 2001 From: Josh Curl Date: Sun, 28 Aug 2016 08:46:03 -0700 Subject: [PATCH 1/3] Create installer image build artifact --- scripts/package-installer | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/package-installer b/scripts/package-installer index be0cdb49..69605345 100755 --- a/scripts/package-installer +++ b/scripts/package-installer @@ -16,5 +16,6 @@ cp ./dist/artifacts/{initrd,vmlinuz} ./scripts/installer/build trap "rm -rf ./scripts/installer/build" EXIT docker build -t ${OS_REPO}/os:${VERSION}${SUFFIX} --build-arg VERSION=${VERSION} -f $DOCKERFILE ./scripts/installer +docker save -o dist/artifacts/installer.tar ${OS_REPO}/os:${VERSION}${SUFFIX} echo ${OS_REPO}/os:${VERSION}${SUFFIX} > dist/images echo Built ${OS_REPO}/os:${VERSION}${SUFFIX} From b536e6ea3506273acff09abcdb9c3f55c03f70ea Mon Sep 17 00:00:00 2001 From: Josh Curl Date: Sun, 28 Aug 2016 08:57:52 -0700 Subject: [PATCH 2/3] Add functionality for installing and running a test image --- scripts/create-installed | 57 +++++++++++++++++++ scripts/run | 117 +++++++++++++++++---------------------- scripts/run-common | 49 ++++++++++++++++ 3 files changed, 156 insertions(+), 67 deletions(-) create mode 100755 scripts/create-installed create mode 100755 scripts/run-common diff --git a/scripts/create-installed b/scripts/create-installed new file mode 100755 index 00000000..9390c47b --- /dev/null +++ b/scripts/create-installed @@ -0,0 +1,57 @@ +#!/bin/bash +set -e + +cd $(dirname $0)/.. + +source ./scripts/run-common + +INSTALLER=${BASE}/dist/artifacts/installer.tar + +if [ ! -e ${INITRD} ]; then + cp bin/ros ${INITRD_SRC}/usr/bin/ros + ./scripts/hash-initrd + pushd ${INITRD_SRC} >/dev/null + find . | cpio -H newc -o | gzip -1 > ${INITRD} + popd >/dev/null +fi + +mkdir -p {dist,build/openstack/latest} + +cat > build/openstack/latest/user_data << EOF +#!/bin/bash +set -e + +trap "poweroff" EXIT + +sleep 5 + +mount -t 9p -o trans=virtio,version=9p2000.L config-2 /mnt + +touch log +openvt -s -- tail -f log & +cat /mnt/installer.tar | system-docker load +ros install -d /dev/vda -f --no-reboot >log 2>&1 + +touch /mnt/success +EOF + +rm -f build/{success,hd.img} +qemu-img create -f qcow2 build/hd.img 8G +cp ${INSTALLER} build/installer.tar +qemu-system-${QEMUARCH} -serial stdio \ + -enable-kvm \ + -drive if=virtio,file=build/hd.img \ + -kernel ${KERNEL} \ + -initrd ${INITRD} \ + -m 2048 \ + -append "${DEFAULT_KERNEL_ARGS}" \ + -smp 1 \ + -nographic \ + -display none \ + -fsdev local,id=conf,security_model=none,path=$(pwd)/build \ + -device virtio-9p-pci,fsdev=conf,mount_tag=config-2 + +[ -f build/success ] + +mkdir -p state +cp build/hd.img state/hd.img diff --git a/scripts/run b/scripts/run index 1cc65ed5..9ce13714 100755 --- a/scripts/run +++ b/scripts/run @@ -4,47 +4,7 @@ set -e cd $(dirname $0)/.. -HOST_ARCH=${HOST_ARCH:-amd64} -ARCH=${ARCH:-amd64} - -declare -A qemuarch=( ["amd64"]="x86_64" ["arm"]="arm" ["arm64"]="aarch64" ) -declare -A ttycons=( ["amd64"]="ttyS0" ["arm"]="ttyAMA0" ["arm64"]="ttyAMA0" ) -declare -A machine=( ["amd64"]="" ["arm"]="-M virt" ["arm64"]="-M virt" ) -declare -A cpu=( ["amd64"]="" ["arm"]="-cpu cortex-a8" ["arm64"]="-cpu cortex-a57" ) -declare -A network=( - ["amd64"]="-net nic,vlan=0,model=virtio -net user,vlan=0,hostfwd=tcp::2222-:22,hostname=rancher-dev" - ["arm"]="-netdev user,id=unet,hostfwd=tcp::2222-:22,hostname=rancher-dev -device virtio-net-device,netdev=unet" -) -network["arm64"]=${network["arm"]} - -hd_amd64() { - echo "-drive if=virtio,file=$1" -} -hd_arm() { - echo "-drive if=none,id=hd0,file=$1 -device virtio-blk-device,drive=hd0" -} -declare -A hd=( ["amd64"]="hd_amd64" ["arm"]="hd_arm" ["arm64"]="hd_arm" ) - -cd_amd64() { - echo "-hdc $1" -} -cd_arm() { - echo "-drive if=none,id=cd0,file=$1 -device virtio-blk-device,drive=cd0" -} -declare -A cd=( ["amd64"]="cd_amd64" ["arm"]="cd_arm" ["arm64"]="cd_arm" ) - -BUILD=build -BASE=$(pwd) -UNAME=$(uname) - -KERNEL=${BASE}/dist/artifacts/vmlinuz -INITRD_SRC=${BASE}/build/initrd -INITRD=${BASE}/build/initrd.tmp - -QEMU=1 -FORMAT=1 -RM_USR=1 -REBUILD=1 +source ./scripts/run-common while [ "$#" -gt 0 ]; do case $1 in @@ -93,6 +53,10 @@ while [ "$#" -gt 0 ]; do --fresh) FRESH=1 ;; + --installed) + ./scripts/create-installed + INSTALLED=1 + ;; *) break ;; @@ -100,9 +64,6 @@ while [ "$#" -gt 0 ]; do shift 1 done -QEMUARCH=${qemuarch["${ARCH}"]} -TTYCONS=${ttycons["${ARCH}"]} - if [ "$QEMU" == "1" ] && ! which qemu-system-${QEMUARCH}; then QEMU=0 fi @@ -120,7 +81,7 @@ if [ "$REBUILD" == "1" ] || [ ! -e ${INITRD} ]; then popd >/dev/null fi -KERNEL_ARGS="quiet rancher.password=rancher console=${TTYCONS} rancher.autologin=${TTYCONS} ${QEMU_APPEND}" +KERNEL_ARGS="${DEFAULT_KERNEL_ARGS} ${QEMU_APPEND}" if [ "$FORMAT" == "1" ]; then KERNEL_ARGS="${KERNEL_ARGS} rancher.state.dev=LABEL=RANCHER_STATE rancher.state.formatzero=true rancher.state.autoformat=[/dev/sda,/dev/vda]" fi @@ -168,29 +129,51 @@ if [ "$QEMU" == "1" ]; then KVM_ENABLE="-enable-kvm" CPU="-cpu host" fi - set -x HOME=${HOME:-/} - exec qemu-system-${QEMUARCH} -serial stdio \ - -rtc base=utc,clock=host \ - ${KVM_ENABLE} \ - ${CPU} \ - ${machine["$ARCH"]} \ - -kernel ${KERNEL} \ - -initrd ${INITRD} \ - -m 2048 \ - ${network["$ARCH"]} \ - $(eval "${hd["$ARCH"]} ${HD}") \ - ${SECOND_DRIVE_ENABLE} \ - -smp 1 \ - -append "${KERNEL_ARGS}" \ - -nographic \ - -display none \ - -fsdev local,security_model=passthrough,readonly,id=fsdev0,path=${CCROOT} \ - -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2 \ - -fsdev local,security_model=none,id=fsdev1,path=${HOME} \ - -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=home \ - ${QEMU_ARGS} \ - "${@}" + if [ "$INSTALLED" == "1" ]; then + set -x + exec qemu-system-${QEMUARCH} -serial stdio \ + -rtc base=utc,clock=host \ + ${KVM_ENABLE} \ + ${CPU} \ + ${machine["$ARCH"]} \ + -m 2048 \ + ${network["$ARCH"]} \ + $(eval "${hd["$ARCH"]} ${HD}") \ + ${SECOND_DRIVE_ENABLE} \ + -smp 1 \ + -nographic \ + -display none \ + -fsdev local,security_model=passthrough,readonly,id=fsdev0,path=${CCROOT} \ + -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2 \ + -fsdev local,security_model=none,id=fsdev1,path=${HOME} \ + -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=home \ + ${QEMU_ARGS} \ + "${@}" + else + set -x + exec qemu-system-${QEMUARCH} -serial stdio \ + -rtc base=utc,clock=host \ + ${KVM_ENABLE} \ + ${CPU} \ + ${machine["$ARCH"]} \ + -kernel ${KERNEL} \ + -initrd ${INITRD} \ + -m 2048 \ + ${network["$ARCH"]} \ + $(eval "${hd["$ARCH"]} ${HD}") \ + ${SECOND_DRIVE_ENABLE} \ + -smp 1 \ + -append "${KERNEL_ARGS}" \ + -nographic \ + -display none \ + -fsdev local,security_model=passthrough,readonly,id=fsdev0,path=${CCROOT} \ + -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2 \ + -fsdev local,security_model=none,id=fsdev1,path=${HOME} \ + -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=home \ + ${QEMU_ARGS} \ + "${@}" + fi elif [ "$QIND" == "1" ]; then diff --git a/scripts/run-common b/scripts/run-common new file mode 100755 index 00000000..8f75097e --- /dev/null +++ b/scripts/run-common @@ -0,0 +1,49 @@ +#!/bin/bash +set -e + +HOST_ARCH=${HOST_ARCH:-amd64} +ARCH=${ARCH:-amd64} + +declare -A qemuarch=( ["amd64"]="x86_64" ["arm"]="arm" ["arm64"]="aarch64" ) +declare -A ttycons=( ["amd64"]="ttyS0" ["arm"]="ttyAMA0" ["arm64"]="ttyAMA0" ) +declare -A machine=( ["amd64"]="" ["arm"]="-M virt" ["arm64"]="-M virt" ) +declare -A cpu=( ["amd64"]="" ["arm"]="-cpu cortex-a8" ["arm64"]="-cpu cortex-a57" ) +declare -A network=( + ["amd64"]="-net nic,vlan=0,model=virtio -net user,vlan=0,hostfwd=tcp::2222-:22,hostname=rancher-dev" + ["arm"]="-netdev user,id=unet,hostfwd=tcp::2222-:22,hostname=rancher-dev -device virtio-net-device,netdev=unet" +) +network["arm64"]=${network["arm"]} + +hd_amd64() { + echo "-drive if=virtio,file=$1" +} +hd_arm() { + echo "-drive if=none,id=hd0,file=$1 -device virtio-blk-device,drive=hd0" +} +declare -A hd=( ["amd64"]="hd_amd64" ["arm"]="hd_arm" ["arm64"]="hd_arm" ) + +cd_amd64() { + echo "-hdc $1" +} +cd_arm() { + echo "-drive if=none,id=cd0,file=$1 -device virtio-blk-device,drive=cd0" +} +declare -A cd=( ["amd64"]="cd_amd64" ["arm"]="cd_arm" ["arm64"]="cd_arm" ) + +BUILD=build +BASE=$(pwd) +UNAME=$(uname) + +KERNEL=${BASE}/dist/artifacts/vmlinuz +INITRD_SRC=${BASE}/build/initrd +INITRD=${BASE}/build/initrd.tmp + +QEMU=1 +FORMAT=1 +RM_USR=1 +REBUILD=1 + +QEMUARCH=${qemuarch["${ARCH}"]} +TTYCONS=${ttycons["${ARCH}"]} + +DEFAULT_KERNEL_ARGS="quiet rancher.password=rancher console=${TTYCONS} rancher.autologin=${TTYCONS}" From 8777e477b821612dcc22eaef969b2c893510e741 Mon Sep 17 00:00:00 2001 From: Josh Curl Date: Sun, 28 Aug 2016 08:58:17 -0700 Subject: [PATCH 3/3] Add upgrade tests --- scripts/integration-test | 2 +- tests/common_test.go | 18 +++++++++++++++++- tests/install_test.go | 18 ------------------ tests/upgrade_test.go | 26 ++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 20 deletions(-) delete mode 100644 tests/install_test.go create mode 100644 tests/upgrade_test.go diff --git a/scripts/integration-test b/scripts/integration-test index 356e85a7..c001c5cd 100755 --- a/scripts/integration-test +++ b/scripts/integration-test @@ -14,4 +14,4 @@ if [ ! -e ../dist/artifacts/initrd ]; then ../scripts/dev fi -go test -timeout 20m +go test -timeout 30m diff --git a/tests/common_test.go b/tests/common_test.go index 8abfa5e7..f3ee93f4 100644 --- a/tests/common_test.go +++ b/tests/common_test.go @@ -56,7 +56,23 @@ func (s *QemuSuite) RunQemu(additionalArgs ...string) error { } runArgs = append(runArgs, additionalArgs...) - s.qemuCmd = exec.Command(s.runCommand, runArgs...) + return s.runQemu(runArgs...) +} + +func (s *QemuSuite) RunQemuInstalled(additionalArgs ...string) error { + runArgs := []string{ + "--qemu", + "--no-rebuild", + "--no-rm-usr", + "--installed", + } + runArgs = append(runArgs, additionalArgs...) + + return s.runQemu(runArgs...) +} + +func (s *QemuSuite) runQemu(args ...string) error { + s.qemuCmd = exec.Command(s.runCommand, args...) s.qemuCmd.Stdout = os.Stdout s.qemuCmd.Stderr = os.Stderr if err := s.qemuCmd.Start(); err != nil { diff --git a/tests/install_test.go b/tests/install_test.go deleted file mode 100644 index a911a2d3..00000000 --- a/tests/install_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package integration - -import ( - "fmt" - - . "gopkg.in/check.v1" -) - -func (s *QemuSuite) TestInstall(c *C) { - err := s.RunQemu("--no-format") - c.Assert(err, IsNil) - - s.LoadInstallerImage(c) - - s.CheckCall(c, fmt.Sprintf(` -sudo mkfs.ext4 /dev/vda -sudo ros install -f --no-reboot -d /dev/vda -i rancher/os:%s%s`, Version, Suffix)) -} diff --git a/tests/upgrade_test.go b/tests/upgrade_test.go new file mode 100644 index 00000000..d1067c2e --- /dev/null +++ b/tests/upgrade_test.go @@ -0,0 +1,26 @@ +package integration + +import ( + "fmt" + + . "gopkg.in/check.v1" +) + +func (s *QemuSuite) TestUpgrade(c *C) { + err := s.RunQemuInstalled() + c.Assert(err, IsNil) + + s.CheckCall(c, ` +set -ex +sudo ros os upgrade -i rancher/os:v0.5.0 --force --no-reboot`) + + s.Reboot(c) + + s.CheckCall(c, "sudo ros -v | grep v0.5.0") + s.LoadInstallerImage(c) + s.CheckCall(c, fmt.Sprintf("sudo ros os upgrade -i rancher/os:%s%s --force --no-reboot", Version, Suffix)) + + s.Reboot(c) + + s.CheckCall(c, fmt.Sprintf("sudo ros -v | grep %s", Version)) +}