Skip to content

Commit b4f0138

Browse files
Add support of storage pool on boot disk. (#11230) (#18817)
[upstream:a91e512e76282855fce81ad9622d0d1b73d816e9] Signed-off-by: Modular Magician <[email protected]>
1 parent c7165ac commit b4f0138

File tree

4 files changed

+122
-0
lines changed

4 files changed

+122
-0
lines changed

.changelog/11230.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added `storage_pool` under `boot_disk.initialize_params` to `google_compute_instance` resource
3+
```

google/services/compute/resource_compute_instance.go

+15
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ var (
7070
"boot_disk.0.initialize_params.0.provisioned_iops",
7171
"boot_disk.0.initialize_params.0.provisioned_throughput",
7272
"boot_disk.0.initialize_params.0.enable_confidential_compute",
73+
"boot_disk.0.initialize_params.0.storage_pool",
7374
}
7475

7576
schedulingKeys = []string{
@@ -289,6 +290,15 @@ func ResourceComputeInstance() *schema.Resource {
289290
ForceNew: true,
290291
Description: `A flag to enable confidential compute mode on boot disk`,
291292
},
293+
294+
"storage_pool": {
295+
Type: schema.TypeString,
296+
Optional: true,
297+
AtLeastOneOf: initializeParamsKeys,
298+
ForceNew: true,
299+
DiffSuppressFunc: tpgresource.CompareResourceNames,
300+
Description: `The URL of the storage pool in which the new disk is created`,
301+
},
292302
},
293303
},
294304
},
@@ -2823,6 +2833,10 @@ func expandBootDisk(d *schema.ResourceData, config *transport_tpg.Config, projec
28232833
if _, ok := d.GetOk("boot_disk.0.initialize_params.0.resource_manager_tags"); ok {
28242834
disk.InitializeParams.ResourceManagerTags = tpgresource.ExpandStringMap(d, "boot_disk.0.initialize_params.0.resource_manager_tags")
28252835
}
2836+
2837+
if v, ok := d.GetOk("boot_disk.0.initialize_params.0.storage_pool"); ok {
2838+
disk.InitializeParams.StoragePool = v.(string)
2839+
}
28262840
}
28272841

28282842
if v, ok := d.GetOk("boot_disk.0.mode"); ok {
@@ -2865,6 +2879,7 @@ func flattenBootDisk(d *schema.ResourceData, disk *compute.AttachedDisk, config
28652879
"provisioned_iops": diskDetails.ProvisionedIops,
28662880
"provisioned_throughput": diskDetails.ProvisionedThroughput,
28672881
"enable_confidential_compute": diskDetails.EnableConfidentialCompute,
2882+
"storage_pool": tpgresource.GetResourceNameFromSelfLink(diskDetails.StoragePool),
28682883
}}
28692884
}
28702885

google/services/compute/resource_compute_instance_test.go

+99
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package compute_test
44

55
import (
66
"fmt"
7+
"net/http"
78
"reflect"
89
"regexp"
910
"sort"
@@ -19,6 +20,7 @@ import (
1920
"github.com/hashicorp/terraform-provider-google/google/envvar"
2021
tpgcompute "github.com/hashicorp/terraform-provider-google/google/services/compute"
2122
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
23+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
2224

2325
"google.golang.org/api/compute/v1"
2426
)
@@ -8044,3 +8046,100 @@ resource "google_compute_instance" "foobar" {
80448046
}
80458047
`, suffix, region, suffix, instance, region, stack_type)
80468048
}
8049+
8050+
func TestAccComputeInstance_bootDisk_storagePoolSpecified(t *testing.T) {
8051+
t.Parallel()
8052+
8053+
instanceName := fmt.Sprintf("tf-test-instance-%s", acctest.RandString(t, 10))
8054+
storagePoolName := fmt.Sprintf("tf-test-storage-pool-%s", acctest.RandString(t, 10))
8055+
storagePoolUrl := fmt.Sprintf("/projects/%s/zones/%s/storagePools/%s", envvar.GetTestProjectFromEnv(), envvar.GetTestZoneFromEnv(), storagePoolName)
8056+
8057+
acctest.VcrTest(t, resource.TestCase{
8058+
PreCheck: func() { acctest.AccTestPreCheck(t) },
8059+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
8060+
Steps: []resource.TestStep{
8061+
{
8062+
PreConfig: setupTestingStoragePool_HyperdiskBalanced(t, storagePoolName),
8063+
Config: testAccComputeInstance_bootDisk_storagePoolSpecified(instanceName, storagePoolUrl, envvar.GetTestZoneFromEnv()),
8064+
Check: resource.ComposeTestCheckFunc(
8065+
resource.TestCheckResourceAttr("google_compute_instance.foobar", "boot_disk.0.initialize_params.0.storage_pool", storagePoolName),
8066+
),
8067+
},
8068+
{
8069+
ResourceName: "google_compute_instance.foobar",
8070+
ImportState: true,
8071+
ImportStateVerify: true,
8072+
},
8073+
},
8074+
})
8075+
8076+
cleanupTestingStoragePool(t, storagePoolName)
8077+
}
8078+
8079+
func setupTestingStoragePool_HyperdiskBalanced(t *testing.T, storagePoolName string) func() {
8080+
return func() {
8081+
config := acctest.GoogleProviderConfig(t)
8082+
headers := make(http.Header)
8083+
project := envvar.GetTestProjectFromEnv()
8084+
zone := envvar.GetTestZoneFromEnv()
8085+
url := fmt.Sprintf("%sprojects/%s/zones/%s/storagePools", config.ComputeBasePath, project, zone)
8086+
storagePoolTypeUrl := fmt.Sprintf("/projects/%s/zones/%s/storagePoolTypes/hyperdisk-balanced", project, zone)
8087+
defaultTimeout := 20 * time.Minute
8088+
obj := make(map[string]interface{})
8089+
obj["name"] = storagePoolName
8090+
obj["poolProvisionedCapacityGb"] = 10240
8091+
obj["poolProvisionedIops"] = 10000
8092+
obj["poolProvisionedThroughput"] = 1024
8093+
obj["storagePoolType"] = storagePoolTypeUrl
8094+
obj["capacityProvisioningType"] = "ADVANCED"
8095+
8096+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
8097+
Config: config,
8098+
Method: "POST",
8099+
Project: project,
8100+
RawURL: url,
8101+
UserAgent: config.UserAgent,
8102+
Body: obj,
8103+
Timeout: defaultTimeout,
8104+
Headers: headers,
8105+
})
8106+
if err != nil {
8107+
t.Errorf("Error creating StoragePool: %s", err)
8108+
}
8109+
8110+
err = tpgcompute.ComputeOperationWaitTime(config, res, project, "Creating StoragePool", config.UserAgent, defaultTimeout)
8111+
if err != nil {
8112+
t.Errorf("Error waiting to create StoragePool: %s", err)
8113+
}
8114+
}
8115+
}
8116+
8117+
func testAccComputeInstance_bootDisk_storagePoolSpecified(instanceName, storagePoolUrl, zone string) string {
8118+
return fmt.Sprintf(`
8119+
data "google_compute_image" "my_image" {
8120+
family = "ubuntu-2204-lts"
8121+
project = "ubuntu-os-cloud"
8122+
}
8123+
8124+
data "google_project" "project" {}
8125+
8126+
resource "google_compute_instance" "foobar" {
8127+
name = "%s"
8128+
machine_type= "h3-standard-88"
8129+
zone = "%s"
8130+
8131+
boot_disk {
8132+
initialize_params {
8133+
image = data.google_compute_image.my_image.self_link
8134+
type = "hyperdisk-balanced"
8135+
size = 500
8136+
storage_pool = "%s"
8137+
}
8138+
}
8139+
8140+
network_interface {
8141+
network = "default"
8142+
}
8143+
}
8144+
`, instanceName, zone, storagePoolUrl)
8145+
}

website/docs/r/compute_instance.html.markdown

+5
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,11 @@ is desired, you will need to modify your state file manually using
270270
* `enable_confidential_compute` - (Optional) Whether this disk is using confidential compute mode.
271271
Note: Only supported on hyperdisk skus, disk_encryption_key is required when setting to true.
272272

273+
* `storage_pool` - (Optional) The URL of the storage pool in which the new disk is created.
274+
For example:
275+
* https://www.googleapis.com/compute/v1/projects/{project}/zones/{zone}/storagePools/{storagePool}
276+
* /projects/{project}/zones/{zone}/storagePools/{storagePool}
277+
273278
<a name="nested_scratch_disk"></a>The `scratch_disk` block supports:
274279

275280
* `interface` - (Required) The disk interface to use for attaching this disk; either SCSI or NVME.

0 commit comments

Comments
 (0)