Hash host ID so its stable and well distributed

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 https://github.com/hashicorp/nomad/issues/2534
This commit is contained in:
Alex Dadgar 2017-04-10 11:44:51 -07:00
parent d2a64d3fd3
commit 2321e8a4a0
2 changed files with 26 additions and 3 deletions

View File

@ -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()

View File

@ -1,6 +1,8 @@
package helper
import (
"crypto/sha512"
"fmt"
"regexp"
"time"
)
@ -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