func cutNetwork(t *testing.T, c cluster.Cluster, closer <-chan struct{}, partitions ...[]int) { defer func() { if errs := restoreNetwork(t, c); len(errs) > 0 { t.Fatalf("errors restoring the network: %+v", errs) } }() addrs, addrsToNode := mustGetHosts(t, c) ipPartitions := make([][]iptables.IP, 0, len(partitions)) for _, partition := range partitions { ipPartition := make([]iptables.IP, 0, len(partition)) for _, nodeIndex := range partition { ipPartition = append(ipPartition, addrs[nodeIndex]) } ipPartitions = append(ipPartitions, ipPartition) } log.Warningf(context.TODO(), "partitioning: %v (%v)", partitions, ipPartitions) for host, cmds := range iptables.Rules(iptables.Bidirectional(ipPartitions...)) { for _, cmd := range cmds { if err := c.ExecRoot(addrsToNode[host], cmd); err != nil { t.Fatal(err) } } } <-closer log.Warningf(context.TODO(), "resolved all partitions") }
func cutNetwork(t *testing.T, c cluster.Cluster, closer <-chan struct{}, partitions ...[]int) { addrs, addrsToNode := mustGetHosts(t, c) ipPartitions := make([][]iptables.IP, 0, len(partitions)) for _, partition := range partitions { ipPartition := make([]iptables.IP, 0, len(partition)) for _, nodeIndex := range partition { ipPartition = append(ipPartition, addrs[nodeIndex]) } ipPartitions = append(ipPartitions, ipPartition) } log.Warningf("partitioning: %v (%v)", partitions, ipPartitions) for host, cmds := range iptables.Rules(iptables.Bidirectional(ipPartitions...)) { for _, cmd := range cmds { if err := c.ExecRoot(addrsToNode[host], cmd); err != nil { t.Fatal(err) } } } <-closer for i := 0; i < c.NumNodes(); i++ { for _, cmd := range iptables.Reset() { if err := c.ExecRoot(i, cmd); err != nil { t.Fatal(err) } } } log.Warningf("resolved all partitions") }
func restoreNetwork(t *testing.T, c cluster.Cluster) []error { var errs []error for i := 0; i < c.NumNodes(); i++ { for _, cmd := range iptables.Reset() { if err := c.ExecRoot(i, cmd); err != nil { errs = append(errs, err) } } } return errs }