Browse code

Tests: Clean up any old devmapper leftovers before starting tests

Alexander Larsson authored on 2013/09/20 03:32:11
Showing 2 changed files
... ...
@@ -347,3 +347,20 @@ func UdevWait(cookie uint32) error {
347 347
 func LogInitVerbose(level int) {
348 348
 	C.dm_log_init_verbose(C.int(level))
349 349
 }
350
+
351
+// Useful helper for cleanup
352
+func RemoveDevice(name string) error {
353
+	task := TaskCreate(DeviceRemove)
354
+	if task == nil {
355
+		return fmt.Errorf("Can't create task of type DeviceRemove")
356
+	}
357
+	err := task.SetName(name)
358
+	if err != nil {
359
+		return fmt.Errorf("Can't set task name %s", name)
360
+	}
361
+	err = task.Run()
362
+	if err != nil {
363
+		return fmt.Errorf("Error running removeDevice")
364
+	}
365
+	return nil
366
+}
... ...
@@ -6,6 +6,7 @@ import (
6 6
 	"github.com/dotcloud/docker/utils"
7 7
 	"github.com/dotcloud/docker/devmapper"
8 8
 	"io"
9
+	"io/ioutil"
9 10
 	"log"
10 11
 	"net"
11 12
 	"os"
... ...
@@ -84,6 +85,32 @@ func layerArchive(tarfile string) (io.Reader, error) {
84 84
 	return f, nil
85 85
 }
86 86
 
87
+// Remove any leftover device mapper devices from earlier runs of the unit tests
88
+func cleanupDevMapper() {
89
+	infos, _ := ioutil.ReadDir("/dev/mapper")
90
+	if infos != nil {
91
+		hasPool := false
92
+		for _, info := range infos {
93
+			name := info.Name()
94
+			if strings.HasPrefix(name, "docker-unit-tests-devices-") {
95
+				if name == "docker-unit-tests-devices-pool" {
96
+					hasPool = true
97
+				} else {
98
+					if err := devmapper.RemoveDevice(name); err != nil {
99
+						panic(fmt.Errorf("Unable to remove existing device %s: %s", name, err))
100
+					}
101
+				}
102
+			}
103
+			// We need to remove the pool last as the other devices block it
104
+			if hasPool {
105
+				if err := devmapper.RemoveDevice("docker-unit-tests-devices-pool"); err != nil {
106
+					panic(fmt.Errorf("Unable to remove existing device docker-unit-tests-devices-pool: %s", name, err))
107
+				}
108
+			}
109
+		}
110
+	}
111
+}
112
+
87 113
 func init() {
88 114
 	os.Setenv("TEST", "1")
89 115
 
... ...
@@ -99,6 +126,8 @@ func init() {
99 99
 
100 100
 	NetworkBridgeIface = unitTestNetworkBridge
101 101
 
102
+	cleanupDevMapper()
103
+
102 104
 	// Always start from a clean set of loopback mounts
103 105
 	err := os.RemoveAll(unitTestStoreDevicesBase)
104 106
 	if err != nil {