Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add single instance field to autoscaler stackdriver metrics #580

Merged
merged 1 commit into from
Apr 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 31 additions & 11 deletions google-beta/resource_compute_autoscaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,22 @@ func resourceComputeAutoscaler() *schema.Resource {
Type: schema.TypeString,
Required: true,
},
"filter": {
Type: schema.TypeString,
Optional: true,
},
"single_instance_assignment": {
Type: schema.TypeFloat,
Optional: true,
},
"target": {
Type: schema.TypeFloat,
Required: true,
Optional: true,
},
"type": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE"}, false),
},
"filter": {
Type: schema.TypeString,
Optional: true,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE", ""}, false),
},
},
},
Expand Down Expand Up @@ -498,10 +502,11 @@ func flattenComputeAutoscalerAutoscalingPolicyMetric(v interface{}, d *schema.Re
continue
}
transformed = append(transformed, map[string]interface{}{
"name": flattenComputeAutoscalerAutoscalingPolicyMetricName(original["metric"], d),
"target": flattenComputeAutoscalerAutoscalingPolicyMetricTarget(original["utilizationTarget"], d),
"type": flattenComputeAutoscalerAutoscalingPolicyMetricType(original["utilizationTargetType"], d),
"filter": flattenComputeAutoscalerAutoscalingPolicyMetricFilter(original["filter"], d),
"name": flattenComputeAutoscalerAutoscalingPolicyMetricName(original["metric"], d),
"single_instance_assignment": flattenComputeAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(original["singleInstanceAssignment"], d),
"target": flattenComputeAutoscalerAutoscalingPolicyMetricTarget(original["utilizationTarget"], d),
"type": flattenComputeAutoscalerAutoscalingPolicyMetricType(original["utilizationTargetType"], d),
"filter": flattenComputeAutoscalerAutoscalingPolicyMetricFilter(original["filter"], d),
})
}
return transformed
Expand All @@ -510,6 +515,10 @@ func flattenComputeAutoscalerAutoscalingPolicyMetricName(v interface{}, d *schem
return v
}

func flattenComputeAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenComputeAutoscalerAutoscalingPolicyMetricTarget(v interface{}, d *schema.ResourceData) interface{} {
return v
}
Expand Down Expand Up @@ -667,6 +676,13 @@ func expandComputeAutoscalerAutoscalingPolicyMetric(v interface{}, d TerraformRe
transformed["metric"] = transformedName
}

