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  }