2020-10-16 13:45:47 -04:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
2023-02-02 17:15:17 -08:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
|
|
2020-08-12 00:40:39 -04:00
|
|
|
package cluster
|
|
|
|
|
|
|
|
|
|
import (
|
2022-12-12 13:48:28 -05:00
|
|
|
"context"
|
2020-08-12 00:40:39 -04:00
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
2020-10-16 13:45:47 -04:00
|
|
|
"github.com/hashicorp/boundary/internal/cmd/config"
|
2022-05-09 12:45:10 -07:00
|
|
|
"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"
|
2022-12-12 13:48:28 -05:00
|
|
|
"github.com/hashicorp/go-secure-stdlib/strutil"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2020-08-12 00:40:39 -04:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestMultiControllerMultiWorkerConnections(t *testing.T) {
|
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,
|
|
|
|
|
})
|
|
|
|
|
|
2020-10-16 13:45:47 -04:00
|
|
|
conf, err := config.DevController()
|
|
|
|
|
require.NoError(err)
|
|
|
|
|
|
2020-08-12 00:40:39 -04:00
|
|
|
c1 := controller.NewTestController(t, &controller.TestControllerOpts{
|
2021-02-11 13:14:18 -05:00
|
|
|
Config: conf,
|
|
|
|
|
Logger: logger.Named("c1"),
|
2020-08-12 00:40:39 -04:00
|
|
|
})
|
|
|
|
|
defer c1.Shutdown()
|
|
|
|
|
|
|
|
|
|
c2 := c1.AddClusterControllerMember(t, &controller.TestControllerOpts{
|
|
|
|
|
Logger: c1.Config().Logger.ResetNamed("c2"),
|
|
|
|
|
})
|
|
|
|
|
defer c2.Shutdown()
|
|
|
|
|
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1)
|
|
|
|
|
helper.ExpectWorkers(t, c2)
|
2020-08-12 00:40:39 -04:00
|
|
|
|
|
|
|
|
w1 := worker.NewTestWorker(t, &worker.TestWorkerOpts{
|
2022-06-13 15:06:03 -07:00
|
|
|
WorkerAuthKms: c1.Config().WorkerAuthKms,
|
|
|
|
|
InitialUpstreams: c1.ClusterAddrs(),
|
|
|
|
|
Logger: logger.Named("w1"),
|
2020-08-12 00:40:39 -04:00
|
|
|
})
|
|
|
|
|
defer w1.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(10 * time.Second)
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w1)
|
|
|
|
|
helper.ExpectWorkers(t, c2, w1)
|
2020-08-12 00:40:39 -04:00
|
|
|
|
|
|
|
|
w2 := w1.AddClusterWorkerMember(t, &worker.TestWorkerOpts{
|
|
|
|
|
Logger: logger.Named("w2"),
|
|
|
|
|
})
|
|
|
|
|
defer w2.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(10 * time.Second)
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w1, w2)
|
|
|
|
|
helper.ExpectWorkers(t, c2, w1, w2)
|
2020-08-12 00:40:39 -04:00
|
|
|
|
2022-03-09 20:21:36 +00:00
|
|
|
require.NoError(w1.Worker().Shutdown())
|
2020-08-12 00:40:39 -04:00
|
|
|
time.Sleep(10 * time.Second)
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w2)
|
|
|
|
|
helper.ExpectWorkers(t, c2, w2)
|
2020-08-12 00:40:39 -04:00
|
|
|
|
2022-03-09 20:21:36 +00:00
|
|
|
w1 = worker.NewTestWorker(t, &worker.TestWorkerOpts{
|
2022-06-13 15:06:03 -07:00
|
|
|
WorkerAuthKms: c1.Config().WorkerAuthKms,
|
|
|
|
|
InitialUpstreams: c1.ClusterAddrs(),
|
|
|
|
|
Logger: logger.Named("w1"),
|
2022-03-09 20:21:36 +00:00
|
|
|
})
|
|
|
|
|
defer w1.Shutdown()
|
|
|
|
|
|
2020-08-12 00:40:39 -04:00
|
|
|
time.Sleep(10 * time.Second)
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w1, w2)
|
|
|
|
|
helper.ExpectWorkers(t, c2, w1, w2)
|
2020-08-12 00:40:39 -04:00
|
|
|
|
2022-03-10 12:54:10 +00:00
|
|
|
require.NoError(c2.Controller().Shutdown())
|
2020-08-12 00:40:39 -04:00
|
|
|
time.Sleep(10 * time.Second)
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w1, w2)
|
2022-03-09 20:21:36 +00:00
|
|
|
|
|
|
|
|
c2 = c1.AddClusterControllerMember(t, &controller.TestControllerOpts{
|
|
|
|
|
Logger: c1.Config().Logger.ResetNamed("c2"),
|
|
|
|
|
})
|
|
|
|
|
defer c2.Shutdown()
|
2020-08-12 00:40:39 -04:00
|
|
|
|
|
|
|
|
time.Sleep(10 * time.Second)
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w1, w2)
|
|
|
|
|
helper.ExpectWorkers(t, c2, w1, w2)
|
2020-08-12 00:40:39 -04:00
|
|
|
}
|
2022-12-12 13:48:28 -05:00
|
|
|
|
|
|
|
|
func TestWorkerAppendInitialUpstreams(t *testing.T) {
|
|
|
|
|
ctx := context.Background()
|
|
|
|
|
require, assert := require.New(t), assert.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"),
|
|
|
|
|
})
|
|
|
|
|
defer c1.Shutdown()
|
|
|
|
|
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1)
|
2022-12-12 13:48:28 -05:00
|
|
|
|
|
|
|
|
initialUpstreams := append(c1.ClusterAddrs(), "127.0.0.9")
|
|
|
|
|
w1 := worker.NewTestWorker(t, &worker.TestWorkerOpts{
|
|
|
|
|
WorkerAuthKms: c1.Config().WorkerAuthKms,
|
|
|
|
|
InitialUpstreams: initialUpstreams,
|
|
|
|
|
Logger: logger.Named("w1"),
|
|
|
|
|
SuccessfulStatusGracePeriodDuration: 1 * time.Second,
|
|
|
|
|
})
|
|
|
|
|
defer w1.Shutdown()
|
|
|
|
|
|
|
|
|
|
// Wait for worker to send status
|
2023-04-03 17:44:41 -04:00
|
|
|
cancelCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
|
|
|
|
t.Cleanup(cancel)
|
2022-12-12 13:48:28 -05:00
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-time.After(500 * time.Millisecond):
|
|
|
|
|
case <-cancelCtx.Done():
|
|
|
|
|
require.FailNow("No worker found after 10 seconds")
|
|
|
|
|
}
|
|
|
|
|
successSent := w1.Worker().LastStatusSuccess()
|
|
|
|
|
if successSent != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-01-03 10:41:12 -05:00
|
|
|
helper.ExpectWorkers(t, c1, w1)
|
2022-12-12 13:48:28 -05:00
|
|
|
|
|
|
|
|
// Upstreams should be equivalent to the controller cluster addr after status updates
|
|
|
|
|
assert.Equal(c1.ClusterAddrs(), w1.Worker().LastStatusSuccess().LastCalculatedUpstreams)
|
|
|
|
|
|
|
|
|
|
// Bring down the controller
|
|
|
|
|
c1.Shutdown()
|
|
|
|
|
time.Sleep(3 * time.Second) // Wait a little longer than the grace period
|
|
|
|
|
|
|
|
|
|
// Upstreams should now match initial upstreams
|
|
|
|
|
assert.True(strutil.EquivalentSlices(initialUpstreams, w1.Worker().LastStatusSuccess().LastCalculatedUpstreams))
|
|
|
|
|
}
|