summaryrefslogtreecommitdiff
path: root/vendor/github.com/hashicorp/terraform/helper/resource/id.go
blob: 629582b3a2da4c2fb0ce41f49e39c8df6534b7a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package resource

import (
	"crypto/rand"
	"fmt"
	"math/big"
	"sync"
)

const UniqueIdPrefix = `terraform-`

// idCounter is a randomly seeded monotonic counter for generating ordered
// unique ids.  It uses a big.Int so we can easily increment a long numeric
// string.  The max possible hex value here with 12 random bytes is
// "01000000000000000000000000", so there's no chance of rollover during
// operation.
var idMutex sync.Mutex
var idCounter = big.NewInt(0).SetBytes(randomBytes(12))

// Helper for a resource to generate a unique identifier w/ default prefix
func UniqueId() string {
	return PrefixedUniqueId(UniqueIdPrefix)
}

// Helper for a resource to generate a unique identifier w/ given prefix
//
// After the prefix, the ID consists of an incrementing 26 digit value (to match
// previous timestamp output).
func PrefixedUniqueId(prefix string) string {
	idMutex.Lock()
	defer idMutex.Unlock()
	return fmt.Sprintf("%s%026x", prefix, idCounter.Add(idCounter, big.NewInt(1)))
}

func randomBytes(n int) []byte {
	b := make([]byte, n)
	rand.Read(b)
	return b
}