From 95291ec5ed0a1696177baa9cc91e0c2a6a50fbec Mon Sep 17 00:00:00 2001 From: Matt Keeler Date: Tue, 26 Jun 2018 17:04:08 -0400 Subject: [PATCH] Make sure to generate UUIDs when services are registered without one This makes the behavior line up with the docs and expected behavior --- agent/catalog_endpoint_test.go | 30 ++++++++++++++++++++++++++++++ agent/consul/catalog_endpoint.go | 10 +++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/agent/catalog_endpoint_test.go b/agent/catalog_endpoint_test.go index f97b22dbc..ada7e2185 100644 --- a/agent/catalog_endpoint_test.go +++ b/agent/catalog_endpoint_test.go @@ -8,9 +8,11 @@ import ( "time" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/types" "github.com/hashicorp/consul/testutil/retry" "github.com/hashicorp/serf/coordinate" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCatalogRegister_Service_InvalidAddress(t *testing.T) { @@ -109,6 +111,34 @@ func TestCatalogNodes(t *testing.T) { } } +func TestCatalog_RegisterNoID(t *testing.T) { + t.Parallel() + a := NewTestAgent(t.Name(), "") + defer a.Shutdown() + + // Register node + args := &structs.RegisterRequest{ + Datacenter: "dc1", + Node: "foo", + Address: "127.0.0.1", + } + + var out struct{} + require.NoError(t, a.RPC("Catalog.Register", args, &out)) + + req, _ := http.NewRequest("GET", "/v1/catalog/node/foo", nil) + resp := httptest.NewRecorder() + obj, err := a.srv.CatalogNodeServices(resp, req) + require.NoError(t, err) + + // Verify an index is set + assertIndex(t, resp) + + node := obj.(*structs.NodeServices) + + require.NotEqual(t, types.NodeID(""), node.Node.ID) +} + func TestCatalogNodes_MetaFilter(t *testing.T) { t.Parallel() a := NewTestAgent(t.Name(), "") diff --git a/agent/consul/catalog_endpoint.go b/agent/consul/catalog_endpoint.go index a31ca59eb..ac17613fe 100644 --- a/agent/consul/catalog_endpoint.go +++ b/agent/consul/catalog_endpoint.go @@ -37,7 +37,15 @@ func (c *Catalog) Register(args *structs.RegisterRequest, reply *struct{}) error if _, err := uuid.ParseUUID(string(args.ID)); err != nil { return fmt.Errorf("Bad node ID: %v", err) } - } + } else { + id, err := uuid.GenerateUUID() + if err != nil { + return fmt.Errorf("Failed to generate ID: %v", err) + } + + args.ID = types.NodeID(id) + } + // Fetch the ACL token, if any. rule, err := c.srv.resolveToken(args.Token)