diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/helper/resource/id.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/helper/resource/id.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/helper/resource/id.go b/vendor/github.com/hashicorp/terraform/helper/resource/id.go new file mode 100644 index 0000000..629582b --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/helper/resource/id.go | |||
@@ -0,0 +1,39 @@ | |||
1 | package resource | ||
2 | |||
3 | import ( | ||
4 | "crypto/rand" | ||
5 | "fmt" | ||
6 | "math/big" | ||
7 | "sync" | ||
8 | ) | ||
9 | |||
10 | const UniqueIdPrefix = `terraform-` | ||
11 | |||
12 | // idCounter is a randomly seeded monotonic counter for generating ordered | ||
13 | // unique ids. It uses a big.Int so we can easily increment a long numeric | ||
14 | // string. The max possible hex value here with 12 random bytes is | ||
15 | // "01000000000000000000000000", so there's no chance of rollover during | ||
16 | // operation. | ||
17 | var idMutex sync.Mutex | ||
18 | var idCounter = big.NewInt(0).SetBytes(randomBytes(12)) | ||
19 | |||
20 | // Helper for a resource to generate a unique identifier w/ default prefix | ||
21 | func UniqueId() string { | ||
22 | return PrefixedUniqueId(UniqueIdPrefix) | ||
23 | } | ||
24 | |||
25 | // Helper for a resource to generate a unique identifier w/ given prefix | ||
26 | // | ||
27 | // After the prefix, the ID consists of an incrementing 26 digit value (to match | ||
28 | // previous timestamp output). | ||
29 | func PrefixedUniqueId(prefix string) string { | ||
30 | idMutex.Lock() | ||
31 | defer idMutex.Unlock() | ||
32 | return fmt.Sprintf("%s%026x", prefix, idCounter.Add(idCounter, big.NewInt(1))) | ||
33 | } | ||
34 | |||
35 | func randomBytes(n int) []byte { | ||
36 | b := make([]byte, n) | ||
37 | rand.Read(b) | ||
38 | return b | ||
39 | } | ||