mirror of
https://github.com/status-im/consul.git
synced 2025-01-27 05:57:03 +00:00
fac3ddc857
A previous commit introduced an internally-managed server certificate to use for peering-related purposes. Now the peering token has been updated to match that behavior: - The server name matches the structure of the server cert - The CA PEMs correspond to the Connect CA Note that if Conect is disabled, and by extension the Connect CA, we fall back to the previous behavior of returning the manually configured certs and local server SNI. Several tests were updated to use the gRPC TLS port since they enable Connect by default. This means that the peering token will embed the Connect CA, and the dialer will expect a TLS listener.
133 lines
3.4 KiB
Go
133 lines
3.4 KiB
Go
package establish
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/mitchellh/cli"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/hashicorp/consul/agent"
|
|
"github.com/hashicorp/consul/api"
|
|
"github.com/hashicorp/consul/sdk/testutil/retry"
|
|
"github.com/hashicorp/consul/testrpc"
|
|
)
|
|
|
|
func TestEstablishCommand_noTabs(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if strings.ContainsRune(New(cli.NewMockUi()).Help(), '\t') {
|
|
t.Fatal("help has tabs")
|
|
}
|
|
}
|
|
|
|
func TestEstablishCommand(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("too slow for testing.Short")
|
|
}
|
|
|
|
t.Parallel()
|
|
|
|
acceptor := agent.NewTestAgent(t, ``)
|
|
t.Cleanup(func() { _ = acceptor.Shutdown() })
|
|
|
|
dialer := agent.NewTestAgent(t, `datacenter = "dc2"`)
|
|
t.Cleanup(func() { _ = dialer.Shutdown() })
|
|
|
|
testrpc.WaitForTestAgent(t, acceptor.RPC, "dc1")
|
|
testrpc.WaitForTestAgent(t, dialer.RPC, "dc2")
|
|
|
|
acceptingClient := acceptor.Client()
|
|
dialingClient := dialer.Client()
|
|
|
|
t.Run("name is required", func(t *testing.T) {
|
|
ui := cli.NewMockUi()
|
|
cmd := New(ui)
|
|
|
|
args := []string{
|
|
"-http-addr=" + dialer.HTTPAddr(),
|
|
"-peering-token=1234abcde",
|
|
}
|
|
|
|
code := cmd.Run(args)
|
|
require.Equal(t, 1, code, "err: %s", ui.ErrorWriter.String())
|
|
require.Contains(t, ui.ErrorWriter.String(), "Missing the required -name flag")
|
|
})
|
|
|
|
t.Run("peering token is required", func(t *testing.T) {
|
|
ui := cli.NewMockUi()
|
|
cmd := New(ui)
|
|
|
|
args := []string{
|
|
"-http-addr=" + dialer.HTTPAddr(),
|
|
"-name=bar",
|
|
}
|
|
|
|
code := cmd.Run(args)
|
|
require.Equal(t, 1, code, "err: %s", ui.ErrorWriter.String())
|
|
require.Contains(t, ui.ErrorWriter.String(), "Missing the required -peering-token flag")
|
|
})
|
|
|
|
t.Run("establish connection", func(t *testing.T) {
|
|
// Grab the token from the acceptor
|
|
req := api.PeeringGenerateTokenRequest{PeerName: "foo"}
|
|
res, _, err := acceptingClient.Peerings().GenerateToken(context.Background(), req, &api.WriteOptions{})
|
|
require.NoError(t, err, "Could not generate peering token at acceptor")
|
|
|
|
ui := cli.NewMockUi()
|
|
cmd := New(ui)
|
|
|
|
args := []string{
|
|
"-http-addr=" + dialer.HTTPAddr(),
|
|
"-name=bar",
|
|
fmt.Sprintf("-peering-token=%s", res.PeeringToken),
|
|
}
|
|
|
|
retry.Run(t, func(r *retry.R) {
|
|
code := cmd.Run(args)
|
|
require.Equal(r, 0, code)
|
|
output := ui.OutputWriter.String()
|
|
require.Contains(r, output, "Success")
|
|
})
|
|
})
|
|
|
|
t.Run("establish connection with options", func(t *testing.T) {
|
|
// Grab the token from the acceptor
|
|
req := api.PeeringGenerateTokenRequest{PeerName: "foo"}
|
|
res, _, err := acceptingClient.Peerings().GenerateToken(context.Background(), req, &api.WriteOptions{})
|
|
require.NoError(t, err, "Could not generate peering token at acceptor")
|
|
|
|
ui := cli.NewMockUi()
|
|
cmd := New(ui)
|
|
|
|
args := []string{
|
|
"-http-addr=" + dialer.HTTPAddr(),
|
|
"-name=bar",
|
|
fmt.Sprintf("-peering-token=%s", res.PeeringToken),
|
|
"-meta=env=production",
|
|
"-meta=region=us-west-1",
|
|
}
|
|
|
|
retry.Run(t, func(r *retry.R) {
|
|
code := cmd.Run(args)
|
|
require.Equal(r, 0, code)
|
|
output := ui.OutputWriter.String()
|
|
require.Contains(r, output, "Success")
|
|
})
|
|
|
|
// Meta
|
|
peering, _, err := dialingClient.Peerings().Read(context.Background(), "bar", &api.QueryOptions{})
|
|
require.NoError(t, err)
|
|
|
|
actual, ok := peering.Meta["env"]
|
|
require.True(t, ok)
|
|
require.Equal(t, "production", actual)
|
|
|
|
actual, ok = peering.Meta["region"]
|
|
require.True(t, ok)
|
|
require.Equal(t, "us-west-1", actual)
|
|
})
|
|
}
|