... | ... |
@@ -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 { |