github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/helper/resource/id.go (about)

     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  }