From be6fef02544d9bc31321b2a21d039e261dc02bd8 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 19 Sep 2013 20:32:11 +0200 Subject: [PATCH] Tests: Clean up any old devmapper leftovers before starting tests --- devmapper/devmapper.go | 17 +++++++++++++++++ runtime_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/devmapper/devmapper.go b/devmapper/devmapper.go index 75742628a2..8458cb3ed9 100644 --- a/devmapper/devmapper.go +++ b/devmapper/devmapper.go @@ -347,3 +347,20 @@ func UdevWait(cookie uint32) error { func LogInitVerbose(level int) { C.dm_log_init_verbose(C.int(level)) } + +// Useful helper for cleanup +func RemoveDevice(name string) error { + task := TaskCreate(DeviceRemove) + if task == nil { + return fmt.Errorf("Can't create task of type DeviceRemove") + } + err := task.SetName(name) + if err != nil { + return fmt.Errorf("Can't set task name %s", name) + } + err = task.Run() + if err != nil { + return fmt.Errorf("Error running removeDevice") + } + return nil +} diff --git a/runtime_test.go b/runtime_test.go index 684ca005cd..bcbdf3f384 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -6,6 +6,7 @@ import ( "github.com/dotcloud/docker/utils" "github.com/dotcloud/docker/devmapper" "io" + "io/ioutil" "log" "net" "os" @@ -84,6 +85,32 @@ func layerArchive(tarfile string) (io.Reader, error) { return f, nil } +// Remove any leftover device mapper devices from earlier runs of the unit tests +func cleanupDevMapper() { + infos, _ := ioutil.ReadDir("/dev/mapper") + if infos != nil { + hasPool := false + for _, info := range infos { + name := info.Name() + if strings.HasPrefix(name, "docker-unit-tests-devices-") { + if name == "docker-unit-tests-devices-pool" { + hasPool = true + } else { + if err := devmapper.RemoveDevice(name); err != nil { + panic(fmt.Errorf("Unable to remove existing device %s: %s", name, err)) + } + } + } + // We need to remove the pool last as the other devices block it + if hasPool { + if err := devmapper.RemoveDevice("docker-unit-tests-devices-pool"); err != nil { + panic(fmt.Errorf("Unable to remove existing device docker-unit-tests-devices-pool: %s", name, err)) + } + } + } + } +} + func init() { os.Setenv("TEST", "1") @@ -99,6 +126,8 @@ func init() { NetworkBridgeIface = unitTestNetworkBridge + cleanupDevMapper() + // Always start from a clean set of loopback mounts err := os.RemoveAll(unitTestStoreDevicesBase) if err != nil {