github.com/recobe182/terraform@v0.8.5-0.20170117231232-49ab22a935b7/builtin/providers/random/resource_id.go (about) 1 package random 2 3 import ( 4 "crypto/rand" 5 "encoding/base64" 6 "encoding/hex" 7 "errors" 8 "math/big" 9 10 "github.com/hashicorp/errwrap" 11 "github.com/hashicorp/terraform/helper/schema" 12 ) 13 14 func resourceId() *schema.Resource { 15 return &schema.Resource{ 16 Create: CreateID, 17 Read: RepopulateEncodings, 18 Delete: schema.RemoveFromState, 19 20 Schema: map[string]*schema.Schema{ 21 "keepers": { 22 Type: schema.TypeMap, 23 Optional: true, 24 ForceNew: true, 25 }, 26 27 "byte_length": { 28 Type: schema.TypeInt, 29 Required: true, 30 ForceNew: true, 31 }, 32 33 "b64": { 34 Type: schema.TypeString, 35 Computed: true, 36 Deprecated: "Use b64_url for old behavior, or b64_std for standard base64 encoding", 37 }, 38 39 "b64_url": { 40 Type: schema.TypeString, 41 Computed: true, 42 }, 43 44 "b64_std": { 45 Type: schema.TypeString, 46 Computed: true, 47 }, 48 49 "hex": { 50 Type: schema.TypeString, 51 Computed: true, 52 }, 53 54 "dec": { 55 Type: schema.TypeString, 56 Computed: true, 57 }, 58 }, 59 } 60 } 61 62 func CreateID(d *schema.ResourceData, meta interface{}) error { 63 byteLength := d.Get("byte_length").(int) 64 bytes := make([]byte, byteLength) 65 66 n, err := rand.Reader.Read(bytes) 67 if n != byteLength { 68 return errors.New("generated insufficient random bytes") 69 } 70 if err != nil { 71 return errwrap.Wrapf("error generating random bytes: {{err}}", err) 72 } 73 74 b64Str := base64.RawURLEncoding.EncodeToString(bytes) 75 d.SetId(b64Str) 76 77 return RepopulateEncodings(d, meta) 78 } 79 80 func RepopulateEncodings(d *schema.ResourceData, _ interface{}) error { 81 base64Str := d.Id() 82 83 bytes, err := base64.RawURLEncoding.DecodeString(base64Str) 84 if err != nil { 85 return errwrap.Wrapf("Error decoding ID: {{err}}", err) 86 } 87 88 b64StdStr := base64.StdEncoding.EncodeToString(bytes) 89 hexStr := hex.EncodeToString(bytes) 90 91 bigInt := big.Int{} 92 bigInt.SetBytes(bytes) 93 decStr := bigInt.String() 94 95 d.Set("b64", base64Str) 96 d.Set("b64_url", base64Str) 97 d.Set("b64_std", b64StdStr) 98 99 d.Set("hex", hexStr) 100 d.Set("dec", decStr) 101 102 return nil 103 }