Make sure to generate UUIDs when services are registered without one

This makes the behavior line up with the docs and expected behavior
This commit is contained in:
Matt Keeler 2018-06-26 17:04:08 -04:00
parent a1be7af835
commit cf69ec42a4
2 changed files with 39 additions and 1 deletions

View File

@ -8,9 +8,11 @@ import (
"time" "time"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
"github.com/hashicorp/consul/types"
"github.com/hashicorp/consul/testutil/retry" "github.com/hashicorp/consul/testutil/retry"
"github.com/hashicorp/serf/coordinate" "github.com/hashicorp/serf/coordinate"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func TestCatalogRegister_Service_InvalidAddress(t *testing.T) { 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) { func TestCatalogNodes_MetaFilter(t *testing.T) {
t.Parallel() t.Parallel()
a := NewTestAgent(t.Name(), "") a := NewTestAgent(t.Name(), "")

View File

@ -37,7 +37,15 @@ func (c *Catalog) Register(args *structs.RegisterRequest, reply *struct{}) error
if _, err := uuid.ParseUUID(string(args.ID)); err != nil { if _, err := uuid.ParseUUID(string(args.ID)); err != nil {
return fmt.Errorf("Bad node ID: %v", err) 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. // Fetch the ACL token, if any.
rule, err := c.srv.resolveToken(args.Token) rule, err := c.srv.resolveToken(args.Token)