Skip to content

Commit 3f068f6

Browse files
Merge pull request #79 from sestegra/disk_storage_policy_id
Support disk storage policy
2 parents 5f9ae54 + b76dea6 commit 3f068f6

File tree

5 files changed

+68
-53
lines changed

5 files changed

+68
-53
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ This Terraform module deploys single or multiple virtual machines of type (Linux
1515
- Ability to deploy either a datastore or a datastore cluster.
1616
- Add extra data disk (up to 15) to the VM.
1717
- Different datastores for data disks (datastore_id).
18+
- Different storage policy for data disks (storage_policy_id).
1819
- Different scsi_controllers per disk, including data disks.
1920
- Ability to define depend on using variable vm_depends_on & tag_depends_on
2021

main.tf

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -109,25 +109,27 @@ resource "vsphere_virtual_machine" "Linux" {
109109
for_each = data.vsphere_virtual_machine.template.disks
110110
iterator = template_disks
111111
content {
112-
label = length(var.disk_label) > 0 ? var.disk_label[template_disks.key] : "disk${template_disks.key}"
113-
size = var.disk_size_gb != null ? var.disk_size_gb[template_disks.key] : data.vsphere_virtual_machine.template.disks[template_disks.key].size
114-
unit_number = var.scsi_controller != null ? var.scsi_controller * 15 + template_disks.key : template_disks.key
115-
thin_provisioned = data.vsphere_virtual_machine.template.disks[template_disks.key].thin_provisioned
116-
eagerly_scrub = data.vsphere_virtual_machine.template.disks[template_disks.key].eagerly_scrub
117-
datastore_id = var.disk_datastore != "" ? data.vsphere_datastore.disk_datastore[0].id : null
112+
label = length(var.disk_label) > 0 ? var.disk_label[template_disks.key] : "disk${template_disks.key}"
113+
size = var.disk_size_gb != null ? var.disk_size_gb[template_disks.key] : data.vsphere_virtual_machine.template.disks[template_disks.key].size
114+
unit_number = var.scsi_controller != null ? var.scsi_controller * 15 + template_disks.key : template_disks.key
115+
thin_provisioned = data.vsphere_virtual_machine.template.disks[template_disks.key].thin_provisioned
116+
eagerly_scrub = data.vsphere_virtual_machine.template.disks[template_disks.key].eagerly_scrub
117+
datastore_id = var.disk_datastore != "" ? data.vsphere_datastore.disk_datastore[0].id : null
118+
storage_policy_id = length(var.template_storage_policy_id) > 0 ? var.template_storage_policy_id[template_disks.key] : null
118119
}
119120
}
120121
// Additional disks defined by Terraform config
121122
dynamic "disk" {
122123
for_each = var.data_disk
123124
iterator = terraform_disks
124125
content {
125-
label = terraform_disks.key
126-
size = lookup(terraform_disks.value, "size_gb", null)
127-
unit_number = lookup(terraform_disks.value, "data_disk_scsi_controller", 0) ? terraform_disks.value.data_disk_scsi_controller * 15 + index(keys(var.data_disk), terraform_disks.key) + (var.scsi_controller == tonumber(terraform_disks.value["data_disk_scsi_controller"]) ? local.template_disk_count : 0) : index(keys(var.data_disk), terraform_disks.key) + local.template_disk_count
128-
thin_provisioned = lookup(terraform_disks.value, "thin_provisioned", "true")
129-
eagerly_scrub = lookup(terraform_disks.value, "eagerly_scrub", "false")
130-
datastore_id = lookup(terraform_disks.value, "datastore_id", null)
126+
label = terraform_disks.key
127+
size = lookup(terraform_disks.value, "size_gb", null)
128+
unit_number = lookup(terraform_disks.value, "data_disk_scsi_controller", 0) ? terraform_disks.value.data_disk_scsi_controller * 15 + index(keys(var.data_disk), terraform_disks.key) + (var.scsi_controller == tonumber(terraform_disks.value["data_disk_scsi_controller"]) ? local.template_disk_count : 0) : index(keys(var.data_disk), terraform_disks.key) + local.template_disk_count
129+
thin_provisioned = lookup(terraform_disks.value, "thin_provisioned", "true")
130+
eagerly_scrub = lookup(terraform_disks.value, "eagerly_scrub", "false")
131+
datastore_id = lookup(terraform_disks.value, "datastore_id", null)
132+
storage_policy_id = lookup(terraform_disks.value, "storage_policy_id", null)
131133
}
132134
}
133135
clone {
@@ -182,6 +184,7 @@ resource "vsphere_virtual_machine" "Windows" {
182184
firmware = var.firmware
183185
efi_secure_boot_enabled = var.efi_secure_boot
184186
enable_disk_uuid = var.enable_disk_uuid
187+
storage_policy_id = var.storage_policy_id
185188

186189
datastore_cluster_id = var.datastore_cluster != "" ? data.vsphere_datastore_cluster.datastore_cluster[0].id : null
187190
datastore_id = var.datastore != "" ? data.vsphere_datastore.datastore[0].id : null
@@ -222,12 +225,13 @@ resource "vsphere_virtual_machine" "Windows" {
222225
for_each = data.vsphere_virtual_machine.template.disks
223226
iterator = template_disks
224227
content {
225-
label = length(var.disk_label) > 0 ? var.disk_label[template_disks.key] : "disk${template_disks.key}"
226-
size = var.disk_size_gb != null ? var.disk_size_gb[template_disks.key] : data.vsphere_virtual_machine.template.disks[template_disks.key].size
227-
unit_number = var.scsi_controller != null ? var.scsi_controller * 15 + template_disks.key : template_disks.key
228-
thin_provisioned = data.vsphere_virtual_machine.template.disks[template_disks.key].thin_provisioned
229-
eagerly_scrub = data.vsphere_virtual_machine.template.disks[template_disks.key].eagerly_scrub
230-
datastore_id = var.disk_datastore != "" ? data.vsphere_datastore.disk_datastore[0].id : null
228+
label = length(var.disk_label) > 0 ? var.disk_label[template_disks.key] : "disk${template_disks.key}"
229+
size = var.disk_size_gb != null ? var.disk_size_gb[template_disks.key] : data.vsphere_virtual_machine.template.disks[template_disks.key].size
230+
unit_number = var.scsi_controller != null ? var.scsi_controller * 15 + template_disks.key : template_disks.key
231+
thin_provisioned = data.vsphere_virtual_machine.template.disks[template_disks.key].thin_provisioned
232+
eagerly_scrub = data.vsphere_virtual_machine.template.disks[template_disks.key].eagerly_scrub
233+
datastore_id = var.disk_datastore != "" ? data.vsphere_datastore.disk_datastore[0].id : null
234+
storage_policy_id = length(var.template_storage_policy_id) > 0 ? var.template_storage_policy_id[template_disks.key] : null
231235
}
232236
}
233237

@@ -236,12 +240,13 @@ resource "vsphere_virtual_machine" "Windows" {
236240
for_each = var.data_disk
237241
iterator = terraform_disks
238242
content {
239-
label = terraform_disks.key
240-
size = lookup(terraform_disks.value, "size_gb", null)
241-
unit_number = lookup(terraform_disks.value, "data_disk_scsi_controller", 0) ? terraform_disks.value.data_disk_scsi_controller * 15 + index(keys(var.data_disk), terraform_disks.key) + (var.scsi_controller == tonumber(terraform_disks.value["data_disk_scsi_controller"]) ? local.template_disk_count : 0) : index(keys(var.data_disk), terraform_disks.key) + local.template_disk_count
242-
thin_provisioned = lookup(terraform_disks.value, "thin_provisioned", "true")
243-
eagerly_scrub = lookup(terraform_disks.value, "eagerly_scrub", "false")
244-
datastore_id = lookup(terraform_disks.value, "datastore_id", null)
243+
label = terraform_disks.key
244+
size = lookup(terraform_disks.value, "size_gb", null)
245+
unit_number = lookup(terraform_disks.value, "data_disk_scsi_controller", 0) ? terraform_disks.value.data_disk_scsi_controller * 15 + index(keys(var.data_disk), terraform_disks.key) + (var.scsi_controller == tonumber(terraform_disks.value["data_disk_scsi_controller"]) ? local.template_disk_count : 0) : index(keys(var.data_disk), terraform_disks.key) + local.template_disk_count
246+
thin_provisioned = lookup(terraform_disks.value, "thin_provisioned", "true")
247+
eagerly_scrub = lookup(terraform_disks.value, "eagerly_scrub", "false")
248+
datastore_id = lookup(terraform_disks.value, "datastore_id", null)
249+
storage_policy_id = lookup(terraform_disks.value, "storage_policy_id", null)
245250
}
246251
}
247252
clone {

tests/sanity/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ vm = {
3131
size_gb = 4,
3232
thin_provisioned = true,
3333
data_disk_scsi_controller = 1,
34+
storage_policy_id = "D680B3D4-ACBE-40B5-BD9C-2EB1526A5EDD"
3435
},
3536
disk3 = {
3637
size_gb = 5,

tests/sanity/main.tf

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,44 @@ resource "vsphere_tag_category" "category" {
1111

1212
resource "vsphere_tag" "tag" {
1313
name = "terraform-test-tag"
14-
category_id = "${vsphere_tag_category.category.id}"
14+
category_id = vsphere_tag_category.category.id
1515
description = "Managed by Terraform"
1616
}
1717

1818
variable "vm" {
1919
type = map(object({
20-
vmname = string
21-
vmtemp = string
22-
dc = string
23-
vmrp = string
24-
vmfolder = string
25-
datastore = string
26-
is_windows_image = bool
27-
tags = map(string)
28-
instances = number
29-
network = map(list(string))
30-
vmgateway = string
31-
dns_servers = list(string)
32-
data_disk = map(map(string))
20+
vmname = string
21+
vmtemp = string
22+
dc = string
23+
vmrp = string
24+
vmfolder = string
25+
datastore = string
26+
template_storage_policy_id = list(string)
27+
is_windows_image = bool
28+
tags = map(string)
29+
instances = number
30+
network = map(list(string))
31+
vmgateway = string
32+
dns_servers = list(string)
33+
data_disk = map(map(string))
3334
}))
3435
}
3536

3637
module "example-server-basic" {
37-
source = "../../"
38-
for_each = var.vm
39-
tag_depends_on = [vsphere_tag.tag.id]
40-
tags = each.value.tags
41-
vmtemp = each.value.vmtemp
42-
is_windows_image = each.value.is_windows_image
43-
instances = each.value.instances
44-
vmname = each.value.vmname
45-
vmrp = each.value.vmrp
46-
vmfolder = each.value.vmfolder
47-
network = each.value.network
48-
vmgateway = each.value.vmgateway
49-
dc = each.value.dc
50-
datastore = each.value.datastore
51-
data_disk = each.value.data_disk
38+
source = "../../"
39+
for_each = var.vm
40+
tag_depends_on = [vsphere_tag.tag.id]
41+
tags = each.value.tags
42+
vmtemp = each.value.vmtemp
43+
is_windows_image = each.value.is_windows_image
44+
instances = each.value.instances
45+
vmname = each.value.vmname
46+
vmrp = each.value.vmrp
47+
vmfolder = each.value.vmfolder
48+
network = each.value.network
49+
vmgateway = each.value.vmgateway
50+
dc = each.value.dc
51+
datastore = each.value.datastore
52+
template_storage_policy_id = each.value.template_storage_policy_id
53+
data_disk = each.value.data_disk
5254
}

variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ variable "disk_datastore" {
5252
default = ""
5353
}
5454

55+
variable "template_storage_policy_id" {
56+
description = "List of UUIDs of the storage policy to assign to the template disk."
57+
type = list(any)
58+
default = []
59+
}
60+
5561
variable "scsi_bus_sharing" {
5662
description = "scsi_bus_sharing mode, acceptable values physicalSharing,virtualSharing,noSharing."
5763
type = string

0 commit comments

Comments
 (0)