github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/helper/acctest/random.go (about)

     1  package acctest
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	crand "crypto/rand"
     7  	"crypto/rsa"
     8  	"crypto/x509"
     9  	"encoding/pem"
    10  	"fmt"
    11  	"math/rand"
    12  	"strings"
    13  	"time"
    14  
    15  	"golang.org/x/crypto/ssh"
    16  )
    17  
    18  // Helpers for generating random tidbits for use in identifiers to prevent
    19  // collisions in acceptance tests.
    20  
    21  // RandInt generates a random integer
    22  func RandInt() int {
    23  	reseed()
    24  	return rand.New(rand.NewSource(time.Now().UnixNano())).Int()
    25  }
    26  
    27  // RandomWithPrefix is used to generate a unique name with a prefix, for
    28  // randomizing names in acceptance tests
    29  func RandomWithPrefix(name string) string {
    30  	reseed()
    31  	return fmt.Sprintf("%s-%d", name, rand.New(rand.NewSource(time.Now().UnixNano())).Int())
    32  }
    33  
    34  func RandIntRange(min int, max int) int {
    35  	reseed()
    36  	source := rand.New(rand.NewSource(time.Now().UnixNano()))
    37  	rangeMax := max - min
    38  
    39  	return int(source.Int31n(int32(rangeMax)))
    40  }
    41  
    42  // RandString generates a random alphanumeric string of the length specified
    43  func RandString(strlen int) string {
    44  	return RandStringFromCharSet(strlen, CharSetAlphaNum)
    45  }
    46  
    47  // RandStringFromCharSet generates a random string by selecting characters from
    48  // the charset provided
    49  func RandStringFromCharSet(strlen int, charSet string) string {
    50  	reseed()
    51  	result := make([]byte, strlen)
    52  	for i := 0; i < strlen; i++ {
    53  		result[i] = charSet[rand.Intn(len(charSet))]
    54  	}
    55  	return string(result)
    56  }
    57  
    58  // RandSSHKeyPair generates a public and private SSH key pair. The public key is
    59  // returned in OpenSSH format, and the private key is PEM encoded.
    60  func RandSSHKeyPair(comment string) (string, string, error) {
    61  	privateKey, err := rsa.GenerateKey(crand.Reader, 1024)
    62  	if err != nil {
    63  		return "", "", err
    64  	}
    65  
    66  	var privateKeyBuffer bytes.Buffer
    67  	privateKeyPEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)}
    68  	if err := pem.Encode(bufio.NewWriter(&privateKeyBuffer), privateKeyPEM); err != nil {
    69  		return "", "", err
    70  	}
    71  
    72  	publicKey, err := ssh.NewPublicKey(&privateKey.PublicKey)
    73  	if err != nil {
    74  		return "", "", err
    75  	}
    76  	keyMaterial := strings.TrimSpace(string(ssh.MarshalAuthorizedKey(publicKey)))
    77  	return fmt.Sprintf("%s %s", keyMaterial, comment), privateKeyBuffer.String(), nil
    78  }
    79  
    80  // Seeds random with current timestamp
    81  func reseed() {
    82  	rand.Seed(time.Now().UTC().UnixNano())
    83  }
    84  
    85  const (
    86  	// CharSetAlphaNum is the alphanumeric character set for use with
    87  	// RandStringFromCharSet
    88  	CharSetAlphaNum = "abcdefghijklmnopqrstuvwxyz012346789"
    89  
    90  	// CharSetAlpha is the alphabetical character set for use with
    91  	// RandStringFromCharSet
    92  	CharSetAlpha = "abcdefghijklmnopqrstuvwxyz"
    93  )