Merge pull request #2541 from hashicorp/f-stable-distributed-id

Hash host ID so its stable and well distributed
This commit is contained in:
Alex Dadgar 2017-04-11 11:27:53 -07:00 committed by GitHub
commit ad5fea9875
2 changed files with 28 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,25 @@ func IsUUID(str string) bool {
return validUUID.MatchString(str)
}
// HashUUID takes an input UUID and returns a hashed version of the UUID to
// ensure it is well distributed.
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