github.com/hugorut/terraform@v1.1.3/src/cloud/e2e/main_test.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"strings"
    11  	"testing"
    12  
    13  	tfe "github.com/hashicorp/go-tfe"
    14  	tfversion "github.com/hugorut/terraform/version"
    15  )
    16  
    17  var terraformBin string
    18  var cliConfigFileEnv string
    19  
    20  var tfeClient *tfe.Client
    21  var tfeHostname string
    22  var tfeToken string
    23  var verboseMode bool
    24  
    25  func TestMain(m *testing.M) {
    26  	teardown := setup()
    27  	code := m.Run()
    28  	teardown()
    29  
    30  	os.Exit(code)
    31  }
    32  
    33  func accTest() bool {
    34  	// TF_ACC is set when we want to run acceptance tests, meaning it relies on
    35  	// network access.
    36  	return os.Getenv("TF_ACC") != ""
    37  }
    38  
    39  func hasHostname() bool {
    40  	return os.Getenv("TFE_HOSTNAME") != ""
    41  }
    42  
    43  func hasToken() bool {
    44  	return os.Getenv("TFE_TOKEN") != ""
    45  }
    46  
    47  func hasRequiredEnvVars() bool {
    48  	return accTest() && hasHostname() && hasToken()
    49  }
    50  
    51  func skipIfMissingEnvVar(t *testing.T) {
    52  	if !hasRequiredEnvVars() {
    53  		t.Skip("Skipping test, required environment variables missing. Use `TF_ACC`, `TFE_HOSTNAME`, `TFE_TOKEN`")
    54  	}
    55  }
    56  
    57  func setup() func() {
    58  	tfOutput := flag.Bool("tfoutput", false, "This flag produces the terraform output from tests.")
    59  	flag.Parse()
    60  	verboseMode = *tfOutput
    61  
    62  	setTfeClient()
    63  	teardown := setupBinary()
    64  
    65  	return func() {
    66  		teardown()
    67  	}
    68  }
    69  
    70  func setTfeClient() {
    71  	tfeHostname = os.Getenv("TFE_HOSTNAME")
    72  	tfeToken = os.Getenv("TFE_TOKEN")
    73  
    74  	cfg := &tfe.Config{
    75  		Address: fmt.Sprintf("https://%s", tfeHostname),
    76  		Token:   tfeToken,
    77  	}
    78  
    79  	if tfeHostname != "" && tfeToken != "" {
    80  		// Create a new TFE client.
    81  		client, err := tfe.NewClient(cfg)
    82  		if err != nil {
    83  			fmt.Printf("Could not create new tfe client: %v\n", err)
    84  			os.Exit(1)
    85  		}
    86  		tfeClient = client
    87  	}
    88  }
    89  
    90  func setupBinary() func() {
    91  	log.Println("Setting up terraform binary")
    92  	tmpTerraformBinaryDir, err := ioutil.TempDir("", "terraform-test")
    93  	if err != nil {
    94  		fmt.Printf("Could not create temp directory: %v\n", err)
    95  		os.Exit(1)
    96  	}
    97  	log.Println(tmpTerraformBinaryDir)
    98  	currentDir, err := os.Getwd()
    99  	defer os.Chdir(currentDir)
   100  	if err != nil {
   101  		fmt.Printf("Could not change directories: %v\n", err)
   102  		os.Exit(1)
   103  	}
   104  	// Getting top level dir
   105  	dirPaths := strings.Split(currentDir, "/")
   106  	log.Println(currentDir)
   107  	topLevel := len(dirPaths) - 3
   108  	topDir := strings.Join(dirPaths[0:topLevel], "/")
   109  
   110  	if err := os.Chdir(topDir); err != nil {
   111  		fmt.Printf("Could not change directories: %v\n", err)
   112  		os.Exit(1)
   113  	}
   114  
   115  	cmd := exec.Command(
   116  		"go",
   117  		"build",
   118  		"-o", tmpTerraformBinaryDir,
   119  		"-ldflags", fmt.Sprintf("-X \"github.com/hugorut/terraform/version.Prerelease=%s\"", tfversion.Prerelease),
   120  	)
   121  	err = cmd.Run()
   122  	if err != nil {
   123  		fmt.Printf("Could not run exec command: %v\n", err)
   124  		os.Exit(1)
   125  	}
   126  
   127  	credFile := fmt.Sprintf("%s/dev.tfrc", tmpTerraformBinaryDir)
   128  	writeCredRC(credFile)
   129  
   130  	terraformBin = fmt.Sprintf("%s/terraform", tmpTerraformBinaryDir)
   131  	cliConfigFileEnv = fmt.Sprintf("TF_CLI_CONFIG_FILE=%s", credFile)
   132  
   133  	return func() {
   134  		os.RemoveAll(tmpTerraformBinaryDir)
   135  	}
   136  }
   137  
   138  func writeCredRC(file string) {
   139  	creds := credentialBlock()
   140  	f, err := os.Create(file)
   141  	if err != nil {
   142  		fmt.Printf("Could not create file: %v\n", err)
   143  		os.Exit(1)
   144  	}
   145  	_, err = f.WriteString(creds)
   146  	if err != nil {
   147  		fmt.Printf("Could not write credentials: %v\n", err)
   148  		os.Exit(1)
   149  	}
   150  	f.Close()
   151  }
   152  
   153  func credentialBlock() string {
   154  	return fmt.Sprintf(`
   155  credentials "%s" {
   156    token = "%s"
   157  }`, tfeHostname, tfeToken)
   158  }