Files
threshold/internal/tests/cluster/parallel/multi_controller_worker_test.go
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

192 lines
4.3 KiB
Go
Raw Normal View History

// Copyright (c) HashiCorp, Inc.
2023-02-02 17:15:17 -08:00
// SPDX-License-Identifier: BUSL-1.1
package parallel
2020-08-12 00:40:39 -04:00
import (
"slices"
"sync"
2020-08-12 00:40:39 -04:00
"testing"
"time"
"github.com/hashicorp/boundary/internal/cmd/config"
"github.com/hashicorp/boundary/internal/daemon/controller"
"github.com/hashicorp/boundary/internal/daemon/worker"
2024-01-03 10:41:12 -05:00
"github.com/hashicorp/boundary/internal/tests/helper"
2020-08-12 00:40:39 -04:00
"github.com/hashicorp/go-hclog"
"github.com/stretchr/testify/require"
)
func TestMultiControllerMultiWorkerConnections(t *testing.T) {
t.Parallel()
2021-01-21 16:27:20 -05:00
require := require.New(t)
2020-08-12 00:40:39 -04:00
logger := hclog.New(&hclog.LoggerOptions{
Level: hclog.Trace,
})
conf, err := config.DevController()
require.NoError(err)
2020-08-12 00:40:39 -04:00
c1 := controller.NewTestController(t, &controller.TestControllerOpts{
Config: conf,
Logger: logger.Named("c1"),
2020-08-12 00:40:39 -04:00
})
c2 := c1.AddClusterControllerMember(t, &controller.TestControllerOpts{
Logger: c1.Config().Logger.ResetNamed("c2"),
})
wg := new(sync.WaitGroup)
wg.Add(2)
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c1)
}()
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c2)
}()
wg.Wait()
2020-08-12 00:40:39 -04:00
w1 := worker.NewTestWorker(t, &worker.TestWorkerOpts{
2025-01-09 10:26:37 -08:00
WorkerAuthKms: c1.Config().WorkerAuthKms,
InitialUpstreams: append(c1.ClusterAddrs(), c2.ClusterAddrs()...),
Logger: logger.Named("w1"),
WorkerRPCInterval: time.Second,
2020-08-12 00:40:39 -04:00
})
wg.Add(2)
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c1, w1)
}()
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c2, w1)
}()
wg.Wait()
2020-08-12 00:40:39 -04:00
w2 := w1.AddClusterWorkerMember(t, &worker.TestWorkerOpts{
Logger: logger.Named("w2"),
})
wg.Add(2)
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c1, w1, w2)
}()
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c2, w1, w2)
}()
wg.Wait()
2020-08-12 00:40:39 -04:00
require.NoError(w1.Worker().Shutdown())
wg.Add(2)
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c1, w2)
}()
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c2, w2)
}()
wg.Wait()
2020-08-12 00:40:39 -04:00
w3 := worker.NewTestWorker(t, &worker.TestWorkerOpts{
2025-01-09 10:26:37 -08:00
WorkerAuthKms: c1.Config().WorkerAuthKms,
InitialUpstreams: c1.ClusterAddrs(),
Logger: logger.Named("w3"),
WorkerRPCInterval: time.Second,
})
wg.Add(2)
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c1, w2, w3)
}()
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c2, w2, w3)
}()
wg.Wait()
2020-08-12 00:40:39 -04:00
require.NoError(c2.Controller().Shutdown())
helper.ExpectWorkers(t, c1, w2, w3)
c3 := c1.AddClusterControllerMember(t, &controller.TestControllerOpts{
Logger: c1.Config().Logger.ResetNamed("c3"),
})
2020-08-12 00:40:39 -04:00
wg.Add(2)
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c1, w2, w3)
}()
go func() {
defer wg.Done()
helper.ExpectWorkers(t, c3, w2, w3)
}()
wg.Wait()
2020-08-12 00:40:39 -04:00
}
func TestWorkerAppendInitialUpstreams(t *testing.T) {
t.Parallel()
require := require.New(t)
logger := hclog.New(&hclog.LoggerOptions{
Level: hclog.Trace,
})
conf, err := config.DevController()
require.NoError(err)
c1 := controller.NewTestController(t, &controller.TestControllerOpts{
Config: conf,
Logger: logger.Named("c1"),
})
2024-01-03 10:41:12 -05:00
helper.ExpectWorkers(t, c1)
initialUpstreams := append(c1.ClusterAddrs(), "127.0.0.9")
w1 := worker.NewTestWorker(t, &worker.TestWorkerOpts{
2025-01-09 10:26:37 -08:00
WorkerAuthKms: c1.Config().WorkerAuthKms,
InitialUpstreams: initialUpstreams,
Logger: logger.Named("w1"),
SuccessfulControllerRPCGracePeriodDuration: 1 * time.Second,
WorkerRPCInterval: time.Second,
})
2025-01-09 10:26:37 -08:00
// Wait for worker to send routing info
require.Eventually(func() bool {
if err := w1.Worker().WaitForNextSuccessfulRoutingInfoUpdate(); err != nil {
return false
}
return true
}, 30*time.Second, time.Second)
2025-01-09 10:26:37 -08:00
// Upstreams should be equivalent to the controller cluster addr after routing info updates
require.Eventually(func() bool {
2025-01-09 10:26:37 -08:00
if w1.Worker().LastRoutingInfoSuccess() == nil {
return false
}
2025-01-09 10:26:37 -08:00
return slices.Equal(c1.ClusterAddrs(), w1.Worker().LastRoutingInfoSuccess().LastCalculatedUpstreams)
}, 30*time.Second, time.Second)
// Bring down the controller
wg := new(sync.WaitGroup)
wg.Add(1)
go func() {
defer wg.Done()
c1.Shutdown()
}()
// Upstreams should now match initial upstreams
require.Eventually(func() bool {
2025-01-09 10:26:37 -08:00
return slices.Equal(initialUpstreams, w1.Worker().LastRoutingInfoSuccess().LastCalculatedUpstreams)
}, 30*time.Second, time.Second)
wg.Wait()
}