session, err := gexec.Start(exec.Command("sh", "-c", fmt.Sprintf("ip netns exec gdnsetnstest ifconfig %s", name)), GinkgoWriter, GinkgoWriter) Expect(err).ToNot(HaveOccurred()) Eventually(session, "5s").Should(gexec.Exit(0)) }) Context("when the interface does not exist", func() { It("returns the error", func() { Expect(l.SetNs(&net.Interface{Name: "something"}, 1234)).To(MatchError("devices: Link not found")) }) }) }) Describe("InterfaceByName", func() { Context("when the interface exists", func() { It("returns the interface with the given name, and true", func() { returnedIntf, found, err := l.InterfaceByName(name) Expect(err).ToNot(HaveOccurred()) Expect(returnedIntf).To(Equal(intf)) Expect(found).To(BeTrue()) }) }) Context("when the interface does not exist", func() { It("does not return an error", func() { _, found, err := l.InterfaceByName("sandwich") Expect(err).ToNot(HaveOccurred()) Expect(found).To(BeFalse()) }) }) })
func init() { reexec.Register("configure-container-netns", func() { var netNsPath, containerIntf, containerIPStr, bridgeIPStr, subnetStr string var mtu int flag.StringVar(&netNsPath, "netNsPath", "", "netNsPath") flag.StringVar(&containerIntf, "containerIntf", "", "containerIntf") flag.StringVar(&containerIPStr, "containerIP", "", "containerIP") flag.StringVar(&bridgeIPStr, "bridgeIP", "", "bridgeIP") flag.StringVar(&subnetStr, "subnet", "", "subnet") flag.IntVar(&mtu, "mtu", 0, "mtu") flag.Parse() fd, err := os.Open(netNsPath) if err != nil { fmt.Fprintf(os.Stderr, "opening netns `%s`: %s", netNsPath, err) os.Exit(1) } defer fd.Close() netNsExecer := &netns.Execer{} if err = netNsExecer.Exec(fd, func() error { containerIP := net.ParseIP(containerIPStr) bridgeIP := net.ParseIP(bridgeIPStr) _, subnetIPNet, err := net.ParseCIDR(subnetStr) if err != nil { panic(err) } link := devices.Link{} intf, found, err := link.InterfaceByName(containerIntf) if err != nil { panic(err) } if !found { return fmt.Errorf("interface `%s` was not found", containerIntf) } if err := link.AddIP(intf, containerIP, subnetIPNet); err != nil { panic(err) } if err := link.SetUp(intf); err != nil { panic(err) } if err := link.AddDefaultGW(intf, bridgeIP); err != nil { panic(err) } if err := link.SetMTU(intf, mtu); err != nil { panic(err) } return nil }); err != nil { fmt.Fprintf(os.Stderr, err.Error()) os.Exit(1) } }) }