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