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  })