Skip to content

Commit 9e813ee

Browse files
make label updatable for google_compute_instance under initialize_params (#15081) (#10710)
[upstream:757ebf8383d4362786ccff45899fac65ed7d775a] Signed-off-by: Modular Magician <[email protected]>
1 parent 06b3ed3 commit 9e813ee

File tree

3 files changed

+134
-1
lines changed

3 files changed

+134
-1
lines changed

.changelog/15081.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
unknown: make label updatable for google_compute_instance under initialize_params

google-beta/services/compute/resource_compute_instance.go

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"errors"
2424
"fmt"
2525
"log"
26+
"net/http"
2627
"strconv"
2728
"strings"
2829
"time"
@@ -479,7 +480,6 @@ func ResourceComputeInstance() *schema.Resource {
479480
Optional: true,
480481
AtLeastOneOf: initializeParamsKeys,
481482
Computed: true,
482-
ForceNew: true,
483483
Description: `A set of key/value label pairs assigned to the disk.`,
484484
},
485485

@@ -2706,6 +2706,31 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
27062706
}
27072707
}
27082708

2709+
if d.HasChange("boot_disk") {
2710+
//default behavior for the disk is to have the same name as the instance
2711+
diskName := instance.Name
2712+
if v := tpgresource.GetResourceNameFromSelfLink(d.Get("boot_disk.0.source").(string)); v != diskName {
2713+
diskName = v
2714+
}
2715+
2716+
disk, err := config.NewComputeClient(userAgent).Disks.Get(project, zone, diskName).Do()
2717+
if err != nil {
2718+
return fmt.Errorf("Error getting boot disk: %s", err)
2719+
}
2720+
2721+
obj := make(map[string]interface{})
2722+
2723+
if d.HasChange("boot_disk.0.initialize_params.0.labels") {
2724+
obj["labels"] = tpgresource.ConvertStringMap(d.Get("boot_disk.0.initialize_params.0.labels").(map[string]interface{}))
2725+
obj["labelFingerprint"] = disk.LabelFingerprint
2726+
url := "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{name}}/setLabels"
2727+
err := updateDisk(d, config, userAgent, project, url, obj)
2728+
if err != nil {
2729+
return err
2730+
}
2731+
}
2732+
}
2733+
27092734
if d.HasChange("attached_disk") {
27102735
o, n := d.GetChange("attached_disk")
27112736

@@ -3800,3 +3825,36 @@ func CheckForCommonAliasIp(old, new *compute.NetworkInterface) []*compute.AliasI
38003825
}
38013826
return resultAliasIpRanges
38023827
}
3828+
3829+
func updateDisk(d *schema.ResourceData, config *transport_tpg.Config, userAgent, project, patchUrl string, obj map[string]interface{}) error {
3830+
billingProject := project
3831+
url, err := tpgresource.ReplaceVars(d, config, patchUrl)
3832+
if err != nil {
3833+
return err
3834+
}
3835+
headers := make(http.Header)
3836+
if bp, err := tpgresource.GetBillingProject(d, config); err != nil {
3837+
billingProject = bp
3838+
}
3839+
3840+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
3841+
Config: config,
3842+
Method: "POST",
3843+
Project: billingProject,
3844+
RawURL: url,
3845+
UserAgent: userAgent,
3846+
Body: obj,
3847+
Timeout: d.Timeout(schema.TimeoutUpdate),
3848+
Headers: headers,
3849+
})
3850+
if err != nil {
3851+
return fmt.Errorf("Error updating Disk %q: %s", d.Id(), err)
3852+
}
3853+
err = ComputeOperationWaitTime(
3854+
config, res, project, "Updating Disk", userAgent,
3855+
d.Timeout(schema.TimeoutUpdate))
3856+
if err != nil {
3857+
return err
3858+
}
3859+
return nil
3860+
}

google-beta/services/compute/resource_compute_instance_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,51 @@ func TestAccComputeInstance_attachDisk_forceAttach(t *testing.T) {
12381238
})
12391239
}
12401240

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

@@ -7325,6 +7370,35 @@ resource "google_compute_resource_policy" "instance_schedule2" {
73257370
`, instance, schedule1, schedule2)
73267371
}
73277372

7373+
func testAccComputeInstance_bootDiskUpdate(context map[string]interface{}) string {
7374+
return acctest.Nprintf(`
7375+
data "google_compute_image" "my_image" {
7376+
family = "debian-11"
7377+
project = "debian-cloud"
7378+
}
7379+
7380+
resource "google_compute_instance" "foobar" {
7381+
name = "%{instance_name}"
7382+
machine_type = "e2-medium"
7383+
zone = "us-central1-a"
7384+
7385+
boot_disk {
7386+
initialize_params {
7387+
image = data.google_compute_image.my_image.self_link
7388+
size = %{disk_size}
7389+
labels = {
7390+
"foo" = "%{labels}"
7391+
}
7392+
}
7393+
}
7394+
7395+
network_interface {
7396+
network = "default"
7397+
}
7398+
}
7399+
`, context)
7400+
}
7401+
73287402
func testAccComputeInstance_attachedDisk(disk, instance string) string {
73297403
return fmt.Sprintf(`
73307404
data "google_compute_image" "my_image" {

0 commit comments

Comments
 (0)