github.imxd.top/hashicorp/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 }