From f5230f12995c407b8450122c9d2fc53903b641e0 Mon Sep 17 00:00:00 2001 From: Sven Dowideit Date: Thu, 15 Dec 2016 23:15:49 +1000 Subject: [PATCH] add integration tests for iso boot, install and then boot from disk. Signed-off-by: Sven Dowideit --- cmd/control/install.go | 39 +++++++++++----- scripts/run | 12 ++++- tests/installer_test.go | 98 +++++++++++++++++++++++++++++------------ util/cutil.go | 2 +- 4 files changed, 107 insertions(+), 44 deletions(-) diff --git a/cmd/control/install.go b/cmd/control/install.go index a959f229..06dcda8e 100755 --- a/cmd/control/install.go +++ b/cmd/control/install.go @@ -236,7 +236,7 @@ func runInstall(image, installType, cloudConfig, device, kappend string, force, log.InitLogger() log.SetLevel(log.InfoLevel) - log.Infof("running installation") + log.Debugf("running installation") if installType == "generic" || installType == "syslinux" || @@ -245,6 +245,7 @@ func runInstall(image, installType, cloudConfig, device, kappend string, force, if installType == "gptsyslinux" { diskType = "gpt" } + log.Debugf("running setDiskpartitions") err := setDiskpartitions(device, diskType) if err != nil { log.Errorf("error setDiskpartitions %s", err) @@ -254,16 +255,18 @@ func runInstall(image, installType, cloudConfig, device, kappend string, force, device = "/host" + device } + log.Debugf("running mountiso?") if mountiso { // TODO: I hope to remove this from here later. if err := mountBootIso(); err != nil { + log.Errorf("error mountBootIso %s", err) return err } } err := layDownOS(image, installType, cloudConfig, device, kappend) if err != nil { - log.Infof("error layDownOS %s", err) + log.Errorf("error layDownOS %s", err) return err } @@ -368,7 +371,7 @@ func layDownOS(image, installType, cloudConfig, device, kappend string) error { var err error bootDir, err = formatAndMount(baseName, bootDir, device, partition) if err != nil { - log.Errorf("%s", err) + log.Errorf("formatAndMount %s", err) return err } //log.Infof("installGrub") @@ -377,13 +380,13 @@ func layDownOS(image, installType, cloudConfig, device, kappend string) error { err = installSyslinux(device, baseName, bootDir, diskType) if err != nil { - log.Errorf("%s", err) + log.Errorf("installSyslinux %s", err) return err } log.Debugf("seedData") err = seedData(baseName, cloudConfig, FILES) if err != nil { - log.Errorf("%s", err) + log.Errorf("seedData %s", err) return err } log.Debugf("seedData done") @@ -572,11 +575,17 @@ func setDiskpartitions(device, diskType string) error { log.Errorf("%s", err) return err } + + // TODO: work out where to do this - it is a so-so place for it + if err := os.Symlink("/usr/bin/ros", "/usr/bin/system-docker"); err != nil { + log.Errorf("ln error %s", err) + } + cmd := exec.Command("system-docker", "ps", "-q") var outb bytes.Buffer cmd.Stdout = &outb if err := cmd.Run(); err != nil { - log.Printf("%s", err) + log.Printf("ps error: %s", err) return err } for _, image := range strings.Split(outb.String(), "\n") { @@ -586,15 +595,17 @@ func setDiskpartitions(device, diskType string) error { r, w := io.Pipe() go func() { // TODO: consider a timeout + // TODO:some of these containers don't have cat / shell cmd := exec.Command("system-docker", "exec", image, "cat /proc/mount") cmd.Stdout = w if err := cmd.Run(); err != nil { - log.Errorf("%s", err) + log.Debugf("%s cat %s", image, err) } + w.Close() }() if partitionMounted(device, r) { err = fmt.Errorf("partition %s mounted in %s, cannot repartition", device, image) - log.Errorf("%s", err) + log.Errorf("k? %s", err) return err } } @@ -604,14 +615,14 @@ func setDiskpartitions(device, diskType string) error { cmd := exec.Command("dd", "if=/dev/zero", "of="+device, "bs=512", "count=2048") //cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr if err := cmd.Run(); err != nil { - log.Errorf("%s", err) + log.Errorf("dd error %s", err) return err } log.Debugf("running partprobe") cmd = exec.Command("partprobe", device) //cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr if err := cmd.Run(); err != nil { - log.Errorf("%s", err) + log.Errorf("partprobe error %s", err) return err } @@ -626,7 +637,7 @@ func setDiskpartitions(device, diskType string) error { "set 1 "+bootflag+" on") cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr if err := cmd.Run(); err != nil { - log.Errorf("%s", err) + log.Errorf("parted: %s", err) return err } @@ -645,7 +656,7 @@ func partitionMounted(device string, file io.Reader) bool { } } if err := scanner.Err(); err != nil { - log.Errorf("%s", err) + log.Errorf("scanner %s", err) return false } } @@ -691,6 +702,7 @@ func mountdevice(baseName, bootDir, partition string, raw bool) (string, error) rootfs = string(out) } } + rootfs = strings.TrimSpace(rootfs) log.Debugf("util.Mount %s, %s", rootfs, baseName) // return bootDir, util.Mount(rootfs, baseName, "", "") @@ -707,14 +719,17 @@ func formatAndMount(baseName, bootDir, device, partition string) (string, error) err := formatdevice(device, partition) if err != nil { + log.Errorf("formatdevice %s", err) return bootDir, err } bootDir, err = mountdevice(baseName, bootDir, partition, false) if err != nil { + log.Errorf("mountdevice %s", err) return bootDir, err } err = createbootDirs(baseName, bootDir) if err != nil { + log.Errorf("createbootDirs %s", err) return bootDir, err } return bootDir, nil diff --git a/scripts/run b/scripts/run index 7680542b..5452ca5c 100755 --- a/scripts/run +++ b/scripts/run @@ -65,6 +65,9 @@ while [ "$#" -gt 0 ]; do --fresh) FRESH=1 ;; + --nodisplay) + NODISPLAY=1 + ;; --installed) INSTALLED=1 ;; @@ -105,7 +108,7 @@ fi if [ "$KVM" == "" ] && [ -c /dev/kvm ] && [ -r /dev/kvm ] && [ -w /dev/kvm ]; then KVM=1 fi - +set -x if [ "$QEMU" == "1" ] || [ "$BOOT_ISO" == "1" ] || [ "$BOOT_HD" == "1" ]; then HD=${BASE}/state/hd.img HD2=${BASE}/state/hd2.img @@ -192,9 +195,14 @@ elif [ "$BOOT_ISO" == "1" ] || -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=home " echo "----- $ISO_OPTS" fi + if [ "$NODISPLAY" == "1" ]; then + DISPLAY_OPTS="-nographic -serial stdio -display none" + else + DISPLAY_OPTS="-curses" + fi set -x exec qemu-system-${QEMUARCH} \ - -curses \ + ${DISPLAY_OPTS} \ -rtc base=utc,clock=host \ ${KVM_ENABLE} \ ${CPU} \ diff --git a/tests/installer_test.go b/tests/installer_test.go index c27758ed..7a3c330e 100644 --- a/tests/installer_test.go +++ b/tests/installer_test.go @@ -1,29 +1,69 @@ -package integration - -import . "gopkg.in/check.v1" - -func (s *QemuSuite) TestInstall(c *C) { - // ./scripts/run --no-format --append "rancher.debug=true" --iso --fresh - runArgs := []string{ - "--iso", - "--fresh", - "--no-format", - "--append", "rancher.debug=true", - } - s.RunQemuWith(c, runArgs...) - - s.CheckCall(c, ` -set -ex -sudo ros install --force --no-reboot --device /dev/vda`) - - s.Stop(c) - - // ./scripts/run --no-format --append "rancher.debug=true" - runArgs = []string{ - "--no-format", - "--append", "rancher.debug=true", - } - s.RunQemuWith(c, runArgs...) - - s.CheckCall(c, "sudo ros -v") -} +package integration + +import . "gopkg.in/check.v1" + +// TODO: separate out into different tests - there's something that makes one pass and one fail. + +//func (s *QemuSuite) TestInstallMsDosMbr(c *C) { +func (s *QemuSuite) TestInstall(c *C) { + // ./scripts/run --no-format --append "rancher.debug=true" --iso --fresh + runArgs := []string{ + "--iso", + "--fresh", + "--nodisplay", + } + { + s.RunQemuWith(c, runArgs...) + defer s.Stop(c) + + s.CheckCall(c, ` +echo "---------------------------------- generic" +set -ex +sudo parted /dev/vda print +echo "ssh_authorized_keys:" > config.yml +echo " - $(cat /home/rancher/.ssh/authorized_keys)" >> config.yml +sudo ros install --force --no-reboot --device /dev/vda -c config.yml`) + } + + // ./scripts/run --no-format --append "rancher.debug=true" + runArgs = []string{ + "--boothd", + "--nodisplay", + } + s.RunQemuWith(c, runArgs...) + defer s.Stop(c) + + s.CheckCall(c, "sudo ros -v") + //} + + //func (s *QemuSuite) TestInstallGptMbr(c *C) { + // ./scripts/run --no-format --append "rancher.debug=true" --iso --fresh + runArgs = []string{ + "--iso", + "--fresh", + "--nodisplay", + } + { + s.RunQemuWith(c, runArgs...) + defer s.Stop(c) + + s.CheckCall(c, ` +echo "---------------------------------- gptsyslinux" +set -ex +sudo parted /dev/vda print +echo "ssh_authorized_keys:" > config.yml +echo " - $(cat /home/rancher/.ssh/authorized_keys)" >> config.yml +sudo ros install --force --no-reboot --device /dev/vda -t gptsyslinux -c config.yml`) + } + + // ./scripts/run --no-format --append "rancher.debug=true" + runArgs = []string{ + "--boothd", + "--nodisplay", + } + s.RunQemuWith(c, runArgs...) + defer s.Stop(c) + + s.CheckCall(c, "sudo ros -v") + // TEST parted output? (gpt non-uefi == legacy_boot) +} diff --git a/util/cutil.go b/util/cutil.go index 5482e956..afea273b 100755 --- a/util/cutil.go +++ b/util/cutil.go @@ -15,7 +15,7 @@ import ( "errors" ) -// Sadly, this isn't reliable - blkid -L LABEL works more often :( +// ResolveDevice this isn't reliable - blkid -L LABEL works more often :( func ResolveDevice(spec string) string { cSpec := C.CString(spec) defer C.free(unsafe.Pointer(cSpec))