package agent import ( "fmt" "os" "path/filepath" "strings" "testing" "github.com/hashicorp/consul/agent/config" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/types" "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-uuid" "github.com/stretchr/testify/require" ) func TestNewNodeIDFromConfig(t *testing.T) { logger := hclog.New(nil) tmpDir := testutil.TempDir(t, "") cfg := &config.RuntimeConfig{ DataDir: tmpDir, } var randomNodeID types.NodeID t.Run("a new ID is generated when none is specified", func(t *testing.T) { var err error randomNodeID, err = newNodeIDFromConfig(cfg, logger) require.NoError(t, err) _, err = uuid.ParseUUID(string(randomNodeID)) require.NoError(t, err) }) t.Run("running again should get the NodeID that was persisted to disk", func(t *testing.T) { nodeID, err := newNodeIDFromConfig(cfg, logger) require.NoError(t, err) require.NotEqual(t, nodeID, "") require.Equal(t, nodeID, randomNodeID) }) t.Run("invalid NodeID in config", func(t *testing.T) { cfg.NodeID = "nope" _, err := newNodeIDFromConfig(cfg, logger) require.Error(t, err) require.Contains(t, err.Error(), "specified NodeID is invalid") }) t.Run("valid NodeID in config", func(t *testing.T) { newID, err := uuid.GenerateUUID() require.NoError(t, err) cfg.NodeID = types.NodeID(strings.ToUpper(newID)) nodeID, err := newNodeIDFromConfig(cfg, logger) require.NoError(t, err) require.Equal(t, string(nodeID), newID) }) t.Run("invalid NodeID in file", func(t *testing.T) { cfg.NodeID = "" filename := filepath.Join(cfg.DataDir, "node-id") err := os.WriteFile(filename, []byte("adf4238a!882b!9ddc!4a9d!5b6758e4159e"), 0600) require.NoError(t, err) _, err = newNodeIDFromConfig(cfg, logger) require.Error(t, err) require.Contains(t, err.Error(), fmt.Sprintf("NodeID in %s is invalid", filename)) }) t.Run("valid NodeID in file", func(t *testing.T) { cfg.NodeID = "" filename := filepath.Join(cfg.DataDir, "node-id") err := os.WriteFile(filename, []byte("ADF4238a-882b-9ddc-4a9d-5b6758e4159e"), 0600) require.NoError(t, err) nodeID, err := newNodeIDFromConfig(cfg, logger) require.NoError(t, err) require.Equal(t, string(nodeID), "adf4238a-882b-9ddc-4a9d-5b6758e4159e") }) } func TestMakeNodeID(t *testing.T) { logger := hclog.New(nil) var randomID string t.Run("Random ID when HostNodeID is disabled", func(t *testing.T) { var err error randomID, err = makeNodeID(logger, true) require.NoError(t, err) _, err = uuid.ParseUUID(randomID) require.NoError(t, err) another, err := makeNodeID(logger, true) require.NoError(t, err) require.NotEqual(t, randomID, another) }) t.Run("host-based ID when HostNodeID is enabled", func(t *testing.T) { id, err := makeNodeID(logger, false) require.NoError(t, err) require.NotEqual(t, randomID, id) another, err := makeNodeID(logger, false) require.NoError(t, err) require.Equal(t, id, another) }) }