]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/hashicorp/terraform/helper/resource/id.go
629582b3a2da4c2fb0ce41f49e39c8df6534b7a6
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / hashicorp / terraform / helper / resource / id.go
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 }