diff --git a/runtime_test.go b/runtime_test.go index e4c631daf..dd670f0ce 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -87,42 +87,61 @@ func layerArchive(tarfile string) (io.Reader, error) { } // Remove any leftover device mapper devices from earlier runs of the unit tests -func removeDev(name string) { +func removeDev(name string) error { path := filepath.Join("/dev/mapper", name) - fd, err := syscall.Open(path, syscall.O_RDONLY, 07777) - if err != nil { - if err == syscall.ENXIO { + + if f, err := os.OpenFile(path, os.O_RDONLY, 07777); err != nil { + if er, ok := err.(*os.PathError); ok && er.Err == syscall.ENXIO { // No device for this node, just remove it - os.Remove(path) - return + return os.Remove(path) } } else { - syscall.Close(fd) + f.Close() } if err := devmapper.RemoveDevice(name); err != nil { - panic(fmt.Errorf("Unable to remove existing device %s: %s", name, err)) + return fmt.Errorf("Unable to remove device %s needed to get a freash unit test environment", name) } + return nil } -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 { - removeDev(name) +func cleanupDevMapper() error { + // Unmount any leftover mounts from previous unit test runs + if data, err := ioutil.ReadFile("/proc/mounts"); err != nil { + return err + } else { + for _, line := range strings.Split(string(data), "\n") { + if cols := strings.Split(line, " "); len(cols) >= 2 && strings.HasPrefix(cols[0], "/dev/mapper/docker-unit-tests-devices") { + if err := syscall.Unmount(cols[1], 0); err != nil { + return fmt.Errorf("Unable to unmount %s needed to get a freash unit test environment: %s", cols[1], err) } } - // We need to remove the pool last as the other devices block it - if hasPool { - removeDev("docker-unit-tests-devices-pool") - } } } + + // Remove any leftover devmapper devices from previous unit run tests + infos, err := ioutil.ReadDir("/dev/mapper") + if err != nil { + return err + } + pools := []string{} + for _, info := range infos { + if name := info.Name(); strings.HasPrefix(name, "docker-unit-tests-devices-") { + if name == "docker-unit-tests-devices-pool" { + pools = append(pools, name) + } else { + if err := removeDev(name); err != nil { + return err + } + } + } + } + // We need to remove the pool last as the other devices block it + for _, pool := range pools { + if err := removeDev(pool); err != nil { + return err + } + } + return nil } func init() { @@ -143,7 +162,9 @@ func init() { NetworkBridgeIface = unitTestNetworkBridge - cleanupDevMapper() + if err := cleanupDevMapper(); err != nil { + log.Fatalf("Unable to cleanup devmapper: %s", err) + } // Always start from a clean set of loopback mounts err := os.RemoveAll(unitTestStoreDevicesBase)