From 7146e52c7018e58c51eedc15fa6f3a8effc5d609 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 21 Jul 2026 08:52:43 +0000 Subject: [PATCH 01/34] feat: add support for storage pools to boot and additional persistent disks --- modules/compute/vm-instance/README.md | 3 ++- modules/compute/vm-instance/main.tf | 20 +++++++++++--------- modules/compute/vm-instance/variables.tf | 13 ++++++++++--- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/modules/compute/vm-instance/README.md b/modules/compute/vm-instance/README.md index c4247ac0bc..0201337eda 100644 --- a/modules/compute/vm-instance/README.md +++ b/modules/compute/vm-instance/README.md @@ -205,7 +205,7 @@ limitations under the License. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [add\_deployment\_name\_before\_prefix](#input\_add\_deployment\_name\_before\_prefix) | If true, the names of VMs and disks will always be prefixed with `deployment_name` to enable uniqueness across deployments.
See `name_prefix` for further details on resource naming behavior. | `bool` | `false` | no | -| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
})
| `{}` | no | +| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | | [allocate\_ip](#input\_allocate\_ip) | If not null, allocate IPs with the given configuration. See details at
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address |
object({
address_type = optional(string, "INTERNAL")
purpose = optional(string),
network_tier = optional(string),
ip_version = optional(string, "IPV4"),
})
| `null` | no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | | [auto\_delete\_boot\_disk](#input\_auto\_delete\_boot\_disk) | Controls if boot disk should be auto-deleted when instance is deleted. | `bool` | `true` | no | @@ -214,6 +214,7 @@ limitations under the License. | [deployment\_name](#input\_deployment\_name) | Name of the deployment, will optionally be used name resources according to `name_prefix` | `string` | n/a | yes | | [disable\_public\_ips](#input\_disable\_public\_ips) | If set to true, instances will not have public IPs | `bool` | `false` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for instances. | `number` | `200` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for instances. | `string` | `"pd-standard"` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enable or Disable OS Login with "ENABLE" or "DISABLE". Set to "INHERIT" to inherit project OS Login setting. | `string` | `"ENABLE"` | no | | [guest\_accelerator](#input\_guest\_accelerator) | List of the type and count of accelerator cards attached to the instance. |
list(object({
type = string,
count = number
}))
| `[]` | no | diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 214d9da131..f6bb7f35c8 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -119,11 +119,12 @@ resource "google_compute_disk" "additional_disks" { count = var.instance_count * var.additional_persistent_disks.count # NB: this resource array must be sliced accounting for var.instance_count - name = "${local.resource_prefix}-disk-${count.index}" - type = var.additional_persistent_disks.type - size = var.additional_persistent_disks.size - labels = local.labels - zone = var.zone + name = "${local.resource_prefix}-disk-${count.index}" + type = var.additional_persistent_disks.type + size = var.additional_persistent_disks.size + labels = local.labels + zone = var.zone + storage_pool = var.additional_persistent_disks.storage_pool } resource "google_compute_resource_policy" "placement_policy" { @@ -188,10 +189,11 @@ resource "google_compute_instance" "compute_vm" { boot_disk { initialize_params { - image = data.google_compute_image.compute_image.self_link - size = var.disk_size_gb - type = var.disk_type - labels = local.labels + image = data.google_compute_image.compute_image.self_link + size = var.disk_size_gb + type = var.disk_type + labels = local.labels + storage_pool = var.disk_storage_pool } device_name = "${local.resource_prefix}-boot-disk-${count.index}" diff --git a/modules/compute/vm-instance/variables.tf b/modules/compute/vm-instance/variables.tf index f442c70edf..78cca86b66 100644 --- a/modules/compute/vm-instance/variables.tf +++ b/modules/compute/vm-instance/variables.tf @@ -62,6 +62,12 @@ variable "auto_delete_boot_disk" { default = true } +variable "disk_storage_pool" { + description = "Storage pool to use for the boot disk." + type = string + default = null +} + variable "local_ssd_count" { description = "The number of local SSDs to attach to each VM. See https://cloud.google.com/compute/docs/disks/local-ssd." type = number @@ -77,9 +83,10 @@ variable "local_ssd_interface" { variable "additional_persistent_disks" { description = "Configurations of additional disks to be included on the partition nodes." type = object({ - count = optional(number, 0) - type = optional(string, "pd-balanced") - size = optional(number, 200) + count = optional(number, 0) + type = optional(string, "pd-balanced") + size = optional(number, 200) + storage_pool = optional(string) }) default = {} } From b8f111f7652c88fb972e1d465fe059f3f0a13537 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 21 Jul 2026 10:02:52 +0000 Subject: [PATCH 02/34] feat: migrate additional disks to google-beta provider and add Hyperdisk precondition validation --- modules/compute/vm-instance/README.md | 6 +++--- modules/compute/vm-instance/main.tf | 8 ++++++++ modules/compute/vm-instance/variables.tf | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/modules/compute/vm-instance/README.md b/modules/compute/vm-instance/README.md index 0201337eda..6c29894798 100644 --- a/modules/compute/vm-instance/README.md +++ b/modules/compute/vm-instance/README.md @@ -192,10 +192,10 @@ limitations under the License. | Name | Type | | ---- | ---- | +| [google-beta_google_compute_disk.additional_disks](https://registry.terraform.io/providers/hashicorp/google-beta/latest/docs/resources/google_compute_disk) | resource | | [google-beta_google_compute_instance.compute_vm](https://registry.terraform.io/providers/hashicorp/google-beta/latest/docs/resources/google_compute_instance) | resource | | [google-beta_google_compute_resource_policy.placement_policy](https://registry.terraform.io/providers/hashicorp/google-beta/latest/docs/resources/google_compute_resource_policy) | resource | | [google_compute_address.compute_ip](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address) | resource | -| [google_compute_disk.additional_disks](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_disk) | resource | | [null_resource.image](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource | | [null_resource.replace_vm_trigger_from_placement](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource | | [google_compute_image.compute_image](https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/compute_image) | data source | @@ -205,7 +205,7 @@ limitations under the License. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [add\_deployment\_name\_before\_prefix](#input\_add\_deployment\_name\_before\_prefix) | If true, the names of VMs and disks will always be prefixed with `deployment_name` to enable uniqueness across deployments.
See `name_prefix` for further details on resource naming behavior. | `bool` | `false` | no | -| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | +| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. Note that storage\_pool is only supported with Hyperdisk types. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | | [allocate\_ip](#input\_allocate\_ip) | If not null, allocate IPs with the given configuration. See details at
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address |
object({
address_type = optional(string, "INTERNAL")
purpose = optional(string),
network_tier = optional(string),
ip_version = optional(string, "IPV4"),
})
| `null` | no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | | [auto\_delete\_boot\_disk](#input\_auto\_delete\_boot\_disk) | Controls if boot disk should be auto-deleted when instance is deleted. | `bool` | `true` | no | @@ -214,7 +214,7 @@ limitations under the License. | [deployment\_name](#input\_deployment\_name) | Name of the deployment, will optionally be used name resources according to `name_prefix` | `string` | n/a | yes | | [disable\_public\_ips](#input\_disable\_public\_ips) | If set to true, instances will not have public IPs | `bool` | `false` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for instances. | `number` | `200` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for instances. | `string` | `"pd-standard"` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enable or Disable OS Login with "ENABLE" or "DISABLE". Set to "INHERIT" to inherit project OS Login setting. | `string` | `"ENABLE"` | no | | [guest\_accelerator](#input\_guest\_accelerator) | List of the type and count of accelerator cards attached to the instance. |
list(object({
type = string,
count = number
}))
| `[]` | no | diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index f6bb7f35c8..af335f2f56 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -119,12 +119,20 @@ resource "google_compute_disk" "additional_disks" { count = var.instance_count * var.additional_persistent_disks.count # NB: this resource array must be sliced accounting for var.instance_count + provider = google-beta name = "${local.resource_prefix}-disk-${count.index}" type = var.additional_persistent_disks.type size = var.additional_persistent_disks.size labels = local.labels zone = var.zone storage_pool = var.additional_persistent_disks.storage_pool + + lifecycle { + precondition { + condition = var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-", var.additional_persistent_disks.type)) + error_message = "Storage pools are only supported with Hyperdisk types." + } + } } resource "google_compute_resource_policy" "placement_policy" { diff --git a/modules/compute/vm-instance/variables.tf b/modules/compute/vm-instance/variables.tf index 78cca86b66..52eca7f1df 100644 --- a/modules/compute/vm-instance/variables.tf +++ b/modules/compute/vm-instance/variables.tf @@ -63,7 +63,7 @@ variable "auto_delete_boot_disk" { } variable "disk_storage_pool" { - description = "Storage pool to use for the boot disk." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types." type = string default = null } @@ -81,7 +81,7 @@ variable "local_ssd_interface" { } variable "additional_persistent_disks" { - description = "Configurations of additional disks to be included on the partition nodes." + description = "Configurations of additional disks to be included on the partition nodes. Note that storage_pool is only supported with Hyperdisk types." type = object({ count = optional(number, 0) type = optional(string, "pd-balanced") From d8ec71c2f0d48e3be287f9a485779583cd01178a Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 21 Jul 2026 10:29:38 +0000 Subject: [PATCH 03/34] refactor: move storage pool validation to root resource --- modules/compute/vm-instance/main.tf | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index af335f2f56..01665c864d 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -126,13 +126,6 @@ resource "google_compute_disk" "additional_disks" { labels = local.labels zone = var.zone storage_pool = var.additional_persistent_disks.storage_pool - - lifecycle { - precondition { - condition = var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-", var.additional_persistent_disks.type)) - error_message = "Storage pools are only supported with Hyperdisk types." - } - } } resource "google_compute_resource_policy" "placement_policy" { @@ -343,5 +336,13 @@ resource "google_compute_instance" "compute_vm" { ], "${substr(var.machine_type, 0, 3)}:${var.disk_type}") error_message = "A disk_type=${var.disk_type} cannot be used with machine_type=${var.machine_type}." } + precondition { + condition = var.disk_storage_pool == null || can(regex("^hyperdisk-", var.disk_type)) + error_message = "Storage pools are only supported with Hyperdisk types." + } + precondition { + condition = var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-", var.additional_persistent_disks.type)) + error_message = "Storage pools are only supported with Hyperdisk types." + } } } From a5611612d9397ddb1f4656ac190ea0e371d7221e Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 21 Jul 2026 10:35:27 +0000 Subject: [PATCH 04/34] fix: add null check to storage pool precondition --- modules/compute/vm-instance/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 01665c864d..80bbd25546 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -341,7 +341,7 @@ resource "google_compute_instance" "compute_vm" { error_message = "Storage pools are only supported with Hyperdisk types." } precondition { - condition = var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-", var.additional_persistent_disks.type)) + condition = var.additional_persistent_disks.count == 0 || var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-", var.additional_persistent_disks.type)) error_message = "Storage pools are only supported with Hyperdisk types." } } From 648eb8b6c1d37262f0c6c1516cfc336da8175d39 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Thu, 23 Jul 2026 05:43:17 +0000 Subject: [PATCH 05/34] feat: add support for GKE storage pools in node pools and storage classes --- modules/compute/gke-node-pool/main.tf | 5 +++++ modules/compute/gke-node-pool/variables.tf | 6 ++++++ modules/file-system/gke-storage/main.tf | 8 ++++++++ .../storage-class/hyperdisk-balanced-sc.yaml.tftpl | 3 +++ .../storage-class/hyperdisk-throughput-sc.yaml.tftpl | 3 +++ modules/file-system/gke-storage/variables.tf | 6 ++++++ 6 files changed, 31 insertions(+) diff --git a/modules/compute/gke-node-pool/main.tf b/modules/compute/gke-node-pool/main.tf index 8f2f28ec7b..87e5989d9e 100644 --- a/modules/compute/gke-node-pool/main.tf +++ b/modules/compute/gke-node-pool/main.tf @@ -173,6 +173,7 @@ resource "google_container_node_pool" "node_pool" { node_config { disk_size_gb = var.disk_size_gb disk_type = var.disk_type + storage_pools = var.disk_storage_pool != null ? [var.disk_storage_pool] : null resource_labels = local.labels labels = local.kubernetes_labels service_account = var.service_account_email @@ -347,6 +348,10 @@ resource "google_container_node_pool" "node_pool" { condition = !(length(compact(local.input_reservation_suffixes)) > 0 && length((var.zones != null ? var.zones : [])) == 0) error_message = "var.zones must be explicitly provided when using an extended reservation block." } + precondition { + condition = var.disk_storage_pool == null || can(regex("^hyperdisk-", var.disk_type)) + error_message = "Storage pools are only supported with Hyperdisk types." + } precondition { condition = (var.max_pods_per_node == null) || (data.google_container_cluster.gke_cluster.networking_mode == "VPC_NATIVE") error_message = "max_pods_per_node does not work on `routes-based` clusters, that don't have IP Aliasing enabled." diff --git a/modules/compute/gke-node-pool/variables.tf b/modules/compute/gke-node-pool/variables.tf index 83d13dffc7..2caf18bd0f 100644 --- a/modules/compute/gke-node-pool/variables.tf +++ b/modules/compute/gke-node-pool/variables.tf @@ -71,6 +71,12 @@ variable "disk_type" { default = null } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "enable_gcfs" { description = "Enable the Google Container Filesystem (GCFS). See [restrictions](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_cluster#gcfs_config)." type = bool diff --git a/modules/file-system/gke-storage/main.tf b/modules/file-system/gke-storage/main.tf index 15c9d9e38a..d3ff7eea7d 100644 --- a/modules/file-system/gke-storage/main.tf +++ b/modules/file-system/gke-storage/main.tf @@ -36,6 +36,13 @@ check "private_vpc_connection_peering" { } } +check "hyperdisk_extreme_storage_pool" { + assert { + condition = lower(var.storage_type) != "hyperdisk-extreme" || (var.disk_storage_pool == null || var.disk_storage_pool == "") + error_message = "Storage Pools are not supported with Hyperdisk Extreme. Use hyperdisk-balanced or hyperdisk-throughput." + } +} + module "kubectl_apply" { source = "../../management/kubectl-apply" @@ -57,6 +64,7 @@ module "kubectl_apply" { topology_zones = var.sc_topology_zones enable_confidential_storage = var.enable_confidential_storage disk_encryption_kms_key = var.disk_encryption_kms_key + disk_storage_pool = var.disk_storage_pool }) wait_for_rollout = false }, diff --git a/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl b/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl index f5dcdfdd1a..77b08c4a2b 100644 --- a/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl +++ b/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl @@ -18,6 +18,9 @@ parameters: %{~ if disk_encryption_kms_key != null && disk_encryption_kms_key != "" ~} disk-encryption-kms-key: "${disk_encryption_kms_key}" %{~ endif ~} + %{~ if disk_storage_pool != null && disk_storage_pool != "" ~} + storage-pool: "${disk_storage_pool}" + %{~ endif ~} volumeBindingMode: ${volume_binding_mode} reclaimPolicy: ${reclaim_policy} %{~ if topology_zones != null ~} diff --git a/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl b/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl index ec404aec45..ac3b269193 100644 --- a/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl +++ b/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl @@ -11,6 +11,9 @@ allowVolumeExpansion: true parameters: type: hyperdisk-throughput provisioned-throughput-on-create: "250Mi" + %{~ if disk_storage_pool != null && disk_storage_pool != "" ~} + storage-pool: "${disk_storage_pool}" + %{~ endif ~} volumeBindingMode: ${volume_binding_mode} reclaimPolicy: ${reclaim_policy} %{~ if topology_zones != null ~} diff --git a/modules/file-system/gke-storage/variables.tf b/modules/file-system/gke-storage/variables.tf index ef43104a7a..1eb24e34a6 100644 --- a/modules/file-system/gke-storage/variables.tf +++ b/modules/file-system/gke-storage/variables.tf @@ -154,3 +154,9 @@ variable "disk_encryption_kms_key" { type = string default = null } + +variable "disk_storage_pool" { + description = "Storage pool to use for the provisioned disks. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} From b8ff09eb47fdb6fb734fae80612da4f07520f089 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Thu, 23 Jul 2026 05:55:06 +0000 Subject: [PATCH 06/34] chore: updarted readme --- modules/compute/gke-node-pool/README.md | 1 + modules/file-system/gke-storage/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/compute/gke-node-pool/README.md b/modules/compute/gke-node-pool/README.md index 0b3dfb5203..2189a4064a 100644 --- a/modules/compute/gke-node-pool/README.md +++ b/modules/compute/gke-node-pool/README.md @@ -347,6 +347,7 @@ limitations under the License. | [compact\_placement](#input\_compact\_placement) | DEPRECATED: Use `placement_policy` | `bool` | `null` | no | | [confidential\_instance\_type](#input\_confidential\_instance\_type) | The type of technology used by the confidential nodes (e.g., SEV, SEV\_SNP, TDX). Leave null for default. | `string` | `null` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for each node. | `number` | `100` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for each node. | `string` | `null` | no | | [dranet\_allocation\_mode](#input\_dranet\_allocation\_mode) | Allocation mode for the auto-applied DRANET ResourceClaimTemplate (e.g., 'All' or 'ExactCount'). | `string` | `"All"` | no | | [dranet\_device\_class\_name](#input\_dranet\_device\_class\_name) | DRA device class name. If null, automatically detected based on machine type. Default is mrdma.google.com (RDMA) for RDMA-supported machines, netdev.google.com for others. | `string` | `null` | no | diff --git a/modules/file-system/gke-storage/README.md b/modules/file-system/gke-storage/README.md index e7163cef8d..a08ab6d02f 100644 --- a/modules/file-system/gke-storage/README.md +++ b/modules/file-system/gke-storage/README.md @@ -115,6 +115,7 @@ limitations under the License. | [capacity\_gb](#input\_capacity\_gb) | The storage capacity with which to create the persistent volume. | `number` | n/a | yes | | [cluster\_id](#input\_cluster\_id) | An identifier for the GKE cluster in the format `projects/{{project}}/locations/{{location}}/clusters/{{cluster}}` | `string` | n/a | yes | | [disk\_encryption\_kms\_key](#input\_disk\_encryption\_kms\_key) | The Customer-Managed Encryption Key (CMEK) to use for disk encryption. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the provisioned disks. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [enable\_confidential\_storage](#input\_enable\_confidential\_storage) | Enable Confidential Storage for this storage class. | `bool` | `false` | no | | [labels](#input\_labels) | GCE resource labels to be applied to resources. Key-value pairs. | `map(string)` | n/a | yes | | [mount\_options](#input\_mount\_options) | Controls the mountOptions for dynamically provisioned PersistentVolumes of this storage class. | `string` | `null` | no | From ad47a8515835dec1cb50d37ccbfa1317fec21cd3 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Thu, 23 Jul 2026 06:12:02 +0000 Subject: [PATCH 07/34] feat: allow empty strings for disk storage pool configuration --- modules/compute/gke-node-pool/main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/compute/gke-node-pool/main.tf b/modules/compute/gke-node-pool/main.tf index 87e5989d9e..0b403f5311 100644 --- a/modules/compute/gke-node-pool/main.tf +++ b/modules/compute/gke-node-pool/main.tf @@ -173,7 +173,7 @@ resource "google_container_node_pool" "node_pool" { node_config { disk_size_gb = var.disk_size_gb disk_type = var.disk_type - storage_pools = var.disk_storage_pool != null ? [var.disk_storage_pool] : null + storage_pools = (var.disk_storage_pool != null && var.disk_storage_pool != "") ? [var.disk_storage_pool] : null resource_labels = local.labels labels = local.kubernetes_labels service_account = var.service_account_email @@ -349,7 +349,7 @@ resource "google_container_node_pool" "node_pool" { error_message = "var.zones must be explicitly provided when using an extended reservation block." } precondition { - condition = var.disk_storage_pool == null || can(regex("^hyperdisk-", var.disk_type)) + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-", var.disk_type)) error_message = "Storage pools are only supported with Hyperdisk types." } precondition { From 45add669c6f8fd68b65f0cf5f9c54c1141b992c8 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Mon, 27 Jul 2026 11:55:06 +0000 Subject: [PATCH 08/34] feat: add support for Hyperdisk storage pools to Slurm controller, login, and node modules --- .../compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf | 2 ++ .../schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf | 7 +++++++ .../modules/compute/schedmd-slurm-gcp-v6-nodeset/main.tf | 2 ++ .../compute/schedmd-slurm-gcp-v6-nodeset/variables.tf | 7 +++++++ .../compute/schedmd-slurm-gcp-v6-partition/variables.tf | 2 ++ .../modules/internal/slurm-gcp/instance_template/main.tf | 2 ++ .../internal/slurm-gcp/instance_template/variables.tf | 7 +++++++ .../internal/slurm-gcp/internal_instance_template/main.tf | 2 ++ .../slurm-gcp/internal_instance_template/variables.tf | 7 +++++++ community/modules/internal/slurm-gcp/login/main.tf | 1 + community/modules/internal/slurm-gcp/login/variables.tf | 2 ++ .../schedmd-slurm-gcp-v6-controller/controller.tf | 3 +++ .../scheduler/schedmd-slurm-gcp-v6-controller/partition.tf | 1 + .../scheduler/schedmd-slurm-gcp-v6-controller/variables.tf | 4 ++++ .../variables_controller_instance.tf | 7 +++++++ .../modules/scheduler/schedmd-slurm-gcp-v6-login/main.tf | 2 ++ .../scheduler/schedmd-slurm-gcp-v6-login/variables.tf | 7 +++++++ 17 files changed, 65 insertions(+) diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf index 2a3ce44b3a..55ec510db2 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf @@ -60,6 +60,7 @@ locals { disk_name = ad.disk_name device_name = ad.device_name disk_type = ad.disk_type + disk_storage_pool = ad.disk_storage_pool disk_size_gb = ad.disk_size_gb disk_labels = merge(ad.disk_labels, local.labels) auto_delete = ad.auto_delete @@ -98,6 +99,7 @@ module "slurm_nodeset_template" { disk_labels = merge(local.labels, var.disk_labels) disk_size_gb = var.disk_size_gb disk_type = var.disk_type + disk_storage_pool = var.disk_storage_pool bandwidth_tier = var.bandwidth_tier can_ip_forward = var.can_ip_forward diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf index 7bcb22b668..07c874f2bc 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf @@ -123,6 +123,12 @@ variable "disk_type" { default = "pd-standard" } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "disk_size_gb" { description = "Size of boot disk to create for the partition compute nodes." type = number @@ -148,6 +154,7 @@ variable "additional_disks" { device_name = string disk_size_gb = number disk_type = string + disk_storage_pool = optional(string) disk_labels = map(string) auto_delete = bool boot = bool diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/main.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/main.tf index fcba71516c..e9116faee2 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/main.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/main.tf @@ -49,6 +49,7 @@ locals { disk_name = ad.disk_name device_name = ad.device_name disk_type = ad.disk_type + disk_storage_pool = ad.disk_storage_pool disk_size_gb = ad.disk_size_gb disk_labels = merge(ad.disk_labels, local.labels) auto_delete = ad.auto_delete @@ -85,6 +86,7 @@ locals { disk_labels = merge(local.labels, var.disk_labels) disk_size_gb = var.disk_size_gb disk_type = var.disk_type + disk_storage_pool = var.disk_storage_pool disk_resource_manager_tags = var.disk_resource_manager_tags additional_disks = local.additional_disks diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf index 95e8967497..55ea9f43b8 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf @@ -142,6 +142,12 @@ variable "disk_type" { default = "pd-standard" } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "disk_size_gb" { description = "Size of boot disk to create for the partition compute nodes." type = number @@ -192,6 +198,7 @@ variable "additional_disks" { device_name = optional(string) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = optional(map(string)) auto_delete = optional(bool) boot = optional(bool) diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-partition/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-partition/variables.tf index 5550941d15..6ad792d63c 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-partition/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-partition/variables.tf @@ -64,6 +64,7 @@ variable "nodeset" { device_name = optional(string) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = optional(map(string), {}) auto_delete = optional(bool, true) boot = optional(bool, false) @@ -76,6 +77,7 @@ variable "nodeset" { disk_resource_manager_tags = optional(map(string), {}) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_encryption_key = optional(string) disk_encryption_key_service_account = optional(string) enable_confidential_vm = optional(bool, false) diff --git a/community/modules/internal/slurm-gcp/instance_template/main.tf b/community/modules/internal/slurm-gcp/instance_template/main.tf index 6064506280..bf7b7b4bec 100644 --- a/community/modules/internal/slurm-gcp/instance_template/main.tf +++ b/community/modules/internal/slurm-gcp/instance_template/main.tf @@ -33,6 +33,7 @@ locals { boot = disk.boot disk_size_gb = disk.disk_size_gb disk_type = disk.disk_type + disk_storage_pool = disk.disk_storage_pool disk_labels = merge( disk.disk_labels, { @@ -157,6 +158,7 @@ module "instance_template" { # Disk disk_type = var.disk_type disk_size_gb = var.disk_size_gb + disk_storage_pool = var.disk_storage_pool auto_delete = var.disk_auto_delete disk_labels = merge( { diff --git a/community/modules/internal/slurm-gcp/instance_template/variables.tf b/community/modules/internal/slurm-gcp/instance_template/variables.tf index fee3fad3ef..27c2dd0826 100644 --- a/community/modules/internal/slurm-gcp/instance_template/variables.tf +++ b/community/modules/internal/slurm-gcp/instance_template/variables.tf @@ -316,6 +316,12 @@ variable "disk_type" { default = "pd-standard" } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "disk_size_gb" { type = number description = "Boot disk size in GB." @@ -365,6 +371,7 @@ variable "additional_disks" { disk_name = optional(string) device_name = string disk_type = optional(string) + disk_storage_pool = optional(string) disk_size_gb = optional(number) disk_labels = map(string) auto_delete = bool diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/main.tf b/community/modules/internal/slurm-gcp/internal_instance_template/main.tf index cbff8bfbe8..c2082e9808 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/main.tf +++ b/community/modules/internal/slurm-gcp/internal_instance_template/main.tf @@ -33,6 +33,7 @@ locals { source_image = var.source_image != "" ? format("${local.source_image_project}/${local.source_image}") : format("${local.source_image_project}/${local.source_image_family}") disk_size_gb = var.disk_size_gb disk_type = var.disk_type + disk_storage_pool = var.disk_storage_pool disk_labels = var.disk_labels auto_delete = var.auto_delete disk_resource_manager_tags = var.disk_resource_manager_tags @@ -105,6 +106,7 @@ resource "google_compute_instance_template" "tpl" { disk_name = lookup(disk.value, "disk_name", null) disk_size_gb = lookup(disk.value, "disk_size_gb", lookup(disk.value, "disk_type", null) == "local-ssd" ? "375" : null) disk_type = lookup(disk.value, "disk_type", null) + storage_pool = lookup(disk.value, "disk_storage_pool", null) != "" ? lookup(disk.value, "disk_storage_pool", null) : null interface = lookup(disk.value, "interface", lookup(disk.value, "disk_type", null) == "local-ssd" ? "NVME" : null) mode = lookup(disk.value, "mode", null) source = lookup(disk.value, "source", null) diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf b/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf index ed54b86737..1b77901a81 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf +++ b/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf @@ -154,6 +154,12 @@ variable "disk_type" { default = "pd-standard" } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "disk_labels" { description = "Labels to be assigned to boot disk, provided as a map" type = map(string) @@ -202,6 +208,7 @@ variable "additional_disks" { boot = bool disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = map(string) disk_resource_manager_tags = map(string) disk_encryption_key = optional(string) diff --git a/community/modules/internal/slurm-gcp/login/main.tf b/community/modules/internal/slurm-gcp/login/main.tf index 23b2b5f56b..4b2d904763 100644 --- a/community/modules/internal/slurm-gcp/login/main.tf +++ b/community/modules/internal/slurm-gcp/login/main.tf @@ -32,6 +32,7 @@ module "template" { disk_resource_manager_tags = var.login_nodes.disk_resource_manager_tags disk_size_gb = var.login_nodes.disk_size_gb disk_type = var.login_nodes.disk_type + disk_storage_pool = var.login_nodes.disk_storage_pool enable_confidential_vm = var.login_nodes.enable_confidential_vm enable_oslogin = var.login_nodes.enable_oslogin enable_shielded_vm = var.login_nodes.enable_shielded_vm diff --git a/community/modules/internal/slurm-gcp/login/variables.tf b/community/modules/internal/slurm-gcp/login/variables.tf index f21de00cae..7f248598cb 100644 --- a/community/modules/internal/slurm-gcp/login/variables.tf +++ b/community/modules/internal/slurm-gcp/login/variables.tf @@ -58,6 +58,7 @@ variable "login_nodes" { device_name = optional(string) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = optional(map(string), {}) auto_delete = optional(bool, true) boot = optional(bool, false) @@ -92,6 +93,7 @@ variable "login_nodes" { disk_resource_manager_tags = optional(map(string), {}) disk_size_gb = optional(number) disk_type = optional(string, "n1-standard-1") + disk_storage_pool = optional(string) enable_confidential_vm = optional(bool, false) enable_oslogin = optional(bool, true) enable_shielded_vm = optional(bool, false) diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/controller.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/controller.tf index cf57527abf..e731051e31 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/controller.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/controller.tf @@ -25,6 +25,7 @@ locals { disk_name = ad.disk_name device_name = ad.device_name disk_type = ad.disk_type + disk_storage_pool = ad.disk_storage_pool disk_size_gb = ad.disk_size_gb disk_labels = merge(ad.disk_labels, local.labels) auto_delete = ad.auto_delete @@ -39,6 +40,7 @@ locals { source = google_compute_disk.controller_disk[0].name device_name = google_compute_disk.controller_disk[0].name disk_labels = null + disk_storage_pool = null auto_delete = false boot = false disk_encryption_key = var.disk_encryption_key @@ -111,6 +113,7 @@ module "slurm_controller_template" { disk_labels = merge(var.disk_labels, local.labels) disk_size_gb = var.disk_size_gb disk_type = var.disk_type + disk_storage_pool = var.disk_storage_pool disk_resource_manager_tags = var.disk_resource_manager_tags additional_disks = concat(local.additional_disks, local.state_disk) diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/partition.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/partition.tf index 0586752f15..8939e19773 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/partition.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/partition.tf @@ -47,6 +47,7 @@ module "slurm_nodeset_template" { disk_resource_manager_tags = each.value.disk_resource_manager_tags disk_size_gb = each.value.disk_size_gb disk_type = each.value.disk_type + disk_storage_pool = each.value.disk_storage_pool enable_confidential_vm = each.value.enable_confidential_vm confidential_instance_type = each.value.confidential_instance_type enable_oslogin = each.value.enable_oslogin diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables.tf index 21cde33754..e3f7b839be 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables.tf @@ -146,6 +146,7 @@ variable "login_nodes" { device_name = optional(string) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = optional(map(string), {}) auto_delete = optional(bool, true) boot = optional(bool, false) @@ -180,6 +181,7 @@ variable "login_nodes" { disk_resource_manager_tags = optional(map(string), {}) disk_size_gb = optional(number) disk_type = optional(string, "n1-standard-1") + disk_storage_pool = optional(string) enable_confidential_vm = optional(bool, false) enable_oslogin = optional(bool, true) enable_shielded_vm = optional(bool, false) @@ -252,6 +254,7 @@ variable "nodeset" { device_name = optional(string) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = optional(map(string), {}) auto_delete = optional(bool, true) boot = optional(bool, false) @@ -264,6 +267,7 @@ variable "nodeset" { disk_resource_manager_tags = optional(map(string), {}) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_encryption_key = optional(string) disk_encryption_key_service_account = optional(string) enable_confidential_vm = optional(bool, false) diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf index a5bbf727c4..1b1dc2de78 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf @@ -18,6 +18,12 @@ variable "disk_type" { default = "pd-ssd" } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "disk_size_gb" { type = number description = "Boot disk size in GB." @@ -55,6 +61,7 @@ variable "additional_disks" { disk_name = optional(string) device_name = optional(string) disk_type = optional(string) + disk_storage_pool = optional(string) disk_size_gb = optional(number) disk_labels = optional(map(string), {}) auto_delete = optional(bool, true) diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/main.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/main.tf index 28d8fbb80e..5546ed7aec 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/main.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/main.tf @@ -46,6 +46,7 @@ locals { disk_name = ad.disk_name device_name = ad.device_name disk_type = ad.disk_type + disk_storage_pool = ad.disk_storage_pool disk_size_gb = ad.disk_size_gb disk_labels = merge(ad.disk_labels, local.labels) auto_delete = ad.auto_delete @@ -82,6 +83,7 @@ locals { disk_labels = merge(var.disk_labels, local.labels) disk_size_gb = var.disk_size_gb disk_type = var.disk_type + disk_storage_pool = var.disk_storage_pool disk_resource_manager_tags = var.disk_resource_manager_tags additional_disks = local.additional_disks additional_networks = var.additional_networks diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf index 888b62a478..fdf2fe45d0 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf @@ -59,6 +59,12 @@ variable "disk_type" { default = "pd-ssd" } +variable "disk_storage_pool" { + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + type = string + default = null +} + variable "disk_size_gb" { type = number description = "Boot disk size in GB." @@ -108,6 +114,7 @@ variable "additional_disks" { device_name = optional(string) disk_size_gb = optional(number) disk_type = optional(string) + disk_storage_pool = optional(string) disk_labels = optional(map(string)) auto_delete = optional(bool) boot = optional(bool) From 78d1101b170fb64de64243133b21ff8cfe2d5055 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Mon, 27 Jul 2026 12:28:26 +0000 Subject: [PATCH 09/34] use try() blocks instead of lookup() --- .../internal/slurm-gcp/internal_instance_template/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/main.tf b/community/modules/internal/slurm-gcp/internal_instance_template/main.tf index c2082e9808..332a888237 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/main.tf +++ b/community/modules/internal/slurm-gcp/internal_instance_template/main.tf @@ -106,7 +106,7 @@ resource "google_compute_instance_template" "tpl" { disk_name = lookup(disk.value, "disk_name", null) disk_size_gb = lookup(disk.value, "disk_size_gb", lookup(disk.value, "disk_type", null) == "local-ssd" ? "375" : null) disk_type = lookup(disk.value, "disk_type", null) - storage_pool = lookup(disk.value, "disk_storage_pool", null) != "" ? lookup(disk.value, "disk_storage_pool", null) : null + storage_pool = try(disk.value.disk_storage_pool, null) == "" ? null : try(disk.value.disk_storage_pool, null) interface = lookup(disk.value, "interface", lookup(disk.value, "disk_type", null) == "local-ssd" ? "NVME" : null) mode = lookup(disk.value, "mode", null) source = lookup(disk.value, "source", null) From c7a348a6a62a9f18ac870c525b8972231f8bbef6 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 28 Jul 2026 09:09:02 +0000 Subject: [PATCH 10/34] feat: add disk_storage_pool support to slurm-gcp modules and instance templates --- .../README.md | 3 ++- .../main.tf | 24 +++++++++---------- .../variables.tf | 14 +++++------ .../schedmd-slurm-gcp-v6-nodeset/README.md | 3 ++- .../schedmd-slurm-gcp-v6-partition/README.md | 2 +- .../slurm-gcp/instance_template/README.md | 3 ++- .../slurm-gcp/instance_template/main.tf | 20 ++++++++-------- .../internal_instance_template/README.md | 3 ++- .../internal/slurm-gcp/login/README.md | 2 +- .../schedmd-slurm-gcp-v6-controller/README.md | 7 +++--- .../schedmd-slurm-gcp-v6-login/README.md | 3 ++- 11 files changed, 45 insertions(+), 39 deletions(-) diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md index ebf4542019..d0f8937791 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md @@ -84,7 +84,7 @@ No resources. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [access\_config](#input\_access\_config) | Access configurations, i.e. IPs via which the VM instance can be accessed via the Internet. |
list(object({
nat_ip = string
network_tier = string
}))
| `[]` | no | -| [additional\_disks](#input\_additional\_disks) | Configurations of additional disks to be included on the partition nodes. |
list(object({
disk_name = string
device_name = string
disk_size_gb = number
disk_type = string
disk_labels = map(string)
auto_delete = bool
boot = bool
}))
| `[]` | no | +| [additional\_disks](#input\_additional\_disks) | Configurations of additional disks to be included on the partition nodes. |
list(object({
disk_name = string
device_name = string
disk_size_gb = number
disk_type = string
disk_storage_pool = optional(string)
disk_labels = map(string)
auto_delete = bool
boot = bool
}))
| `[]` | no | | [additional\_networks](#input\_additional\_networks) | Additional network interface details for GCE, if any. |
list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = string
queue_count = number
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
alias_ip_range = list(object({
ip_cidr_range = string
subnetwork_range_name = string
}))
}))
| `[]` | no | | [advanced\_machine\_features](#input\_advanced\_machine\_features) | See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features |
object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
|
{
"threads_per_core": 1
}
| no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | @@ -93,6 +93,7 @@ No resources. | [disk\_auto\_delete](#input\_disk\_auto\_delete) | Whether or not the boot disk should be auto-deleted. | `bool` | `true` | no | | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of boot disk to create for the partition compute nodes. | `number` | `50` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enables Google Cloud os-login for user login and authentication for VMs.
See https://cloud.google.com/compute/docs/oslogin | `bool` | `true` | no | diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf index 55ec510db2..54b771eff7 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/main.tf @@ -57,14 +57,14 @@ locals { additional_disks = [ for ad in var.additional_disks : { - disk_name = ad.disk_name - device_name = ad.device_name - disk_type = ad.disk_type + disk_name = ad.disk_name + device_name = ad.device_name + disk_type = ad.disk_type disk_storage_pool = ad.disk_storage_pool - disk_size_gb = ad.disk_size_gb - disk_labels = merge(ad.disk_labels, local.labels) - auto_delete = ad.auto_delete - boot = ad.boot + disk_size_gb = ad.disk_size_gb + disk_labels = merge(ad.disk_labels, local.labels) + auto_delete = ad.auto_delete + boot = ad.boot } ] @@ -94,11 +94,11 @@ module "slurm_nodeset_template" { slurm_bucket_path = var.slurm_bucket_path metadata = local.metadata - additional_disks = local.additional_disks - disk_auto_delete = var.disk_auto_delete - disk_labels = merge(local.labels, var.disk_labels) - disk_size_gb = var.disk_size_gb - disk_type = var.disk_type + additional_disks = local.additional_disks + disk_auto_delete = var.disk_auto_delete + disk_labels = merge(local.labels, var.disk_labels) + disk_size_gb = var.disk_size_gb + disk_type = var.disk_type disk_storage_pool = var.disk_storage_pool bandwidth_tier = var.bandwidth_tier diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf index 07c874f2bc..b8afb48d57 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf @@ -150,14 +150,14 @@ variable "disk_labels" { variable "additional_disks" { description = "Configurations of additional disks to be included on the partition nodes." type = list(object({ - disk_name = string - device_name = string - disk_size_gb = number - disk_type = string + disk_name = string + device_name = string + disk_size_gb = number + disk_type = string disk_storage_pool = optional(string) - disk_labels = map(string) - auto_delete = bool - boot = bool + disk_labels = map(string) + auto_delete = bool + boot = bool })) default = [] } diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md index 8c28146e4c..d1ba382294 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md @@ -195,7 +195,7 @@ modules. For support with the underlying modules, see the instructions in the | ---- | ----------- | ---- | ------- | :------: | | [accelerator\_topology](#input\_accelerator\_topology) | Specifies the shape of the Accelerator (GPU/TPU) slice. | `string` | `null` | no | | [access\_config](#input\_access\_config) | Access configurations, i.e. IPs via which the VM instance can be accessed via the Internet. |
list(object({
nat_ip = string
network_tier = string
}))
| `[]` | no | -| [additional\_disks](#input\_additional\_disks) | Configurations of additional disks to be included on the partition nodes. |
list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = optional(map(string))
auto_delete = optional(bool)
boot = optional(bool)
disk_resource_manager_tags = optional(map(string))
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | +| [additional\_disks](#input\_additional\_disks) | Configurations of additional disks to be included on the partition nodes. |
list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = optional(map(string))
auto_delete = optional(bool)
boot = optional(bool)
disk_resource_manager_tags = optional(map(string))
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | | [additional\_networks](#input\_additional\_networks) | Additional network interface details for GCE, if any. |
list(object({
network = optional(string)
subnetwork = string
subnetwork_project = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
stack_type = optional(string)
queue_count = optional(number)
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
}))
| `[]` | no | | [advanced\_machine\_features](#input\_advanced\_machine\_features) | See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features |
object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
|
{
"threads_per_core": 1
}
| no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | @@ -209,6 +209,7 @@ modules. For support with the underlying modules, see the instructions in the | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of boot disk to create for the partition compute nodes. | `number` | `50` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-standard"` | no | | [dws\_flex](#input\_dws\_flex) | If set and `enabled = true`, will utilize the DWS Flex Start to provision nodes.
See: https://cloud.google.com/blog/products/compute/introducing-dynamic-workload-scheduler
Options:
- enable: Enable DWS Flex Start
- max\_run\_duration: Maximum duration in seconds for the job to run, should not exceed 604,800 (one week).
- use\_job\_duration: Use the job duration to determine the max\_run\_duration, if job duration is not set, max\_run\_duration will be used.
- use\_bulk\_insert: Uses the legacy implementation of DWS Flex Start with Bulk Insert for non-accelerator instances

Limitations:
- CAN NOT be used with reservations. |
object({
enabled = optional(bool, true)
max_run_duration = optional(number, 604800) # one week
use_job_duration = optional(bool, false)
use_bulk_insert = optional(bool, false)
})
|
{
"enabled": false
}
| no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-partition/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-partition/README.md index f0b8901b5a..0b57dc88ed 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-partition/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-partition/README.md @@ -85,7 +85,7 @@ No resources. | [exclusive](#input\_exclusive) | Exclusive job access to nodes. When set to true nodes execute single job and are deleted
after job exits. If set to false, multiple jobs can be scheduled on one node. | `bool` | `true` | no | | [is\_default](#input\_is\_default) | Sets this partition as the default partition by updating the partition\_conf.
If "Default" is already set in partition\_conf, this variable will have no effect. | `bool` | `false` | no | | [network\_storage](#input\_network\_storage) | DEPRECATED |
list(object({
server_ip = string,
remote_mount = string,
local_mount = string,
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string,
mount_options = string,
client_install_runner = map(string)
mount_runner = map(string)
}))
| `[]` | no | -| [nodeset](#input\_nodeset) | A list of nodesets.
For type definition see community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables.tf::nodeset |
list(object({
node_count_static = optional(number, 0)
node_count_dynamic_max = optional(number, 1)
node_conf = optional(map(string), {})
nodeset_name = string
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
enable_confidential_vm = optional(bool, false)
confidential_instance_type = optional(string)
enable_placement = optional(bool, false)
placement_max_distance = optional(number, null)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
enable_maintenance_reservation = optional(bool, false)
enable_opportunistic_maintenance = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
accelerator_topology = optional(string, null)
dws_flex = object({
enabled = bool
max_run_duration = number
use_job_duration = bool
use_bulk_insert = bool
})
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
maintenance_interval = optional(string)
instance_properties_json = string
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
network_tier = optional(string, "STANDARD")
network_storage = optional(list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
client_install_runner = optional(map(string))
mount_runner = optional(map(string))
})), [])
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
subnetwork_self_link = string
additional_networks = optional(list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = string
queue_count = number
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
alias_ip_range = list(object({
ip_cidr_range = string
subnetwork_range_name = string
}))
})))
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
spot = optional(bool, false)
tags = optional(list(string), [])
termination_action = optional(string)
reservation_name = optional(string)
future_reservation = string
startup_script = optional(list(object({
filename = string
content = string })), [])

zone_target_shape = string
zone_policy_allow = set(string)
zone_policy_deny = set(string)
}))
| `[]` | no | +| [nodeset](#input\_nodeset) | A list of nodesets.
For type definition see community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables.tf::nodeset |
list(object({
node_count_static = optional(number, 0)
node_count_dynamic_max = optional(number, 1)
node_conf = optional(map(string), {})
nodeset_name = string
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
enable_confidential_vm = optional(bool, false)
confidential_instance_type = optional(string)
enable_placement = optional(bool, false)
placement_max_distance = optional(number, null)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
enable_maintenance_reservation = optional(bool, false)
enable_opportunistic_maintenance = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
accelerator_topology = optional(string, null)
dws_flex = object({
enabled = bool
max_run_duration = number
use_job_duration = bool
use_bulk_insert = bool
})
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
maintenance_interval = optional(string)
instance_properties_json = string
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
network_tier = optional(string, "STANDARD")
network_storage = optional(list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
client_install_runner = optional(map(string))
mount_runner = optional(map(string))
})), [])
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
subnetwork_self_link = string
additional_networks = optional(list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = string
queue_count = number
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
alias_ip_range = list(object({
ip_cidr_range = string
subnetwork_range_name = string
}))
})))
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
spot = optional(bool, false)
tags = optional(list(string), [])
termination_action = optional(string)
reservation_name = optional(string)
future_reservation = string
startup_script = optional(list(object({
filename = string
content = string })), [])

zone_target_shape = string
zone_policy_allow = set(string)
zone_policy_deny = set(string)
}))
| `[]` | no | | [nodeset\_dyn](#input\_nodeset\_dyn) | Defines dynamic nodesets, as a list. |
list(object({
nodeset_name = string
nodeset_feature = string
}))
| `[]` | no | | [nodeset\_tpu](#input\_nodeset\_tpu) | Define TPU nodesets, as a list. |
list(object({
node_count_static = optional(number, 0)
node_count_dynamic_max = optional(number, 5)
nodeset_name = string
enable_public_ip = optional(bool, false)
node_type = string
accelerator_config = optional(object({
topology = string
version = string
}), {
topology = ""
version = ""
})
tf_version = string
preemptible = optional(bool, false)
preserve_tpu = optional(bool, false)
zone = string
data_disks = optional(list(string), [])
docker_image = optional(string, "")
network_storage = optional(list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
})), [])
subnetwork = string
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
project_id = string
reserved = optional(string, false)
}))
| `[]` | no | | [partition\_conf](#input\_partition\_conf) | Slurm partition configuration as a map.
See https://slurm.schedmd.com/slurm.conf.html#SECTION_PARTITION-CONFIGURATION | `map(string)` | `{}` | no | diff --git a/community/modules/internal/slurm-gcp/instance_template/README.md b/community/modules/internal/slurm-gcp/instance_template/README.md index 9d9fc7bddd..b9c096b7ae 100644 --- a/community/modules/internal/slurm-gcp/instance_template/README.md +++ b/community/modules/internal/slurm-gcp/instance_template/README.md @@ -30,7 +30,7 @@ | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [access\_config](#input\_access\_config) | Access configurations, i.e. IPs via which the VM instance can be accessed via the Internet. |
list(object({
nat_ip = string
network_tier = string
}))
| `[]` | no | -| [additional\_disks](#input\_additional\_disks) | List of maps of disks. |
list(object({
source = optional(string)
disk_name = optional(string)
device_name = string
disk_type = optional(string)
disk_size_gb = optional(number)
disk_labels = map(string)
auto_delete = bool
boot = bool
disk_resource_manager_tags = optional(map(string))
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | +| [additional\_disks](#input\_additional\_disks) | List of maps of disks. |
list(object({
source = optional(string)
disk_name = optional(string)
device_name = string
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_size_gb = optional(number)
disk_labels = map(string)
auto_delete = bool
boot = bool
disk_resource_manager_tags = optional(map(string))
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | | [additional\_networks](#input\_additional\_networks) | Additional network interface details for GCE, if any. |
list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = optional(string)
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
}))
| `[]` | no | | [advanced\_machine\_features](#input\_advanced\_machine\_features) | See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features |
object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
| n/a | yes | | [bandwidth\_tier](#input\_bandwidth\_tier) | Tier 1 bandwidth increases the maximum egress bandwidth for VMs.
Using the `virtio_enabled` setting will only enable VirtioNet and will not enable TIER\_1.
Using the `tier_1_enabled` setting will enable both gVNIC and TIER\_1 higher bandwidth networking.
Using the `gvnic_enabled` setting will only enable gVNIC and will not enable TIER\_1.
Note that TIER\_1 only works with specific machine families & shapes and must be using an image that supports gVNIC. See [official docs](https://cloud.google.com/compute/docs/networking/configure-vm-with-high-bandwidth-configuration) for more details. | `string` | `"platform_default"` | no | @@ -42,6 +42,7 @@ | [disk\_labels](#input\_disk\_labels) | Labels to be assigned to boot disk, provided as a map. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `100` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either pd-ssd, local-ssd, or pd-standard. | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enables Google Cloud os-login for user login and authentication for VMs.
See https://cloud.google.com/compute/docs/oslogin | `bool` | `true` | no | diff --git a/community/modules/internal/slurm-gcp/instance_template/main.tf b/community/modules/internal/slurm-gcp/instance_template/main.tf index bf7b7b4bec..e0285d11e1 100644 --- a/community/modules/internal/slurm-gcp/instance_template/main.tf +++ b/community/modules/internal/slurm-gcp/instance_template/main.tf @@ -26,13 +26,13 @@ module "instance_validation" { locals { additional_disks = [ for disk in var.additional_disks : { - disk_name = disk.disk_name - device_name = disk.device_name - auto_delete = disk.auto_delete - source = disk.source - boot = disk.boot - disk_size_gb = disk.disk_size_gb - disk_type = disk.disk_type + disk_name = disk.disk_name + device_name = disk.device_name + auto_delete = disk.auto_delete + source = disk.source + boot = disk.boot + disk_size_gb = disk.disk_size_gb + disk_type = disk.disk_type disk_storage_pool = disk.disk_storage_pool disk_labels = merge( disk.disk_labels, @@ -156,10 +156,10 @@ module "instance_template" { source_image = local.source_image # Disk - disk_type = var.disk_type - disk_size_gb = var.disk_size_gb + disk_type = var.disk_type + disk_size_gb = var.disk_size_gb disk_storage_pool = var.disk_storage_pool - auto_delete = var.disk_auto_delete + auto_delete = var.disk_auto_delete disk_labels = merge( { slurm_cluster_name = var.slurm_cluster_name diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/README.md b/community/modules/internal/slurm-gcp/internal_instance_template/README.md index deee509e0f..1a92ae3cad 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/README.md +++ b/community/modules/internal/slurm-gcp/internal_instance_template/README.md @@ -32,7 +32,7 @@ | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [access\_config](#input\_access\_config) | Access configurations, i.e. IPs via which the VM instance can be accessed via the Internet. |
list(object({
nat_ip = string
network_tier = string
}))
| `[]` | no | -| [additional\_disks](#input\_additional\_disks) | List of maps of additional disks. See https://www.terraform.io/docs/providers/google/r/compute_instance_template#disk_name |
list(object({
source = optional(string)
disk_name = optional(string)
device_name = string
auto_delete = bool
boot = bool
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = map(string)
disk_resource_manager_tags = map(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | +| [additional\_disks](#input\_additional\_disks) | List of maps of additional disks. See https://www.terraform.io/docs/providers/google/r/compute_instance_template#disk_name |
list(object({
source = optional(string)
disk_name = optional(string)
device_name = string
auto_delete = bool
boot = bool
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = map(string)
disk_resource_manager_tags = map(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | | [additional\_networks](#input\_additional\_networks) | Additional network interface details for GCE, if any. |
list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = optional(string)
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
}))
| `[]` | no | | [advanced\_machine\_features](#input\_advanced\_machine\_features) | See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features |
object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
| n/a | yes | | [alias\_ip\_range](#input\_alias\_ip\_range) | An array of alias IP ranges for this network interface. Can only be specified for network interfaces on subnet-mode networks.
ip\_cidr\_range: The IP CIDR range represented by this alias IP range. This IP CIDR range must belong to the specified subnetwork and cannot contain IP addresses reserved by system or used by other network interfaces. At the time of writing only a netmask (e.g. /24) may be supplied, with a CIDR format resulting in an API error.
subnetwork\_range\_name: The subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range. If left unspecified, the primary range of the subnetwork will be used. |
object({
ip_cidr_range = string
subnetwork_range_name = string
})
| `null` | no | @@ -45,6 +45,7 @@ | [disk\_labels](#input\_disk\_labels) | Labels to be assigned to boot disk, provided as a map | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB | `string` | `"100"` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either pd-ssd, local-ssd, or pd-standard | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Whether to enable the Confidential VM configuration on the instance. Note that the instance image must support Confidential VMs. See https://cloud.google.com/compute/docs/images | `bool` | `false` | no | | [enable\_shielded\_vm](#input\_enable\_shielded\_vm) | Whether to enable the Shielded VM configuration on the instance. Note that the instance image must support Shielded VMs. See https://cloud.google.com/compute/docs/images | `bool` | `false` | no | diff --git a/community/modules/internal/slurm-gcp/login/README.md b/community/modules/internal/slurm-gcp/login/README.md index fa2f3ff8ff..c0d1df4f12 100644 --- a/community/modules/internal/slurm-gcp/login/README.md +++ b/community/modules/internal/slurm-gcp/login/README.md @@ -31,7 +31,7 @@ | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [internal\_startup\_script](#input\_internal\_startup\_script) | FOR INTERNAL TOOLKIT USAGE ONLY. | `string` | `null` | no | -| [login\_nodes](#input\_login\_nodes) | Slurm login instance definitions. |
object({
group_name = string
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
})), [])
additional_networks = optional(list(object({
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
network = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
queue_count = optional(number)
stack_type = optional(string)
subnetwork = optional(string)
subnetwork_project = optional(string)
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string, "n1-standard-1")
enable_confidential_vm = optional(bool, false)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
num_instances = optional(number, 1)
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
static_ips = optional(list(string), [])
subnetwork = string
spot = optional(bool, false)
tags = optional(list(string), [])
zone = optional(string)
termination_action = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
})
| n/a | yes | +| [login\_nodes](#input\_login\_nodes) | Slurm login instance definitions. |
object({
group_name = string
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
})), [])
additional_networks = optional(list(object({
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
network = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
queue_count = optional(number)
stack_type = optional(string)
subnetwork = optional(string)
subnetwork_project = optional(string)
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string, "n1-standard-1")
disk_storage_pool = optional(string)
enable_confidential_vm = optional(bool, false)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
num_instances = optional(number, 1)
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
static_ips = optional(list(string), [])
subnetwork = string
spot = optional(bool, false)
tags = optional(list(string), [])
zone = optional(string)
termination_action = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
})
| n/a | yes | | [network\_storage](#input\_network\_storage) | Storage to mounted on login instances
- server\_ip : Address of the storage server.
- remote\_mount : The location in the remote instance filesystem to mount from.
- local\_mount : The location on the instance filesystem to mount to.
- fs\_type : Filesystem type (e.g. "nfs").
- mount\_options : Options to mount with. |
list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
}))
| `[]` | no | | [project\_id](#input\_project\_id) | Project ID to create resources in. | `string` | n/a | yes | | [replace\_trigger](#input\_replace\_trigger) | Trigger value to replace the instances. | `string` | `""` | no | diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md index cc8b1aea69..0fbc9689b0 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md @@ -439,7 +439,7 @@ limitations under the License. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | -| [additional\_disks](#input\_additional\_disks) | List of maps of disks. |
list(object({
disk_name = optional(string)
device_name = optional(string)
disk_type = optional(string)
disk_size_gb = optional(number)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | +| [additional\_disks](#input\_additional\_disks) | List of maps of disks. |
list(object({
disk_name = optional(string)
device_name = optional(string)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_size_gb = optional(number)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | | [additional\_networks](#input\_additional\_networks) | Additional network interface details for the controller, if any. |
list(object({
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
network = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
queue_count = optional(number)
stack_type = optional(string)
subnetwork = optional(string)
subnetwork_project = optional(string)
}))
| `[]` | no | | [advanced\_machine\_features](#input\_advanced\_machine\_features) | See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features |
object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
|
{
"threads_per_core": 1
}
| no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | @@ -471,6 +471,7 @@ limitations under the License. | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `50` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-ssd"` | no | | [enable\_backup\_controller](#input\_enable\_backup\_controller) | Enables a secondary backup controller for High Availability. | `bool` | `false` | no | | [enable\_bigquery\_load](#input\_enable\_bigquery\_load) | Enables loading of cluster job usage into big query.

NOTE: Requires Google Bigquery API. | `bool` | `false` | no | @@ -504,7 +505,7 @@ limitations under the License. | [instance\_template](#input\_instance\_template) | DEPRECATED: Instance template can not be specified for controller. | `string` | `null` | no | | [labels](#input\_labels) | Labels, provided as a map. | `map(string)` | `{}` | no | | [login\_network\_storage](#input\_login\_network\_storage) | An array of network attached storage mounts to be configured on all login nodes. |
list(object({
server_ip = string,
remote_mount = string,
local_mount = string,
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string,
mount_options = string,
}))
| `[]` | no | -| [login\_nodes](#input\_login\_nodes) | List of slurm login instance definitions. |
list(object({
group_name = string
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
})), [])
additional_networks = optional(list(object({
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
network = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
queue_count = optional(number)
stack_type = optional(string)
subnetwork = optional(string)
subnetwork_project = optional(string)
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string, "n1-standard-1")
enable_confidential_vm = optional(bool, false)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
num_instances = optional(number, 1)
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
static_ips = optional(list(string), [])
subnetwork = string
spot = optional(bool, false)
tags = optional(list(string), [])
zone = optional(string)
termination_action = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
startup_script = optional(list(object({
filename = string
content = string
})), [])
}))
| `[]` | no | +| [login\_nodes](#input\_login\_nodes) | List of slurm login instance definitions. |
list(object({
group_name = string
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
})), [])
additional_networks = optional(list(object({
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
network = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
queue_count = optional(number)
stack_type = optional(string)
subnetwork = optional(string)
subnetwork_project = optional(string)
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string, "n1-standard-1")
disk_storage_pool = optional(string)
enable_confidential_vm = optional(bool, false)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
num_instances = optional(number, 1)
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
static_ips = optional(list(string), [])
subnetwork = string
spot = optional(bool, false)
tags = optional(list(string), [])
zone = optional(string)
termination_action = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
startup_script = optional(list(object({
filename = string
content = string
})), [])
}))
| `[]` | no | | [login\_startup\_script](#input\_login\_startup\_script) | Startup script used by the login VMs. | `string` | `"# no-op"` | no | | [login\_startup\_scripts\_timeout](#input\_login\_startup\_scripts\_timeout) | The timeout (seconds) applied to each script in login\_startup\_scripts. If
any script exceeds this timeout, then the instance setup process is considered
failed and handled accordingly.

NOTE: When set to 0, the timeout is considered infinite and thus disabled. | `number` | `300` | no | | [machine\_type](#input\_machine\_type) | Machine type to create. | `string` | `"c2-standard-4"` | no | @@ -512,7 +513,7 @@ limitations under the License. | [min\_cpu\_platform](#input\_min\_cpu\_platform) | Specifies a minimum CPU platform. Applicable values are the friendly names of
CPU platforms, such as Intel Haswell or Intel Skylake. See the complete list:
https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform | `string` | `null` | no | | [munge\_mount](#input\_munge\_mount) | Remote munge mount for compute and login nodes to acquire the munge.key.
By default, the munge mount server will be assumed to be the
`var.slurm_control_host` (or `var.slurm_control_addr` if non-null) when
`server_ip=null`. |
object({
server_ip = string
remote_mount = string
fs_type = string
mount_options = string
})
|
{
"fs_type": "nfs",
"mount_options": "",
"remote_mount": "/etc/munge/",
"server_ip": null
}
| no | | [network\_storage](#input\_network\_storage) | An array of network attached storage mounts to be configured on all instances. |
list(object({
server_ip = string,
remote_mount = string,
local_mount = string,
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string,
mount_options = string,
client_install_runner = optional(map(string))
mount_runner = optional(map(string))
}))
| `[]` | no | -| [nodeset](#input\_nodeset) | Define nodesets, as a list. |
list(object({
node_count_static = optional(number, 0)
node_count_dynamic_max = optional(number, 1)
node_conf = optional(map(string), {})
nodeset_name = string
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
enable_confidential_vm = optional(bool, false)
confidential_instance_type = optional(string)
enable_placement = optional(bool, false)
placement_max_distance = optional(number, null)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
enable_maintenance_reservation = optional(bool, false)
enable_opportunistic_maintenance = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
accelerator_topology = optional(string, null)
dws_flex = object({
enabled = bool
max_run_duration = number
use_job_duration = bool
use_bulk_insert = bool
})
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
maintenance_interval = optional(string)
instance_properties_json = string
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
network_tier = optional(string, "STANDARD")
network_storage = optional(list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
client_install_runner = optional(map(string))
mount_runner = optional(map(string))
})), [])
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
subnetwork_self_link = string
additional_networks = optional(list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = string
queue_count = number
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
alias_ip_range = list(object({
ip_cidr_range = string
subnetwork_range_name = string
}))
})))
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
spot = optional(bool, false)
tags = optional(list(string), [])
termination_action = optional(string)
reservation_name = optional(string)
future_reservation = string
startup_script = optional(list(object({
filename = string
content = string })), [])

zone_target_shape = string
zone_policy_allow = set(string)
zone_policy_deny = set(string)
}))
| `[]` | no | +| [nodeset](#input\_nodeset) | Define nodesets, as a list. |
list(object({
node_count_static = optional(number, 0)
node_count_dynamic_max = optional(number, 1)
node_conf = optional(map(string), {})
nodeset_name = string
additional_disks = optional(list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = optional(map(string), {})
auto_delete = optional(bool, true)
boot = optional(bool, false)
disk_resource_manager_tags = optional(map(string), {})
})), [])
bandwidth_tier = optional(string, "platform_default")
can_ip_forward = optional(bool, false)
disk_auto_delete = optional(bool, true)
disk_labels = optional(map(string), {})
disk_resource_manager_tags = optional(map(string), {})
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
enable_confidential_vm = optional(bool, false)
confidential_instance_type = optional(string)
enable_placement = optional(bool, false)
placement_max_distance = optional(number, null)
enable_oslogin = optional(bool, true)
enable_shielded_vm = optional(bool, false)
enable_maintenance_reservation = optional(bool, false)
enable_opportunistic_maintenance = optional(bool, false)
gpu = optional(object({
count = number
type = string
}))
accelerator_topology = optional(string, null)
dws_flex = object({
enabled = bool
max_run_duration = number
use_job_duration = bool
use_bulk_insert = bool
})
labels = optional(map(string), {})
machine_type = optional(string)
advanced_machine_features = object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
maintenance_interval = optional(string)
instance_properties_json = string
metadata = optional(map(string), {})
min_cpu_platform = optional(string)
network_tier = optional(string, "STANDARD")
network_storage = optional(list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
client_install_runner = optional(map(string))
mount_runner = optional(map(string))
})), [])
on_host_maintenance = optional(string)
preemptible = optional(bool, false)
region = optional(string)
resource_manager_tags = optional(map(string), {})
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
shielded_instance_config = optional(object({
enable_integrity_monitoring = optional(bool, true)
enable_secure_boot = optional(bool, true)
enable_vtpm = optional(bool, true)
}))
source_image_family = optional(string)
source_image_project = optional(string)
source_image = optional(string)
subnetwork_self_link = string
additional_networks = optional(list(object({
network = string
subnetwork = string
subnetwork_project = string
network_ip = string
nic_type = string
stack_type = string
queue_count = number
access_config = list(object({
nat_ip = string
network_tier = string
}))
ipv6_access_config = list(object({
network_tier = string
}))
alias_ip_range = list(object({
ip_cidr_range = string
subnetwork_range_name = string
}))
})))
access_config = optional(list(object({
nat_ip = string
network_tier = string
})))
spot = optional(bool, false)
tags = optional(list(string), [])
termination_action = optional(string)
reservation_name = optional(string)
future_reservation = string
startup_script = optional(list(object({
filename = string
content = string })), [])

zone_target_shape = string
zone_policy_allow = set(string)
zone_policy_deny = set(string)
}))
| `[]` | no | | [nodeset\_dyn](#input\_nodeset\_dyn) | Defines dynamic nodesets, as a list. |
list(object({
nodeset_name = string
nodeset_feature = string
}))
| `[]` | no | | [nodeset\_tpu](#input\_nodeset\_tpu) | Define TPU nodesets, as a list. |
list(object({
node_count_static = optional(number, 0)
node_count_dynamic_max = optional(number, 5)
nodeset_name = string
enable_public_ip = optional(bool, false)
node_type = string
accelerator_config = optional(object({
topology = string
version = string
}), {
topology = ""
version = ""
})
tf_version = string
preemptible = optional(bool, false)
preserve_tpu = optional(bool, false)
zone = string
data_disks = optional(list(string), [])
docker_image = optional(string, "")
network_storage = optional(list(object({
server_ip = string
remote_mount = string
local_mount = string
local_mount_owner = optional(string)
local_mount_permissions = optional(string)
fs_type = string
mount_options = string
client_install_runner = optional(map(string))
mount_runner = optional(map(string))
})), [])
subnetwork = string
service_account = optional(object({
email = optional(string)
scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])
}))
project_id = string
reserved = optional(string, false)
}))
| `[]` | no | | [on\_host\_maintenance](#input\_on\_host\_maintenance) | Instance availability Policy. | `string` | `"MIGRATE"` | no | diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md index 1edbcc91a6..11e060bc93 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md @@ -80,7 +80,7 @@ No resources. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | -| [additional\_disks](#input\_additional\_disks) | List of maps of disks. |
list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_labels = optional(map(string))
auto_delete = optional(bool)
boot = optional(bool)
disk_resource_manager_tags = optional(map(string))
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | +| [additional\_disks](#input\_additional\_disks) | List of maps of disks. |
list(object({
disk_name = optional(string)
device_name = optional(string)
disk_size_gb = optional(number)
disk_type = optional(string)
disk_storage_pool = optional(string)
disk_labels = optional(map(string))
auto_delete = optional(bool)
boot = optional(bool)
disk_resource_manager_tags = optional(map(string))
disk_encryption_key = optional(string)
disk_encryption_key_service_account = optional(string)
}))
| `[]` | no | | [additional\_networks](#input\_additional\_networks) | Additional network interface details for GCE, if any. |
list(object({
access_config = optional(list(object({
nat_ip = string
network_tier = string
})), [])
alias_ip_range = optional(list(object({
ip_cidr_range = string
subnetwork_range_name = string
})), [])
ipv6_access_config = optional(list(object({
network_tier = string
})), [])
network = optional(string)
network_ip = optional(string, "")
nic_type = optional(string)
queue_count = optional(number)
stack_type = optional(string)
subnetwork = optional(string)
subnetwork_project = optional(string)
}))
| `[]` | no | | [advanced\_machine\_features](#input\_advanced\_machine\_features) | See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features |
object({
enable_nested_virtualization = optional(bool)
threads_per_core = optional(number)
turbo_mode = optional(string)
visible_core_count = optional(number)
performance_monitoring_unit = optional(string)
enable_uefi_networking = optional(bool)
})
|
{
"threads_per_core": 1
}
| no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | @@ -94,6 +94,7 @@ No resources. | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `50` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-ssd"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_login\_public\_ips](#input\_enable\_login\_public\_ips) | If set to true. The login node will have a random public IP assigned to it. | `bool` | `false` | no | From 81bb7dce6cd09ec6b3ba4c70dc9edd301dd290d6 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 28 Jul 2026 11:07:41 +0000 Subject: [PATCH 11/34] update storage pool descriptions and restrict validation to hyperdisk-balanced/throughput types --- modules/compute/vm-instance/README.md | 4 ++-- modules/compute/vm-instance/main.tf | 8 ++++---- modules/compute/vm-instance/variables.tf | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/compute/vm-instance/README.md b/modules/compute/vm-instance/README.md index 6c29894798..1779b48a9b 100644 --- a/modules/compute/vm-instance/README.md +++ b/modules/compute/vm-instance/README.md @@ -205,7 +205,7 @@ limitations under the License. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [add\_deployment\_name\_before\_prefix](#input\_add\_deployment\_name\_before\_prefix) | If true, the names of VMs and disks will always be prefixed with `deployment_name` to enable uniqueness across deployments.
See `name_prefix` for further details on resource naming behavior. | `bool` | `false` | no | -| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. Note that storage\_pool is only supported with Hyperdisk types. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | +| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. Note that storage\_pool is only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | | [allocate\_ip](#input\_allocate\_ip) | If not null, allocate IPs with the given configuration. See details at
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address |
object({
address_type = optional(string, "INTERNAL")
purpose = optional(string),
network_tier = optional(string),
ip_version = optional(string, "IPV4"),
})
| `null` | no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | | [auto\_delete\_boot\_disk](#input\_auto\_delete\_boot\_disk) | Controls if boot disk should be auto-deleted when instance is deleted. | `bool` | `true` | no | @@ -214,7 +214,7 @@ limitations under the License. | [deployment\_name](#input\_deployment\_name) | Name of the deployment, will optionally be used name resources according to `name_prefix` | `string` | n/a | yes | | [disable\_public\_ips](#input\_disable\_public\_ips) | If set to true, instances will not have public IPs | `bool` | `false` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for instances. | `number` | `200` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for instances. | `string` | `"pd-standard"` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enable or Disable OS Login with "ENABLE" or "DISABLE". Set to "INHERIT" to inherit project OS Login setting. | `string` | `"ENABLE"` | no | | [guest\_accelerator](#input\_guest\_accelerator) | List of the type and count of accelerator cards attached to the instance. |
list(object({
type = string,
count = number
}))
| `[]` | no | diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 80bbd25546..2ab3b4a76c 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -337,12 +337,12 @@ resource "google_compute_instance" "compute_vm" { error_message = "A disk_type=${var.disk_type} cannot be used with machine_type=${var.machine_type}." } precondition { - condition = var.disk_storage_pool == null || can(regex("^hyperdisk-", var.disk_type)) - error_message = "Storage pools are only supported with Hyperdisk types." + condition = var.disk_storage_pool == null || can(regex("^hyperdisk-(balanced|throughput)$", var.disk_type)) + error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } precondition { - condition = var.additional_persistent_disks.count == 0 || var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-", var.additional_persistent_disks.type)) - error_message = "Storage pools are only supported with Hyperdisk types." + condition = try(var.additional_persistent_disks.count, 0) == 0 || try(var.additional_persistent_disks.storage_pool, null) == null || can(regex("^hyperdisk-(balanced|throughput)$", try(var.additional_persistent_disks.type, "pd-balanced"))) + error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } } } diff --git a/modules/compute/vm-instance/variables.tf b/modules/compute/vm-instance/variables.tf index 52eca7f1df..444ebd8ad1 100644 --- a/modules/compute/vm-instance/variables.tf +++ b/modules/compute/vm-instance/variables.tf @@ -63,7 +63,7 @@ variable "auto_delete_boot_disk" { } variable "disk_storage_pool" { - description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created." type = string default = null } @@ -81,7 +81,7 @@ variable "local_ssd_interface" { } variable "additional_persistent_disks" { - description = "Configurations of additional disks to be included on the partition nodes. Note that storage_pool is only supported with Hyperdisk types." + description = "Configurations of additional disks to be included on the partition nodes. Note that storage_pool is only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created." type = object({ count = optional(number, 0) type = optional(string, "pd-balanced") From 1397b5b3693cab2213a7cd6f9aa1c85f3021e7eb Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 28 Jul 2026 11:43:05 +0000 Subject: [PATCH 12/34] clarify storage pool requirements in vm-instance variables --- modules/compute/vm-instance/README.md | 4 ++-- modules/compute/vm-instance/variables.tf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/compute/vm-instance/README.md b/modules/compute/vm-instance/README.md index 1779b48a9b..8b49c70f12 100644 --- a/modules/compute/vm-instance/README.md +++ b/modules/compute/vm-instance/README.md @@ -205,7 +205,7 @@ limitations under the License. | Name | Description | Type | Default | Required | | ---- | ----------- | ---- | ------- | :------: | | [add\_deployment\_name\_before\_prefix](#input\_add\_deployment\_name\_before\_prefix) | If true, the names of VMs and disks will always be prefixed with `deployment_name` to enable uniqueness across deployments.
See `name_prefix` for further details on resource naming behavior. | `bool` | `false` | no | -| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. Note that storage\_pool is only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | +| [additional\_persistent\_disks](#input\_additional\_persistent\_disks) | Configurations of additional disks to be included on the partition nodes. Note that storage\_pool is only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. |
object({
count = optional(number, 0)
type = optional(string, "pd-balanced")
size = optional(number, 200)
storage_pool = optional(string)
})
| `{}` | no | | [allocate\_ip](#input\_allocate\_ip) | If not null, allocate IPs with the given configuration. See details at
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address |
object({
address_type = optional(string, "INTERNAL")
purpose = optional(string),
network_tier = optional(string),
ip_version = optional(string, "IPV4"),
})
| `null` | no | | [allow\_automatic\_updates](#input\_allow\_automatic\_updates) | If false, disables automatic system package updates on the created instances. This feature is
only available on supported images (or images derived from them). For more details, see
https://cloud.google.com/compute/docs/instances/create-hpc-vm#disable_automatic_updates | `bool` | `true` | no | | [auto\_delete\_boot\_disk](#input\_auto\_delete\_boot\_disk) | Controls if boot disk should be auto-deleted when instance is deleted. | `bool` | `true` | no | @@ -214,7 +214,7 @@ limitations under the License. | [deployment\_name](#input\_deployment\_name) | Name of the deployment, will optionally be used name resources according to `name_prefix` | `string` | n/a | yes | | [disable\_public\_ips](#input\_disable\_public\_ips) | If set to true, instances will not have public IPs | `bool` | `false` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for instances. | `number` | `200` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for instances. | `string` | `"pd-standard"` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enable or Disable OS Login with "ENABLE" or "DISABLE". Set to "INHERIT" to inherit project OS Login setting. | `string` | `"ENABLE"` | no | | [guest\_accelerator](#input\_guest\_accelerator) | List of the type and count of accelerator cards attached to the instance. |
list(object({
type = string,
count = number
}))
| `[]` | no | diff --git a/modules/compute/vm-instance/variables.tf b/modules/compute/vm-instance/variables.tf index 444ebd8ad1..7f5085ce5a 100644 --- a/modules/compute/vm-instance/variables.tf +++ b/modules/compute/vm-instance/variables.tf @@ -63,7 +63,7 @@ variable "auto_delete_boot_disk" { } variable "disk_storage_pool" { - description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } @@ -81,7 +81,7 @@ variable "local_ssd_interface" { } variable "additional_persistent_disks" { - description = "Configurations of additional disks to be included on the partition nodes. Note that storage_pool is only supported with Hyperdisk types (balanced or throughput). Provide an existing storage pool, new pools are not created." + description = "Configurations of additional disks to be included on the partition nodes. Note that storage_pool is only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = object({ count = optional(number, 0) type = optional(string, "pd-balanced") From 3a726c7a9c0331e1ee61d1fd714074339777c765 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 28 Jul 2026 12:43:59 +0000 Subject: [PATCH 13/34] fix: simplify storage pool precondition logic and update additional_persistent_disks variable configuration --- modules/compute/vm-instance/main.tf | 2 +- modules/compute/vm-instance/variables.tf | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 2ab3b4a76c..7be51f8394 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -341,7 +341,7 @@ resource "google_compute_instance" "compute_vm" { error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } precondition { - condition = try(var.additional_persistent_disks.count, 0) == 0 || try(var.additional_persistent_disks.storage_pool, null) == null || can(regex("^hyperdisk-(balanced|throughput)$", try(var.additional_persistent_disks.type, "pd-balanced"))) + condition = var.additional_persistent_disks.count == 0 || var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-(balanced|throughput)$", var.additional_persistent_disks.type)) error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } } diff --git a/modules/compute/vm-instance/variables.tf b/modules/compute/vm-instance/variables.tf index 7f5085ce5a..ddfb092625 100644 --- a/modules/compute/vm-instance/variables.tf +++ b/modules/compute/vm-instance/variables.tf @@ -88,7 +88,8 @@ variable "additional_persistent_disks" { size = optional(number, 200) storage_pool = optional(string) }) - default = {} + default = {} + nullable = false } variable "name_prefix" { From a4406d2b0a8f9ecced584250d589192dae3a2638 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 28 Jul 2026 12:58:40 +0000 Subject: [PATCH 14/34] restrict storage pool support to specific Hyperdisk types --- modules/compute/gke-node-pool/README.md | 2 +- modules/compute/gke-node-pool/main.tf | 4 ++-- modules/compute/gke-node-pool/variables.tf | 2 +- modules/file-system/gke-storage/README.md | 2 +- modules/file-system/gke-storage/main.tf | 6 +++--- modules/file-system/gke-storage/variables.tf | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/compute/gke-node-pool/README.md b/modules/compute/gke-node-pool/README.md index 2189a4064a..56f3446dbf 100644 --- a/modules/compute/gke-node-pool/README.md +++ b/modules/compute/gke-node-pool/README.md @@ -347,7 +347,7 @@ limitations under the License. | [compact\_placement](#input\_compact\_placement) | DEPRECATED: Use `placement_policy` | `bool` | `null` | no | | [confidential\_instance\_type](#input\_confidential\_instance\_type) | The type of technology used by the confidential nodes (e.g., SEV, SEV\_SNP, TDX). Leave null for default. | `string` | `null` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for each node. | `number` | `100` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for each node. | `string` | `null` | no | | [dranet\_allocation\_mode](#input\_dranet\_allocation\_mode) | Allocation mode for the auto-applied DRANET ResourceClaimTemplate (e.g., 'All' or 'ExactCount'). | `string` | `"All"` | no | | [dranet\_device\_class\_name](#input\_dranet\_device\_class\_name) | DRA device class name. If null, automatically detected based on machine type. Default is mrdma.google.com (RDMA) for RDMA-supported machines, netdev.google.com for others. | `string` | `null` | no | diff --git a/modules/compute/gke-node-pool/main.tf b/modules/compute/gke-node-pool/main.tf index 0b403f5311..d01ab9a9a0 100644 --- a/modules/compute/gke-node-pool/main.tf +++ b/modules/compute/gke-node-pool/main.tf @@ -349,8 +349,8 @@ resource "google_container_node_pool" "node_pool" { error_message = "var.zones must be explicitly provided when using an extended reservation block." } precondition { - condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-", var.disk_type)) - error_message = "Storage pools are only supported with Hyperdisk types." + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-(balanced|throughput)$", var.disk_type)) + error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } precondition { condition = (var.max_pods_per_node == null) || (data.google_container_cluster.gke_cluster.networking_mode == "VPC_NATIVE") diff --git a/modules/compute/gke-node-pool/variables.tf b/modules/compute/gke-node-pool/variables.tf index 2caf18bd0f..ea5931d7f1 100644 --- a/modules/compute/gke-node-pool/variables.tf +++ b/modules/compute/gke-node-pool/variables.tf @@ -72,7 +72,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/modules/file-system/gke-storage/README.md b/modules/file-system/gke-storage/README.md index a08ab6d02f..7245751ec9 100644 --- a/modules/file-system/gke-storage/README.md +++ b/modules/file-system/gke-storage/README.md @@ -115,7 +115,7 @@ limitations under the License. | [capacity\_gb](#input\_capacity\_gb) | The storage capacity with which to create the persistent volume. | `number` | n/a | yes | | [cluster\_id](#input\_cluster\_id) | An identifier for the GKE cluster in the format `projects/{{project}}/locations/{{location}}/clusters/{{cluster}}` | `string` | n/a | yes | | [disk\_encryption\_kms\_key](#input\_disk\_encryption\_kms\_key) | The Customer-Managed Encryption Key (CMEK) to use for disk encryption. | `string` | `null` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the provisioned disks. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the provisioned disks. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [enable\_confidential\_storage](#input\_enable\_confidential\_storage) | Enable Confidential Storage for this storage class. | `bool` | `false` | no | | [labels](#input\_labels) | GCE resource labels to be applied to resources. Key-value pairs. | `map(string)` | n/a | yes | | [mount\_options](#input\_mount\_options) | Controls the mountOptions for dynamically provisioned PersistentVolumes of this storage class. | `string` | `null` | no | diff --git a/modules/file-system/gke-storage/main.tf b/modules/file-system/gke-storage/main.tf index d3ff7eea7d..d8d52551a5 100644 --- a/modules/file-system/gke-storage/main.tf +++ b/modules/file-system/gke-storage/main.tf @@ -36,10 +36,10 @@ check "private_vpc_connection_peering" { } } -check "hyperdisk_extreme_storage_pool" { +check "storage_pool_supported_types" { assert { - condition = lower(var.storage_type) != "hyperdisk-extreme" || (var.disk_storage_pool == null || var.disk_storage_pool == "") - error_message = "Storage Pools are not supported with Hyperdisk Extreme. Use hyperdisk-balanced or hyperdisk-throughput." + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-(balanced|throughput)$", lower(var.storage_type))) + error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } } diff --git a/modules/file-system/gke-storage/variables.tf b/modules/file-system/gke-storage/variables.tf index 1eb24e34a6..fee3c9705b 100644 --- a/modules/file-system/gke-storage/variables.tf +++ b/modules/file-system/gke-storage/variables.tf @@ -156,7 +156,7 @@ variable "disk_encryption_kms_key" { } variable "disk_storage_pool" { - description = "Storage pool to use for the provisioned disks. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the provisioned disks. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } From bf24b49f819780c359c44b4ce85910f572eb62ae Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 28 Jul 2026 13:11:48 +0000 Subject: [PATCH 15/34] clarify disk_storage_pool requirements --- .../compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md | 2 +- .../compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf | 2 +- .../modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md | 2 +- .../modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf | 2 +- .../modules/internal/slurm-gcp/instance_template/README.md | 2 +- .../modules/internal/slurm-gcp/instance_template/variables.tf | 2 +- .../internal/slurm-gcp/internal_instance_template/README.md | 2 +- .../internal/slurm-gcp/internal_instance_template/variables.tf | 2 +- .../modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md | 2 +- .../variables_controller_instance.tf | 2 +- .../modules/scheduler/schedmd-slurm-gcp-v6-login/README.md | 2 +- .../modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md index d0f8937791..b40bfa2583 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md @@ -93,7 +93,7 @@ No resources. | [disk\_auto\_delete](#input\_disk\_auto\_delete) | Whether or not the boot disk should be auto-deleted. | `bool` | `true` | no | | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of boot disk to create for the partition compute nodes. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enables Google Cloud os-login for user login and authentication for VMs.
See https://cloud.google.com/compute/docs/oslogin | `bool` | `true` | no | diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf index b8afb48d57..e16184d8a8 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf @@ -124,7 +124,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md index d1ba382294..df5a45473b 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md @@ -209,7 +209,7 @@ modules. For support with the underlying modules, see the instructions in the | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of boot disk to create for the partition compute nodes. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-standard"` | no | | [dws\_flex](#input\_dws\_flex) | If set and `enabled = true`, will utilize the DWS Flex Start to provision nodes.
See: https://cloud.google.com/blog/products/compute/introducing-dynamic-workload-scheduler
Options:
- enable: Enable DWS Flex Start
- max\_run\_duration: Maximum duration in seconds for the job to run, should not exceed 604,800 (one week).
- use\_job\_duration: Use the job duration to determine the max\_run\_duration, if job duration is not set, max\_run\_duration will be used.
- use\_bulk\_insert: Uses the legacy implementation of DWS Flex Start with Bulk Insert for non-accelerator instances

Limitations:
- CAN NOT be used with reservations. |
object({
enabled = optional(bool, true)
max_run_duration = optional(number, 604800) # one week
use_job_duration = optional(bool, false)
use_bulk_insert = optional(bool, false)
})
|
{
"enabled": false
}
| no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf index 55ea9f43b8..8684806276 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf @@ -143,7 +143,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/internal/slurm-gcp/instance_template/README.md b/community/modules/internal/slurm-gcp/instance_template/README.md index b9c096b7ae..4f1349764c 100644 --- a/community/modules/internal/slurm-gcp/instance_template/README.md +++ b/community/modules/internal/slurm-gcp/instance_template/README.md @@ -42,7 +42,7 @@ | [disk\_labels](#input\_disk\_labels) | Labels to be assigned to boot disk, provided as a map. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `100` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either pd-ssd, local-ssd, or pd-standard. | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enables Google Cloud os-login for user login and authentication for VMs.
See https://cloud.google.com/compute/docs/oslogin | `bool` | `true` | no | diff --git a/community/modules/internal/slurm-gcp/instance_template/variables.tf b/community/modules/internal/slurm-gcp/instance_template/variables.tf index 27c2dd0826..bc18cfa7a6 100644 --- a/community/modules/internal/slurm-gcp/instance_template/variables.tf +++ b/community/modules/internal/slurm-gcp/instance_template/variables.tf @@ -317,7 +317,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/README.md b/community/modules/internal/slurm-gcp/internal_instance_template/README.md index 1a92ae3cad..3cfcf7c747 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/README.md +++ b/community/modules/internal/slurm-gcp/internal_instance_template/README.md @@ -45,7 +45,7 @@ | [disk\_labels](#input\_disk\_labels) | Labels to be assigned to boot disk, provided as a map | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB | `string` | `"100"` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either pd-ssd, local-ssd, or pd-standard | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Whether to enable the Confidential VM configuration on the instance. Note that the instance image must support Confidential VMs. See https://cloud.google.com/compute/docs/images | `bool` | `false` | no | | [enable\_shielded\_vm](#input\_enable\_shielded\_vm) | Whether to enable the Shielded VM configuration on the instance. Note that the instance image must support Shielded VMs. See https://cloud.google.com/compute/docs/images | `bool` | `false` | no | diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf b/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf index 1b77901a81..a2e7862ecd 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf +++ b/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf @@ -155,7 +155,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md index 0fbc9689b0..1fd753c60e 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md @@ -471,7 +471,7 @@ limitations under the License. | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-ssd"` | no | | [enable\_backup\_controller](#input\_enable\_backup\_controller) | Enables a secondary backup controller for High Availability. | `bool` | `false` | no | | [enable\_bigquery\_load](#input\_enable\_bigquery\_load) | Enables loading of cluster job usage into big query.

NOTE: Requires Google Bigquery API. | `bool` | `false` | no | diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf index 1b1dc2de78..22601f8c5f 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf @@ -19,7 +19,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md index 11e060bc93..a5c20c4e0b 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md @@ -94,7 +94,7 @@ No resources. | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-ssd"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_login\_public\_ips](#input\_enable\_login\_public\_ips) | If set to true. The login node will have a random public IP assigned to it. | `bool` | `false` | no | diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf index fdf2fe45d0..2f935b4a23 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf @@ -60,7 +60,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." type = string default = null } From f718258287279b9d81ad9d0839fdf14709641779 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Thu, 30 Jul 2026 16:41:48 +0000 Subject: [PATCH 16/34] fix: correct storage-pool parameter to storage-pools in GKE StorageClasses --- .../gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl | 2 +- .../storage-class/hyperdisk-throughput-sc.yaml.tftpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl b/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl index 77b08c4a2b..7894ede0f7 100644 --- a/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl +++ b/modules/file-system/gke-storage/storage-class/hyperdisk-balanced-sc.yaml.tftpl @@ -19,7 +19,7 @@ parameters: disk-encryption-kms-key: "${disk_encryption_kms_key}" %{~ endif ~} %{~ if disk_storage_pool != null && disk_storage_pool != "" ~} - storage-pool: "${disk_storage_pool}" + storage-pools: "${disk_storage_pool}" %{~ endif ~} volumeBindingMode: ${volume_binding_mode} reclaimPolicy: ${reclaim_policy} diff --git a/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl b/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl index ac3b269193..cdafebaf0c 100644 --- a/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl +++ b/modules/file-system/gke-storage/storage-class/hyperdisk-throughput-sc.yaml.tftpl @@ -12,7 +12,7 @@ parameters: type: hyperdisk-throughput provisioned-throughput-on-create: "250Mi" %{~ if disk_storage_pool != null && disk_storage_pool != "" ~} - storage-pool: "${disk_storage_pool}" + storage-pools: "${disk_storage_pool}" %{~ endif ~} volumeBindingMode: ${volume_binding_mode} reclaimPolicy: ${reclaim_policy} From 3c92d754e80e0e3fc7e2c73b29d90023c616541f Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Mon, 3 Aug 2026 13:55:02 +0000 Subject: [PATCH 17/34] chore: upgrade google provider to v5.30.0, migrate additional_disks to google provider --- modules/compute/vm-instance/README.md | 6 +++--- modules/compute/vm-instance/main.tf | 1 - modules/compute/vm-instance/versions.tf | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/compute/vm-instance/README.md b/modules/compute/vm-instance/README.md index 8b49c70f12..b4501f3137 100644 --- a/modules/compute/vm-instance/README.md +++ b/modules/compute/vm-instance/README.md @@ -169,7 +169,7 @@ limitations under the License. | Name | Version | | ---- | ------- | | [terraform](#requirement\_terraform) | >= 1.12.2 | -| [google](#requirement\_google) | >= 4.73.0 | +| [google](#requirement\_google) | >= 5.30.0 | | [google-beta](#requirement\_google-beta) | >= 6.13.0 | | [null](#requirement\_null) | >= 3.0 | @@ -177,7 +177,7 @@ limitations under the License. | Name | Version | | ---- | ------- | -| [google](#provider\_google) | >= 4.73.0 | +| [google](#provider\_google) | >= 5.30.0 | | [google-beta](#provider\_google-beta) | >= 6.13.0 | | [null](#provider\_null) | >= 3.0 | @@ -192,10 +192,10 @@ limitations under the License. | Name | Type | | ---- | ---- | -| [google-beta_google_compute_disk.additional_disks](https://registry.terraform.io/providers/hashicorp/google-beta/latest/docs/resources/google_compute_disk) | resource | | [google-beta_google_compute_instance.compute_vm](https://registry.terraform.io/providers/hashicorp/google-beta/latest/docs/resources/google_compute_instance) | resource | | [google-beta_google_compute_resource_policy.placement_policy](https://registry.terraform.io/providers/hashicorp/google-beta/latest/docs/resources/google_compute_resource_policy) | resource | | [google_compute_address.compute_ip](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address) | resource | +| [google_compute_disk.additional_disks](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_disk) | resource | | [null_resource.image](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource | | [null_resource.replace_vm_trigger_from_placement](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource | | [google_compute_image.compute_image](https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/compute_image) | data source | diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 7be51f8394..89ed9518a4 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -119,7 +119,6 @@ resource "google_compute_disk" "additional_disks" { count = var.instance_count * var.additional_persistent_disks.count # NB: this resource array must be sliced accounting for var.instance_count - provider = google-beta name = "${local.resource_prefix}-disk-${count.index}" type = var.additional_persistent_disks.type size = var.additional_persistent_disks.size diff --git a/modules/compute/vm-instance/versions.tf b/modules/compute/vm-instance/versions.tf index 64b50fdc03..2b2a80f011 100644 --- a/modules/compute/vm-instance/versions.tf +++ b/modules/compute/vm-instance/versions.tf @@ -18,7 +18,7 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 4.73.0" + version = ">= 5.30.0" } google-beta = { From 953a343e46165888b6b42119d8ae7c74087cf217 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 4 Aug 2026 05:34:26 +0000 Subject: [PATCH 18/34] fix: restrict boot disk storage pools to hyperdisk-balanced --- modules/compute/gke-node-pool/main.tf | 4 ++-- modules/file-system/gke-storage/main.tf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/compute/gke-node-pool/main.tf b/modules/compute/gke-node-pool/main.tf index d01ab9a9a0..d23ccb1740 100644 --- a/modules/compute/gke-node-pool/main.tf +++ b/modules/compute/gke-node-pool/main.tf @@ -349,8 +349,8 @@ resource "google_container_node_pool" "node_pool" { error_message = "var.zones must be explicitly provided when using an extended reservation block." } precondition { - condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-(balanced|throughput)$", var.disk_type)) - error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || lower(var.disk_type) == "hyperdisk-balanced" + error_message = "Storage pools for boot disks only support hyperdisk-balanced." } precondition { condition = (var.max_pods_per_node == null) || (data.google_container_cluster.gke_cluster.networking_mode == "VPC_NATIVE") diff --git a/modules/file-system/gke-storage/main.tf b/modules/file-system/gke-storage/main.tf index d8d52551a5..ecc6bcd74e 100644 --- a/modules/file-system/gke-storage/main.tf +++ b/modules/file-system/gke-storage/main.tf @@ -38,7 +38,7 @@ check "private_vpc_connection_peering" { check "storage_pool_supported_types" { assert { - condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-(balanced|throughput)$", lower(var.storage_type))) + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || contains(["hyperdisk-balanced", "hyperdisk-throughput"], lower(var.storage_type)) error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } } From 53bfb398df2b56046c46b006235e2e706e5459b8 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 4 Aug 2026 14:52:15 +0000 Subject: [PATCH 19/34] feat: add validation for hyperdisk-balanced boot disk requirements --- modules/compute/gke-node-pool/README.md | 2 +- modules/compute/gke-node-pool/main.tf | 12 ++++++++++-- modules/compute/gke-node-pool/variables.tf | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/compute/gke-node-pool/README.md b/modules/compute/gke-node-pool/README.md index 56f3446dbf..81b57eeec4 100644 --- a/modules/compute/gke-node-pool/README.md +++ b/modules/compute/gke-node-pool/README.md @@ -347,7 +347,7 @@ limitations under the License. | [compact\_placement](#input\_compact\_placement) | DEPRECATED: Use `placement_policy` | `bool` | `null` | no | | [confidential\_instance\_type](#input\_confidential\_instance\_type) | The type of technology used by the confidential nodes (e.g., SEV, SEV\_SNP, TDX). Leave null for default. | `string` | `null` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for each node. | `number` | `100` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for each node. | `string` | `null` | no | | [dranet\_allocation\_mode](#input\_dranet\_allocation\_mode) | Allocation mode for the auto-applied DRANET ResourceClaimTemplate (e.g., 'All' or 'ExactCount'). | `string` | `"All"` | no | | [dranet\_device\_class\_name](#input\_dranet\_device\_class\_name) | DRA device class name. If null, automatically detected based on machine type. Default is mrdma.google.com (RDMA) for RDMA-supported machines, netdev.google.com for others. | `string` | `null` | no | diff --git a/modules/compute/gke-node-pool/main.tf b/modules/compute/gke-node-pool/main.tf index d23ccb1740..087a3e609d 100644 --- a/modules/compute/gke-node-pool/main.tf +++ b/modules/compute/gke-node-pool/main.tf @@ -349,8 +349,16 @@ resource "google_container_node_pool" "node_pool" { error_message = "var.zones must be explicitly provided when using an extended reservation block." } precondition { - condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || lower(var.disk_type) == "hyperdisk-balanced" - error_message = "Storage pools for boot disks only support hyperdisk-balanced." + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-", lower(var.disk_type))) + error_message = "Storage pools are only supported with Hyperdisks. You must specify a valid hyperdisk disk_type." + } + precondition { + condition = var.disk_type == null || !startswith(lower(var.disk_type), "hyperdisk-") || lower(var.disk_type) == "hyperdisk-balanced" + error_message = "When using Hyperdisks for boot disks, only hyperdisk-balanced is supported." + } + precondition { + condition = var.disk_type == null || lower(var.disk_type) != "hyperdisk-balanced" || var.disk_size_gb == null || var.disk_size_gb >= 4 + error_message = "The minimum capacity for hyperdisk-balanced is 4 GB." } precondition { condition = (var.max_pods_per_node == null) || (data.google_container_cluster.gke_cluster.networking_mode == "VPC_NATIVE") diff --git a/modules/compute/gke-node-pool/variables.tf b/modules/compute/gke-node-pool/variables.tf index ea5931d7f1..9204b69bc7 100644 --- a/modules/compute/gke-node-pool/variables.tf +++ b/modules/compute/gke-node-pool/variables.tf @@ -72,7 +72,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } From dabd6a828a59db575509fb295bf2e54e93a8720e Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 4 Aug 2026 15:09:29 +0000 Subject: [PATCH 20/34] feat: add validation for Hyperdisk configurations --- modules/compute/vm-instance/main.tf | 14 +++++++++++--- modules/compute/vm-instance/variables.tf | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 89ed9518a4..96105d24be 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -336,11 +336,19 @@ resource "google_compute_instance" "compute_vm" { error_message = "A disk_type=${var.disk_type} cannot be used with machine_type=${var.machine_type}." } precondition { - condition = var.disk_storage_pool == null || can(regex("^hyperdisk-(balanced|throughput)$", var.disk_type)) - error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-", lower(var.disk_type))) + error_message = "Storage pools are only supported with Hyperdisks. You must specify a valid hyperdisk disk_type." + } + precondition { + condition = var.disk_type == null || !startswith(lower(var.disk_type), "hyperdisk-") || lower(var.disk_type) == "hyperdisk-balanced" + error_message = "When using Hyperdisks for boot disks, only hyperdisk-balanced is supported." + } + precondition { + condition = var.disk_type == null || lower(var.disk_type) != "hyperdisk-balanced" || var.disk_size_gb == null || var.disk_size_gb >= 4 + error_message = "The minimum capacity for hyperdisk-balanced is 4 GB." } precondition { - condition = var.additional_persistent_disks.count == 0 || var.additional_persistent_disks.storage_pool == null || can(regex("^hyperdisk-(balanced|throughput)$", var.additional_persistent_disks.type)) + condition = var.additional_persistent_disks.count == 0 || var.additional_persistent_disks.storage_pool == null || var.additional_persistent_disks.storage_pool == "" || contains(["hyperdisk-balanced", "hyperdisk-throughput"], lower(var.additional_persistent_disks.type)) error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." } } diff --git a/modules/compute/vm-instance/variables.tf b/modules/compute/vm-instance/variables.tf index ddfb092625..4dadc70049 100644 --- a/modules/compute/vm-instance/variables.tf +++ b/modules/compute/vm-instance/variables.tf @@ -63,7 +63,7 @@ variable "auto_delete_boot_disk" { } variable "disk_storage_pool" { - description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } From 03bb78bf7492f5e11787fef18e7a9b3c10f74b61 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 4 Aug 2026 15:38:55 +0000 Subject: [PATCH 21/34] chore:update disk_storage_pool documentation in vm-instance module --- modules/compute/vm-instance/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/compute/vm-instance/README.md b/modules/compute/vm-instance/README.md index b4501f3137..a2c76c2dab 100644 --- a/modules/compute/vm-instance/README.md +++ b/modules/compute/vm-instance/README.md @@ -214,7 +214,7 @@ limitations under the License. | [deployment\_name](#input\_deployment\_name) | Name of the deployment, will optionally be used name resources according to `name_prefix` | `string` | n/a | yes | | [disable\_public\_ips](#input\_disable\_public\_ips) | If set to true, instances will not have public IPs | `bool` | `false` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of disk for instances. | `number` | `200` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Disk type for instances. | `string` | `"pd-standard"` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enable or Disable OS Login with "ENABLE" or "DISABLE". Set to "INHERIT" to inherit project OS Login setting. | `string` | `"ENABLE"` | no | | [guest\_accelerator](#input\_guest\_accelerator) | List of the type and count of accelerator cards attached to the instance. |
list(object({
type = string,
count = number
}))
| `[]` | no | From b8758567881ef88c104078cf927a1f531fdfa017 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Tue, 4 Aug 2026 16:31:50 +0000 Subject: [PATCH 22/34] docs: clarify storage pool hyperdisk limitations --- .../README.md | 2 +- .../variables.tf | 2 +- .../schedmd-slurm-gcp-v6-nodeset/README.md | 2 +- .../schedmd-slurm-gcp-v6-nodeset/variables.tf | 2 +- .../slurm-gcp/instance_template/README.md | 2 +- .../slurm-gcp/instance_template/variables.tf | 2 +- .../internal_instance_template/README.md | 2 +- .../internal_instance_template/main.tf | 20 +++++++++++++++++++ .../internal_instance_template/variables.tf | 2 +- .../schedmd-slurm-gcp-v6-controller/README.md | 2 +- .../variables_controller_instance.tf | 2 +- .../schedmd-slurm-gcp-v6-login/README.md | 2 +- .../schedmd-slurm-gcp-v6-login/variables.tf | 2 +- 13 files changed, 32 insertions(+), 12 deletions(-) diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md index b40bfa2583..dc2a59b65d 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/README.md @@ -93,7 +93,7 @@ No resources. | [disk\_auto\_delete](#input\_disk\_auto\_delete) | Whether or not the boot disk should be auto-deleted. | `bool` | `true` | no | | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of boot disk to create for the partition compute nodes. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enables Google Cloud os-login for user login and authentication for VMs.
See https://cloud.google.com/compute/docs/oslogin | `bool` | `true` | no | diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf index e16184d8a8..3d29b6da77 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset-dynamic/variables.tf @@ -124,7 +124,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md index df5a45473b..af57380172 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/README.md @@ -209,7 +209,7 @@ modules. For support with the underlying modules, see the instructions in the | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Size of boot disk to create for the partition compute nodes. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-standard"` | no | | [dws\_flex](#input\_dws\_flex) | If set and `enabled = true`, will utilize the DWS Flex Start to provision nodes.
See: https://cloud.google.com/blog/products/compute/introducing-dynamic-workload-scheduler
Options:
- enable: Enable DWS Flex Start
- max\_run\_duration: Maximum duration in seconds for the job to run, should not exceed 604,800 (one week).
- use\_job\_duration: Use the job duration to determine the max\_run\_duration, if job duration is not set, max\_run\_duration will be used.
- use\_bulk\_insert: Uses the legacy implementation of DWS Flex Start with Bulk Insert for non-accelerator instances

Limitations:
- CAN NOT be used with reservations. |
object({
enabled = optional(bool, true)
max_run_duration = optional(number, 604800) # one week
use_job_duration = optional(bool, false)
use_bulk_insert = optional(bool, false)
})
|
{
"enabled": false
}
| no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | diff --git a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf index 8684806276..7294976ca1 100644 --- a/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf +++ b/community/modules/compute/schedmd-slurm-gcp-v6-nodeset/variables.tf @@ -143,7 +143,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/internal/slurm-gcp/instance_template/README.md b/community/modules/internal/slurm-gcp/instance_template/README.md index 4f1349764c..bbe7e0e026 100644 --- a/community/modules/internal/slurm-gcp/instance_template/README.md +++ b/community/modules/internal/slurm-gcp/instance_template/README.md @@ -42,7 +42,7 @@ | [disk\_labels](#input\_disk\_labels) | Labels to be assigned to boot disk, provided as a map. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `100` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either pd-ssd, local-ssd, or pd-standard. | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_oslogin](#input\_enable\_oslogin) | Enables Google Cloud os-login for user login and authentication for VMs.
See https://cloud.google.com/compute/docs/oslogin | `bool` | `true` | no | diff --git a/community/modules/internal/slurm-gcp/instance_template/variables.tf b/community/modules/internal/slurm-gcp/instance_template/variables.tf index bc18cfa7a6..85e8ec7738 100644 --- a/community/modules/internal/slurm-gcp/instance_template/variables.tf +++ b/community/modules/internal/slurm-gcp/instance_template/variables.tf @@ -317,7 +317,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/README.md b/community/modules/internal/slurm-gcp/internal_instance_template/README.md index 3cfcf7c747..043b0fbb88 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/README.md +++ b/community/modules/internal/slurm-gcp/internal_instance_template/README.md @@ -45,7 +45,7 @@ | [disk\_labels](#input\_disk\_labels) | Labels to be assigned to boot disk, provided as a map | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB | `string` | `"100"` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either pd-ssd, local-ssd, or pd-standard | `string` | `"pd-standard"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Whether to enable the Confidential VM configuration on the instance. Note that the instance image must support Confidential VMs. See https://cloud.google.com/compute/docs/images | `bool` | `false` | no | | [enable\_shielded\_vm](#input\_enable\_shielded\_vm) | Whether to enable the Shielded VM configuration on the instance. Note that the instance image must support Shielded VMs. See https://cloud.google.com/compute/docs/images | `bool` | `false` | no | diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/main.tf b/community/modules/internal/slurm-gcp/internal_instance_template/main.tf index 332a888237..af8161153d 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/main.tf +++ b/community/modules/internal/slurm-gcp/internal_instance_template/main.tf @@ -205,6 +205,26 @@ resource "google_compute_instance_template" "tpl" { condition = var.enable_confidential_vm ? contains(["SEV", "SEV_SNP", "TDX"], local.confidential_instance_type) : true error_message = "If enable_confidential_vm is true, confidential_instance_type must be one of 'SEV', 'SEV_SNP', or 'TDX'." } + + precondition { + condition = var.disk_storage_pool == null || var.disk_storage_pool == "" || can(regex("^hyperdisk-", lower(var.disk_type))) + error_message = "Storage pools are only supported with Hyperdisks. You must specify a valid hyperdisk disk_type." + } + + precondition { + condition = var.disk_type == null || !startswith(lower(var.disk_type), "hyperdisk-") || lower(var.disk_type) == "hyperdisk-balanced" + error_message = "When using Hyperdisks for boot disks, only hyperdisk-balanced is supported." + } + + precondition { + condition = var.disk_type == null || lower(var.disk_type) != "hyperdisk-balanced" || var.disk_size_gb == null || tonumber(var.disk_size_gb) >= 4 + error_message = "The minimum capacity for hyperdisk-balanced is 4 GB." + } + + precondition { + condition = length(var.additional_disks) == 0 || alltrue([for disk in var.additional_disks : disk.disk_storage_pool == null || disk.disk_storage_pool == "" || contains(["hyperdisk-balanced", "hyperdisk-throughput"], lower(try(disk.disk_type, "")))]) + error_message = "Storage pools are only supported with Hyperdisk types (balanced or throughput)." + } } scheduling { diff --git a/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf b/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf index a2e7862ecd..cd0eec8764 100644 --- a/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf +++ b/community/modules/internal/slurm-gcp/internal_instance_template/variables.tf @@ -155,7 +155,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md index 1fd753c60e..6ceb98c4f8 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md @@ -471,7 +471,7 @@ limitations under the License. | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-ssd"` | no | | [enable\_backup\_controller](#input\_enable\_backup\_controller) | Enables a secondary backup controller for High Availability. | `bool` | `false` | no | | [enable\_bigquery\_load](#input\_enable\_bigquery\_load) | Enables loading of cluster job usage into big query.

NOTE: Requires Google Bigquery API. | `bool` | `false` | no | diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf index 22601f8c5f..3e013be4d4 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf @@ -19,7 +19,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md index a5c20c4e0b..81632cf108 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/README.md @@ -94,7 +94,7 @@ No resources. | [disk\_labels](#input\_disk\_labels) | Labels specific to the boot disk. These will be merged with var.labels. | `map(string)` | `{}` | no | | [disk\_resource\_manager\_tags](#input\_disk\_resource\_manager\_tags) | (Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag\_key\_id}, and values are in the format tagValues/456. | `map(string)` | `{}` | no | | [disk\_size\_gb](#input\_disk\_size\_gb) | Boot disk size in GB. | `number` | `50` | no | -| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | +| [disk\_storage\_pool](#input\_disk\_storage\_pool) | Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones. | `string` | `null` | no | | [disk\_type](#input\_disk\_type) | Boot disk type, can be either hyperdisk-balanced, pd-ssd, pd-standard, pd-balanced, or pd-extreme. | `string` | `"pd-ssd"` | no | | [enable\_confidential\_vm](#input\_enable\_confidential\_vm) | Enable the Confidential VM configuration. Note: the instance image must support option. | `bool` | `false` | no | | [enable\_login\_public\_ips](#input\_enable\_login\_public\_ips) | If set to true. The login node will have a random public IP assigned to it. | `bool` | `false` | no | diff --git a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf index 2f935b4a23..5c79d8db69 100644 --- a/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf +++ b/community/modules/scheduler/schedmd-slurm-gcp-v6-login/variables.tf @@ -60,7 +60,7 @@ variable "disk_type" { } variable "disk_storage_pool" { - description = "Storage pool to use for the node's boot disk. Note that storage pools are only supported with Hyperdisk types (balanced or throughput). You must provide an existing storage pool, as this module does not create new ones." + description = "Storage pool to use for the boot disk. Note that storage pools are only supported with Hyperdisk types. For boot disks, only hyperdisk-balanced is supported. You must provide an existing storage pool, as this module does not create new ones." type = string default = null } From 9e25a0a7867d59a281fcd2ec2671c88131a3ff04 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Wed, 5 Aug 2026 05:49:08 +0000 Subject: [PATCH 23/34] fix: set storage_pool to null when empty --- modules/compute/vm-instance/main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/compute/vm-instance/main.tf b/modules/compute/vm-instance/main.tf index 96105d24be..5ca7629042 100644 --- a/modules/compute/vm-instance/main.tf +++ b/modules/compute/vm-instance/main.tf @@ -124,7 +124,7 @@ resource "google_compute_disk" "additional_disks" { size = var.additional_persistent_disks.size labels = local.labels zone = var.zone - storage_pool = var.additional_persistent_disks.storage_pool + storage_pool = var.additional_persistent_disks.storage_pool == "" ? null : var.additional_persistent_disks.storage_pool } resource "google_compute_resource_policy" "placement_policy" { @@ -193,7 +193,7 @@ resource "google_compute_instance" "compute_vm" { size = var.disk_size_gb type = var.disk_type labels = local.labels - storage_pool = var.disk_storage_pool + storage_pool = var.disk_storage_pool == "" ? null : var.disk_storage_pool } device_name = "${local.resource_prefix}-boot-disk-${count.index}" From d479bc762da1a3848e2a007fc396d91a81ca3555 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Thu, 13 Aug 2026 13:31:49 +0000 Subject: [PATCH 24/34] added integration test and blueprint for vm storage pools --- examples/vm-storage.yaml | 48 +++ .../test-validation/test-vm-storage.yml | 40 +++ .../daily-tests/builds/vm-storage.yaml | 297 ++++++++++++++++++ .../daily-tests/tests/vm-storage.yml | 18 ++ 4 files changed, 403 insertions(+) create mode 100644 examples/vm-storage.yaml create mode 100644 tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-vm-storage.yml create mode 100644 tools/cloud-build/daily-tests/builds/vm-storage.yaml create mode 100644 tools/cloud-build/daily-tests/tests/vm-storage.yml diff --git a/examples/vm-storage.yaml b/examples/vm-storage.yaml new file mode 100644 index 0000000000..eac8e9a47d --- /dev/null +++ b/examples/vm-storage.yaml @@ -0,0 +1,48 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +blueprint_name: vm-storage +vars: + project_id: ## Set GCP Project ID Here ## + deployment_name: vm-storage + region: us-central1 + zone: us-central1-a + test_name: vm-storage + network_name: default-net + hyperdisk_balanced_storage_pool: projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-balanced + hyperdisk_throughput_storage_pool: projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-throughput + +deployment_groups: +- group: primary + modules: + - id: network + source: modules/network/vpc + settings: + network_name: $(vars.network_name) + network_description: "Test network for $(vars.test_name) in $(vars.region)" + - id: vm + source: modules/compute/vm-instance + use: + - network + settings: + machine_type: c3d-standard-4 + instance_count: 1 + disk_type: hyperdisk-balanced + disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) + additional_persistent_disks: + count: 1 + type: hyperdisk-throughput + size: 2048 + storage_pool: $(vars.hyperdisk_throughput_storage_pool) diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-vm-storage.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-vm-storage.yml new file mode 100644 index 0000000000..44876c368f --- /dev/null +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-vm-storage.yml @@ -0,0 +1,40 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +- name: Verify VM Boot Disk Storage Pool + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute disks describe {{ deployment_name }}-0 --project={{ project }} --zone={{ zone }} --format="value(storagePool)" + register: vm_boot_pool + changed_when: false + +- name: Assert VM Boot Disk is in Balanced Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_balanced_pool in vm_boot_pool.stdout + +- name: Verify VM Additional Disk Storage Pool + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute disks describe {{ deployment_name }}-disk-0 --project={{ project }} --zone={{ zone }} --format="value(storagePool)" + register: vm_data_pool + changed_when: false + +- name: Assert VM Additional Disk is in Throughput Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_throughput_pool in vm_data_pool.stdout diff --git a/tools/cloud-build/daily-tests/builds/vm-storage.yaml b/tools/cloud-build/daily-tests/builds/vm-storage.yaml new file mode 100644 index 0000000000..6974ef7895 --- /dev/null +++ b/tools/cloud-build/daily-tests/builds/vm-storage.yaml @@ -0,0 +1,297 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# limitations under the License. + +--- +tags: +- m.vpc +- m.vm-instance +- storage-pool + +substitutions: + _TEST_PREFIX: "" + _ZONE: "us-central1-a" + +timeout: 86400s +queueTtl: 86400s # 24hr +logsBucket: "gs://$PROJECT_NUMBER.cloudbuild-logs.googleusercontent.com" + +steps: +# 1. Build and push workspace container containing the current code layer +- id: build-workspace-image + name: gcr.io/cloud-builders/docker + entrypoint: /bin/bash + args: + - -c + - | + set -eo pipefail + docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/hpc-toolkit-repo/test-runner:$BUILD_ID -f- . < job.yaml + apiVersion: batch/v1 + kind: Job + metadata: + name: vm-storage-$$BUILD_ID_SHORT + namespace: default + labels: + kueue.x-k8s.io/queue-name: local-queue-test-locks + build-id: "$BUILD_ID" + spec: + suspend: true # Required for Kueue: the job must be created in suspended state for Kueue to manage it + backoffLimit: 0 + template: + metadata: + annotations: + cluster-autoscaler.kubernetes.io/safe-to-evict: "false" + spec: + $$PRIORITY_LINE + serviceAccountName: test-kueue-cluster-runner-ksa + restartPolicy: Never + containers: + - name: runner + image: us-central1-docker.pkg.dev/$PROJECT_ID/hpc-toolkit-repo/test-runner:$BUILD_ID + env: + - name: ANSIBLE_HOST_KEY_CHECKING + value: "false" + - name: ANSIBLE_CONFIG + value: "/workspace/tools/cloud-build/ansible.cfg" + - name: _TEST_PREFIX + value: "${_TEST_PREFIX}" + - name: ZONE + value: "${_ZONE}" + - name: BUILD_ID + value: "$BUILD_ID" + - name: PROJECT_ID + value: "$PROJECT_ID" + - name: GCLUSTER_GCS_PATH + value: "$$GCLUSTER_GCS_PATH" + - name: TRIAGE_GCS_BUCKET + value: "$$TRIAGE_GCS_BUCKET" + - name: TRIAGE_PROJECT_NUMBER + value: "$$TRIAGE_PROJECT_NUMBER" + - name: TRIAGE_INVOKER_SA + value: "$$TRIAGE_INVOKER_SA" + - name: TRIAGE_CLOUD_RUN_URL + value: "$$TRIAGE_CLOUD_RUN_URL" + command: ["/bin/bash", "-c"] + args: + - | + + set -x -e + cd /workspace + + DEPLOYMENT_NAME="vm-storage-$$BUILD_ID_SHORT" + + RUN_CLEANUP=true + source /workspace/tools/cloud-build/kueue_cleanup_pod.sh + trap cleanup_pod EXIT SIGTERM SIGINT + + + + REGION="\$${ZONE%-*}" + bash tools/get_binary.sh "\$$_TEST_PREFIX" + + BLUEPRINT="examples/vm-storage.yaml" + bash tools/add_ttl_label.sh \$$BLUEPRINT + + + echo "Checking if required storage pools exist..." + if ! gcloud compute storage-pools describe test-pool-balanced --project=$PROJECT_ID --zone=\$$ZONE >/dev/null 2>&1; then + echo "ERROR: Storage pool 'test-pool-balanced' does not exist." + echo "Please create it by running the following command:" + echo "gcloud compute storage-pools create test-pool-balanced" + echo " --project=$PROJECT_ID" + echo " --zone=\$$ZONE" + echo " --provisioned-capacity=10240GB" + echo " --provisioned-iops=10000" + echo " --provisioned-throughput=1024" + echo " --storage-pool-type=hyperdisk-balanced" + exit 1 + fi + if ! gcloud compute storage-pools describe test-pool-throughput --project=$PROJECT_ID --zone=\$$ZONE >/dev/null 2>&1; then + echo "ERROR: Storage pool 'test-pool-throughput' does not exist." + echo "Please create it by running the following command:" + echo "gcloud compute storage-pools create test-pool-throughput" + echo " --project=$PROJECT_ID" + echo " --zone=\$$ZONE" + echo " --provisioned-capacity=10240GB" + echo " --provisioned-throughput=180" + echo " --storage-pool-type=hyperdisk-throughput" + exit 1 + fi + + + ansible-playbook tools/cloud-build/daily-tests/ansible_playbooks/base-integration-test.yml \ + --user="$$OSLOGIN_USER" --extra-vars="project=\$$PROJECT_ID build=$$BUILD_ID_SHORT full_build_id=$BUILD_ID" \ + --extra-vars="region=\$$REGION zone=\$$ZONE" \ + --extra-vars="hyperdisk_balanced_pool=test-pool-balanced hyperdisk_throughput_pool=test-pool-throughput" \ + --extra-vars="@tools/cloud-build/daily-tests/tests/vm-storage.yml" \ + --extra-vars="triage_gcs_bucket_override=$$TRIAGE_GCS_BUCKET" \ + --extra-vars="triage_project_number_override=$$TRIAGE_PROJECT_NUMBER" \ + --extra-vars="triage_invoker_sa_override=$$TRIAGE_INVOKER_SA" \ + --extra-vars="triage_cloud_run_url_override=$$TRIAGE_CLOUD_RUN_URL" & + ANSIBLE_PID=\$$! + + wait \$$ANSIBLE_PID + RUN_CLEANUP=false + + resources: + requests: + cpu: 200m + memory: "2Gi" + test-locks/vm-storage: 1 + limits: + cpu: 1 + memory: "2Gi" + test-locks/vm-storage: 1 + EOF + +# 3. Submit and Monitor GKE Kueue Job with Retry +- id: submit-and-monitor-gke-job + name: gcr.io/cloud-builders/gcloud + entrypoint: /bin/bash + args: + - -c + - | + set -eo pipefail + gcloud container clusters get-credentials test-kueue-cluster --region=us-central1 + BUILD_ID_SHORT=$$(echo "$BUILD_ID" | cut -c1-6) + JOB_NAME="vm-storage-$$BUILD_ID_SHORT" + + # Cloud Build trap: If the Cloud Build step itself receives a cancellation signal, + # delete the GKE job so the pod receives a SIGTERM and performs infrastructure cleanup. + cleanup_cb() { + echo "" + echo "==========================================================================" + echo "PIPELINE CANCELLED: The Cloud Build step received a termination signal." + echo "Deleting GKE Kueue Job ($$JOB_NAME) to force the Pod to clean itself up!" + echo "==========================================================================" + kubectl delete job "$$JOB_NAME" -n default || true + exit 1 + } + trap cleanup_cb SIGTERM SIGINT + + MAX_RETRIES=10 + RETRY_DELAY=300 + ATTEMPT=1 + + while true; do + echo "=== ATTEMPT $$ATTEMPT: Submitting Kueue Job ===" + kubectl apply -f /workspace/job.yaml + + set +e + ( bash tools/cloud-build/monitor_kueue_job.sh \ + test-kueue-cluster \ + us-central1 \ + "$$JOB_NAME" \ + default | tee /workspace/job_logs.txt; exit $${PIPESTATUS[0]} ) & + MONITOR_PID=$$! + wait $$MONITOR_PID + EXIT_CODE=$$? + set -e + + if [ $$EXIT_CODE -eq 0 ]; then + echo "Job succeeded!" + break + fi + + # If so, retry. If it's a real error (like a terraform syntax error), fail immediately. + if bash tools/cloud-build/check_retriable_error.sh /workspace/job_logs.txt; then + echo "WARNING: Retriable error detected. Kueue Job has already been deleted. Retrying in $$RETRY_DELAY seconds..." + else + echo "ERROR: Test failed due to an actual error (not zone capacity). Failing pipeline." >&2 + exit 1 + fi + + if [ $$ATTEMPT -ge $$MAX_RETRIES ]; then + exit 1 + fi + + sleep $$RETRY_DELAY + ATTEMPT=$$((ATTEMPT + 1)) + done + +# 4. Cleanup the built image from Registry to save costs +- id: cleanup-image + name: gcr.io/cloud-builders/gcloud + entrypoint: /bin/bash + allowFailure: true + args: + - -c + - | + set -eo pipefail + IMAGE="us-central1-docker.pkg.dev/$PROJECT_ID/hpc-toolkit-repo/test-runner:$BUILD_ID" + MAX_RETRIES=5 + RETRY_DELAY=10 + ATTEMPT=1 + + echo "Starting cleanup for image: $$IMAGE" + + while [ "$$ATTEMPT" -le "$$MAX_RETRIES" ]; do + echo "Attempt $$ATTEMPT of $$MAX_RETRIES..." + + if gcloud artifacts docker images delete "$$IMAGE" --quiet; then + echo "Image successfully deleted." + exit 0 + fi + + if [ "$$ATTEMPT" -lt "$$MAX_RETRIES" ]; then + echo "Deletion failed. Retrying in $$RETRY_DELAY seconds..." + sleep $$RETRY_DELAY + fi + + ATTEMPT=$$((ATTEMPT + 1)) + done + + echo "Failed to delete image after $$MAX_RETRIES attempts." + echo "Image will be handled by Artifact Registry background cleanup policies." + exit 1 + +availableSecrets: + secretManager: + - versionName: projects/${PROJECT_ID}/secrets/sa-email/versions/latest + env: 'SA_EMAIL' + - versionName: projects/${PROJECT_ID}/secrets/gcluster-develop-release-bucket/versions/latest + env: 'GCLUSTER_GCS_PATH' + - versionName: projects/${PROJECT_ID}/secrets/triage-gcs-bucket/versions/latest + env: 'TRIAGE_GCS_BUCKET' + - versionName: projects/${PROJECT_ID}/secrets/triage-project-number/versions/latest + env: 'TRIAGE_PROJECT_NUMBER' + - versionName: projects/${PROJECT_ID}/secrets/triage-invoker-sa/versions/latest + env: 'TRIAGE_INVOKER_SA' + - versionName: projects/${PROJECT_ID}/secrets/triage-cloud-run-url/versions/latest + env: 'TRIAGE_CLOUD_RUN_URL' diff --git a/tools/cloud-build/daily-tests/tests/vm-storage.yml b/tools/cloud-build/daily-tests/tests/vm-storage.yml new file mode 100644 index 0000000000..d646376ca4 --- /dev/null +++ b/tools/cloud-build/daily-tests/tests/vm-storage.yml @@ -0,0 +1,18 @@ +--- +# region, zone must be defined in build file with --extra-vars flag! +test_name: vm-storage +deployment_name: vmstorage-{{ build }} +workspace: /workspace +blueprint_yaml: "{{ workspace }}/examples/vm-storage.yaml" +network: "{{ test_name }}-net" +remote_node: "{{ deployment_name }}-0" +post_deploy_tests: +- test-validation/test-vm-storage.yml +cli_deployment_vars: + project_id: "{{ project }}" + test_name: "{{ test_name }}" + network_name: "{{ network }}" + region: "{{ region }}" + zone: "{{ zone }}" + hyperdisk_balanced_storage_pool: "projects/{{ project }}/zones/{{ zone }}/storagePools/{{ hyperdisk_balanced_pool }}" + hyperdisk_throughput_storage_pool: "projects/{{ project }}/zones/{{ zone }}/storagePools/{{ hyperdisk_throughput_pool }}" From 621e7c38648297081e0eef495cd75765921373b0 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Fri, 14 Aug 2026 11:35:28 +0000 Subject: [PATCH 25/34] feat: GKE storage pool blueprint and integration test updates --- examples/storage-gke.yaml | 34 ++++ examples/vm-storage.yaml | 2 +- .../test-validation/test-gke-storage-pool.yml | 166 ++++++++++++++++++ .../daily-tests/builds/gke-storage.yaml | 27 ++- .../daily-tests/builds/vm-storage.yaml | 2 +- .../daily-tests/tests/gke-storage.yml | 4 + 6 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml diff --git a/examples/storage-gke.yaml b/examples/storage-gke.yaml index 575af2ed1d..6a0639bf8a 100644 --- a/examples/storage-gke.yaml +++ b/examples/storage-gke.yaml @@ -23,6 +23,8 @@ vars: # The following line must be updated for this example to work. authorized_cidr: /32 gcp_public_cidrs_access_enabled: false + hyperdisk_balanced_storage_pool: "projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-balanced" + hyperdisk_throughput_storage_pool: "projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-throughput" deployment_groups: - group: primary @@ -210,3 +212,35 @@ deployment_groups: - --iodepth_batch_submit=64 - --iodepth_batch_complete_max=64 outputs: [instructions] + + ### Storage Pools ### + + - id: gke-pool-hp + source: modules/compute/gke-node-pool + use: [gke_cluster, node_pool_service_account] + settings: + name: hp-pool + zones: [$(vars.zone)] + machine_type: c3d-standard-4 + disk_type: hyperdisk-balanced + disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) + + - id: gke-storage-hp + source: modules/file-system/gke-storage + use: [gke_cluster] + settings: + storage_type: hyperdisk-balanced + access_mode: ReadWriteOnce + capacity_gb: 20 + sc_reclaim_policy: Delete + disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) + + - id: gke-storage-hp-thr + source: modules/file-system/gke-storage + use: [gke_cluster] + settings: + storage_type: hyperdisk-throughput + access_mode: ReadWriteOnce + capacity_gb: 5000 + sc_reclaim_policy: Delete + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) diff --git a/examples/vm-storage.yaml b/examples/vm-storage.yaml index eac8e9a47d..366fa53c45 100644 --- a/examples/vm-storage.yaml +++ b/examples/vm-storage.yaml @@ -18,7 +18,7 @@ vars: project_id: ## Set GCP Project ID Here ## deployment_name: vm-storage region: us-central1 - zone: us-central1-a + zone: us-central1-b test_name: vm-storage network_name: default-net hyperdisk_balanced_storage_pool: projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-balanced diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml new file mode 100644 index 0000000000..5208e17400 --- /dev/null +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml @@ -0,0 +1,166 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +- name: Verify GKE Node Pool Storage Pool + delegate_to: localhost + ansible.builtin.shell: | + # The cluster name defaults to deployment_name in our GKE module + gcloud container node-pools describe hp-pool --cluster {{ deployment_name }} --region {{ region }} --project {{ project }} --format="value(config.storagePools)" + register: gke_node_pool + changed_when: false + # Ignore errors in case the cluster is zonal instead of regional, and try zonal + ignore_errors: true + +- name: Verify GKE Node Pool Storage Pool (Zonal Fallback) + delegate_to: localhost + ansible.builtin.shell: | + gcloud container node-pools describe hp-pool --cluster {{ deployment_name }} --zone {{ zone }} --project {{ project }} --format="value(config.storagePools)" + register: gke_node_pool_zonal + changed_when: false + when: gke_node_pool.failed + +- name: Set GKE Node Pool Result + delegate_to: localhost + ansible.builtin.set_fact: + gke_node_pool_output: "{{ gke_node_pool.stdout if not gke_node_pool.failed else gke_node_pool_zonal.stdout }}" + +- name: Assert GKE Node Pool uses Balanced Storage Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_balanced_pool in gke_node_pool_output + + +- name: Authenticate to GKE Cluster (Regional) + delegate_to: localhost + ansible.builtin.shell: | + gcloud container clusters get-credentials {{ deployment_name }} --region {{ region }} --project {{ project }} + register: gke_auth + changed_when: false + ignore_errors: true + +- name: Authenticate to GKE Cluster (Zonal Fallback) + delegate_to: localhost + ansible.builtin.shell: | + gcloud container clusters get-credentials {{ deployment_name }} --zone {{ zone }} --project {{ project }} + changed_when: false + when: gke_auth.failed + +- name: Verify StorageClass contains storage-pools (Balanced) + delegate_to: localhost + ansible.builtin.shell: | + kubectl get sc hyperdisk-balanced-sc -o yaml + register: sc_balanced + changed_when: false + +- name: Assert StorageClass contains storage-pools (Balanced) + delegate_to: localhost + ansible.builtin.assert: + that: + - "'storage-pools: projects/{{ project }}' in sc_balanced.stdout" + - hyperdisk_balanced_pool in sc_balanced.stdout + +- name: Verify StorageClass contains storage-pools (Throughput) + delegate_to: localhost + ansible.builtin.shell: | + kubectl get sc hyperdisk-throughput-sc -o yaml + register: sc_throughput + changed_when: false + +- name: Assert StorageClass contains storage-pools (Throughput) + delegate_to: localhost + ansible.builtin.assert: + that: + - "'storage-pools: projects/{{ project }}' in sc_throughput.stdout" + - hyperdisk_throughput_pool in sc_throughput.stdout + +- name: Deploy Test Pod to trigger PVC binding + delegate_to: localhost + ansible.builtin.shell: | + cat <<'POD' | kubectl apply -f - + apiVersion: v1 + kind: Pod + metadata: + name: test-hd-pod + spec: + containers: + - name: test + image: busybox + command: ["sleep", "3600"] + volumeMounts: + - mountPath: "/data-balanced" + name: vol-balanced + - mountPath: "/data-throughput" + name: vol-throughput + volumes: + - name: vol-balanced + persistentVolumeClaim: + claimName: hyperdisk-balanced-pvc-0 + - name: vol-throughput + persistentVolumeClaim: + claimName: hyperdisk-throughput-pvc-0 + POD + changed_when: true + +- name: Wait for Test Pod to be Running (Binding PVCs) + delegate_to: localhost + ansible.builtin.shell: | + kubectl wait --for=condition=Ready pod/test-hd-pod --timeout=120s + changed_when: false + +- name: Get Persistent Volume names (Balanced) + delegate_to: localhost + ansible.builtin.shell: | + kubectl get pvc hyperdisk-balanced-pvc-0 -o jsonpath='{.spec.volumeName}' + register: pv_balanced_name + changed_when: false + +- name: Get Persistent Volume names (Throughput) + delegate_to: localhost + ansible.builtin.shell: | + kubectl get pvc hyperdisk-throughput-pvc-0 -o jsonpath='{.spec.volumeName}' + register: pv_throughput_name + changed_when: false + +- name: Wait for CSI to provision Disks in GCP + delegate_to: localhost + ansible.builtin.pause: + seconds: 15 + +- name: Verify GCP Persistent Disk Placement (Balanced) + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute disks describe {{ pv_balanced_name.stdout }} --zone {{ zone }} --project {{ project }} --format="value(storagePool)" + register: disk_pool_balanced + changed_when: false + +- name: Assert Balanced Disk is in Storage Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_balanced_pool in disk_pool_balanced.stdout + +- name: Verify GCP Persistent Disk Placement (Throughput) + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute disks describe {{ pv_throughput_name.stdout }} --zone {{ zone }} --project {{ project }} --format="value(storagePool)" + register: disk_pool_throughput + changed_when: false + +- name: Assert Throughput Disk is in Storage Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_throughput_pool in disk_pool_throughput.stdout diff --git a/tools/cloud-build/daily-tests/builds/gke-storage.yaml b/tools/cloud-build/daily-tests/builds/gke-storage.yaml index 788e978e79..0edb64bac2 100644 --- a/tools/cloud-build/daily-tests/builds/gke-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/gke-storage.yaml @@ -177,11 +177,36 @@ steps: echo ' machine_type: e2-standard-2' >> \$$SG_EXAMPLE echo ' zone: us-central1-b' >> \$$SG_EXAMPLE + echo "Checking if required storage pools exist..." + if ! gcloud compute storage-pools describe test-pool-balanced --project=$PROJECT_ID --zone=us-central1-b >/dev/null 2>&1; then + echo "ERROR: Storage pool 'test-pool-balanced' does not exist in us-central1-b." + echo "Please create it by running the following command:" + echo "gcloud compute storage-pools create test-pool-balanced" + echo " --project=$PROJECT_ID" + echo " --zone=us-central1-b" + echo " --provisioned-capacity=10240GB" + echo " --provisioned-iops=10000" + echo " --provisioned-throughput=1024" + echo " --storage-pool-type=hyperdisk-balanced" + exit 1 + fi + if ! gcloud compute storage-pools describe test-pool-throughput --project=$PROJECT_ID --zone=us-central1-b >/dev/null 2>&1; then + echo "ERROR: Storage pool 'test-pool-throughput' does not exist in us-central1-b." + echo "Please create it by running the following command:" + echo "gcloud compute storage-pools create test-pool-throughput" + echo " --project=$PROJECT_ID" + echo " --zone=us-central1-b" + echo " --provisioned-capacity=10240GB" + echo " --provisioned-throughput=180" + echo " --storage-pool-type=hyperdisk-throughput" + exit 1 + fi + bash tools/add_ttl_label.sh "\$$SG_EXAMPLE" python3 tools/fix_vpc_name.py \$$SG_EXAMPLE "${_TEST_PREFIX}" ansible-playbook tools/cloud-build/daily-tests/ansible_playbooks/base-integration-test.yml \ - --extra-vars="test_prefix=${_TEST_PREFIX}" --extra-vars="use_fixed_vpc=true" \ + --extra-vars="hyperdisk_balanced_pool=test-pool-balanced hyperdisk_throughput_pool=test-pool-throughput" --extra-vars="test_prefix=${_TEST_PREFIX}" --extra-vars="use_fixed_vpc=true" \ --user="$$OSLOGIN_USER" --extra-vars="project=$PROJECT_ID build=$$BUILD_ID_SHORT full_build_id=$BUILD_ID" \ --extra-vars="@tools/cloud-build/daily-tests/tests/gke-storage.yml" \ --extra-vars="triage_gcs_bucket_override=$$TRIAGE_GCS_BUCKET" \ diff --git a/tools/cloud-build/daily-tests/builds/vm-storage.yaml b/tools/cloud-build/daily-tests/builds/vm-storage.yaml index 6974ef7895..2071c2a03c 100644 --- a/tools/cloud-build/daily-tests/builds/vm-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/vm-storage.yaml @@ -18,7 +18,7 @@ tags: substitutions: _TEST_PREFIX: "" - _ZONE: "us-central1-a" + _ZONE: "us-central1-b" timeout: 86400s queueTtl: 86400s # 24hr diff --git a/tools/cloud-build/daily-tests/tests/gke-storage.yml b/tools/cloud-build/daily-tests/tests/gke-storage.yml index dd9c947e0c..8f59c07c9a 100644 --- a/tools/cloud-build/daily-tests/tests/gke-storage.yml +++ b/tools/cloud-build/daily-tests/tests/gke-storage.yml @@ -23,11 +23,15 @@ remote_node: "{{ deployment_name }}-0" post_deploy_tests: - test-validation/test-zonal-bucket.yml - test-validation/test-anywhere-cache.yml +- test-validation/test-gke-storage-pool.yml cli_deployment_vars: test_name: "{{ test_name }}" region: "{{ region }}" zone: "{{ zone }}" authorized_cidr: "{{ build_ip.stdout }}/32" gcp_public_cidrs_access_enabled: true + project_id: "{{ project }}" + hyperdisk_balanced_storage_pool: "projects/{{ project }}/zones/us-central1-b/storagePools/{{ hyperdisk_balanced_pool }}" + hyperdisk_throughput_storage_pool: "projects/{{ project }}/zones/us-central1-b/storagePools/{{ hyperdisk_throughput_pool }}" custom_vars: project: "{{ project }}" From 88fbced0fe5f45c8877b87fb369854fff2d57f7d Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Fri, 14 Aug 2026 11:49:34 +0000 Subject: [PATCH 26/34] feat: rename vm storage --- examples/{vm-storage.yaml => storage-vm.yaml} | 2 +- tools/cloud-build/daily-tests/builds/vm-storage.yaml | 2 +- tools/cloud-build/daily-tests/tests/vm-storage.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename examples/{vm-storage.yaml => storage-vm.yaml} (98%) diff --git a/examples/vm-storage.yaml b/examples/storage-vm.yaml similarity index 98% rename from examples/vm-storage.yaml rename to examples/storage-vm.yaml index 366fa53c45..c5d8e99b6e 100644 --- a/examples/vm-storage.yaml +++ b/examples/storage-vm.yaml @@ -13,7 +13,7 @@ # limitations under the License. --- -blueprint_name: vm-storage +blueprint_name: storage-vm vars: project_id: ## Set GCP Project ID Here ## deployment_name: vm-storage diff --git a/tools/cloud-build/daily-tests/builds/vm-storage.yaml b/tools/cloud-build/daily-tests/builds/vm-storage.yaml index 2071c2a03c..601ab77a2a 100644 --- a/tools/cloud-build/daily-tests/builds/vm-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/vm-storage.yaml @@ -125,7 +125,7 @@ steps: REGION="\$${ZONE%-*}" bash tools/get_binary.sh "\$$_TEST_PREFIX" - BLUEPRINT="examples/vm-storage.yaml" + BLUEPRINT="examples/storage-vm.yaml" bash tools/add_ttl_label.sh \$$BLUEPRINT diff --git a/tools/cloud-build/daily-tests/tests/vm-storage.yml b/tools/cloud-build/daily-tests/tests/vm-storage.yml index d646376ca4..69724775b2 100644 --- a/tools/cloud-build/daily-tests/tests/vm-storage.yml +++ b/tools/cloud-build/daily-tests/tests/vm-storage.yml @@ -3,7 +3,7 @@ test_name: vm-storage deployment_name: vmstorage-{{ build }} workspace: /workspace -blueprint_yaml: "{{ workspace }}/examples/vm-storage.yaml" +blueprint_yaml: "{{ workspace }}/examples/storage-vm.yaml" network: "{{ test_name }}-net" remote_node: "{{ deployment_name }}-0" post_deploy_tests: From 5e8ccd6fcd2adf66d438e028b847bfbb7ac54fb0 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Fri, 14 Aug 2026 12:13:04 +0000 Subject: [PATCH 27/34] feat: slurm storage pool blueprint and integration changes --- ...-storage-slurm.yaml => storage-slurm.yaml} | 45 ++++++++-- ...pid-storage.yml => test-slurm-storage.yml} | 54 ++++++++++++ ...-rapid-storage.yaml => slurm-storage.yaml} | 83 +++++++++---------- ...-rapid-storage.yaml => slurm-storage.yaml} | 7 +- .../daily-tests/validate_tests_metadata.py | 2 +- 5 files changed, 139 insertions(+), 52 deletions(-) rename examples/{rapid-storage-slurm.yaml => storage-slurm.yaml} (61%) rename tools/cloud-build/daily-tests/ansible_playbooks/test-validation/{test-slurm-rapid-storage.yml => test-slurm-storage.yml} (64%) rename tools/cloud-build/daily-tests/builds/{slurm-rapid-storage.yaml => slurm-storage.yaml} (80%) rename tools/cloud-build/daily-tests/tests/{slurm-rapid-storage.yaml => slurm-storage.yaml} (77%) diff --git a/examples/rapid-storage-slurm.yaml b/examples/storage-slurm.yaml similarity index 61% rename from examples/rapid-storage-slurm.yaml rename to examples/storage-slurm.yaml index dec96754ee..79523f96d4 100644 --- a/examples/rapid-storage-slurm.yaml +++ b/examples/storage-slurm.yaml @@ -13,14 +13,16 @@ # limitations under the License. --- -blueprint_name: rapid-storage-slurm +blueprint_name: storage-slurm vars: project_id: # Set GCP Project ID Here - deployment_name: zonal-bucket-ac-slurm + deployment_name: storage-slurm region: us-central1 zone: us-central1-b gcs_bucket_local_mount: /data + hyperdisk_balanced_storage_pool: "projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-balanced" + hyperdisk_throughput_storage_pool: "projects/$(vars.project_id)/zones/$(vars.zone)/storagePools/your-pool-throughput" deployment_groups: - group: primary @@ -52,7 +54,18 @@ deployment_groups: use: [network] settings: node_count_dynamic_max: 2 - machine_type: n2-standard-4 + machine_type: c3d-standard-4 + disk_type: hyperdisk-balanced + disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) + additional_disks: + - disk_name: nodeset-data + device_name: nodeset-data + disk_type: hyperdisk-throughput + disk_size_gb: 2048 + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) + auto_delete: true + boot: false + disk_labels: {} allow_automatic_updates: false metadata: gcs-bucket-name: $(zonal-gcs-bucket.gcs_bucket_name) @@ -71,7 +84,18 @@ deployment_groups: use: - network settings: - machine_type: n2-standard-4 + machine_type: c3d-standard-4 + disk_type: hyperdisk-balanced + disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) + additional_disks: + - disk_name: login-data + device_name: login-data + disk_type: hyperdisk-throughput + disk_size_gb: 2048 + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) + auto_delete: true + boot: false + disk_labels: {} enable_login_public_ips: true metadata: gcs-bucket-name: $(zonal-gcs-bucket.gcs_bucket_name) @@ -85,5 +109,16 @@ deployment_groups: - zonal-gcs-bucket - slurm_login settings: - machine_type: n2-standard-4 + machine_type: c3d-standard-4 + disk_type: hyperdisk-balanced + disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) + additional_disks: + - disk_name: controller-data + device_name: controller-data + disk_type: hyperdisk-throughput + disk_size_gb: 2048 + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) + auto_delete: true + boot: false + disk_labels: {} enable_controller_public_ips: true diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-rapid-storage.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml similarity index 64% rename from tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-rapid-storage.yml rename to tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml index c797539308..1c5f4731ea 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-rapid-storage.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml @@ -101,3 +101,57 @@ - fio_results.jobs[0].read.iops_mean >= 300 fail_msg: "FIO read performance thresholds not met. Bandwidth: {{ fio_results.jobs[0].read.bw_mean }} KB/s (expected >= 1000 KB/s), IOPS: {{ fio_results.jobs[0].read.iops_mean }} (expected >= 300)." success_msg: "FIO read performance thresholds met. Bandwidth: {{ fio_results.jobs[0].read.bw_mean }} KB/s, IOPS: {{ fio_results.jobs[0].read.iops_mean }}." + +- name: Verify Controller Boot Disk Storage Pool + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute disks describe {{ slurm_cluster_name }}-controller --project={{ project_id }} --zone={{ zone }} --format="value(storagePool)" + register: controller_boot_pool + changed_when: false + +- name: Assert Controller Boot Disk is in Balanced Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_balanced_pool in controller_boot_pool.stdout + +- name: Verify Controller Additional Disk Storage Pool + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute disks describe slurm_controller-data --project={{ project_id }} --zone={{ zone }} --format="value(storagePool)" + register: controller_data_pool + changed_when: false + +- name: Assert Controller Additional Disk is in Throughput Pool + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_throughput_pool in controller_data_pool.stdout + +- name: Verify Login Nodes Instance Template Storage Pools + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-login" --project={{ project_id }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + register: login_template_pools + changed_when: false + +- name: Assert Login Template uses correct Storage Pools + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_balanced_pool in login_template_pools.stdout + - hyperdisk_throughput_pool in login_template_pools.stdout + +- name: Verify Nodeset Instance Template Storage Pools + delegate_to: localhost + ansible.builtin.shell: | + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-slurm-nodeset" --project={{ project_id }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + register: nodeset_template_pools + changed_when: false + +- name: Assert Nodeset Template uses correct Storage Pools + delegate_to: localhost + ansible.builtin.assert: + that: + - hyperdisk_balanced_pool in nodeset_template_pools.stdout + - hyperdisk_throughput_pool in nodeset_template_pools.stdout diff --git a/tools/cloud-build/daily-tests/builds/slurm-rapid-storage.yaml b/tools/cloud-build/daily-tests/builds/slurm-storage.yaml similarity index 80% rename from tools/cloud-build/daily-tests/builds/slurm-rapid-storage.yaml rename to tools/cloud-build/daily-tests/builds/slurm-storage.yaml index 31f1b94ab3..f750d6133f 100644 --- a/tools/cloud-build/daily-tests/builds/slurm-rapid-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/slurm-storage.yaml @@ -71,7 +71,7 @@ steps: apiVersion: batch/v1 kind: Job metadata: - name: slurm-rapid-storage-$$BUILD_ID_SHORT + name: slurm-storage-$$BUILD_ID_SHORT namespace: default labels: kueue.x-k8s.io/queue-name: local-queue-test-locks @@ -117,58 +117,53 @@ steps: args: - | set -x -e - echo "\"test_file_path\": tools/cloud-build/daily-tests/builds/slurm-rapid-storage.yaml" + echo "\"test_file_path\": tools/cloud-build/daily-tests/builds/slurm-storage.yaml" cd /workspace DEPLOYMENT_NAME="rapid-$$BUILD_ID_SHORT" RUN_CLEANUP=true - # Trap function that runs the rescue playbook (terraform destroy) - # if the pod is terminated by Kueue, fails, or is cancelled. - cleanup_pod() { - local exit_code=\$$? - trap - EXIT SIGTERM SIGINT ERR - set +e - - if [ "\$$RUN_CLEANUP" = "false" ]; then - exit 0 - fi - if [ \$$exit_code -eq 0 ]; then exit_code=1; fi - - echo "" - echo "==========================================================================" - echo "CAUGHT SIGTERM OR SCRIPT ERROR!" - echo "Halting primary Ansible execution..." - echo "==========================================================================" - if [ -n "\$${ANSIBLE_PID:-}" ]; then - kill -TERM \$$ANSIBLE_PID 2>/dev/null || true - wait \$$ANSIBLE_PID 2>/dev/null || true - echo "Waiting 15s for Terraform to release GCS backend state locks..." - sleep 15 - fi - - echo "" - echo "INITIATING RESCUE PLAYBOOK: Destroying leaked infrastructure for \$$DEPLOYMENT_NAME..." - echo "- hosts: localhost" > /workspace/cleanup-playbook.yml - echo " tasks:" >> /workspace/cleanup-playbook.yml - echo " - ansible.builtin.include_tasks:" >> /workspace/cleanup-playbook.yml - echo " file: tools/cloud-build/daily-tests/ansible_playbooks/tasks/rescue_gcluster_failure.yml" >> /workspace/cleanup-playbook.yml - - ansible-playbook /workspace/cleanup-playbook.yml -e deployment_name="\$$DEPLOYMENT_NAME" -e workspace="/workspace" || true - - echo "Graceful cleanup finished." - exit \$$exit_code + source /workspace/tools/cloud-build/kueue_cleanup_pod.sh + cleanup() { + echo "Cleaning up storage pools..." + cleanup_pod } - trap cleanup_pod EXIT SIGTERM SIGINT + trap cleanup EXIT SIGTERM SIGINT bash tools/get_binary.sh "${_TEST_PREFIX}" - BLUEPRINT="examples/rapid-storage-slurm.yaml" + BLUEPRINT="examples/storage-slurm.yaml" bash tools/add_ttl_label.sh \$$BLUEPRINT + echo "Checking if required storage pools exist..." + if ! gcloud compute storage-pools describe test-pool-balanced --project=$PROJECT_ID --zone=us-central1-b >/dev/null 2>&1; then + echo "ERROR: Storage pool 'test-pool-balanced' does not exist in us-central1-b." + echo "Please create it by running the following command:" + echo "gcloud compute storage-pools create test-pool-balanced" + echo " --project=$PROJECT_ID" + echo " --zone=us-central1-b" + echo " --provisioned-capacity=10240GB" + echo " --provisioned-iops=10000" + echo " --provisioned-throughput=1024" + echo " --storage-pool-type=hyperdisk-balanced" + exit 1 + fi + if ! gcloud compute storage-pools describe test-pool-throughput --project=$PROJECT_ID --zone=us-central1-b >/dev/null 2>&1; then + echo "ERROR: Storage pool 'test-pool-throughput' does not exist in us-central1-b." + echo "Please create it by running the following command:" + echo "gcloud compute storage-pools create test-pool-throughput" + echo " --project=$PROJECT_ID" + echo " --zone=us-central1-b" + echo " --provisioned-capacity=10240GB" + echo " --provisioned-throughput=180" + echo " --storage-pool-type=hyperdisk-throughput" + exit 1 + fi + + ansible-playbook tools/cloud-build/daily-tests/ansible_playbooks/slurm-integration-test.yml \ - --user="$$OSLOGIN_USER" --extra-vars="project=$PROJECT_ID build=$$BUILD_ID_SHORT full_build_id=$BUILD_ID" \ - --extra-vars="@tools/cloud-build/daily-tests/tests/slurm-rapid-storage.yaml" \ + --user="$$OSLOGIN_USER" --extra-vars="project=$PROJECT_ID build=$$BUILD_ID_SHORT full_build_id=$BUILD_ID hyperdisk_balanced_pool=test-pool-balanced hyperdisk_throughput_pool=test-pool-throughput" \ + --extra-vars="@tools/cloud-build/daily-tests/tests/slurm-storage.yaml" \ --extra-vars="triage_gcs_bucket_override=$$TRIAGE_GCS_BUCKET" \ --extra-vars="triage_project_number_override=$$TRIAGE_PROJECT_NUMBER" \ --extra-vars="triage_invoker_sa_override=$$TRIAGE_INVOKER_SA" \ @@ -181,11 +176,11 @@ steps: requests: cpu: 200m memory: "2Gi" - test-locks/slurm-rapid-storage: 1 + test-locks/slurm-storage: 1 limits: cpu: 1 memory: "2Gi" - test-locks/slurm-rapid-storage: 1 + test-locks/slurm-storage: 1 EOF # 3. Submit and Monitor GKE Kueue Job with Retry @@ -198,7 +193,7 @@ steps: set -eo pipefail gcloud container clusters get-credentials test-kueue-cluster --region=us-central1 BUILD_ID_SHORT=$$(echo "$BUILD_ID" | cut -c1-6) - JOB_NAME="slurm-rapid-storage-$$BUILD_ID_SHORT" + JOB_NAME="slurm-storage-$$BUILD_ID_SHORT" # Cloud Build trap: If the Cloud Build step itself receives a cancellation signal, # delete the GKE job so the pod receives a SIGTERM and performs infrastructure cleanup. diff --git a/tools/cloud-build/daily-tests/tests/slurm-rapid-storage.yaml b/tools/cloud-build/daily-tests/tests/slurm-storage.yaml similarity index 77% rename from tools/cloud-build/daily-tests/tests/slurm-rapid-storage.yaml rename to tools/cloud-build/daily-tests/tests/slurm-storage.yaml index dbbc0672bb..d881a81e01 100644 --- a/tools/cloud-build/daily-tests/tests/slurm-rapid-storage.yaml +++ b/tools/cloud-build/daily-tests/tests/slurm-storage.yaml @@ -18,16 +18,19 @@ slurm_cluster_name: "rapid{{ build[0:4] }}" region: us-central1 zone: us-central1-b workspace: /workspace -blueprint_yaml: "{{ workspace }}/examples/rapid-storage-slurm.yaml" +blueprint_yaml: "{{ workspace }}/examples/storage-slurm.yaml" network: "{{ test_name }}-net" login_node: "{{ slurm_cluster_name }}-slurm-login-*" controller_node: "{{ slurm_cluster_name }}-controller" post_deploy_tests: -- test-validation/test-slurm-rapid-storage.yml +- test-validation/test-slurm-storage.yml cli_deployment_vars: region: "{{ region }}" network_name: "{{ network }}" slurm_cluster_name: "{{ slurm_cluster_name }}" + project_id: "{{ project }}" + hyperdisk_balanced_storage_pool: "projects/{{ project }}/zones/{{ zone }}/storagePools/{{ hyperdisk_balanced_pool }}" + hyperdisk_throughput_storage_pool: "projects/{{ project }}/zones/{{ zone }}/storagePools/{{ hyperdisk_throughput_pool }}" custom_vars: project_id: "{{ project }}" zone: "{{ zone }}" diff --git a/tools/cloud-build/daily-tests/validate_tests_metadata.py b/tools/cloud-build/daily-tests/validate_tests_metadata.py index 6eadde3cc7..0b99841aeb 100644 --- a/tools/cloud-build/daily-tests/validate_tests_metadata.py +++ b/tools/cloud-build/daily-tests/validate_tests_metadata.py @@ -78,7 +78,7 @@ def get_blueprint(build_path: str) -> Optional[str]: f"{BUILDS_DIR}/slurm-gcp-v6-simple-job-completion.yaml": "tools/python-integration-tests/blueprints/slurm-simple.yaml", f"{BUILDS_DIR}/slurm-flex.yaml": "tools/python-integration-tests/blueprints/slurm-flex.yaml", f"{BUILDS_DIR}/slurm-gcp-v6-topology.yaml": "tools/python-integration-tests/blueprints/topology-test.yaml", - f"{BUILDS_DIR}/slurm-rapid-storage.yaml": "examples/rapid-storage-slurm.yaml", + f"{BUILDS_DIR}/slurm-rapid-storage.yaml": "examples/storage-slurm.yaml", } if build_path in SPECIAL_CASES: return SPECIAL_CASES[build_path] From b8dda55303b059b0196e1da3c1400fc5169f2e16 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Fri, 14 Aug 2026 12:54:09 +0000 Subject: [PATCH 28/34] fix: update storage-slurm configuration, standardize test file extensions, and clean up GKE/VM storage test build definitions --- examples/storage-slurm.yaml | 48 +++++++++---------- .../daily-tests/builds/gke-storage.yaml | 1 + .../daily-tests/builds/slurm-storage.yaml | 2 +- .../daily-tests/builds/vm-storage.yaml | 10 ++-- .../{slurm-storage.yaml => slurm-storage.yml} | 0 .../daily-tests/tests/vm-storage.yml | 14 ++++++ .../daily-tests/validate_tests_metadata.py | 2 +- 7 files changed, 45 insertions(+), 32 deletions(-) rename tools/cloud-build/daily-tests/tests/{slurm-storage.yaml => slurm-storage.yml} (100%) diff --git a/examples/storage-slurm.yaml b/examples/storage-slurm.yaml index 79523f96d4..ba6f4b5b9b 100644 --- a/examples/storage-slurm.yaml +++ b/examples/storage-slurm.yaml @@ -58,14 +58,14 @@ deployment_groups: disk_type: hyperdisk-balanced disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) additional_disks: - - disk_name: nodeset-data - device_name: nodeset-data - disk_type: hyperdisk-throughput - disk_size_gb: 2048 - disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) - auto_delete: true - boot: false - disk_labels: {} + - disk_name: nodeset-data + device_name: nodeset-data + disk_type: hyperdisk-throughput + disk_size_gb: 2048 + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) + auto_delete: true + boot: false + disk_labels: {} allow_automatic_updates: false metadata: gcs-bucket-name: $(zonal-gcs-bucket.gcs_bucket_name) @@ -88,14 +88,14 @@ deployment_groups: disk_type: hyperdisk-balanced disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) additional_disks: - - disk_name: login-data - device_name: login-data - disk_type: hyperdisk-throughput - disk_size_gb: 2048 - disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) - auto_delete: true - boot: false - disk_labels: {} + - disk_name: login-data + device_name: login-data + disk_type: hyperdisk-throughput + disk_size_gb: 2048 + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) + auto_delete: true + boot: false + disk_labels: {} enable_login_public_ips: true metadata: gcs-bucket-name: $(zonal-gcs-bucket.gcs_bucket_name) @@ -113,12 +113,12 @@ deployment_groups: disk_type: hyperdisk-balanced disk_storage_pool: $(vars.hyperdisk_balanced_storage_pool) additional_disks: - - disk_name: controller-data - device_name: controller-data - disk_type: hyperdisk-throughput - disk_size_gb: 2048 - disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) - auto_delete: true - boot: false - disk_labels: {} + - disk_name: controller-data + device_name: controller-data + disk_type: hyperdisk-throughput + disk_size_gb: 2048 + disk_storage_pool: $(vars.hyperdisk_throughput_storage_pool) + auto_delete: true + boot: false + disk_labels: {} enable_controller_public_ips: true diff --git a/tools/cloud-build/daily-tests/builds/gke-storage.yaml b/tools/cloud-build/daily-tests/builds/gke-storage.yaml index 0edb64bac2..335594bd25 100644 --- a/tools/cloud-build/daily-tests/builds/gke-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/gke-storage.yaml @@ -23,6 +23,7 @@ tags: - m.gke-job-template - m.gke-node-pool - m.gke-persistent-volume +- m.gke-storage - m.vpc - gke diff --git a/tools/cloud-build/daily-tests/builds/slurm-storage.yaml b/tools/cloud-build/daily-tests/builds/slurm-storage.yaml index f750d6133f..966646caca 100644 --- a/tools/cloud-build/daily-tests/builds/slurm-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/slurm-storage.yaml @@ -163,7 +163,7 @@ steps: ansible-playbook tools/cloud-build/daily-tests/ansible_playbooks/slurm-integration-test.yml \ --user="$$OSLOGIN_USER" --extra-vars="project=$PROJECT_ID build=$$BUILD_ID_SHORT full_build_id=$BUILD_ID hyperdisk_balanced_pool=test-pool-balanced hyperdisk_throughput_pool=test-pool-throughput" \ - --extra-vars="@tools/cloud-build/daily-tests/tests/slurm-storage.yaml" \ + --extra-vars="@tools/cloud-build/daily-tests/tests/slurm-storage.yml" \ --extra-vars="triage_gcs_bucket_override=$$TRIAGE_GCS_BUCKET" \ --extra-vars="triage_project_number_override=$$TRIAGE_PROJECT_NUMBER" \ --extra-vars="triage_invoker_sa_override=$$TRIAGE_INVOKER_SA" \ diff --git a/tools/cloud-build/daily-tests/builds/vm-storage.yaml b/tools/cloud-build/daily-tests/builds/vm-storage.yaml index 601ab77a2a..44c0aa9e4a 100644 --- a/tools/cloud-build/daily-tests/builds/vm-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/vm-storage.yaml @@ -12,9 +12,9 @@ --- tags: +- vm - m.vpc - m.vm-instance -- storage-pool substitutions: _TEST_PREFIX: "" @@ -115,20 +115,18 @@ steps: cd /workspace DEPLOYMENT_NAME="vm-storage-$$BUILD_ID_SHORT" - + RUN_CLEANUP=true source /workspace/tools/cloud-build/kueue_cleanup_pod.sh trap cleanup_pod EXIT SIGTERM SIGINT - - REGION="\$${ZONE%-*}" bash tools/get_binary.sh "\$$_TEST_PREFIX" - + BLUEPRINT="examples/storage-vm.yaml" bash tools/add_ttl_label.sh \$$BLUEPRINT - + echo "Checking if required storage pools exist..." if ! gcloud compute storage-pools describe test-pool-balanced --project=$PROJECT_ID --zone=\$$ZONE >/dev/null 2>&1; then echo "ERROR: Storage pool 'test-pool-balanced' does not exist." diff --git a/tools/cloud-build/daily-tests/tests/slurm-storage.yaml b/tools/cloud-build/daily-tests/tests/slurm-storage.yml similarity index 100% rename from tools/cloud-build/daily-tests/tests/slurm-storage.yaml rename to tools/cloud-build/daily-tests/tests/slurm-storage.yml diff --git a/tools/cloud-build/daily-tests/tests/vm-storage.yml b/tools/cloud-build/daily-tests/tests/vm-storage.yml index 69724775b2..78bebfad99 100644 --- a/tools/cloud-build/daily-tests/tests/vm-storage.yml +++ b/tools/cloud-build/daily-tests/tests/vm-storage.yml @@ -1,3 +1,17 @@ +# Copyright 2026 "Google LLC" +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + --- # region, zone must be defined in build file with --extra-vars flag! test_name: vm-storage diff --git a/tools/cloud-build/daily-tests/validate_tests_metadata.py b/tools/cloud-build/daily-tests/validate_tests_metadata.py index 0b99841aeb..d398574400 100644 --- a/tools/cloud-build/daily-tests/validate_tests_metadata.py +++ b/tools/cloud-build/daily-tests/validate_tests_metadata.py @@ -78,7 +78,7 @@ def get_blueprint(build_path: str) -> Optional[str]: f"{BUILDS_DIR}/slurm-gcp-v6-simple-job-completion.yaml": "tools/python-integration-tests/blueprints/slurm-simple.yaml", f"{BUILDS_DIR}/slurm-flex.yaml": "tools/python-integration-tests/blueprints/slurm-flex.yaml", f"{BUILDS_DIR}/slurm-gcp-v6-topology.yaml": "tools/python-integration-tests/blueprints/topology-test.yaml", - f"{BUILDS_DIR}/slurm-rapid-storage.yaml": "examples/storage-slurm.yaml", + f"{BUILDS_DIR}/slurm-storage.yaml": "examples/storage-slurm.yaml", } if build_path in SPECIAL_CASES: return SPECIAL_CASES[build_path] From ff34947adf3d0b20e5ef9b38678bac847fb727d9 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Fri, 14 Aug 2026 14:03:16 +0000 Subject: [PATCH 29/34] refactor: update storage pool validation to check instance templates --- .../test-validation/test-slurm-storage.yml | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml index 1c5f4731ea..e756613ff8 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml @@ -102,31 +102,19 @@ fail_msg: "FIO read performance thresholds not met. Bandwidth: {{ fio_results.jobs[0].read.bw_mean }} KB/s (expected >= 1000 KB/s), IOPS: {{ fio_results.jobs[0].read.iops_mean }} (expected >= 300)." success_msg: "FIO read performance thresholds met. Bandwidth: {{ fio_results.jobs[0].read.bw_mean }} KB/s, IOPS: {{ fio_results.jobs[0].read.iops_mean }}." -- name: Verify Controller Boot Disk Storage Pool +- name: Verify Controller Instance Template Storage Pools delegate_to: localhost ansible.builtin.shell: | - gcloud compute disks describe {{ slurm_cluster_name }}-controller --project={{ project_id }} --zone={{ zone }} --format="value(storagePool)" - register: controller_boot_pool + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-controller" --project={{ project_id }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + register: controller_template_pools changed_when: false -- name: Assert Controller Boot Disk is in Balanced Pool +- name: Assert Controller Template uses correct Storage Pools delegate_to: localhost ansible.builtin.assert: that: - - hyperdisk_balanced_pool in controller_boot_pool.stdout - -- name: Verify Controller Additional Disk Storage Pool - delegate_to: localhost - ansible.builtin.shell: | - gcloud compute disks describe slurm_controller-data --project={{ project_id }} --zone={{ zone }} --format="value(storagePool)" - register: controller_data_pool - changed_when: false - -- name: Assert Controller Additional Disk is in Throughput Pool - delegate_to: localhost - ansible.builtin.assert: - that: - - hyperdisk_throughput_pool in controller_data_pool.stdout + - hyperdisk_balanced_pool in controller_template_pools.stdout + - hyperdisk_throughput_pool in controller_template_pools.stdout - name: Verify Login Nodes Instance Template Storage Pools delegate_to: localhost From 4496e70e81ae2072989a697332df27df30b4ad25 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Fri, 14 Aug 2026 14:40:30 +0000 Subject: [PATCH 30/34] refactor: rename storage blueprint, add storage-vm example, update documentation and testing configurations --- examples/README.md | 21 +++++++++++++++---- .../test-validation/test-gke-storage-pool.yml | 5 ----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/examples/README.md b/examples/README.md index 5de8b89f0a..86f135ef0c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -31,7 +31,7 @@ md_toc github examples/README.md | sed -e "s/\s-\s/ * /" * [batch-mpi.yaml](#batch-mpiyaml-) ![core-badge] * [pfs-managed-lustre-vm.yaml](#pfs-managed-lustre-vmyaml-) ![core-badge] * [pfs-managed-lustre-slurm.yaml](#pfs-managed-lustre-slurmyaml-) ![core-badge] - * [rapid-storage-slurm.yaml](#rapid-storage-slurmyaml-) ![core-badge] + * [storage-slurm.yaml](#storage-slurmyaml-) ![core-badge] * [gke-managed-lustre.yaml](#gke-managed-lustreyaml-) ![core-badge] * [cae-slurm.yaml](#cae-slurmyaml-) ![core-badge] * [hpc-build-slurm-image.yaml](#hpc-build-slurm-imageyaml--) ![community-badge] ![experimental-badge] @@ -47,7 +47,8 @@ md_toc github examples/README.md | sed -e "s/\s-\s/ * /" * [af3-slurm.yaml](#af3-slurmyaml--) ![core-badge] ![experimental-badge] * [hpc-gke.yaml](#hpc-gkeyaml-) ![core-badge] * [ml-gke](#ml-gkeyaml-) ![core-badge] - * [storage-gke](#storage-gkeyaml-) ![core-badge] + * [storage-gke.yaml](#storage-gkeyaml-) ![core-badge] + * [storage-vm.yaml](#storage-vmyaml-) ![core-badge] * [gke-managed-hyperdisk.yaml](#gke-managed-hyperdiskyaml--) ![core-badge] ![experimental-badge] * [gke-a3-ultragpu.yaml](#gke-a3-ultragpuyaml-) ![core-badge] * [gke-a3-megagpu](#gke-a3-megagpuyaml-) ![core-badge] @@ -697,7 +698,7 @@ To destroy the cluster,Run below command: ``` [pfs-managed-lustre-slurm.yaml]: ./pfs-managed-lustre-slurm.yaml -### [rapid-storage-slurm.yaml] ![core-badge] +### [storage-slurm.yaml] ![core-badge] This blueprint showcases the integration of several storage solutions: @@ -707,7 +708,10 @@ This blueprint showcases the integration of several storage solutions: * Note: A maximum of one cache per zone can be created for each bucket. For example, a bucket in `us-east1` can have caches in `us-east1-b` and `us-east1-c`. * Refer to [Create a Cache](https://docs.cloud.google.com/storage/docs/anywhere-cache#create_a_cache) for more parameter details. -[rapid-storage-slurm.yaml]: ./rapid-storage-slurm.yaml +* **Hyperdisk Storage Pools:** + * The `schedmd-slurm-gcp-v6-controller`, `schedmd-slurm-gcp-v6-login`, and `schedmd-slurm-gcp-v6-nodeset` modules attach persistent disks directly from pre-provisioned `hyperdisk-balanced` and `hyperdisk-throughput` Storage Pools, allowing you to share IOPS and throughput capacity across the cluster. + +[storage-slurm.yaml]: ./storage-slurm.yaml ### [gke-managed-lustre.yaml] ![core-badge] @@ -1296,6 +1300,12 @@ credentials for the created cluster_ and _submit a job calling `nvidia_smi`_. [ml-gke.yaml]: ../examples/ml-gke.yaml +### [storage-vm.yaml] ![core-badge] + +Creates a standalone VM instance and securely attaches persistent disks that are provisioned directly into specified `hyperdisk-balanced` and `hyperdisk-throughput` Storage Pools. This allows the VM to share IOPS and throughput capacity from the pre-provisioned pools. + +[storage-vm.yaml]: ./storage-vm.yaml + ### [storage-gke.yaml] ![core-badge] This blueprint showcases the integration of several storage solutions: @@ -1319,6 +1329,9 @@ This blueprint showcases the integration of several storage solutions: * **Balanced Persistent Disk (`pd-balanced`) ephemeral volume**: Similar to `pd-ssd`, a Persistent Disk is created and cleaned up with the job. * When using `pd-ssd` or `pd-balanced`, a persistent disk is automatically created upon job submission and cleaned up when the job is deleted. +* **Hyperdisk Storage Pools:** + * The `gke-persistent-volume` module dynamically provisions Persistent Volumes (PVs) that draw directly from `hyperdisk-balanced` and `hyperdisk-throughput` Storage Pools, allowing workloads to share aggregate disk performance. + > [!Note] > The Kubernetes API server will only allow requests from authorized networks. > The `gke-persistent-volume` module needs access to the Kubernetes API server diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml index 5208e17400..bcd8a8c598 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml @@ -134,11 +134,6 @@ register: pv_throughput_name changed_when: false -- name: Wait for CSI to provision Disks in GCP - delegate_to: localhost - ansible.builtin.pause: - seconds: 15 - - name: Verify GCP Persistent Disk Placement (Balanced) delegate_to: localhost ansible.builtin.shell: | From 79d969357c3f633b863c9a147a434e0cd34821a1 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Sat, 15 Aug 2026 08:07:49 +0000 Subject: [PATCH 31/34] refactor: update pod wait condition in validation playbooks --- .../test-validation/test-gke-storage-pool.yml | 2 +- .../test-validation/test-slurm-storage.yml | 6 +++--- .../ansible_playbooks/test-validation/test-zonal-bucket.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml index bcd8a8c598..670d826eb5 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml @@ -117,7 +117,7 @@ - name: Wait for Test Pod to be Running (Binding PVCs) delegate_to: localhost ansible.builtin.shell: | - kubectl wait --for=condition=Ready pod/test-hd-pod --timeout=120s + kubectl wait --for=condition=Ready pod/test-hd-pod --timeout=600s changed_when: false - name: Get Persistent Volume names (Balanced) diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml index e756613ff8..5d6500a6ae 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml @@ -105,7 +105,7 @@ - name: Verify Controller Instance Template Storage Pools delegate_to: localhost ansible.builtin.shell: | - gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-controller" --project={{ project_id }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-controller" --project={{ project }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" register: controller_template_pools changed_when: false @@ -119,7 +119,7 @@ - name: Verify Login Nodes Instance Template Storage Pools delegate_to: localhost ansible.builtin.shell: | - gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-login" --project={{ project_id }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-login" --project={{ project }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" register: login_template_pools changed_when: false @@ -133,7 +133,7 @@ - name: Verify Nodeset Instance Template Storage Pools delegate_to: localhost ansible.builtin.shell: | - gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-slurm-nodeset" --project={{ project_id }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-slurm-nodeset" --project={{ project }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" register: nodeset_template_pools changed_when: false diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-zonal-bucket.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-zonal-bucket.yml index c40f88dea1..2a0363129e 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-zonal-bucket.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-zonal-bucket.yml @@ -54,7 +54,7 @@ delegate_to: localhost - name: Wait for FIO Pod to complete - ansible.builtin.command: kubectl wait --for=condition=Succeeded pod/fio --namespace default --timeout=900s + ansible.builtin.command: kubectl wait --for=jsonpath='{.status.phase}'=Succeeded pod/fio --namespace default --timeout=900s delegate_to: localhost ignore_errors: true # Even if we timeout, continue to next steps From 8621d3ebb746a34d61c7f5c70c979ee4f369b55d Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Sun, 16 Aug 2026 06:48:52 +0000 Subject: [PATCH 32/34] fix: update instance template filter in storage validation --- .../ansible_playbooks/test-validation/test-slurm-storage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml index 5d6500a6ae..4818f6aa61 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-slurm-storage.yml @@ -133,7 +133,7 @@ - name: Verify Nodeset Instance Template Storage Pools delegate_to: localhost ansible.builtin.shell: | - gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-slurm-nodeset" --project={{ project }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" + gcloud compute instance-templates list --filter="name~{{ slurm_cluster_name }}-compute-slurmnodeset" --project={{ project }} --format="value(properties.disks[0].initializeParams.storagePool, properties.disks[1].initializeParams.storagePool)" register: nodeset_template_pools changed_when: false From 30f12a6e74664eb46b893114086d3b8acd264f6a Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Mon, 17 Aug 2026 07:00:57 +0000 Subject: [PATCH 33/34] chore: increase storage pool capacity and throughput in daily tests --- tools/cloud-build/daily-tests/builds/gke-storage.yaml | 4 ++-- tools/cloud-build/daily-tests/builds/slurm-storage.yaml | 4 ++-- tools/cloud-build/daily-tests/builds/vm-storage.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/cloud-build/daily-tests/builds/gke-storage.yaml b/tools/cloud-build/daily-tests/builds/gke-storage.yaml index 335594bd25..9ed36ac1ec 100644 --- a/tools/cloud-build/daily-tests/builds/gke-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/gke-storage.yaml @@ -197,8 +197,8 @@ steps: echo "gcloud compute storage-pools create test-pool-throughput" echo " --project=$PROJECT_ID" echo " --zone=us-central1-b" - echo " --provisioned-capacity=10240GB" - echo " --provisioned-throughput=180" + echo " --provisioned-capacity=28672GB" + echo " --provisioned-throughput=500" echo " --storage-pool-type=hyperdisk-throughput" exit 1 fi diff --git a/tools/cloud-build/daily-tests/builds/slurm-storage.yaml b/tools/cloud-build/daily-tests/builds/slurm-storage.yaml index 966646caca..76a952f2ce 100644 --- a/tools/cloud-build/daily-tests/builds/slurm-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/slurm-storage.yaml @@ -154,8 +154,8 @@ steps: echo "gcloud compute storage-pools create test-pool-throughput" echo " --project=$PROJECT_ID" echo " --zone=us-central1-b" - echo " --provisioned-capacity=10240GB" - echo " --provisioned-throughput=180" + echo " --provisioned-capacity=28672GB" + echo " --provisioned-throughput=500" echo " --storage-pool-type=hyperdisk-throughput" exit 1 fi diff --git a/tools/cloud-build/daily-tests/builds/vm-storage.yaml b/tools/cloud-build/daily-tests/builds/vm-storage.yaml index 44c0aa9e4a..f934495a17 100644 --- a/tools/cloud-build/daily-tests/builds/vm-storage.yaml +++ b/tools/cloud-build/daily-tests/builds/vm-storage.yaml @@ -146,8 +146,8 @@ steps: echo "gcloud compute storage-pools create test-pool-throughput" echo " --project=$PROJECT_ID" echo " --zone=\$$ZONE" - echo " --provisioned-capacity=10240GB" - echo " --provisioned-throughput=180" + echo " --provisioned-capacity=28672GB" + echo " --provisioned-throughput=500" echo " --storage-pool-type=hyperdisk-throughput" exit 1 fi From 68931cff8d6b759e7d0c3fa0181000cf79ef9e67 Mon Sep 17 00:00:00 2001 From: rahimkhan19 Date: Mon, 17 Aug 2026 10:59:14 +0000 Subject: [PATCH 34/34] feat: add node selector to GKE storage pool test --- .../ansible_playbooks/test-validation/test-gke-storage-pool.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml index 670d826eb5..ab556743fe 100644 --- a/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml +++ b/tools/cloud-build/daily-tests/ansible_playbooks/test-validation/test-gke-storage-pool.yml @@ -104,6 +104,8 @@ name: vol-balanced - mountPath: "/data-throughput" name: vol-throughput + nodeSelector: + cloud.google.com/gke-nodepool: hp-pool volumes: - name: vol-balanced persistentVolumeClaim: