1
0
mirror of https://github.com/rancher/os.git synced 2025-06-26 15:01:34 +00:00
os/tests/common_test.go
Sven Dowideit 83e6696fd3 Improve and test install and upgrade robustness
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2017-01-30 14:48:43 +10:00

199 lines
4.4 KiB
Go
Executable File

package integration
import (
"fmt"
"os"
"os/exec"
"runtime"
"testing"
"time"
. "gopkg.in/check.v1"
)
func Test(t *testing.T) { TestingT(t) }
func init() {
Suite(&QemuSuite{
runCommand: "../scripts/run",
sshCommand: "../scripts/ssh",
qemuCmd: nil,
})
}
var (
BusyboxImage = map[string]string{
"amd64": "busybox",
"arm": "armhf/busybox",
"arm64": "aarch64/busybox",
}[runtime.GOARCH]
NginxImage = map[string]string{
"amd64": "nginx",
"arm": "armhfbuild/nginx",
"arm64": "armhfbuild/nginx",
}[runtime.GOARCH]
Version = os.Getenv("VERSION")
Suffix = os.Getenv("SUFFIX")
)
type QemuSuite struct {
runCommand string
sshCommand string
qemuCmd *exec.Cmd
}
func (s *QemuSuite) TearDownTest(c *C) {
if s.qemuCmd != nil {
s.Stop(c)
}
}
// RunQemuWith requires user to specify all the `scripts/run` arguments
func (s *QemuSuite) RunQemuWith(c *C, additionalArgs ...string) error {
err := s.runQemu(c, additionalArgs...)
c.Assert(err, IsNil)
return err
}
func (s *QemuSuite) RunQemu(c *C, additionalArgs ...string) error {
runArgs := []string{
"--qemu",
"--no-rebuild",
"--no-rm-usr",
"--fresh",
}
runArgs = append(runArgs, additionalArgs...)
err := s.RunQemuWith(c, runArgs...)
c.Assert(err, IsNil)
return err
}
func (s *QemuSuite) RunQemuInstalled(c *C, additionalArgs ...string) error {
runArgs := []string{
"--fresh",
}
runArgs = append(runArgs, additionalArgs...)
err := s.RunQemu(c, runArgs...)
c.Assert(err, IsNil)
return err
}
func (s *QemuSuite) runQemu(c *C, args ...string) error {
c.Assert(s.qemuCmd, IsNil) // can't run 2 qemu's at once (yet)
s.qemuCmd = exec.Command(s.runCommand, args...)
//s.qemuCmd.Stdout = os.Stdout
s.qemuCmd.Stderr = os.Stderr
if err := s.qemuCmd.Start(); err != nil {
return err
}
fmt.Printf("--- %s: starting qemu %s, %v\n", c.TestName(), s.runCommand, args)
return s.WaitForSSH()
}
func (s *QemuSuite) WaitForSSH() error {
sshArgs := []string{
"--qemu",
"true",
}
var err error
for i := 0; i < 100; i++ {
cmd := exec.Command(s.sshCommand, sshArgs...)
if err = cmd.Run(); err == nil {
break
}
time.Sleep(500 * time.Millisecond)
}
if err != nil {
return fmt.Errorf("Failed to connect to SSH: %v", err)
}
sshArgs = []string{
"--qemu",
"docker",
"version",
">/dev/null",
"2>&1",
}
for i := 0; i < 20; i++ {
cmd := exec.Command(s.sshCommand, sshArgs...)
if err = cmd.Run(); err == nil {
return nil
}
time.Sleep(500 * time.Millisecond)
}
return fmt.Errorf("Failed to check Docker version: %v", err)
}
func (s *QemuSuite) MakeCall(additionalArgs ...string) (string, error) {
sshArgs := []string{
"--qemu",
}
sshArgs = append(sshArgs, additionalArgs...)
cmd := exec.Command(s.sshCommand, sshArgs...)
cmd.Stderr = os.Stderr
out, err := cmd.Output()
str := string(out)
fmt.Println(str)
return str, err
}
func (s *QemuSuite) CheckCall(c *C, additionalArgs ...string) {
_, err := s.MakeCall(additionalArgs...)
c.Assert(err, IsNil)
}
func (s *QemuSuite) CheckOutput(c *C, result string, check Checker, additionalArgs ...string) string {
out, err := s.MakeCall(additionalArgs...)
c.Assert(err, IsNil)
c.Assert(out, check, result)
return out
}
func (s *QemuSuite) Stop(c *C) {
//s.MakeCall("sudo halt")
//time.Sleep(2000 * time.Millisecond)
//c.Assert(s.WaitForSSH(), IsNil)
//fmt.Println("%s: stopping qemu", c.TestName())
c.Assert(s.qemuCmd.Process.Kill(), IsNil)
s.qemuCmd.Process.Wait()
//time.Sleep(time.Millisecond * 1000)
s.qemuCmd = nil
fmt.Printf("--- %s: qemu stopped", c.TestName())
}
func (s *QemuSuite) Reboot(c *C) {
fmt.Printf("--- %s: qemu reboot", c.TestName())
s.MakeCall("sudo reboot")
time.Sleep(3000 * time.Millisecond)
c.Assert(s.WaitForSSH(), IsNil)
}
func (s *QemuSuite) LoadInstallerImage(c *C) {
cmd := exec.Command("sh", "-c", fmt.Sprintf("docker save rancher/os:%s%s | ../scripts/ssh --qemu sudo system-docker load", Version, Suffix))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
c.Assert(cmd.Run(), IsNil)
}
func (s *QemuSuite) PullAndLoadInstallerImage(c *C, tag string) {
cmd := exec.Command("sh", "-c", fmt.Sprintf("docker pull rancher/os:%s", tag))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
c.Assert(cmd.Run(), IsNil)
cmd = exec.Command("sh", "-c", fmt.Sprintf("docker save rancher/os:%s | ../scripts/ssh --qemu sudo system-docker load", tag))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
c.Assert(cmd.Run(), IsNil)
}