// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package agent import ( "fmt" "net/http" "testing" "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/testrpc" "github.com/stretchr/testify/require" ) func TestStatusLeader(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") } t.Parallel() a := NewTestAgent(t, "") defer a.Shutdown() testrpc.WaitForLeader(t, a.RPC, "dc1") req, _ := http.NewRequest("GET", "/v1/status/leader", nil) obj, err := a.srv.StatusLeader(nil, req) if err != nil { t.Fatalf("Err: %v", err) } val := obj.(string) if val == "" { t.Fatalf("bad addr: %v", obj) } } func TestStatusLeaderSecondary(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") } t.Parallel() a1 := NewTestAgent(t, "datacenter = \"primary\"") defer a1.Shutdown() a2 := NewTestAgent(t, "datacenter = \"secondary\"") defer a2.Shutdown() testrpc.WaitForTestAgent(t, a1.RPC, "primary") testrpc.WaitForTestAgent(t, a2.RPC, "secondary") a1SerfAddr := fmt.Sprintf("127.0.0.1:%d", a1.Config.SerfPortWAN) a1Addr := fmt.Sprintf("127.0.0.1:%d", a1.Config.ServerPort) a2Addr := fmt.Sprintf("127.0.0.1:%d", a2.Config.ServerPort) _, err := a2.JoinWAN([]string{a1SerfAddr}) require.NoError(t, err) retry.Run(t, func(r *retry.R) { require.Len(r, a1.WANMembers(), 2) require.Len(r, a2.WANMembers(), 2) }) testrpc.WaitForLeader(t, a1.RPC, "secondary") testrpc.WaitForLeader(t, a2.RPC, "primary") req, _ := http.NewRequest("GET", "/v1/status/leader?dc=secondary", nil) obj, err := a1.srv.StatusLeader(nil, req) require.NoError(t, err) leader, ok := obj.(string) require.True(t, ok) require.Equal(t, a2Addr, leader) req, _ = http.NewRequest("GET", "/v1/status/leader?dc=primary", nil) obj, err = a2.srv.StatusLeader(nil, req) require.NoError(t, err) leader, ok = obj.(string) require.True(t, ok) require.Equal(t, a1Addr, leader) } func TestStatusPeers(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") } t.Parallel() a := NewTestAgent(t, "") defer a.Shutdown() req, _ := http.NewRequest("GET", "/v1/status/peers", nil) obj, err := a.srv.StatusPeers(nil, req) if err != nil { t.Fatalf("Err: %v", err) } peers := obj.([]string) if len(peers) != 1 { t.Fatalf("bad peers: %v", peers) } } func TestStatusPeersSecondary(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") } t.Parallel() a1 := NewTestAgent(t, "datacenter = \"primary\"") defer a1.Shutdown() a2 := NewTestAgent(t, "datacenter = \"secondary\"") defer a2.Shutdown() testrpc.WaitForTestAgent(t, a1.RPC, "primary") testrpc.WaitForTestAgent(t, a2.RPC, "secondary") a1SerfAddr := fmt.Sprintf("127.0.0.1:%d", a1.Config.SerfPortWAN) a1Addr := fmt.Sprintf("127.0.0.1:%d", a1.Config.ServerPort) a2Addr := fmt.Sprintf("127.0.0.1:%d", a2.Config.ServerPort) _, err := a2.JoinWAN([]string{a1SerfAddr}) require.NoError(t, err) retry.Run(t, func(r *retry.R) { require.Len(r, a1.WANMembers(), 2) require.Len(r, a2.WANMembers(), 2) }) testrpc.WaitForLeader(t, a1.RPC, "secondary") testrpc.WaitForLeader(t, a2.RPC, "primary") req, _ := http.NewRequest("GET", "/v1/status/peers?dc=secondary", nil) obj, err := a1.srv.StatusPeers(nil, req) require.NoError(t, err) peers, ok := obj.([]string) require.True(t, ok) require.Equal(t, []string{a2Addr}, peers) req, _ = http.NewRequest("GET", "/v1/status/peers?dc=primary", nil) obj, err = a2.srv.StatusPeers(nil, req) require.NoError(t, err) peers, ok = obj.([]string) require.True(t, ok) require.Equal(t, []string{a1Addr}, peers) }