Skip to content

Commit

Permalink
Enable 'zone' to be specified at the provider level instead of per-re…
Browse files Browse the repository at this point in the history
…source. (#816)

- Fetch Zone attribute any place where it *was* being fetched from the schema by
	combination schema / provider-level attribute.
- Allow region to be unspecified if zone is specified.
- Switch one example to using provider-level zone as an example.
- Make provider-level zone optional.  (Individual resources will fail if they can't find a zone.)
- Add tests for getZone and getRegion.
  • Loading branch information
nat-henderson authored Dec 6, 2017
1 parent 9bebdd0 commit 114b646
Show file tree
Hide file tree
Showing 16 changed files with 258 additions and 78 deletions.
5 changes: 1 addition & 4 deletions examples/content-based-load-balancing/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ provider "google" {
region = "${var.region}"
project = "${var.project_name}"
credentials = "${file("${var.credentials_file_path}")}"
zone = "${var.region_zone}"
}

resource "google_compute_instance" "www" {
name = "tf-www-compute"
machine_type = "f1-micro"
zone = "${var.region_zone}"
tags = ["http-tag"]

boot_disk {
Expand All @@ -36,7 +36,6 @@ resource "google_compute_instance" "www" {
resource "google_compute_instance" "www-video" {
name = "tf-www-video-compute"
machine_type = "f1-micro"
zone = "${var.region_zone}"
tags = ["http-tag"]

boot_disk {
Expand Down Expand Up @@ -66,7 +65,6 @@ resource "google_compute_global_address" "external-address" {

resource "google_compute_instance_group" "www-resources" {
name = "tf-www-resources"
zone = "${var.region_zone}"

instances = ["${google_compute_instance.www.self_link}"]

Expand All @@ -78,7 +76,6 @@ resource "google_compute_instance_group" "www-resources" {

resource "google_compute_instance_group" "video-resources" {
name = "tf-video-resources"
zone = "${var.region_zone}"

instances = ["${google_compute_instance.www-video.self_link}"]

Expand Down
1 change: 1 addition & 0 deletions google/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type Config struct {
Credentials string
Project string
Region string
Zone string

clientBilling *cloudbilling.Service
clientCompute *compute.Service
Expand Down
8 changes: 6 additions & 2 deletions google/data_source_google_compute_instance_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func dataSourceGoogleComputeInstanceGroup() *schema.Resource {

"zone": {
Type: schema.TypeString,
Required: true,
Optional: true,
},

"project": {
Expand Down Expand Up @@ -74,7 +74,11 @@ func dataSourceGoogleComputeInstanceGroup() *schema.Resource {
}

func dataSourceComputeInstanceGroupRead(d *schema.ResourceData, meta interface{}) error {
zone := d.Get("zone").(string)

zone, err := getZone(d, meta.(*Config))
if err != nil {
return err
}
name := d.Get("name").(string)

d.SetId(fmt.Sprintf("%s/%s", zone, name))
Expand Down
7 changes: 5 additions & 2 deletions google/data_source_google_container_engine_versions.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func dataSourceGoogleContainerEngineVersions() *schema.Resource {
},
"zone": {
Type: schema.TypeString,
Required: true,
Optional: true,
},
"latest_master_version": {
Type: schema.TypeString,
Expand Down Expand Up @@ -49,7 +49,10 @@ func dataSourceGoogleContainerEngineVersionsRead(d *schema.ResourceData, meta in
return err
}

zone := d.Get("zone").(string)
zone, err := getZone(d, meta.(*Config))
if err != nil {
return err
}

resp, err := config.clientContainer.Projects.Zones.GetServerconfig(project, zone).Do()
if err != nil {
Expand Down
11 changes: 11 additions & 0 deletions google/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@ func Provider() terraform.ResourceProvider {
"CLOUDSDK_COMPUTE_REGION",
}, nil),
},

"zone": &schema.Schema{
Type: schema.TypeString,
Optional: true,
DefaultFunc: schema.MultiEnvDefaultFunc([]string{
"GOOGLE_ZONE",
"GCLOUD_ZONE",
"CLOUDSDK_COMPUTE_ZONE",
}, nil),
},
},

DataSourcesMap: map[string]*schema.Resource{
Expand Down Expand Up @@ -168,6 +178,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
Credentials: credentials,
Project: d.Get("project").(string),
Region: d.Get("region").(string),
Zone: d.Get("zone").(string),
}

if err := config.loadAndValidate(); err != nil {
Expand Down
9 changes: 7 additions & 2 deletions google/resource_bigtable_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func resourceBigtableInstance() *schema.Resource {

"zone": {
Type: schema.TypeString,
Required: true,
Optional: true,
ForceNew: true,
},

Expand Down Expand Up @@ -111,14 +111,19 @@ func resourceBigtableInstanceCreate(d *schema.ResourceData, meta interface{}) er
instanceType = bigtable.PRODUCTION
}

zone, err := getZone(d, config)
if err != nil {
return err
}

instanceConf := &bigtable.InstanceConf{
InstanceId: name,
DisplayName: displayName.(string),
ClusterId: d.Get("cluster_id").(string),
NumNodes: numNodes,
InstanceType: instanceType,
StorageType: storageType,
Zone: d.Get("zone").(string),
Zone: zone,
}

c, err := config.bigtableClientFactory.NewInstanceAdminClient(project)
Expand Down
26 changes: 18 additions & 8 deletions google/resource_compute_autoscaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func resourceComputeAutoscaler() *schema.Resource {

"zone": &schema.Schema{
Type: schema.TypeString,
Required: true,
Optional: true,
ForceNew: true,
},

Expand Down Expand Up @@ -211,12 +211,16 @@ func resourceComputeAutoscalerCreate(d *schema.ResourceData, meta interface{}) e
}

// Get the zone
log.Printf("[DEBUG] Loading zone: %s", d.Get("zone").(string))
z, err := getZone(d, config)
if err != nil {
return err
}
log.Printf("[DEBUG] Loading zone: %s", z)
zone, err := config.clientCompute.Zones.Get(
project, d.Get("zone").(string)).Do()
project, z).Do()
if err != nil {
return fmt.Errorf(
"Error loading zone '%s': %s", d.Get("zone").(string), err)
"Error loading zone '%s': %s", z, err)
}

scaler, err := buildAutoscaler(d)
Expand Down Expand Up @@ -293,8 +297,8 @@ func resourceComputeAutoscalerRead(d *schema.ResourceData, meta interface{}) err

var scaler *compute.Autoscaler
var e error
if zone, ok := d.GetOk("zone"); ok {
scaler, e = config.clientCompute.Autoscalers.Get(project, zone.(string), d.Id()).Do()
if zone, _ := getZone(d, config); zone != "" {
scaler, e = config.clientCompute.Autoscalers.Get(project, zone, d.Id()).Do()
if e != nil {
return handleNotFoundError(e, d, fmt.Sprintf("Autoscaler %q", d.Id()))
}
Expand Down Expand Up @@ -338,7 +342,10 @@ func resourceComputeAutoscalerUpdate(d *schema.ResourceData, meta interface{}) e
return err
}

zone := d.Get("zone").(string)
zone, err := getZone(d, config)
if err != nil {
return err
}

scaler, err := buildAutoscaler(d)
if err != nil {
Expand Down Expand Up @@ -370,7 +377,10 @@ func resourceComputeAutoscalerDelete(d *schema.ResourceData, meta interface{}) e
return err
}

zone := d.Get("zone").(string)
zone, err := getZone(d, config)
if err != nil {
return err
}
op, err := config.clientCompute.Autoscalers.Delete(
project, zone, d.Id()).Do()
if err != nil {
Expand Down
32 changes: 22 additions & 10 deletions google/resource_compute_disk.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func resourceComputeDisk() *schema.Resource {

"zone": &schema.Schema{
Type: schema.TypeString,
Required: true,
Optional: true,
ForceNew: true,
},

Expand Down Expand Up @@ -130,12 +130,16 @@ func resourceComputeDiskCreate(d *schema.ResourceData, meta interface{}) error {
}

// Get the zone
log.Printf("[DEBUG] Loading zone: %s", d.Get("zone").(string))
z, err := getZone(d, config)
if err != nil {
return err
}
log.Printf("[DEBUG] Loading zone: %s", z)
zone, err := config.clientCompute.Zones.Get(
project, d.Get("zone").(string)).Do()
project, z).Do()
if err != nil {
return fmt.Errorf(
"Error loading zone '%s': %s", d.Get("zone").(string), err)
"Error loading zone '%s': %s", z, err)
}

// Build the disk parameter
Expand Down Expand Up @@ -199,7 +203,7 @@ func resourceComputeDiskCreate(d *schema.ResourceData, meta interface{}) error {
}

op, err := config.clientCompute.Disks.Insert(
project, d.Get("zone").(string), disk).Do()
project, z, disk).Do()
if err != nil {
return fmt.Errorf("Error creating disk: %s", err)
}
Expand All @@ -221,13 +225,17 @@ func resourceComputeDiskUpdate(d *schema.ResourceData, meta interface{}) error {
if err != nil {
return err
}
z, err := getZone(d, config)
if err != nil {
return err
}
d.Partial(true)
if d.HasChange("size") {
rb := &compute.DisksResizeRequest{
SizeGb: int64(d.Get("size").(int)),
}
op, err := config.clientCompute.Disks.Resize(
project, d.Get("zone").(string), d.Id(), rb).Do()
project, z, d.Id(), rb).Do()
if err != nil {
return fmt.Errorf("Error resizing disk: %s", err)
}
Expand All @@ -245,7 +253,7 @@ func resourceComputeDiskUpdate(d *schema.ResourceData, meta interface{}) error {
LabelFingerprint: d.Get("label_fingerprint").(string),
}
op, err := config.clientCompute.Disks.SetLabels(
project, d.Get("zone").(string), d.Id(), &zslr).Do()
project, z, d.Id(), &zslr).Do()
if err != nil {
return fmt.Errorf("Error when setting labels: %s", err)
}
Expand Down Expand Up @@ -279,9 +287,9 @@ func resourceComputeDiskRead(d *schema.ResourceData, meta interface{}) error {
}

var disk *compute.Disk
if zone, ok := d.GetOk("zone"); ok {
if zone, _ := getZone(d, config); zone != "" {
disk, err = config.clientCompute.Disks.Get(
project, zone.(string), d.Id()).Do()
project, zone, d.Id()).Do()
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("Disk %q", d.Get("name").(string)))
}
Expand Down Expand Up @@ -326,6 +334,10 @@ func resourceComputeDiskDelete(d *schema.ResourceData, meta interface{}) error {
if err != nil {
return err
}
z, err := getZone(d, config)
if err != nil {
return err
}

// if disks are attached, they must be detached before the disk can be deleted
if instances, ok := d.Get("users").([]interface{}); ok {
Expand Down Expand Up @@ -376,7 +388,7 @@ func resourceComputeDiskDelete(d *schema.ResourceData, meta interface{}) error {

// Delete the disk
op, err := config.clientCompute.Disks.Delete(
project, d.Get("zone").(string), d.Id()).Do()
project, z, d.Id()).Do()
if err != nil {
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
log.Printf("[WARN] Removing Disk %q because it's gone", d.Get("name").(string))
Expand Down
27 changes: 20 additions & 7 deletions google/resource_compute_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ func resourceComputeInstance() *schema.Resource {

"zone": &schema.Schema{
Type: schema.TypeString,
Required: true,
Optional: true,
ForceNew: true,
},

Expand Down Expand Up @@ -547,7 +547,10 @@ func getInstance(config *Config, d *schema.ResourceData) (*computeBeta.Instance,
if err != nil {
return nil, err
}
zone := d.Get("zone").(string)
zone, err := getZone(d, config)
if err != nil {
return nil, err
}
instance := &computeBeta.Instance{}
switch getComputeApiVersion(d, InstanceBaseApiVersion, InstanceVersionedFeatures) {
case v1:
Expand Down Expand Up @@ -576,12 +579,16 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err
}

// Get the zone
log.Printf("[DEBUG] Loading zone: %s", d.Get("zone").(string))
z, err := getZone(d, config)
if err != nil {
return err
}
log.Printf("[DEBUG] Loading zone: %s", z)
zone, err := config.clientCompute.Zones.Get(
project, d.Get("zone").(string)).Do()
project, z).Do()
if err != nil {
return fmt.Errorf(
"Error loading zone '%s': %s", d.Get("zone").(string), err)
"Error loading zone '%s': %s", z, err)
}

// Get the machine type
Expand Down Expand Up @@ -856,7 +863,10 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
return err
}

zone := d.Get("zone").(string)
zone, err := getZone(d, config)
if err != nil {
return err
}

instance, err := getInstance(config, d)
if err != nil {
Expand Down Expand Up @@ -1200,7 +1210,10 @@ func resourceComputeInstanceDelete(d *schema.ResourceData, meta interface{}) err
return err
}

zone := d.Get("zone").(string)
zone, err := getZone(d, config)
if err != nil {
return err
}
log.Printf("[INFO] Requesting instance deletion: %s", d.Id())
op, err := config.clientCompute.Instances.Delete(project, zone, d.Id()).Do()
if err != nil {
Expand Down
Loading

0 comments on commit 114b646

Please sign in to comment.