github.imxd.top/hashicorp/consul@v1.4.5/agent/consul/client_test.go (about) 1 package consul 2 3 import ( 4 "bytes" 5 "net" 6 "os" 7 "sync" 8 "testing" 9 "time" 10 11 "github.com/hashicorp/consul/agent/structs" 12 "github.com/hashicorp/consul/lib/freeport" 13 "github.com/hashicorp/consul/testrpc" 14 "github.com/hashicorp/consul/testutil" 15 "github.com/hashicorp/consul/testutil/retry" 16 "github.com/hashicorp/net-rpc-msgpackrpc" 17 "github.com/hashicorp/serf/serf" 18 "github.com/stretchr/testify/require" 19 "golang.org/x/time/rate" 20 ) 21 22 func testClientConfig(t *testing.T) (string, *Config) { 23 dir := testutil.TempDir(t, "consul") 24 config := DefaultConfig() 25 config.Datacenter = "dc1" 26 config.DataDir = dir 27 config.NodeName = uniqueNodeName(t.Name()) 28 config.RPCAddr = &net.TCPAddr{ 29 IP: []byte{127, 0, 0, 1}, 30 Port: freeport.Get(1)[0], 31 } 32 config.SerfLANConfig.MemberlistConfig.BindAddr = "127.0.0.1" 33 config.SerfLANConfig.MemberlistConfig.BindPort = freeport.Get(1)[0] 34 config.SerfLANConfig.MemberlistConfig.ProbeTimeout = 200 * time.Millisecond 35 config.SerfLANConfig.MemberlistConfig.ProbeInterval = time.Second 36 config.SerfLANConfig.MemberlistConfig.GossipInterval = 100 * time.Millisecond 37 38 return dir, config 39 } 40 41 func testClient(t *testing.T) (string, *Client) { 42 return testClientWithConfig(t, func(c *Config) { 43 c.Datacenter = "dc1" 44 c.NodeName = uniqueNodeName(t.Name()) 45 }) 46 } 47 48 func testClientDC(t *testing.T, dc string) (string, *Client) { 49 return testClientWithConfig(t, func(c *Config) { 50 c.Datacenter = dc 51 c.NodeName = uniqueNodeName(t.Name()) 52 }) 53 } 54 55 func testClientWithConfig(t *testing.T, cb func(c *Config)) (string, *Client) { 56 dir, config := testClientConfig(t) 57 if cb != nil { 58 cb(config) 59 } 60 client, err := NewClient(config) 61 if err != nil { 62 t.Fatalf("err: %v", err) 63 } 64 return dir, client 65 } 66 67 func TestClient_StartStop(t *testing.T) { 68 t.Parallel() 69 dir, client := testClient(t) 70 defer os.RemoveAll(dir) 71 72 if err := client.Shutdown(); err != nil { 73 t.Fatalf("err: %v", err) 74 } 75 } 76 77 func TestClient_JoinLAN(t *testing.T) { 78 t.Parallel() 79 dir1, s1 := testServer(t) 80 defer os.RemoveAll(dir1) 81 defer s1.Shutdown() 82 83 dir2, c1 := testClient(t) 84 defer os.RemoveAll(dir2) 85 defer c1.Shutdown() 86 87 // Try to join 88 joinLAN(t, c1, s1) 89 retry.Run(t, func(r *retry.R) { 90 if got, want := c1.routers.NumServers(), 1; got != want { 91 r.Fatalf("got %d servers want %d", got, want) 92 } 93 if got, want := len(s1.LANMembers()), 2; got != want { 94 r.Fatalf("got %d server LAN members want %d", got, want) 95 } 96 if got, want := len(c1.LANMembers()), 2; got != want { 97 r.Fatalf("got %d client LAN members want %d", got, want) 98 } 99 }) 100 } 101 102 func TestClient_LANReap(t *testing.T) { 103 t.Parallel() 104 dir1, s1 := testServer(t) 105 defer os.RemoveAll(dir1) 106 107 dir2, c1 := testClientWithConfig(t, func(c *Config) { 108 c.Datacenter = "dc1" 109 c.SerfFloodInterval = 100 * time.Millisecond 110 c.SerfLANConfig.ReconnectTimeout = 250 * time.Millisecond 111 c.SerfLANConfig.TombstoneTimeout = 250 * time.Millisecond 112 c.SerfLANConfig.ReapInterval = 500 * time.Millisecond 113 }) 114 defer os.RemoveAll(dir2) 115 defer c1.Shutdown() 116 117 // Try to join 118 joinLAN(t, c1, s1) 119 testrpc.WaitForLeader(t, c1.RPC, "dc1") 120 121 retry.Run(t, func(r *retry.R) { 122 require.Len(r, s1.LANMembers(), 2) 123 require.Len(r, c1.LANMembers(), 2) 124 }) 125 126 // Check the router has both 127 retry.Run(t, func(r *retry.R) { 128 server := c1.routers.FindServer() 129 require.NotNil(t, server) 130 require.Equal(t, s1.config.NodeName, server.Name) 131 }) 132 133 // shutdown the second dc 134 s1.Shutdown() 135 136 retry.Run(t, func(r *retry.R) { 137 require.Len(r, c1.LANMembers(), 1) 138 server := c1.routers.FindServer() 139 require.Nil(t, server) 140 }) 141 } 142 143 func TestClient_JoinLAN_Invalid(t *testing.T) { 144 t.Parallel() 145 dir1, s1 := testServer(t) 146 defer os.RemoveAll(dir1) 147 defer s1.Shutdown() 148 149 dir2, c1 := testClientDC(t, "other") 150 defer os.RemoveAll(dir2) 151 defer c1.Shutdown() 152 153 // Try to join 154 if _, err := c1.JoinLAN([]string{joinAddrLAN(s1)}); err == nil { 155 t.Fatal("should error") 156 } 157 158 time.Sleep(50 * time.Millisecond) 159 if len(s1.LANMembers()) != 1 { 160 t.Fatalf("should not join") 161 } 162 if len(c1.LANMembers()) != 1 { 163 t.Fatalf("should not join") 164 } 165 } 166 167 func TestClient_JoinWAN_Invalid(t *testing.T) { 168 t.Parallel() 169 dir1, s1 := testServer(t) 170 defer os.RemoveAll(dir1) 171 defer s1.Shutdown() 172 173 dir2, c1 := testClientDC(t, "dc2") 174 defer os.RemoveAll(dir2) 175 defer c1.Shutdown() 176 177 // Try to join 178 if _, err := c1.JoinLAN([]string{joinAddrWAN(s1)}); err == nil { 179 t.Fatal("should error") 180 } 181 182 time.Sleep(50 * time.Millisecond) 183 if len(s1.WANMembers()) != 1 { 184 t.Fatalf("should not join") 185 } 186 if len(c1.LANMembers()) != 1 { 187 t.Fatalf("should not join") 188 } 189 } 190 191 func TestClient_RPC(t *testing.T) { 192 t.Parallel() 193 dir1, s1 := testServer(t) 194 defer os.RemoveAll(dir1) 195 defer s1.Shutdown() 196 197 dir2, c1 := testClient(t) 198 defer os.RemoveAll(dir2) 199 defer c1.Shutdown() 200 201 // Try an RPC 202 var out struct{} 203 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != structs.ErrNoServers { 204 t.Fatalf("err: %v", err) 205 } 206 207 // Try to join 208 joinLAN(t, c1, s1) 209 210 // Check the members 211 if len(s1.LANMembers()) != 2 { 212 t.Fatalf("bad len") 213 } 214 215 if len(c1.LANMembers()) != 2 { 216 t.Fatalf("bad len") 217 } 218 219 // RPC should succeed 220 retry.Run(t, func(r *retry.R) { 221 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil { 222 r.Fatal("ping failed", err) 223 } 224 }) 225 } 226 227 type leaderFailer struct { 228 totalCalls int 229 onceCalls int 230 } 231 232 func (l *leaderFailer) Always(args struct{}, reply *struct{}) error { 233 l.totalCalls++ 234 return structs.ErrNoLeader 235 } 236 237 func (l *leaderFailer) Once(args struct{}, reply *struct{}) error { 238 l.totalCalls++ 239 l.onceCalls++ 240 241 switch { 242 case l.onceCalls == 1: 243 return structs.ErrNoLeader 244 245 default: 246 return nil 247 } 248 } 249 250 func TestClient_RPC_Retry(t *testing.T) { 251 t.Parallel() 252 253 dir1, s1 := testServer(t) 254 defer os.RemoveAll(dir1) 255 defer s1.Shutdown() 256 257 dir2, c1 := testClientWithConfig(t, func(c *Config) { 258 c.Datacenter = "dc1" 259 c.NodeName = uniqueNodeName(t.Name()) 260 c.RPCHoldTimeout = 2 * time.Second 261 }) 262 defer os.RemoveAll(dir2) 263 defer c1.Shutdown() 264 265 joinLAN(t, c1, s1) 266 retry.Run(t, func(r *retry.R) { 267 var out struct{} 268 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil { 269 r.Fatalf("err: %v", err) 270 } 271 }) 272 273 failer := &leaderFailer{} 274 if err := s1.RegisterEndpoint("Fail", failer); err != nil { 275 t.Fatalf("err: %v", err) 276 } 277 278 var out struct{} 279 if err := c1.RPC("Fail.Always", struct{}{}, &out); !structs.IsErrNoLeader(err) { 280 t.Fatalf("err: %v", err) 281 } 282 if got, want := failer.totalCalls, 2; got < want { 283 t.Fatalf("got %d want >= %d", got, want) 284 } 285 if err := c1.RPC("Fail.Once", struct{}{}, &out); err != nil { 286 t.Fatalf("err: %v", err) 287 } 288 if got, want := failer.onceCalls, 2; got < want { 289 t.Fatalf("got %d want >= %d", got, want) 290 } 291 if got, want := failer.totalCalls, 4; got < want { 292 t.Fatalf("got %d want >= %d", got, want) 293 } 294 } 295 296 func TestClient_RPC_Pool(t *testing.T) { 297 t.Parallel() 298 dir1, s1 := testServer(t) 299 defer os.RemoveAll(dir1) 300 defer s1.Shutdown() 301 302 dir2, c1 := testClient(t) 303 defer os.RemoveAll(dir2) 304 defer c1.Shutdown() 305 306 // Try to join. 307 joinLAN(t, c1, s1) 308 309 // Wait for both agents to finish joining 310 retry.Run(t, func(r *retry.R) { 311 if got, want := len(s1.LANMembers()), 2; got != want { 312 r.Fatalf("got %d server LAN members want %d", got, want) 313 } 314 if got, want := len(c1.LANMembers()), 2; got != want { 315 r.Fatalf("got %d client LAN members want %d", got, want) 316 } 317 }) 318 319 // Blast out a bunch of RPC requests at the same time to try to get 320 // contention opening new connections. 321 var wg sync.WaitGroup 322 for i := 0; i < 150; i++ { 323 wg.Add(1) 324 325 go func() { 326 defer wg.Done() 327 var out struct{} 328 retry.Run(t, func(r *retry.R) { 329 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil { 330 r.Fatal("ping failed", err) 331 } 332 }) 333 }() 334 } 335 336 wg.Wait() 337 } 338 339 func TestClient_RPC_ConsulServerPing(t *testing.T) { 340 t.Parallel() 341 var servers []*Server 342 var serverDirs []string 343 const numServers = 5 344 345 for n := 0; n < numServers; n++ { 346 bootstrap := n == 0 347 dir, s := testServerDCBootstrap(t, "dc1", bootstrap) 348 defer os.RemoveAll(dir) 349 defer s.Shutdown() 350 351 servers = append(servers, s) 352 serverDirs = append(serverDirs, dir) 353 } 354 355 const numClients = 1 356 clientDir, c := testClient(t) 357 defer os.RemoveAll(clientDir) 358 defer c.Shutdown() 359 360 // Join all servers. 361 for _, s := range servers { 362 joinLAN(t, c, s) 363 } 364 365 for _, s := range servers { 366 retry.Run(t, func(r *retry.R) { r.Check(wantPeers(s, numServers)) }) 367 } 368 369 // Sleep to allow Serf to sync, shuffle, and let the shuffle complete 370 c.routers.ResetRebalanceTimer() 371 time.Sleep(time.Second) 372 373 if len(c.LANMembers()) != numServers+numClients { 374 t.Errorf("bad len: %d", len(c.LANMembers())) 375 } 376 for _, s := range servers { 377 if len(s.LANMembers()) != numServers+numClients { 378 t.Errorf("bad len: %d", len(s.LANMembers())) 379 } 380 } 381 382 // Ping each server in the list 383 var pingCount int 384 for range servers { 385 time.Sleep(200 * time.Millisecond) 386 s := c.routers.FindServer() 387 ok, err := c.connPool.Ping(s.Datacenter, s.Addr, s.Version, s.UseTLS) 388 if !ok { 389 t.Errorf("Unable to ping server %v: %s", s.String(), err) 390 } 391 pingCount++ 392 393 // Artificially fail the server in order to rotate the server 394 // list 395 c.routers.NotifyFailedServer(s) 396 } 397 398 if pingCount != numServers { 399 t.Errorf("bad len: %d/%d", pingCount, numServers) 400 } 401 } 402 403 func TestClient_RPC_TLS(t *testing.T) { 404 t.Parallel() 405 dir1, conf1 := testServerConfig(t) 406 conf1.VerifyIncoming = true 407 conf1.VerifyOutgoing = true 408 configureTLS(conf1) 409 s1, err := NewServer(conf1) 410 if err != nil { 411 t.Fatalf("err: %v", err) 412 } 413 defer os.RemoveAll(dir1) 414 defer s1.Shutdown() 415 416 dir2, conf2 := testClientConfig(t) 417 conf2.VerifyOutgoing = true 418 configureTLS(conf2) 419 c1, err := NewClient(conf2) 420 if err != nil { 421 t.Fatalf("err: %v", err) 422 } 423 defer os.RemoveAll(dir2) 424 defer c1.Shutdown() 425 426 // Try an RPC 427 var out struct{} 428 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != structs.ErrNoServers { 429 t.Fatalf("err: %v", err) 430 } 431 432 // Try to join 433 joinLAN(t, c1, s1) 434 435 // Wait for joins to finish/RPC to succeed 436 retry.Run(t, func(r *retry.R) { 437 if got, want := len(s1.LANMembers()), 2; got != want { 438 r.Fatalf("got %d server LAN members want %d", got, want) 439 } 440 if got, want := len(c1.LANMembers()), 2; got != want { 441 r.Fatalf("got %d client LAN members want %d", got, want) 442 } 443 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil { 444 r.Fatal("ping failed", err) 445 } 446 }) 447 } 448 449 func TestClient_RPC_RateLimit(t *testing.T) { 450 t.Parallel() 451 dir1, conf1 := testServerConfig(t) 452 s1, err := NewServer(conf1) 453 if err != nil { 454 t.Fatalf("err: %v", err) 455 } 456 defer os.RemoveAll(dir1) 457 defer s1.Shutdown() 458 testrpc.WaitForLeader(t, s1.RPC, "dc1") 459 460 dir2, conf2 := testClientConfig(t) 461 conf2.RPCRate = 2 462 conf2.RPCMaxBurst = 2 463 c1, err := NewClient(conf2) 464 if err != nil { 465 t.Fatalf("err: %v", err) 466 } 467 defer os.RemoveAll(dir2) 468 defer c1.Shutdown() 469 470 joinLAN(t, c1, s1) 471 retry.Run(t, func(r *retry.R) { 472 var out struct{} 473 if err := c1.RPC("Status.Ping", struct{}{}, &out); err != structs.ErrRPCRateExceeded { 474 r.Fatalf("err: %v", err) 475 } 476 }) 477 } 478 479 func TestClient_SnapshotRPC(t *testing.T) { 480 t.Parallel() 481 dir1, s1 := testServer(t) 482 defer os.RemoveAll(dir1) 483 defer s1.Shutdown() 484 485 dir2, c1 := testClient(t) 486 defer os.RemoveAll(dir2) 487 defer c1.Shutdown() 488 489 // Wait for the leader 490 testrpc.WaitForLeader(t, s1.RPC, "dc1") 491 492 // Try to join. 493 joinLAN(t, c1, s1) 494 testrpc.WaitForLeader(t, c1.RPC, "dc1") 495 496 // Wait until we've got a healthy server. 497 retry.Run(t, func(r *retry.R) { 498 if got, want := c1.routers.NumServers(), 1; got != want { 499 r.Fatalf("got %d servers want %d", got, want) 500 } 501 }) 502 503 // Take a snapshot. 504 var snap bytes.Buffer 505 args := structs.SnapshotRequest{ 506 Datacenter: "dc1", 507 Op: structs.SnapshotSave, 508 } 509 if err := c1.SnapshotRPC(&args, bytes.NewReader([]byte("")), &snap, nil); err != nil { 510 t.Fatalf("err: %v", err) 511 } 512 513 // Restore a snapshot. 514 args.Op = structs.SnapshotRestore 515 if err := c1.SnapshotRPC(&args, &snap, nil, nil); err != nil { 516 t.Fatalf("err: %v", err) 517 } 518 } 519 520 func TestClient_SnapshotRPC_RateLimit(t *testing.T) { 521 t.Parallel() 522 dir1, s1 := testServer(t) 523 defer os.RemoveAll(dir1) 524 defer s1.Shutdown() 525 testrpc.WaitForLeader(t, s1.RPC, "dc1") 526 527 dir2, conf1 := testClientConfig(t) 528 conf1.RPCRate = 2 529 conf1.RPCMaxBurst = 2 530 c1, err := NewClient(conf1) 531 if err != nil { 532 t.Fatalf("err: %v", err) 533 } 534 defer os.RemoveAll(dir2) 535 defer c1.Shutdown() 536 537 joinLAN(t, c1, s1) 538 retry.Run(t, func(r *retry.R) { 539 if got, want := c1.routers.NumServers(), 1; got != want { 540 r.Fatalf("got %d servers want %d", got, want) 541 } 542 }) 543 544 retry.Run(t, func(r *retry.R) { 545 var snap bytes.Buffer 546 args := structs.SnapshotRequest{ 547 Datacenter: "dc1", 548 Op: structs.SnapshotSave, 549 } 550 if err := c1.SnapshotRPC(&args, bytes.NewReader([]byte("")), &snap, nil); err != structs.ErrRPCRateExceeded { 551 r.Fatalf("err: %v", err) 552 } 553 }) 554 } 555 556 func TestClient_SnapshotRPC_TLS(t *testing.T) { 557 t.Parallel() 558 dir1, conf1 := testServerConfig(t) 559 conf1.VerifyIncoming = true 560 conf1.VerifyOutgoing = true 561 configureTLS(conf1) 562 s1, err := NewServer(conf1) 563 if err != nil { 564 t.Fatalf("err: %v", err) 565 } 566 defer os.RemoveAll(dir1) 567 defer s1.Shutdown() 568 569 dir2, conf2 := testClientConfig(t) 570 conf2.VerifyOutgoing = true 571 configureTLS(conf2) 572 c1, err := NewClient(conf2) 573 if err != nil { 574 t.Fatalf("err: %v", err) 575 } 576 defer os.RemoveAll(dir2) 577 defer c1.Shutdown() 578 579 // Wait for the leader 580 testrpc.WaitForLeader(t, s1.RPC, "dc1") 581 582 // Try to join. 583 joinLAN(t, c1, s1) 584 retry.Run(t, func(r *retry.R) { 585 if got, want := len(s1.LANMembers()), 2; got != want { 586 r.Fatalf("got %d server members want %d", got, want) 587 } 588 if got, want := len(c1.LANMembers()), 2; got != want { 589 r.Fatalf("got %d client members want %d", got, want) 590 } 591 592 // Wait until we've got a healthy server. 593 if got, want := c1.routers.NumServers(), 1; got != want { 594 r.Fatalf("got %d servers want %d", got, want) 595 } 596 }) 597 598 // Take a snapshot. 599 var snap bytes.Buffer 600 args := structs.SnapshotRequest{ 601 Datacenter: "dc1", 602 Op: structs.SnapshotSave, 603 } 604 if err := c1.SnapshotRPC(&args, bytes.NewReader([]byte("")), &snap, nil); err != nil { 605 t.Fatalf("err: %v", err) 606 } 607 608 // Restore a snapshot. 609 args.Op = structs.SnapshotRestore 610 if err := c1.SnapshotRPC(&args, &snap, nil, nil); err != nil { 611 t.Fatalf("err: %v", err) 612 } 613 } 614 615 func TestClientServer_UserEvent(t *testing.T) { 616 t.Parallel() 617 clientOut := make(chan serf.UserEvent, 2) 618 dir1, c1 := testClientWithConfig(t, func(conf *Config) { 619 conf.UserEventHandler = func(e serf.UserEvent) { 620 clientOut <- e 621 } 622 }) 623 defer os.RemoveAll(dir1) 624 defer c1.Shutdown() 625 626 serverOut := make(chan serf.UserEvent, 2) 627 dir2, s1 := testServerWithConfig(t, func(conf *Config) { 628 conf.UserEventHandler = func(e serf.UserEvent) { 629 serverOut <- e 630 } 631 }) 632 defer os.RemoveAll(dir2) 633 defer s1.Shutdown() 634 635 // Try to join 636 joinLAN(t, c1, s1) 637 638 // Wait for the leader 639 testrpc.WaitForLeader(t, s1.RPC, "dc1") 640 641 // Check the members 642 retry.Run(t, func(r *retry.R) { 643 if got, want := len(s1.LANMembers()), 2; got != want { 644 r.Fatalf("got %d server LAN members want %d", got, want) 645 } 646 if got, want := len(c1.LANMembers()), 2; got != want { 647 r.Fatalf("got %d client LAN members want %d", got, want) 648 } 649 }) 650 651 // Fire the user event 652 codec := rpcClient(t, s1) 653 event := structs.EventFireRequest{ 654 Name: "foo", 655 Datacenter: "dc1", 656 Payload: []byte("baz"), 657 } 658 if err := msgpackrpc.CallWithCodec(codec, "Internal.EventFire", &event, nil); err != nil { 659 t.Fatalf("err: %v", err) 660 } 661 662 // Wait for all the events 663 var clientReceived, serverReceived bool 664 for i := 0; i < 2; i++ { 665 select { 666 case e := <-clientOut: 667 switch e.Name { 668 case "foo": 669 clientReceived = true 670 default: 671 t.Fatalf("Bad: %#v", e) 672 } 673 674 case e := <-serverOut: 675 switch e.Name { 676 case "foo": 677 serverReceived = true 678 default: 679 t.Fatalf("Bad: %#v", e) 680 } 681 682 case <-time.After(10 * time.Second): 683 t.Fatalf("timeout") 684 } 685 } 686 687 if !serverReceived || !clientReceived { 688 t.Fatalf("missing events") 689 } 690 } 691 692 func TestClient_Encrypted(t *testing.T) { 693 t.Parallel() 694 dir1, c1 := testClient(t) 695 defer os.RemoveAll(dir1) 696 defer c1.Shutdown() 697 698 key := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} 699 dir2, c2 := testClientWithConfig(t, func(c *Config) { 700 c.SerfLANConfig.MemberlistConfig.SecretKey = key 701 }) 702 defer os.RemoveAll(dir2) 703 defer c2.Shutdown() 704 705 if c1.Encrypted() { 706 t.Fatalf("should not be encrypted") 707 } 708 if !c2.Encrypted() { 709 t.Fatalf("should be encrypted") 710 } 711 } 712 713 func TestClient_Reload(t *testing.T) { 714 t.Parallel() 715 dir1, c := testClientWithConfig(t, func(c *Config) { 716 c.RPCRate = 500 717 c.RPCMaxBurst = 5000 718 }) 719 defer os.RemoveAll(dir1) 720 defer c.Shutdown() 721 722 limiter := c.rpcLimiter.Load().(*rate.Limiter) 723 require.Equal(t, rate.Limit(500), limiter.Limit()) 724 require.Equal(t, 5000, limiter.Burst()) 725 726 c.config.RPCRate = 1000 727 c.config.RPCMaxBurst = 10000 728 729 require.NoError(t, c.ReloadConfig(c.config)) 730 limiter = c.rpcLimiter.Load().(*rate.Limiter) 731 require.Equal(t, rate.Limit(1000), limiter.Limit()) 732 require.Equal(t, 10000, limiter.Burst()) 733 }