terraform-provider-google/google/field_helpers.go
Vincent Roseberry 66f876e6ae Add new resource google_compute_target_ssl_proxy (#569)
* Add target ssl proxy
* Add documentation
2017-10-13 11:02:42 -07:00

94 lines
2.8 KiB
Go

package google
import (
"fmt"
"regexp"
)
const (
globalLinkTemplate = "projects/%s/global/%s/%s"
globalLinkBasePattern = "projects/(.+)/global/%s/(.+)"
)
// ------------------------------------------------------------
// Field helpers
// ------------------------------------------------------------
func ParseNetworkFieldValue(network string, d TerraformResourceData, config *Config) (*GlobalFieldValue, error) {
return parseGlobalFieldValue("networks", network, "project", d, config, true)
}
func ParseSslCertificateFieldValue(sslCertificate string, d TerraformResourceData, config *Config) (*GlobalFieldValue, error) {
return parseGlobalFieldValue("sslCertificates", sslCertificate, "project", d, config, false)
}
// ------------------------------------------------------------
// Base helpers used to create helpers for specific fields.
// ------------------------------------------------------------
type GlobalFieldValue struct {
Project string
Name string
resourceType string
}
func (f GlobalFieldValue) RelativeLink() string {
if len(f.Name) == 0 {
return ""
}
return fmt.Sprintf(globalLinkTemplate, f.Project, f.resourceType, f.Name)
}
// Parses a global field supporting 4 different formats:
// - https://www.googleapis.com/compute/ANY_VERSION/projects/{my-project}/global/{resource_type}/{resource_name}
// - projects/{my-project}/global/{resource_type}/{resource_name}
// - global/{resource_type}/{resource_name} (default project is used)
// - resource_name (default project is used)
// - "" (empty string). RelativeLink() returns empty if isEmptyValid is true.
func parseGlobalFieldValue(resourceType, fieldValue, projectSchemaField string, d TerraformResourceData, config *Config, isEmptyValid bool) (*GlobalFieldValue, error) {
if len(fieldValue) == 0 {
if isEmptyValid {
return &GlobalFieldValue{resourceType: resourceType}, nil
}
return nil, fmt.Errorf("The global field for resource %s cannot be empty", resourceType)
}
r := regexp.MustCompile(fmt.Sprintf(globalLinkBasePattern, resourceType))
if r.MatchString(fieldValue) {
parts := r.FindStringSubmatch(fieldValue)
return &GlobalFieldValue{
Project: parts[1],
Name: parts[2],
resourceType: resourceType,
}, nil
}
project, err := getProjectFromSchema(projectSchemaField, d, config)
if err != nil {
return nil, err
}
return &GlobalFieldValue{
Project: project,
Name: GetResourceNameFromSelfLink(fieldValue),
resourceType: resourceType,
}, nil
}
func getProjectFromSchema(projectSchemaField string, d TerraformResourceData, config *Config) (string, error) {
res, ok := d.GetOk(projectSchemaField)
if !ok || len(projectSchemaField) == 0 {
if config.Project != "" {
return config.Project, nil
}
return "", fmt.Errorf("project: required field is not set")
}
return res.(string), nil
}