github.com/DerekStrickland/consul@v1.4.5/agent/consul/merge_test.go (about)

     1  package consul
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/consul/types"
     8  	"github.com/hashicorp/serf/serf"
     9  )
    10  
    11  func makeNode(dc, name, id string, server bool, build string) *serf.Member {
    12  	var role string
    13  	if server {
    14  		role = "consul"
    15  	} else {
    16  		role = "node"
    17  	}
    18  
    19  	return &serf.Member{
    20  		Name: name,
    21  		Tags: map[string]string{
    22  			"role":    role,
    23  			"dc":      dc,
    24  			"id":      id,
    25  			"port":    "8300",
    26  			"build":   build,
    27  			"vsn":     "2",
    28  			"vsn_max": "3",
    29  			"vsn_min": "2",
    30  		},
    31  	}
    32  }
    33  
    34  func TestMerge_LAN(t *testing.T) {
    35  	t.Parallel()
    36  	cases := []struct {
    37  		members []*serf.Member
    38  		expect  string
    39  	}{
    40  		// Client in the wrong datacenter.
    41  		{
    42  			members: []*serf.Member{
    43  				makeNode("dc2",
    44  					"node1",
    45  					"96430788-246f-4379-94ce-257f7429e340",
    46  					false,
    47  					"0.7.5"),
    48  			},
    49  			expect: "wrong datacenter",
    50  		},
    51  		// Server in the wrong datacenter.
    52  		{
    53  			members: []*serf.Member{
    54  				makeNode("dc2",
    55  					"node1",
    56  					"96430788-246f-4379-94ce-257f7429e340",
    57  					true,
    58  					"0.7.5"),
    59  			},
    60  			expect: "wrong datacenter",
    61  		},
    62  		// Node ID conflict with delegate's ID.
    63  		{
    64  			members: []*serf.Member{
    65  				makeNode("dc1",
    66  					"node1",
    67  					"ee954a2f-80de-4b34-8780-97b942a50a99",
    68  					true,
    69  					"0.7.5"),
    70  			},
    71  			expect: "with this agent's ID",
    72  		},
    73  		// Cluster with existing conflicting node IDs.
    74  		{
    75  			members: []*serf.Member{
    76  				makeNode("dc1",
    77  					"node1",
    78  					"6185913b-98d7-4441-bd8f-f7f7d854a4af",
    79  					true,
    80  					"0.8.5"),
    81  				makeNode("dc1",
    82  					"node2",
    83  					"6185913b-98d7-4441-bd8f-f7f7d854a4af",
    84  					true,
    85  					"0.9.0"),
    86  			},
    87  			expect: "with member",
    88  		},
    89  		// Cluster with existing conflicting node IDs, but version is
    90  		// old enough to skip the check.
    91  		{
    92  			members: []*serf.Member{
    93  				makeNode("dc1",
    94  					"node1",
    95  					"6185913b-98d7-4441-bd8f-f7f7d854a4af",
    96  					true,
    97  					"0.8.5"),
    98  				makeNode("dc1",
    99  					"node2",
   100  					"6185913b-98d7-4441-bd8f-f7f7d854a4af",
   101  					true,
   102  					"0.8.4"),
   103  			},
   104  			expect: "with member",
   105  		},
   106  		// Good cluster.
   107  		{
   108  			members: []*serf.Member{
   109  				makeNode("dc1",
   110  					"node1",
   111  					"6185913b-98d7-4441-bd8f-f7f7d854a4af",
   112  					true,
   113  					"0.8.5"),
   114  				makeNode("dc1",
   115  					"node2",
   116  					"cda916bc-a357-4a19-b886-59419fcee50c",
   117  					true,
   118  					"0.8.5"),
   119  			},
   120  			expect: "",
   121  		},
   122  	}
   123  
   124  	delegate := &lanMergeDelegate{
   125  		dc:       "dc1",
   126  		nodeID:   types.NodeID("ee954a2f-80de-4b34-8780-97b942a50a99"),
   127  		nodeName: "node0",
   128  		segment:  "",
   129  	}
   130  	for i, c := range cases {
   131  		if err := delegate.NotifyMerge(c.members); c.expect == "" {
   132  			if err != nil {
   133  				t.Fatalf("case %d: err: %v", i+1, err)
   134  			}
   135  		} else {
   136  			if err == nil || !strings.Contains(err.Error(), c.expect) {
   137  				t.Fatalf("case %d: err: %v", i+1, err)
   138  			}
   139  		}
   140  	}
   141  }
   142  
   143  func TestMerge_WAN(t *testing.T) {
   144  	t.Parallel()
   145  	cases := []struct {
   146  		members []*serf.Member
   147  		expect  string
   148  	}{
   149  		// Not a server
   150  		{
   151  			members: []*serf.Member{
   152  				makeNode("dc2",
   153  					"node1",
   154  					"96430788-246f-4379-94ce-257f7429e340",
   155  					false,
   156  					"0.7.5"),
   157  			},
   158  			expect: "not a server",
   159  		},
   160  		// Good cluster.
   161  		{
   162  			members: []*serf.Member{
   163  				makeNode("dc2",
   164  					"node1",
   165  					"6185913b-98d7-4441-bd8f-f7f7d854a4af",
   166  					true,
   167  					"0.7.5"),
   168  				makeNode("dc3",
   169  					"node2",
   170  					"cda916bc-a357-4a19-b886-59419fcee50c",
   171  					true,
   172  					"0.7.5"),
   173  			},
   174  			expect: "",
   175  		},
   176  	}
   177  
   178  	delegate := &wanMergeDelegate{}
   179  	for i, c := range cases {
   180  		if err := delegate.NotifyMerge(c.members); c.expect == "" {
   181  			if err != nil {
   182  				t.Fatalf("case %d: err: %v", i+1, err)
   183  			}
   184  		} else {
   185  			if err == nil || !strings.Contains(err.Error(), c.expect) {
   186  				t.Fatalf("case %d: err: %v", i+1, err)
   187  			}
   188  		}
   189  	}
   190  }