2014-08-25 18:48:20 +00:00
|
|
|
package google
|
|
|
|
|
|
|
|
import (
|
2017-04-28 19:17:08 +00:00
|
|
|
"fmt"
|
2016-01-04 19:19:46 +00:00
|
|
|
"io/ioutil"
|
2014-08-25 18:48:20 +00:00
|
|
|
"os"
|
2016-04-10 23:31:40 +00:00
|
|
|
"strings"
|
2014-08-25 18:48:20 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
|
|
"github.com/hashicorp/terraform/terraform"
|
|
|
|
)
|
|
|
|
|
|
|
|
var testAccProviders map[string]terraform.ResourceProvider
|
|
|
|
var testAccProvider *schema.Provider
|
|
|
|
|
2017-09-12 20:28:31 +00:00
|
|
|
var credsEnvVars = []string{
|
|
|
|
"GOOGLE_CREDENTIALS",
|
|
|
|
"GOOGLE_CLOUD_KEYFILE_JSON",
|
|
|
|
"GCLOUD_KEYFILE_JSON",
|
|
|
|
"GOOGLE_USE_DEFAULT_CREDENTIALS",
|
|
|
|
}
|
|
|
|
|
|
|
|
var projectEnvVars = []string{
|
|
|
|
"GOOGLE_PROJECT",
|
|
|
|
"GCLOUD_PROJECT",
|
|
|
|
"CLOUDSDK_CORE_PROJECT",
|
|
|
|
}
|
|
|
|
|
|
|
|
var regionEnvVars = []string{
|
|
|
|
"GOOGLE_REGION",
|
|
|
|
"GCLOUD_REGION",
|
|
|
|
"CLOUDSDK_COMPUTE_REGION",
|
|
|
|
}
|
|
|
|
|
2017-11-20 23:45:51 +00:00
|
|
|
var orgEnvVars = []string{
|
|
|
|
"GOOGLE_ORG",
|
|
|
|
}
|
|
|
|
|
|
|
|
var billingAccountEnvVars = []string{
|
|
|
|
"GOOGLE_BILLING_ACCOUNT",
|
|
|
|
}
|
|
|
|
|
2014-08-25 18:48:20 +00:00
|
|
|
func init() {
|
2014-09-28 18:53:53 +00:00
|
|
|
testAccProvider = Provider().(*schema.Provider)
|
2014-08-25 18:48:20 +00:00
|
|
|
testAccProviders = map[string]terraform.ResourceProvider{
|
|
|
|
"google": testAccProvider,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestProvider(t *testing.T) {
|
2014-09-28 18:53:53 +00:00
|
|
|
if err := Provider().(*schema.Provider).InternalValidate(); err != nil {
|
2014-08-25 18:48:20 +00:00
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestProvider_impl(t *testing.T) {
|
|
|
|
var _ terraform.ResourceProvider = Provider()
|
|
|
|
}
|
|
|
|
|
|
|
|
func testAccPreCheck(t *testing.T) {
|
2016-01-04 19:19:46 +00:00
|
|
|
if v := os.Getenv("GOOGLE_CREDENTIALS_FILE"); v != "" {
|
|
|
|
creds, err := ioutil.ReadFile(v)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Error reading GOOGLE_CREDENTIALS_FILE path: %s", err)
|
|
|
|
}
|
|
|
|
os.Setenv("GOOGLE_CREDENTIALS", string(creds))
|
|
|
|
}
|
|
|
|
|
2017-09-12 20:28:31 +00:00
|
|
|
if v := multiEnvSearch(credsEnvVars); v == "" {
|
|
|
|
t.Fatalf("One of %s must be set for acceptance tests", strings.Join(credsEnvVars, ", "))
|
2014-09-02 13:49:16 +00:00
|
|
|
}
|
2014-11-20 10:25:23 +00:00
|
|
|
|
2017-09-12 20:28:31 +00:00
|
|
|
if v := multiEnvSearch(projectEnvVars); v == "" {
|
|
|
|
t.Fatalf("One of %s must be set for acceptance tests", strings.Join(projectEnvVars, ", "))
|
2016-04-10 23:31:40 +00:00
|
|
|
}
|
|
|
|
|
2017-09-12 20:28:31 +00:00
|
|
|
if v := multiEnvSearch(regionEnvVars); v != "us-central1" {
|
|
|
|
t.Fatalf("One of %s must be set to us-central1 for acceptance tests", strings.Join(regionEnvVars, ", "))
|
2014-11-20 10:25:23 +00:00
|
|
|
}
|
2014-08-25 18:48:20 +00:00
|
|
|
}
|
2016-02-16 03:04:44 +00:00
|
|
|
|
|
|
|
func TestProvider_getRegionFromZone(t *testing.T) {
|
|
|
|
expected := "us-central1"
|
|
|
|
actual := getRegionFromZone("us-central1-f")
|
|
|
|
if expected != actual {
|
|
|
|
t.Fatalf("Region (%s) did not match expected value: %s", actual, expected)
|
|
|
|
}
|
|
|
|
}
|
2017-04-28 19:17:08 +00:00
|
|
|
|
|
|
|
// getTestRegion has the same logic as the provider's getRegion, to be used in tests.
|
|
|
|
func getTestRegion(is *terraform.InstanceState, config *Config) (string, error) {
|
|
|
|
if res, ok := is.Attributes["region"]; ok {
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
if config.Region != "" {
|
|
|
|
return config.Region, nil
|
|
|
|
}
|
|
|
|
return "", fmt.Errorf("%q: required field is not set", "region")
|
|
|
|
}
|
|
|
|
|
|
|
|
// getTestProject has the same logic as the provider's getProject, to be used in tests.
|
|
|
|
func getTestProject(is *terraform.InstanceState, config *Config) (string, error) {
|
|
|
|
if res, ok := is.Attributes["project"]; ok {
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
if config.Project != "" {
|
|
|
|
return config.Project, nil
|
|
|
|
}
|
|
|
|
return "", fmt.Errorf("%q: required field is not set", "project")
|
|
|
|
}
|
2017-09-12 20:28:31 +00:00
|
|
|
|
2017-11-21 17:34:32 +00:00
|
|
|
// testAccPreCheck ensures at least one of the project env variables is set.
|
2017-09-12 20:28:31 +00:00
|
|
|
func getTestProjectFromEnv() string {
|
|
|
|
return multiEnvSearch(projectEnvVars)
|
|
|
|
}
|
|
|
|
|
2017-11-21 17:34:32 +00:00
|
|
|
// testAccPreCheck ensures at least one of the credentials env variables is set.
|
|
|
|
func getTestCredsFromEnv() string {
|
|
|
|
return multiEnvSearch(credsEnvVars)
|
|
|
|
}
|
|
|
|
|
|
|
|
// testAccPreCheck ensures at least one of the region env variables is set.
|
|
|
|
func getTestRegionFromEnv() string {
|
|
|
|
return multiEnvSearch(regionEnvVars)
|
|
|
|
}
|
|
|
|
|
2017-11-20 23:45:51 +00:00
|
|
|
func getTestOrgFromEnv(t *testing.T) string {
|
|
|
|
skipIfEnvNotSet(t, orgEnvVars...)
|
|
|
|
return multiEnvSearch(orgEnvVars)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getTestBillingAccountFromEnv(t *testing.T) string {
|
|
|
|
skipIfEnvNotSet(t, billingAccountEnvVars...)
|
|
|
|
return multiEnvSearch(billingAccountEnvVars)
|
|
|
|
}
|
|
|
|
|
2017-09-12 20:28:31 +00:00
|
|
|
func multiEnvSearch(ks []string) string {
|
|
|
|
for _, k := range ks {
|
|
|
|
if v := os.Getenv(k); v != "" {
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|