mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-10-04 17:51:11 +00:00
90 lines
2.6 KiB
Go
90 lines
2.6 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)
|
|
}
|
|
|
|
// ------------------------------------------------------------
|
|
// 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
|
|
}
|