github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/integration/networking/recovery_test.go (about) 1 package networking_test 2 3 import ( 4 "fmt" 5 "os/exec" 6 7 "github.com/cloudfoundry-incubator/garden" 8 . "github.com/onsi/ginkgo" 9 . "github.com/onsi/gomega" 10 ) 11 12 var _ = Describe("Networking recovery", func() { 13 Context("with two containers in the same subnet", func() { 14 var ( 15 ctr1 garden.Container 16 ctr2 garden.Container 17 bridgeEvidence string 18 ) 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.1/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 killGarden() 38 39 client = startGarden() 40 Expect(client.Ping()).ToNot(HaveOccurred()) 41 }) 42 43 It("the subnet's bridge no longer exists", func() { 44 cmd := exec.Command("ip", "a") 45 Expect(cmd.CombinedOutput()).ToNot(ContainSubstring(bridgeEvidence)) 46 }) 47 }) 48 49 Context("when garden is shut down cleanly and restarted, and the containers are deleted", func() { 50 BeforeEach(func() { 51 stopGarden() 52 53 client = startGarden() 54 Expect(client.Ping()).ToNot(HaveOccurred()) 55 56 cmd := exec.Command("ip", "a") 57 Expect(cmd.CombinedOutput()).To(ContainSubstring(bridgeEvidence)) 58 59 Expect(client.Destroy(ctr1.Handle())).To(Succeed()) 60 Expect(client.Destroy(ctr2.Handle())).To(Succeed()) 61 }) 62 63 It("the subnet's bridge no longer exists", func() { 64 cmd := exec.Command("ip", "a") 65 Expect(cmd.CombinedOutput()).ToNot(ContainSubstring(bridgeEvidence)) 66 }) 67 }) 68 69 Context("when garden is shut down and restarted", func() { 70 BeforeEach(func() { 71 stopGarden() 72 73 client = startGarden() 74 Expect(client.Ping()).ToNot(HaveOccurred()) 75 }) 76 77 It("the subnet's bridge still exists", func() { 78 cmd := exec.Command("ip", "a") 79 Expect(cmd.CombinedOutput()).To(ContainSubstring(bridgeEvidence)) 80 }) 81 82 It("containers are still pingable", func() { 83 info1, ierr := ctr1.Info() 84 Expect(ierr).ToNot(HaveOccurred()) 85 86 out, err := exec.Command("/bin/ping", "-c 2", info1.ContainerIP).Output() 87 Expect(out).To(ContainSubstring(" 0% packet loss")) 88 Expect(err).ToNot(HaveOccurred()) 89 }) 90 91 It("a container can still reach external networks", func() { 92 Expect(checkInternet(ctr1)).To(Succeed()) 93 }) 94 }) 95 }) 96 })