|
8 | 8 | "errors"
|
9 | 9 | "fmt"
|
10 | 10 | "io"
|
| 11 | + "io/fs" |
11 | 12 | "math/rand"
|
12 | 13 | "net"
|
13 | 14 | "net/url"
|
@@ -138,10 +139,32 @@ const (
|
138 | 139 | imageCacheDir = "imagecachedir"
|
139 | 140 | )
|
140 | 141 |
|
| 142 | +var netnsFiles []fs.DirEntry |
| 143 | + |
| 144 | +func getNetnsDir() string { |
| 145 | + if isRootless() { |
| 146 | + var path string |
| 147 | + if env, ok := os.LookupEnv("XDG_RUNTIME_DIR"); ok { |
| 148 | + path = env |
| 149 | + } else { |
| 150 | + path = fmt.Sprintf("/run/user/%d", os.Getuid()) |
| 151 | + } |
| 152 | + return filepath.Join(path, "netns") |
| 153 | + } |
| 154 | + // root is hard coded to |
| 155 | + return "/run/netns" |
| 156 | +} |
| 157 | + |
141 | 158 | var _ = SynchronizedBeforeSuite(func() []byte {
|
142 | 159 | globalTmpDir, err := os.MkdirTemp("", "podman-e2e-")
|
143 | 160 | Expect(err).ToNot(HaveOccurred())
|
144 | 161 |
|
| 162 | + netnsFiles, err = os.ReadDir(getNetnsDir()) |
| 163 | + // dir might not exists which is fine |
| 164 | + if !errors.Is(err, fs.ErrNotExist) { |
| 165 | + Expect(err).ToNot(HaveOccurred()) |
| 166 | + } |
| 167 | + |
145 | 168 | // make cache dir
|
146 | 169 | ImageCacheDir = filepath.Join(globalTmpDir, imageCacheDir)
|
147 | 170 | err = os.MkdirAll(ImageCacheDir, 0700)
|
@@ -203,6 +226,13 @@ var _ = SynchronizedAfterSuite(func() {
|
203 | 226 | timingsFile = nil
|
204 | 227 | },
|
205 | 228 | func() {
|
| 229 | + // perform a netns leak check after all tests run |
| 230 | + newNetnsFiles, err := os.ReadDir(getNetnsDir()) |
| 231 | + if !errors.Is(err, fs.ErrNotExist) { |
| 232 | + Expect(err).ToNot(HaveOccurred()) |
| 233 | + } |
| 234 | + Expect(newNetnsFiles).To(ConsistOf(netnsFiles), "Netns files were leaked") |
| 235 | + |
206 | 236 | testTimings := make(testResultsSorted, 0, 2000)
|
207 | 237 | for i := 1; i <= GinkgoT().ParallelTotal(); i++ {
|
208 | 238 | f, err := os.Open(fmt.Sprintf("%s/timings-%d", LockTmpDir, i))
|
|
0 commit comments