Skip to content

Commit 7c1138e

Browse files
Support compute reservation resize (#3308) (#1908)
* support compute reservations resize * remove if custom encoder * review comments Signed-off-by: Modular Magician <[email protected]>
1 parent e71998f commit 7c1138e

File tree

4 files changed

+122
-5
lines changed

4 files changed

+122
-5
lines changed

.changelog/3308.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added ability to resize `google_compute_reservation`
3+
```

google-beta/resource_compute_reservation.go

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func resourceComputeReservation() *schema.Resource {
2929
return &schema.Resource{
3030
Create: resourceComputeReservationCreate,
3131
Read: resourceComputeReservationRead,
32+
Update: resourceComputeReservationUpdate,
3233
Delete: resourceComputeReservationDelete,
3334

3435
Importer: &schema.ResourceImporter{
@@ -37,6 +38,7 @@ func resourceComputeReservation() *schema.Resource {
3738

3839
Timeouts: &schema.ResourceTimeout{
3940
Create: schema.DefaultTimeout(4 * time.Minute),
41+
Update: schema.DefaultTimeout(4 * time.Minute),
4042
Delete: schema.DefaultTimeout(4 * time.Minute),
4143
},
4244

@@ -56,16 +58,15 @@ character, which cannot be a dash.`,
5658
"specific_reservation": {
5759
Type: schema.TypeList,
5860
Required: true,
59-
ForceNew: true,
6061
Description: `Reservation for instances with specific machine shapes.`,
6162
MaxItems: 1,
6263
Elem: &schema.Resource{
6364
Schema: map[string]*schema.Schema{
6465
"count": {
65-
Type: schema.TypeInt,
66-
Required: true,
67-
ForceNew: true,
68-
Description: `The number of resources that are allocated.`,
66+
Type: schema.TypeInt,
67+
Required: true,
68+
ValidateFunc: validation.IntAtLeast(1),
69+
Description: `The number of resources that are allocated.`,
6970
},
7071
"instance_properties": {
7172
Type: schema.TypeList,
@@ -331,6 +332,55 @@ func resourceComputeReservationRead(d *schema.ResourceData, meta interface{}) er
331332
return nil
332333
}
333334

335+
func resourceComputeReservationUpdate(d *schema.ResourceData, meta interface{}) error {
336+
config := meta.(*Config)
337+
338+
project, err := getProject(d, config)
339+
if err != nil {
340+
return err
341+
}
342+
343+
d.Partial(true)
344+
345+
if d.HasChange("specific_reservation") {
346+
obj := make(map[string]interface{})
347+
348+
specificReservationProp, err := expandComputeReservationSpecificReservation(d.Get("specific_reservation"), d, config)
349+
if err != nil {
350+
return err
351+
} else if v, ok := d.GetOkExists("specific_reservation"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, specificReservationProp)) {
352+
obj["specificReservation"] = specificReservationProp
353+
}
354+
355+
obj, err = resourceComputeReservationUpdateEncoder(d, meta, obj)
356+
if err != nil {
357+
return err
358+
}
359+
360+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/reservations/{{name}}/resize")
361+
if err != nil {
362+
return err
363+
}
364+
res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutUpdate))
365+
if err != nil {
366+
return fmt.Errorf("Error updating Reservation %q: %s", d.Id(), err)
367+
}
368+
369+
err = computeOperationWaitTime(
370+
config, res, project, "Updating Reservation",
371+
int(d.Timeout(schema.TimeoutUpdate).Minutes()))
372+
if err != nil {
373+
return err
374+
}
375+
376+
d.SetPartial("specific_reservation")
377+
}
378+
379+
d.Partial(false)
380+
381+
return resourceComputeReservationRead(d, meta)
382+
}
383+
334384
func resourceComputeReservationDelete(d *schema.ResourceData, meta interface{}) error {
335385
config := meta.(*Config)
336386

@@ -756,3 +806,10 @@ func expandComputeReservationZone(v interface{}, d TerraformResourceData, config
756806
}
757807
return f.RelativeLink(), nil
758808
}
809+
810+
func resourceComputeReservationUpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
811+
newObj := make(map[string]interface{})
812+
newObj["specificSkuCount"] = obj["specificReservation"].(map[string]interface{})["count"]
813+
814+
return newObj, nil
815+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package google
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
9+
)
10+
11+
func TestAccComputeReservation_update(t *testing.T) {
12+
t.Parallel()
13+
14+
reservationName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
15+
16+
resource.Test(t, resource.TestCase{
17+
PreCheck: func() { testAccPreCheck(t) },
18+
Providers: testAccProviders,
19+
CheckDestroy: testAccCheckComputeReservationDestroy,
20+
Steps: []resource.TestStep{
21+
{
22+
Config: testAccComputeReservation_basic(reservationName, "2"),
23+
},
24+
{
25+
ResourceName: "google_compute_reservation.reservation",
26+
ImportState: true,
27+
ImportStateVerify: true,
28+
},
29+
{
30+
Config: testAccComputeReservation_basic(reservationName, "1"),
31+
},
32+
{
33+
ResourceName: "google_compute_reservation.reservation",
34+
ImportState: true,
35+
ImportStateVerify: true,
36+
},
37+
},
38+
})
39+
}
40+
41+
func testAccComputeReservation_basic(reservationName, count string) string {
42+
return fmt.Sprintf(`
43+
resource "google_compute_reservation" "reservation" {
44+
name = "%s"
45+
zone = "us-central1-a"
46+
47+
specific_reservation {
48+
count = %s
49+
instance_properties {
50+
min_cpu_platform = "Intel Cascade Lake"
51+
machine_type = "n2-standard-2"
52+
}
53+
}
54+
}
55+
`, reservationName, count)
56+
}

website/docs/r/compute_reservation.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ This resource provides the following
188188
[Timeouts](/docs/configuration/resources.html#timeouts) configuration options:
189189

190190
- `create` - Default is 4 minutes.
191+
- `update` - Default is 4 minutes.
191192
- `delete` - Default is 4 minutes.
192193

193194
## Import

0 commit comments

Comments
 (0)