transformedSingleInstanceAssignment, err := expandComputeAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(original["single_instance_assignment"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedSingleInstanceAssignment); val.IsValid() && !isEmptyValue(val) {
transformed["singleInstanceAssignment"] = transformedSingleInstanceAssignment
}

transformedTarget, err := expandComputeAutoscalerAutoscalingPolicyMetricTarget(original["target"], d, config)
if err != nil {
return nil, err
Expand Down Expand Up @@ -697,6 +713,10 @@ func expandComputeAutoscalerAutoscalingPolicyMetricName(v interface{}, d Terrafo
return v, nil
}

func expandComputeAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandComputeAutoscalerAutoscalingPolicyMetricTarget(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}
Expand Down
32 changes: 17 additions & 15 deletions google-beta/resource_compute_autoscaler_generated_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
"github.com/hashicorp/terraform/terraform"
)

func TestAccComputeAutoscaler_autoscalerBetaExample(t *testing.T) {
func TestAccComputeAutoscaler_autoscalerSingleInstanceExample(t *testing.T) {
t.Parallel()

context := map[string]interface{}{
Expand All @@ -37,33 +37,35 @@ func TestAccComputeAutoscaler_autoscalerBetaExample(t *testing.T) {
CheckDestroy: testAccCheckComputeAutoscalerDestroy,
Steps: []resource.TestStep{
{
Config: testAccComputeAutoscaler_autoscalerBetaExample(context),
Config: testAccComputeAutoscaler_autoscalerSingleInstanceExample(context),
},
},
})
}

func testAccComputeAutoscaler_autoscalerBetaExample(context map[string]interface{}) string {
func testAccComputeAutoscaler_autoscalerSingleInstanceExample(context map[string]interface{}) string {
return Nprintf(`
resource "google_compute_autoscaler" "foobar" {
resource "google_compute_autoscaler" "default" {
provider = "google-beta"

name = "my-autoscaler-%{random_suffix}"
zone = "us-central1-f"
target = "${google_compute_instance_group_manager.foobar.self_link}"
target = "${google_compute_instance_group_manager.default.self_link}"

autoscaling_policy {
max_replicas = 5
min_replicas = 1
cooldown_period = 60

cpu_utilization {
target = 0.5
metric {
name = "pubsub.googleapis.com/subscription/num_undelivered_messages"
filter = "resource.type = pubsub_subscription AND resource.label.subscription_id = our-subscription"
single_instance_assignment = 65535
}
}
}

resource "google_compute_instance_template" "foobar" {
resource "google_compute_instance_template" "default" {
provider = "google-beta"

name = "my-instance-template-%{random_suffix}"
Expand All @@ -89,32 +91,32 @@ resource "google_compute_instance_template" "foobar" {
}
}

resource "google_compute_target_pool" "foobar" {
resource "google_compute_target_pool" "default" {
provider = "google-beta"

name = "my-target-pool-%{random_suffix}"
}

resource "google_compute_instance_group_manager" "foobar" {
resource "google_compute_instance_group_manager" "default" {
provider = "google-beta"

name = "my-igm-%{random_suffix}"
zone = "us-central1-f"

version {
instance_template = "${google_compute_instance_template.foobar.self_link}"
instance_template = "${google_compute_instance_template.default.self_link}"
name = "primary"
}

target_pools = ["${google_compute_target_pool.foobar.self_link}"]
base_instance_name = "foobar"
target_pools = ["${google_compute_target_pool.default.self_link}"]
base_instance_name = "autoscaler-sample"
}

data "google_compute_image" "debian_9" {
provider = "google-beta"

family = "debian-9"
project = "debian-cloud"
family = "debian-9"
project = "debian-cloud"
}

provider "google-beta"{
Expand Down
42 changes: 31 additions & 11 deletions google-beta/resource_compute_region_autoscaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,22 @@ func resourceComputeRegionAutoscaler() *schema.Resource {
Type: schema.TypeString,
Required: true,
},
"filter": {
Type: schema.TypeString,
Optional: true,
},
"single_instance_assignment": {
Type: schema.TypeFloat,
Optional: true,
},
"target": {
Type: schema.TypeFloat,
Required: true,
Optional: true,
},
"type": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE"}, false),
},
"filter": {
Type: schema.TypeString,
Optional: true,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE", ""}, false),
},
},
},
Expand Down Expand Up @@ -498,10 +502,11 @@ func flattenComputeRegionAutoscalerAutoscalingPolicyMetric(v interface{}, d *sch
continue
}
transformed = append(transformed, map[string]interface{}{
"name": flattenComputeRegionAutoscalerAutoscalingPolicyMetricName(original["metric"], d),
"target": flattenComputeRegionAutoscalerAutoscalingPolicyMetricTarget(original["utilizationTarget"], d),
"type": flattenComputeRegionAutoscalerAutoscalingPolicyMetricType(original["utilizationTargetType"], d),
"filter": flattenComputeRegionAutoscalerAutoscalingPolicyMetricFilter(original["filter"], d),
"name": flattenComputeRegionAutoscalerAutoscalingPolicyMetricName(original["metric"], d),
"single_instance_assignment": flattenComputeRegionAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(original["singleInstanceAssignment"], d),
"target": flattenComputeRegionAutoscalerAutoscalingPolicyMetricTarget(original["utilizationTarget"], d),
"type": flattenComputeRegionAutoscalerAutoscalingPolicyMetricType(original["utilizationTargetType"], d),
"filter": flattenComputeRegionAutoscalerAutoscalingPolicyMetricFilter(original["filter"], d),
})
}
return transformed
Expand All @@ -510,6 +515,10 @@ func flattenComputeRegionAutoscalerAutoscalingPolicyMetricName(v interface{}, d
return v
}

func flattenComputeRegionAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenComputeRegionAutoscalerAutoscalingPolicyMetricTarget(v interface{}, d *schema.ResourceData) interface{} {
return v
}
Expand Down Expand Up @@ -664,6 +673,13 @@ func expandComputeRegionAutoscalerAutoscalingPolicyMetric(v interface{}, d Terra
transformed["metric"] = transformedName
}

transformedSingleInstanceAssignment, err := expandComputeRegionAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(original["single_instance_assignment"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedSingleInstanceAssignment); val.IsValid() && !isEmptyValue(val) {
transformed["singleInstanceAssignment"] = transformedSingleInstanceAssignment
}

transformedTarget, err := expandComputeRegionAutoscalerAutoscalingPolicyMetricTarget(original["target"], d, config)
if err != nil {
return nil, err
Expand Down Expand Up @@ -694,6 +710,10 @@ func expandComputeRegionAutoscalerAutoscalingPolicyMetricName(v interface{}, d T
return v, nil
}

func expandComputeRegionAutoscalerAutoscalingPolicyMetricSingleInstanceAssignment(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandComputeRegionAutoscalerAutoscalingPolicyMetricTarget(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}
Expand Down
51 changes: 35 additions & 16 deletions website/docs/r/compute_autoscaler.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -35,33 +35,35 @@ To get more information about Autoscaler, see:
* [Autoscaling Groups of Instances](https://cloud.google.com/compute/docs/autoscaler/)

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgit.luolix.top%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=autoscaler_beta&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgit.luolix.top%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=autoscaler_single_instance&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
</a>
</div>
## Example Usage - Autoscaler Beta
## Example Usage - Autoscaler Single Instance


```hcl
resource "google_compute_autoscaler" "foobar" {
resource "google_compute_autoscaler" "default" {
provider = "google-beta"

name = "my-autoscaler"
zone = "us-central1-f"
target = "${google_compute_instance_group_manager.foobar.self_link}"
target = "${google_compute_instance_group_manager.default.self_link}"

autoscaling_policy {
max_replicas = 5
min_replicas = 1
cooldown_period = 60

cpu_utilization {
target = 0.5
metric {
name = "pubsub.googleapis.com/subscription/num_undelivered_messages"
filter = "resource.type = pubsub_subscription AND resource.label.subscription_id = our-subscription"
single_instance_assignment = 65535
}
}
}

resource "google_compute_instance_template" "foobar" {
resource "google_compute_instance_template" "default" {
provider = "google-beta"

name = "my-instance-template"
Expand All @@ -87,32 +89,32 @@ resource "google_compute_instance_template" "foobar" {
}
}

resource "google_compute_target_pool" "foobar" {
resource "google_compute_target_pool" "default" {
provider = "google-beta"

name = "my-target-pool"
}

resource "google_compute_instance_group_manager" "foobar" {
resource "google_compute_instance_group_manager" "default" {
provider = "google-beta"

name = "my-igm"
zone = "us-central1-f"

version {
instance_template = "${google_compute_instance_template.foobar.self_link}"
instance_template = "${google_compute_instance_template.default.self_link}"
name = "primary"
}

target_pools = ["${google_compute_target_pool.foobar.self_link}"]
base_instance_name = "foobar"
target_pools = ["${google_compute_target_pool.default.self_link}"]
base_instance_name = "autoscaler-sample"
}

data "google_compute_image" "debian_9" {
provider = "google-beta"

family = "debian-9"
project = "debian-cloud"
family = "debian-9"
project = "debian-cloud"
}

provider "google-beta"{
Expand Down Expand Up @@ -284,8 +286,25 @@ The `metric` block supports:
The metric cannot have negative values.
The metric must have a value type of INT64 or DOUBLE.

* `single_instance_assignment` -
(Optional, [Beta](https://terraform.io/docs/providers/google/provider_versions.html))
If scaling is based on a per-group metric value that represents the
total amount of work to be done or resource usage, set this value to
an amount assigned for a single instance of the scaled group.
The autoscaler will keep the number of instances proportional to the
value of this metric, the metric itself should not change value due
to group resizing.
For example, a good metric to use with the target is
`pubsub.googleapis.com/subscription/num_undelivered_messages`
or a custom metric exporting the total number of requests coming to
your instances.
A bad example would be a metric exporting an average or median
latency, since this value can't include a chunk assignable to a
single instance, it could be better used with utilization_target
instead.

* `target` -
(Required)
(Optional)
The target value of the metric that autoscaler should
maintain. This must be a positive value. A utilization
metric scales number of virtual machines handling requests
Expand All @@ -296,7 +315,7 @@ The `metric` block supports:
of the instances.

* `type` -
(Required)
(Optional)
Defines how target utilization value is expressed for a
Stackdriver Monitoring metric. Either GAUGE, DELTA_PER_SECOND,
or DELTA_PER_MINUTE.
Expand Down
Loading