mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-09-06 09:06:44 +00:00
144 lines
3.3 KiB
Go
144 lines
3.3 KiB
Go
package google
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
)
|
|
|
|
var (
|
|
computeAddressIdTemplate = "projects/%s/regions/%s/addresses/%s"
|
|
computeAddressLinkRegex = regexp.MustCompile("projects/(.+)/regions/(.+)/addresses/(.+)$")
|
|
)
|
|
|
|
func dataSourceGoogleComputeAddress() *schema.Resource {
|
|
return &schema.Resource{
|
|
Read: dataSourceGoogleComputeAddressRead,
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
"name": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
|
|
"address": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
},
|
|
|
|
"status": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
},
|
|
|
|
"self_link": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
},
|
|
|
|
"region": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Optional: true,
|
|
},
|
|
|
|
"project": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Optional: true,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func dataSourceGoogleComputeAddressRead(d *schema.ResourceData, meta interface{}) error {
|
|
config := meta.(*Config)
|
|
|
|
project, err := getProject(d, config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
region, err := getRegion(d, config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
name := d.Get("name").(string)
|
|
|
|
address, err := config.clientCompute.Addresses.Get(project, region, name).Do()
|
|
if err != nil {
|
|
return handleNotFoundError(err, d, fmt.Sprintf("Address Not Found : %s", name))
|
|
}
|
|
|
|
d.Set("address", address.Address)
|
|
d.Set("status", address.Status)
|
|
d.Set("self_link", address.SelfLink)
|
|
d.Set("project", project)
|
|
d.Set("region", region)
|
|
|
|
d.SetId(strconv.FormatUint(uint64(address.Id), 10))
|
|
return nil
|
|
}
|
|
|
|
type computeAddressId struct {
|
|
Project string
|
|
Region string
|
|
Name string
|
|
}
|
|
|
|
func (s computeAddressId) canonicalId() string {
|
|
return fmt.Sprintf(computeAddressIdTemplate, s.Project, s.Region, s.Name)
|
|
}
|
|
|
|
func parseComputeAddressId(id string, config *Config) (*computeAddressId, error) {
|
|
var parts []string
|
|
if computeAddressLinkRegex.MatchString(id) {
|
|
parts = computeAddressLinkRegex.FindStringSubmatch(id)
|
|
|
|
return &computeAddressId{
|
|
Project: parts[1],
|
|
Region: parts[2],
|
|
Name: parts[3],
|
|
}, nil
|
|
} else {
|
|
parts = strings.Split(id, "/")
|
|
}
|
|
|
|
if len(parts) == 3 {
|
|
return &computeAddressId{
|
|
Project: parts[0],
|
|
Region: parts[1],
|
|
Name: parts[2],
|
|
}, nil
|
|
} else if len(parts) == 2 {
|
|
// Project is optional.
|
|
if config.Project == "" {
|
|
return nil, fmt.Errorf("The default project for the provider must be set when using the `{region}/{name}` id format.")
|
|
}
|
|
|
|
return &computeAddressId{
|
|
Project: config.Project,
|
|
Region: parts[0],
|
|
Name: parts[1],
|
|
}, nil
|
|
} else if len(parts) == 1 {
|
|
// Project and region is optional
|
|
if config.Project == "" {
|
|
return nil, fmt.Errorf("The default project for the provider must be set when using the `{name}` id format.")
|
|
}
|
|
if config.Region == "" {
|
|
return nil, fmt.Errorf("The default region for the provider must be set when using the `{name}` id format.")
|
|
}
|
|
|
|
return &computeAddressId{
|
|
Project: config.Project,
|
|
Region: config.Region,
|
|
Name: parts[0],
|
|
}, nil
|
|
}
|
|
|
|
return nil, fmt.Errorf("Invalid compute address id. Expecting resource link, `{project}/{region}/{name}`, `{region}/{name}` or `{name}` format.")
|
|
}
|