github.com/schwarzm/garden-linux@v0.0.0-20150507151835-33bca2147c47/integration/networking/recovery_test.go (about) 1 package networking_test 2 3 import ( 4 "fmt" 5 "os/exec" 6 "syscall" 7 8 "github.com/cloudfoundry-incubator/garden" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 ) 12 13 var _ = Describe("Networking recovery", func() { 14 Context("with two containers in the same subnet", func() { 15 var ( 16 ctr1 garden.Container 17 ctr2 garden.Container 18 bridgeEvidence string 19 ) 20 BeforeEach(func() { 21 client = startGarden() 22 23 containerNetwork := fmt.Sprintf("10.%d.0.0/24", GinkgoParallelNode()) 24 var err error 25 ctr1, err = client.Create(garden.ContainerSpec{Network: containerNetwork}) 26 Expect(err).ToNot(HaveOccurred()) 27 ctr2, err = client.Create(garden.ContainerSpec{Network: containerNetwork}) 28 Expect(err).ToNot(HaveOccurred()) 29 30 bridgeEvidence = fmt.Sprintf("inet 10.%d.0.254/24 scope global w%db-", GinkgoParallelNode(), GinkgoParallelNode()) 31 cmd := exec.Command("ip", "a") 32 Expect(cmd.CombinedOutput()).To(ContainSubstring(bridgeEvidence)) 33 }) 34 35 Context("when garden is killed and restarted using SIGKILL", func() { 36 BeforeEach(func() { 37 gardenProcess.Signal(syscall.SIGKILL) 38 Eventually(gardenProcess.Wait(), "10s").Should(Receive()) 39 40 client = startGarden() 41 Expect(client.Ping()).ToNot(HaveOccurred()) 42 }) 43 44 It("the subnet's bridge no longer exists", func() { 45 cmd := exec.Command("ip", "a") 46 Expect(cmd.CombinedOutput()).ToNot(ContainSubstring(bridgeEvidence)) 47 }) 48 }) 49 50 Context("when garden is shut down cleanly and restarted, and the containers are deleted", func() { 51 BeforeEach(func() { 52 gardenProcess.Signal(syscall.SIGTERM) 53 Eventually(gardenProcess.Wait(), "10s").Should(Receive()) 54 55 client = startGarden() 56 Expect(client.Ping()).ToNot(HaveOccurred()) 57 58 cmd := exec.Command("ip", "a") 59 Expect(cmd.CombinedOutput()).To(ContainSubstring(bridgeEvidence)) 60 61 Expect(client.Destroy(ctr1.Handle())).To(Succeed()) 62 Expect(client.Destroy(ctr2.Handle())).To(Succeed()) 63 }) 64 65 It("the subnet's bridge no longer exists", func() { 66 cmd := exec.Command("ip", "a") 67 Expect(cmd.CombinedOutput()).ToNot(ContainSubstring(bridgeEvidence)) 68 }) 69 }) 70 71 Context("when garden is shut down and restarted", func() { 72 BeforeEach(func() { 73 gardenProcess.Signal(syscall.SIGTERM) 74 Eventually(gardenProcess.Wait(), "10s").Should(Receive()) 75 76 client = startGarden() 77 Expect(client.Ping()).ToNot(HaveOccurred()) 78 }) 79 80 It("the subnet's bridge still exists", func() { 81 cmd := exec.Command("ip", "a") 82 Expect(cmd.CombinedOutput()).To(ContainSubstring(bridgeEvidence)) 83 }) 84 85 It("containers are still pingable", func() { 86 info1, ierr := ctr1.Info() 87 Expect(ierr).ToNot(HaveOccurred()) 88 89 out, err := exec.Command("/bin/ping", "-c 2", info1.ContainerIP).Output() 90 Expect(out).To(ContainSubstring(" 0% packet loss")) 91 Expect(err).ToNot(HaveOccurred()) 92 }) 93 94 It("a container can still reach external networks", func() { 95 Expect(checkInternet(ctr1)).To(Succeed()) 96 }) 97 }) 98 }) 99 100 })