238 lines
5.9 KiB
Go
238 lines
5.9 KiB
Go
package openstack
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/terraform/config"
|
|
"github.com/hashicorp/terraform/helper/pathorcontents"
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
"github.com/hashicorp/terraform/terraform"
|
|
)
|
|
|
|
var (
|
|
OS_EXTGW_ID = os.Getenv("OS_EXTGW_ID")
|
|
OS_FLAVOR_ID = os.Getenv("OS_FLAVOR_ID")
|
|
OS_FLAVOR_NAME = os.Getenv("OS_FLAVOR_NAME")
|
|
OS_IMAGE_ID = os.Getenv("OS_IMAGE_ID")
|
|
OS_IMAGE_NAME = os.Getenv("OS_IMAGE_NAME")
|
|
OS_NETWORK_ID = os.Getenv("OS_NETWORK_ID")
|
|
OS_POOL_NAME = os.Getenv("OS_POOL_NAME")
|
|
OS_REGION_NAME = os.Getenv("OS_REGION_NAME")
|
|
)
|
|
|
|
var testAccProviders map[string]terraform.ResourceProvider
|
|
var testAccProvider *schema.Provider
|
|
|
|
func init() {
|
|
testAccProvider = Provider().(*schema.Provider)
|
|
testAccProviders = map[string]terraform.ResourceProvider{
|
|
"openstack": testAccProvider,
|
|
}
|
|
}
|
|
|
|
func testAccPreCheck(t *testing.T) {
|
|
v := os.Getenv("OS_AUTH_URL")
|
|
if v == "" {
|
|
t.Fatal("OS_AUTH_URL must be set for acceptance tests")
|
|
}
|
|
|
|
if OS_IMAGE_ID == "" || OS_IMAGE_NAME == "" {
|
|
t.Fatal("OS_IMAGE_ID and OS_IMAGE_NAME must be set for acceptance tests")
|
|
}
|
|
|
|
if OS_POOL_NAME == "" {
|
|
t.Fatal("OS_POOL_NAME must be set for acceptance tests")
|
|
}
|
|
|
|
if OS_FLAVOR_ID == "" && OS_FLAVOR_NAME == "" {
|
|
t.Fatal("OS_FLAVOR_ID or OS_FLAVOR_NAME must be set for acceptance tests")
|
|
}
|
|
|
|
if OS_NETWORK_ID == "" {
|
|
t.Fatal("OS_NETWORK_ID must be set for acceptance tests")
|
|
}
|
|
|
|
if OS_EXTGW_ID == "" {
|
|
t.Fatal("OS_EXTGW_ID must be set for acceptance tests")
|
|
}
|
|
}
|
|
|
|
func testAccPreCheckAdminOnly(t *testing.T) {
|
|
v := os.Getenv("OS_USERNAME")
|
|
if v != "admin" {
|
|
t.Skip("Skipping test because it requires the admin user")
|
|
}
|
|
}
|
|
|
|
func TestProvider(t *testing.T) {
|
|
if err := Provider().(*schema.Provider).InternalValidate(); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
func TestProvider_impl(t *testing.T) {
|
|
var _ terraform.ResourceProvider = Provider()
|
|
}
|
|
|
|
// Steps for configuring OpenStack with SSL validation are here:
|
|
// https://github.com/hashicorp/terraform/pull/6279#issuecomment-219020144
|
|
func TestAccProvider_caCertFile(t *testing.T) {
|
|
if os.Getenv("TF_ACC") == "" || os.Getenv("OS_SSL_TESTS") == "" {
|
|
t.Skip("TF_ACC or OS_SSL_TESTS not set, skipping OpenStack SSL test.")
|
|
}
|
|
if os.Getenv("OS_CACERT") == "" {
|
|
t.Skip("OS_CACERT is not set; skipping OpenStack CA test.")
|
|
}
|
|
|
|
p := Provider()
|
|
|
|
caFile, err := envVarFile("OS_CACERT")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.Remove(caFile)
|
|
|
|
raw := map[string]interface{}{
|
|
"cacert_file": caFile,
|
|
}
|
|
rawConfig, err := config.NewRawConfig(raw)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
err = p.Configure(terraform.NewResourceConfig(rawConfig))
|
|
if err != nil {
|
|
t.Fatalf("Unexpected err when specifying OpenStack CA by file: %s", err)
|
|
}
|
|
}
|
|
|
|
func TestAccProvider_caCertString(t *testing.T) {
|
|
if os.Getenv("TF_ACC") == "" || os.Getenv("OS_SSL_TESTS") == "" {
|
|
t.Skip("TF_ACC or OS_SSL_TESTS not set, skipping OpenStack SSL test.")
|
|
}
|
|
if os.Getenv("OS_CACERT") == "" {
|
|
t.Skip("OS_CACERT is not set; skipping OpenStack CA test.")
|
|
}
|
|
|
|
p := Provider()
|
|
|
|
caContents, err := envVarContents("OS_CACERT")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
raw := map[string]interface{}{
|
|
"cacert_file": caContents,
|
|
}
|
|
rawConfig, err := config.NewRawConfig(raw)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
err = p.Configure(terraform.NewResourceConfig(rawConfig))
|
|
if err != nil {
|
|
t.Fatalf("Unexpected err when specifying OpenStack CA by string: %s", err)
|
|
}
|
|
}
|
|
|
|
func TestAccProvider_clientCertFile(t *testing.T) {
|
|
if os.Getenv("TF_ACC") == "" || os.Getenv("OS_SSL_TESTS") == "" {
|
|
t.Skip("TF_ACC or OS_SSL_TESTS not set, skipping OpenStack SSL test.")
|
|
}
|
|
if os.Getenv("OS_CERT") == "" || os.Getenv("OS_KEY") == "" {
|
|
t.Skip("OS_CERT or OS_KEY is not set; skipping OpenStack client SSL auth test.")
|
|
}
|
|
|
|
p := Provider()
|
|
|
|
certFile, err := envVarFile("OS_CERT")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.Remove(certFile)
|
|
keyFile, err := envVarFile("OS_KEY")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.Remove(keyFile)
|
|
|
|
raw := map[string]interface{}{
|
|
"cert": certFile,
|
|
"key": keyFile,
|
|
}
|
|
rawConfig, err := config.NewRawConfig(raw)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
err = p.Configure(terraform.NewResourceConfig(rawConfig))
|
|
if err != nil {
|
|
t.Fatalf("Unexpected err when specifying OpenStack Client keypair by file: %s", err)
|
|
}
|
|
}
|
|
|
|
func TestAccProvider_clientCertString(t *testing.T) {
|
|
if os.Getenv("TF_ACC") == "" || os.Getenv("OS_SSL_TESTS") == "" {
|
|
t.Skip("TF_ACC or OS_SSL_TESTS not set, skipping OpenStack SSL test.")
|
|
}
|
|
if os.Getenv("OS_CERT") == "" || os.Getenv("OS_KEY") == "" {
|
|
t.Skip("OS_CERT or OS_KEY is not set; skipping OpenStack client SSL auth test.")
|
|
}
|
|
|
|
p := Provider()
|
|
|
|
certContents, err := envVarContents("OS_CERT")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
keyContents, err := envVarContents("OS_KEY")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
raw := map[string]interface{}{
|
|
"cert": certContents,
|
|
"key": keyContents,
|
|
}
|
|
rawConfig, err := config.NewRawConfig(raw)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
err = p.Configure(terraform.NewResourceConfig(rawConfig))
|
|
if err != nil {
|
|
t.Fatalf("Unexpected err when specifying OpenStack Client keypair by contents: %s", err)
|
|
}
|
|
}
|
|
|
|
func envVarContents(varName string) (string, error) {
|
|
contents, _, err := pathorcontents.Read(os.Getenv(varName))
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error reading %s: %s", varName, err)
|
|
}
|
|
return contents, nil
|
|
}
|
|
|
|
func envVarFile(varName string) (string, error) {
|
|
contents, err := envVarContents(varName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
tmpFile, err := ioutil.TempFile("", varName)
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error creating temp file: %s", err)
|
|
}
|
|
if _, err := tmpFile.Write([]byte(contents)); err != nil {
|
|
_ = os.Remove(tmpFile.Name())
|
|
return "", fmt.Errorf("Error writing temp file: %s", err)
|
|
}
|
|
if err := tmpFile.Close(); err != nil {
|
|
_ = os.Remove(tmpFile.Name())
|
|
return "", fmt.Errorf("Error closing temp file: %s", err)
|
|
}
|
|
return tmpFile.Name(), nil
|
|
}
|