Skip to content

Commit

Permalink
Hash host ID so its stable and well distributed
Browse files Browse the repository at this point in the history
This PR takes the host ID and runs it through a hash so that it is well
distributed. This makes it so that machines that report similar host IDs
are easily distinguished.

Instances of similar IDs occur on EC2 where the ID is prefixed and on
motherboards created in the same batch.

Fixes #2534
  • Loading branch information
dadgar committed Apr 10, 2017
1 parent db11e7d commit 68ba51c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
10 changes: 7 additions & 3 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -655,9 +655,13 @@ func (c *Client) getAllocRunners() map[string]*AllocRunner {
func (c *Client) nodeID() (id, secret string, err error) {
var hostID string
hostInfo, err := host.Info()
if !c.config.NoHostUUID && err == nil && helper.IsUUID(hostInfo.HostID) {
hostID = hostInfo.HostID
} else {
if !c.config.NoHostUUID && err == nil {
if hashed, ok := helper.HashUUID(hostInfo.HostID); ok {
hostID = hashed
}
}

if hostID == "" {
// Generate a random hostID if no constant ID is available on
// this platform.
hostID = structs.GenerateUUID()
Expand Down
19 changes: 19 additions & 0 deletions helper/funcs.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package helper

import (
"crypto/sha512"
"fmt"
"regexp"
"time"
)
Expand All @@ -18,6 +20,23 @@ func IsUUID(str string) bool {
return validUUID.MatchString(str)
}

func HashUUID(input string) (output string, hashed bool) {
if !IsUUID(input) {
return "", false
}

// Hash the input
buf := sha512.Sum512([]byte(input))
output = fmt.Sprintf("%08x-%04x-%04x-%04x-%12x",
buf[0:4],
buf[4:6],
buf[6:8],
buf[8:10],
buf[10:16])

return output, true
}

// boolToPtr returns the pointer to a boolean
func BoolToPtr(b bool) *bool {
return &b
Expand Down

0 comments on commit 68ba51c

Please sign in to comment.