Skip to content

Commit 757ebf8

Browse files
authored
make label updatable for google_compute_instance under initialize_params (#15081)
1 parent eb45d62 commit 757ebf8

File tree

2 files changed

+134
-1
lines changed

2 files changed

+134
-1
lines changed

mmv1/third_party/terraform/services/compute/resource_compute_instance.go.tmpl

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"errors"
88
"fmt"
99
"log"
10+
"net/http"
1011
"strconv"
1112
"strings"
1213
"time"
@@ -469,7 +470,6 @@ func ResourceComputeInstance() *schema.Resource {
469470
Optional: true,
470471
AtLeastOneOf: initializeParamsKeys,
471472
Computed: true,
472-
ForceNew: true,
473473
Description: `A set of key/value label pairs assigned to the disk.`,
474474
},
475475

@@ -2732,6 +2732,31 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
27322732
}
27332733
}
27342734

2735+
if d.HasChange("boot_disk") {
2736+
//default behavior for the disk is to have the same name as the instance
2737+
diskName := instance.Name
2738+
if v := tpgresource.GetResourceNameFromSelfLink(d.Get("boot_disk.0.source").(string)); v != diskName {
2739+
diskName = v
2740+
}
2741+
2742+
disk, err := config.NewComputeClient(userAgent).Disks.Get(project, zone, diskName).Do()
2743+
if err != nil {
2744+
return fmt.Errorf("Error getting boot disk: %s", err)
2745+
}
2746+
2747+
obj := make(map[string]interface{})
2748+
2749+
if d.HasChange("boot_disk.0.initialize_params.0.labels") {
2750+
obj["labels"] = tpgresource.ConvertStringMap(d.Get("boot_disk.0.initialize_params.0.labels").(map[string]interface{}))
2751+
obj["labelFingerprint"] = disk.LabelFingerprint
2752+
url := "{{"{{"}}ComputeBasePath{{"}}"}}projects/{{"{{"}}project{{"}}"}}/zones/{{"{{"}}zone{{"}}"}}/disks/{{"{{"}}name{{"}}"}}/setLabels"
2753+
err := updateDisk(d, config, userAgent, project, url, obj)
2754+
if err != nil {
2755+
return err
2756+
}
2757+
}
2758+
}
2759+
27352760
if d.HasChange("attached_disk") {
27362761
o, n := d.GetChange("attached_disk")
27372762

@@ -3836,3 +3861,37 @@ func CheckForCommonAliasIp(old, new *compute.NetworkInterface) []*compute.AliasI
38363861
}
38373862
return resultAliasIpRanges
38383863
}
3864+
3865+
func updateDisk(d *schema.ResourceData, config *transport_tpg.Config, userAgent, project, patchUrl string, obj map[string]interface{}) error {
3866+
billingProject := project
3867+
url, err := tpgresource.ReplaceVars(d, config, patchUrl)
3868+
if err != nil {
3869+
return err
3870+
}
3871+
headers := make(http.Header)
3872+
if bp, err := tpgresource.GetBillingProject(d, config); err != nil {
3873+
billingProject = bp
3874+
}
3875+
3876+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
3877+
Config: config,
3878+
Method: "POST",
3879+
Project: billingProject,
3880+
RawURL: url,
3881+
UserAgent: userAgent,
3882+
Body: obj,
3883+
Timeout: d.Timeout(schema.TimeoutUpdate),
3884+
Headers: headers,
3885+
})
3886+
if err != nil {
3887+
return fmt.Errorf("Error updating Disk %q: %s", d.Id(), err)
3888+
}
3889+
err = ComputeOperationWaitTime(
3890+
config, res, project, "Updating Disk", userAgent,
3891+
d.Timeout(schema.TimeoutUpdate))
3892+
if err != nil {
3893+
return err
3894+
}
3895+
return nil
3896+
}
3897+

mmv1/third_party/terraform/services/compute/resource_compute_instance_test.go.tmpl

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,51 @@ func TestAccComputeInstance_attachDisk_forceAttach(t *testing.T) {
12301230
})
12311231
}
12321232

1233+
func TestAccComputeInstance_bootDiskUpdate(t *testing.T) {
1234+
t.Parallel()
1235+
1236+
var instance compute.Instance
1237+
context1 := map[string]interface{}{
1238+
"instance_name": fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10)),
1239+
"disk_size": 10,
1240+
"labels": "bar",
1241+
}
1242+
1243+
context2 := map[string]interface{}{
1244+
"instance_name": context1["instance_name"].(string),
1245+
"disk_size": 10,
1246+
"labels": "baz",
1247+
}
1248+
1249+
acctest.VcrTest(t, resource.TestCase{
1250+
PreCheck: func() { acctest.AccTestPreCheck(t) },
1251+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
1252+
CheckDestroy: testAccCheckComputeInstanceDestroyProducer(t),
1253+
Steps: []resource.TestStep{
1254+
{
1255+
Config: testAccComputeInstance_bootDiskUpdate(context1),
1256+
Check: resource.ComposeTestCheckFunc(
1257+
testAccCheckComputeInstanceExists(
1258+
t, "google_compute_instance.foobar", &instance),
1259+
),
1260+
},
1261+
{
1262+
Config: testAccComputeInstance_bootDiskUpdate(context2),
1263+
ConfigPlanChecks: resource.ConfigPlanChecks{
1264+
PreApply: []plancheck.PlanCheck{
1265+
// Check that the update is done in-place
1266+
plancheck.ExpectResourceAction("google_compute_instance.foobar", plancheck.ResourceActionUpdate),
1267+
},
1268+
},
1269+
Check: resource.ComposeTestCheckFunc(
1270+
testAccCheckComputeInstanceExists(
1271+
t, "google_compute_instance.foobar", &instance),
1272+
),
1273+
},
1274+
},
1275+
})
1276+
}
1277+
12331278
func TestAccComputeInstance_attachedDiskUpdate(t *testing.T) {
12341279
t.Parallel()
12351280

@@ -7341,6 +7386,35 @@ resource "google_compute_resource_policy" "instance_schedule2" {
73417386
`, instance, schedule1, schedule2)
73427387
}
73437388

7389+
func testAccComputeInstance_bootDiskUpdate(context map[string]interface{}) string {
7390+
return acctest.Nprintf(`
7391+
data "google_compute_image" "my_image" {
7392+
family = "debian-11"
7393+
project = "debian-cloud"
7394+
}
7395+
7396+
resource "google_compute_instance" "foobar" {
7397+
name = "%{instance_name}"
7398+
machine_type = "e2-medium"
7399+
zone = "us-central1-a"
7400+
7401+
boot_disk {
7402+
initialize_params {
7403+
image = data.google_compute_image.my_image.self_link
7404+
size = %{disk_size}
7405+
labels = {
7406+
"foo" = "%{labels}"
7407+
}
7408+
}
7409+
}
7410+
7411+
network_interface {
7412+
network = "default"
7413+
}
7414+
}
7415+
`, context)
7416+
}
7417+
73447418
func testAccComputeInstance_attachedDisk(disk, instance string) string {
73457419
return fmt.Sprintf(`
73467420
data "google_compute_image" "my_image" {

0 commit comments

Comments
 (0)