Skip to content

Commit ffc26b2

Browse files
Merge pull request #115 from sestegra/content_library
Support template from Content Library
2 parents 5c3d3a6 + 8d5e3de commit ffc26b2

File tree

4 files changed

+80
-37
lines changed

4 files changed

+80
-37
lines changed

main.tf

Lines changed: 68 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,25 @@ data "vsphere_network" "network" {
3232
}
3333

3434
data "vsphere_virtual_machine" "template" {
35+
count = var.content_library == null ? 1 : 0
3536
name = var.vmtemp
3637
datacenter_id = data.vsphere_datacenter.dc.id
3738
}
3839

40+
data "vsphere_content_library" "library" {
41+
count = var.content_library != null ? 1 : 0
42+
name = var.content_library
43+
depends_on = [var.tag_depends_on]
44+
}
45+
46+
data "vsphere_content_library_item" "library_item_template" {
47+
count = var.content_library != null ? 1 : 0
48+
library_id = data.vsphere_content_library.library[0].id
49+
type = "ovf"
50+
name = var.vmtemp
51+
depends_on = [var.tag_depends_on]
52+
}
53+
3954
data "vsphere_tag_category" "category" {
4055
count = var.tags != null ? length(var.tags) : 0
4156
name = keys(var.tags)[count.index]
@@ -50,13 +65,13 @@ data "vsphere_tag" "tag" {
5065
}
5166

5267
data "vsphere_folder" "folder" {
53-
count = var.vmfolder != null ? 1 : 0
54-
path = "/${data.vsphere_datacenter.dc.name}/vm/${var.vmfolder}"
68+
count = var.vmfolder != null ? 1 : 0
69+
path = "/${data.vsphere_datacenter.dc.name}/vm/${var.vmfolder}"
5570
}
5671

5772
locals {
5873
interface_count = length(var.ipv4submask) #Used for Subnet handeling
59-
template_disk_count = length(data.vsphere_virtual_machine.template.disks)
74+
template_disk_count = var.content_library == null ? length(data.vsphere_virtual_machine.template[0].disks) : 0
6075
}
6176

6277
// Cloning a Linux or Windows VM from a given template.
@@ -71,9 +86,9 @@ resource "vsphere_virtual_machine" "vm" {
7186
custom_attributes = var.custom_attributes
7287
annotation = var.annotation
7388
extra_config = var.extra_config
74-
firmware = var.firmware == null ? data.vsphere_virtual_machine.template.firmware : var.firmware
75-
efi_secure_boot_enabled = var.efi_secure_boot == null ? data.vsphere_virtual_machine.template.efi_secure_boot_enabled : var.efi_secure_boot
76-
enable_disk_uuid = var.enable_disk_uuid == null ? data.vsphere_virtual_machine.template.enable_disk_uuid : var.enable_disk_uuid
89+
firmware = var.content_library == null && var.firmware == null ? data.vsphere_virtual_machine.template[0].firmware : var.firmware
90+
efi_secure_boot_enabled = var.content_library == null && var.efi_secure_boot == null ? data.vsphere_virtual_machine.template[0].efi_secure_boot_enabled : var.efi_secure_boot
91+
enable_disk_uuid = var.content_library == null && var.enable_disk_uuid == null ? data.vsphere_virtual_machine.template[0].enable_disk_uuid : var.enable_disk_uuid
7792
storage_policy_id = var.storage_policy_id
7893

7994
datastore_cluster_id = var.datastore_cluster != "" ? data.vsphere_datastore_cluster.datastore_cluster[0].id : null
@@ -91,21 +106,21 @@ resource "vsphere_virtual_machine" "vm" {
91106
memory_hot_add_enabled = var.memory_hot_add_enabled
92107
memory_share_level = var.memory_share_level
93108
memory_share_count = var.memory_share_level == "custom" ? var.memory_share_count : null
94-
guest_id = data.vsphere_virtual_machine.template.guest_id
109+
guest_id = var.content_library == null ? data.vsphere_virtual_machine.template[0].guest_id : null
95110
scsi_bus_sharing = var.scsi_bus_sharing
96-
scsi_type = var.scsi_type != "" ? var.scsi_type : data.vsphere_virtual_machine.template.scsi_type
111+
scsi_type = var.scsi_type != "" ? var.scsi_type : (var.content_library == null ? data.vsphere_virtual_machine.template[0].scsi_type : null)
97112
scsi_controller_count = max(
98-
max(0,flatten([
113+
max(0, flatten([
99114
for item in values(var.data_disk) : [
100115
for elem, val in item :
101116
elem == "data_disk_scsi_controller" ? val : 0
102-
]])...) + 1,
103-
ceil((max(0,flatten([
117+
]])...) + 1,
118+
ceil((max(0, flatten([
104119
for item in values(var.data_disk) : [
105120
for elem, val in item :
106121
elem == "unit_number" ? val : 0
107-
] ])...) + 1) / 15),
108-
var.scsi_controller)
122+
]])...) + 1) / 15),
123+
var.scsi_controller)
109124
wait_for_guest_net_routable = var.wait_for_guest_net_routable
110125
wait_for_guest_ip_timeout = var.wait_for_guest_ip_timeout
111126
wait_for_guest_net_timeout = var.wait_for_guest_net_timeout
@@ -116,19 +131,36 @@ resource "vsphere_virtual_machine" "vm" {
116131
for_each = keys(var.network) #data.vsphere_network.network[*].id #other option
117132
content {
118133
network_id = data.vsphere_network.network[network_interface.key].id
119-
adapter_type = var.network_type != null ? var.network_type[network_interface.key] : data.vsphere_virtual_machine.template.network_interface_types[0]
134+
adapter_type = var.network_type != null ? var.network_type[network_interface.key] : (var.content_library == null ? data.vsphere_virtual_machine.template[0].network_interface_types[0] : null)
120135
}
121136
}
122137
// Disks defined in the original template
123138
dynamic "disk" {
124-
for_each = data.vsphere_virtual_machine.template.disks
139+
for_each = var.content_library == null ? data.vsphere_virtual_machine.template[0].disks : []
125140
iterator = template_disks
126141
content {
127142
label = length(var.disk_label) > 0 ? var.disk_label[template_disks.key] : "disk${template_disks.key}"
128-
size = var.disk_size_gb != null ? var.disk_size_gb[template_disks.key] : data.vsphere_virtual_machine.template.disks[template_disks.key].size
143+
size = var.disk_size_gb != null ? var.disk_size_gb[template_disks.key] : data.vsphere_virtual_machine.template[0].disks[template_disks.key].size
129144
unit_number = var.scsi_controller != null ? var.scsi_controller * 15 + template_disks.key : template_disks.key
130-
thin_provisioned = data.vsphere_virtual_machine.template.disks[template_disks.key].thin_provisioned
131-
eagerly_scrub = data.vsphere_virtual_machine.template.disks[template_disks.key].eagerly_scrub
145+
thin_provisioned = data.vsphere_virtual_machine.template[0].disks[template_disks.key].thin_provisioned
146+
eagerly_scrub = data.vsphere_virtual_machine.template[0].disks[template_disks.key].eagerly_scrub
147+
datastore_id = var.disk_datastore != "" ? data.vsphere_datastore.disk_datastore[0].id : null
148+
storage_policy_id = length(var.template_storage_policy_id) > 0 ? var.template_storage_policy_id[template_disks.key] : null
149+
io_reservation = length(var.io_reservation) > 0 ? var.io_reservation[template_disks.key] : null
150+
io_share_level = length(var.io_share_level) > 0 ? var.io_share_level[template_disks.key] : "normal"
151+
io_share_count = length(var.io_share_level) > 0 && var.io_share_level[template_disks.key] == "custom" ? var.io_share_count[template_disks.key] : null
152+
}
153+
}
154+
// Disk for template from Content Library
155+
dynamic "disk" {
156+
for_each = var.content_library == null ? [] : [1]
157+
iterator = template_disks
158+
content {
159+
label = length(var.disk_label) > 0 ? var.disk_label[template_disks.key] : "disk${template_disks.key}"
160+
size = var.disk_size_gb[template_disks.key]
161+
unit_number = var.scsi_controller != null ? var.scsi_controller * 15 + template_disks.key : template_disks.key
162+
// thin_provisioned = data.vsphere_virtual_machine.template[0].disks[template_disks.key].thin_provisioned
163+
// eagerly_scrub = data.vsphere_virtual_machine.template[0].disks[template_disks.key].eagerly_scrub
132164
datastore_id = var.disk_datastore != "" ? data.vsphere_datastore.disk_datastore[0].id : null
133165
storage_policy_id = length(var.template_storage_policy_id) > 0 ? var.template_storage_policy_id[template_disks.key] : null
134166
io_reservation = length(var.io_reservation) > 0 ? var.io_reservation[template_disks.key] : null
@@ -142,26 +174,26 @@ resource "vsphere_virtual_machine" "vm" {
142174
for_each = var.data_disk
143175
iterator = terraform_disks
144176
content {
145-
label = terraform_disks.key
146-
size = lookup(terraform_disks.value, "size_gb", null)
177+
label = terraform_disks.key
178+
size = lookup(terraform_disks.value, "size_gb", null)
147179
unit_number = (
148180
lookup(
149-
terraform_disks.value,
150-
"unit_number",
181+
terraform_disks.value,
182+
"unit_number",
151183
-1
152-
) < 0 ? (
184+
) < 0 ? (
153185
lookup(
154-
terraform_disks.value,
155-
"data_disk_scsi_controller",
186+
terraform_disks.value,
187+
"data_disk_scsi_controller",
156188
0
157-
) > 0 ? (
189+
) > 0 ? (
158190
(terraform_disks.value.data_disk_scsi_controller * 15) +
159-
index(keys(var.data_disk), terraform_disks.key) +
191+
index(keys(var.data_disk), terraform_disks.key) +
160192
(var.scsi_controller == tonumber(terraform_disks.value["data_disk_scsi_controller"]) ? local.template_disk_count : 0)
161-
) : (
193+
) : (
162194
index(keys(var.data_disk), terraform_disks.key) + local.template_disk_count
163195
)
164-
) : (
196+
) : (
165197
tonumber(terraform_disks.value["unit_number"])
166198
)
167199
)
@@ -176,7 +208,7 @@ resource "vsphere_virtual_machine" "vm" {
176208
}
177209
}
178210
clone {
179-
template_uuid = data.vsphere_virtual_machine.template.id
211+
template_uuid = var.content_library == null ? data.vsphere_virtual_machine.template[0].id : data.vsphere_content_library_item.library_item_template[0].id
180212
linked_clone = var.linked_clone
181213
timeout = var.timeout
182214

@@ -214,12 +246,12 @@ resource "vsphere_virtual_machine" "vm" {
214246
content {
215247
ipv4_address = split("/", var.network[keys(var.network)[network_interface.key]][count.index])[0]
216248
ipv4_netmask = var.network[keys(var.network)[network_interface.key]][count.index] == "" ? null : (
217-
length(split("/", var.network[keys(var.network)[network_interface.key]][count.index])) == 2 ? (
218-
split("/", var.network[keys(var.network)[network_interface.key]][count.index])[1]
219-
) : (
220-
length(var.ipv4submask) == 1 ? var.ipv4submask[0] : var.ipv4submask[network_interface.key]
221-
)
222-
)
249+
length(split("/", var.network[keys(var.network)[network_interface.key]][count.index])) == 2 ? (
250+
split("/", var.network[keys(var.network)[network_interface.key]][count.index])[1]
251+
) : (
252+
length(var.ipv4submask) == 1 ? var.ipv4submask[0] : var.ipv4submask[network_interface.key]
253+
)
254+
)
223255
}
224256
}
225257
dns_server_list = var.dns_server_list

tests/smoke/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Smoke Test
22

3-
You need to run the plan using vars.tfvars
3+
You need to run the plan using private.tfvars
44

55
### Example:
66

@@ -13,6 +13,7 @@ vm = {
1313
linuxvm = {
1414
vmname = "example-server-linux",
1515
vmtemp = "fill"
16+
content_library = null
1617
annotation = "Terraform Smoke Test"
1718
instances = 0
1819
is_windows_image = false
@@ -25,6 +26,7 @@ vm = {
2526
network = {
2627
"VM Networks" = ["10.13.13.2"],
2728
}
29+
disk_size_gb = [ 20 ]
2830
}
2931
}
3032
```

tests/smoke/main.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ variable "vm" {
77
type = map(object({
88
vmname = string
99
vmtemp = string
10+
content_library = string
1011
annotation = string
1112
dc = string
1213
vmrp = string
@@ -15,6 +16,7 @@ variable "vm" {
1516
is_windows_image = bool
1617
instances = number
1718
network = map(list(string))
19+
disk_size_gb = list(number)
1820
vmgateway = string
1921
dns_servers = list(string)
2022
}))
@@ -24,13 +26,15 @@ module "example-server-basic" {
2426
source = "../../"
2527
for_each = var.vm
2628
vmtemp = each.value.vmtemp
29+
content_library = each.value.content_library
2730
annotation = each.value.annotation
2831
is_windows_image = each.value.is_windows_image
2932
instances = each.value.instances
3033
vmname = each.value.vmname
3134
vmrp = each.value.vmrp
3235
vmfolder = each.value.vmfolder
3336
network = each.value.network
37+
disk_size_gb = each.value.disk_size_gb
3438
vmgateway = each.value.vmgateway
3539
dc = each.value.dc
3640
datastore = each.value.datastore #Either

variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ variable "vmtemp" {
134134
description = "Name of the template available in the vSphere."
135135
}
136136

137+
variable "content_library" {
138+
description = "Name of the content library where the OVF template is stored."
139+
default = null
140+
}
141+
137142
variable "instances" {
138143
description = "number of instances you want deploy from the template."
139144
default = 1

0 commit comments

Comments
 (0)