Handle namespaces with care
authorzachgersh <zachgersh@gmail.com>
Mon, 22 Feb 2016 03:23:14 +0000 (19:23 -0800)
committerzachgersh <zachgersh@gmail.com>
Mon, 29 Feb 2016 17:29:06 +0000 (12:29 -0500)
- After creating new netns, switch back to main netns
- Lock thread during test and test setup

plugins/main/loopback/loopback_suite_test.go
plugins/main/loopback/loopback_test.go

index c9c3438..d261605 100644 (file)
@@ -1,7 +1,9 @@
 package main_test
 
 import (
+       "fmt"
        "os"
+       "runtime"
 
        "github.com/onsi/gomega/gexec"
 
@@ -32,21 +34,38 @@ var _ = AfterSuite(func() {
 
 func makeNetworkNS(containerID string) string {
        namespace := "/var/run/netns/" + containerID
+       pid := unix.Getpid()
+       tid := unix.Gettid()
 
        err := os.MkdirAll("/var/run/netns", 0600)
        Expect(err).NotTo(HaveOccurred())
 
-       err = unix.Unshare(unix.CLONE_NEWNET)
-       Expect(err).NotTo(HaveOccurred())
+       runtime.LockOSThread()
+       defer runtime.UnlockOSThread()
+       go (func() {
+               defer GinkgoRecover()
 
-       fd, err := os.Create(namespace)
-       Expect(err).NotTo(HaveOccurred())
-       defer fd.Close()
+               err = unix.Unshare(unix.CLONE_NEWNET)
+               Expect(err).NotTo(HaveOccurred())
+
+               fd, err := os.Create(namespace)
+               Expect(err).NotTo(HaveOccurred())
+               defer fd.Close()
+
+               err = unix.Mount("/proc/self/ns/net", namespace, "none", unix.MS_BIND, "")
+               Expect(err).NotTo(HaveOccurred())
+       })()
 
-       err = unix.Mount("/proc/self/ns/net", namespace, "none", unix.MS_BIND, "")
+       Eventually(namespace).Should(BeAnExistingFile())
+
+       fd, err := unix.Open(fmt.Sprintf("/proc/%d/task/%d/ns/net", pid, tid), unix.O_RDONLY, 0)
        Expect(err).NotTo(HaveOccurred())
 
-       Expect(namespace).To(BeAnExistingFile())
+       defer unix.Close(fd)
+
+       _, _, e1 := unix.Syscall(unix.SYS_SETNS, uintptr(fd), uintptr(unix.CLONE_NEWNET), 0)
+       Expect(e1).To(BeZero())
+
        return namespace
 }
 
index 5ed2215..9ae1198 100644 (file)
@@ -57,7 +57,7 @@ var _ = Describe("Loopback", func() {
                        Eventually(session).Should(gexec.Exit(0))
 
                        var lo *net.Interface
-                       err = ns.WithNetNSPath(networkNS, false, func(hostNS *os.File) error {
+                       err = ns.WithNetNSPath(networkNS, true, func(hostNS *os.File) error {
                                var err error
                                lo, err = net.InterfaceByName("lo")
                                return err