Files
hunfabric/modules/compute-vm/resource-policies.tf
Ludovico Magnocavallo a4eb4d24fd Compute VM module refactor (#3805)
* add ad for compute-vm refactor

* Exclue nic_type from validated fields, add split of main.tf and template.tf

* boot disk

* fix examples and fixtures

* attached disks

* fix further examples and module-level tests

* remove extra file

* fix mig examples

* finish refactoring variables

* align fast and other modules

* refactor(compute-vm): align examples and ADR with the newly implemented interface

This commit addresses the remaining references of the `instance_type` and `confidential_compute` parameters in the testing environment and updates the ADR.

* feat(compute-vm): add network_performance_config to instance and templates

This change implements the usage of the `network_performance_tier` variable we added earlier into the actual Terraform resources.

---------

Co-authored-by: Wiktor Niesiobędzki <wiktorn@google.com>
2026-03-26 11:31:40 +00:00

192 lines
6.1 KiB
HCL

/**
* Copyright 2023 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.
*/
# tfdoc:file:description Resource policies.
locals {
ischedule = var.instance_schedule == null ? null : [
google_compute_resource_policy.schedule[0].id
]
disk_zonal_schedule_attachments = flatten([
for k, v in local.attached_disks_zonal :
v.snapshot_schedule != null ? [
for schedule in v.snapshot_schedule : {
disk_key = k
source = v.source
snapshot_schedule = schedule
}
] : []
])
disk_regional_schedule_attachments = flatten([
for k, v in try(local.attached_disks_regional, []) :
v.snapshot_schedule != null ? [
for schedule in v.snapshot_schedule : {
disk_key = k
source = v.source
snapshot_schedule = schedule
}
] : []
])
}
resource "google_compute_resource_policy" "schedule" {
count = var.instance_schedule != null ? 1 : 0
project = local.project_id
region = substr(local.zone, 0, length(local.zone) - 2)
name = var.name
description = coalesce(
var.instance_schedule.description, "Schedule policy for ${var.name}."
)
instance_schedule_policy {
expiration_time = var.instance_schedule.expiration_time
start_time = var.instance_schedule.start_time
time_zone = var.instance_schedule.timezone
dynamic "vm_start_schedule" {
for_each = var.instance_schedule.vm_start != null ? [""] : []
content {
schedule = var.instance_schedule.vm_start
}
}
dynamic "vm_stop_schedule" {
for_each = var.instance_schedule.vm_stop != null ? [""] : []
content {
schedule = var.instance_schedule.vm_stop
}
}
}
}
resource "google_compute_resource_policy" "snapshot" {
for_each = var.snapshot_schedules
project = local.project_id
region = substr(local.zone, 0, length(local.zone) - 2)
name = "${var.name}-${each.key}"
description = coalesce(
each.value.description, "Schedule policy ${each.key} for ${var.name}."
)
snapshot_schedule_policy {
schedule {
dynamic "daily_schedule" {
for_each = each.value.schedule.daily != null ? [""] : []
content {
days_in_cycle = each.value.schedule.daily.days_in_cycle
start_time = each.value.schedule.daily.start_time
}
}
dynamic "hourly_schedule" {
for_each = each.value.schedule.hourly != null ? [""] : []
content {
hours_in_cycle = each.value.schedule.hourly.hours_in_cycle
start_time = each.value.schedule.hourly.start_time
}
}
dynamic "weekly_schedule" {
for_each = each.value.schedule.weekly != null ? [""] : []
content {
dynamic "day_of_weeks" {
for_each = each.value.schedule.weekly
content {
day = day_of_weeks.value.day
start_time = day_of_weeks.value.start_time
}
}
}
}
}
dynamic "retention_policy" {
for_each = each.value.retention_policy != null ? [""] : []
content {
max_retention_days = each.value.retention_policy.max_retention_days
on_source_disk_delete = (
each.value.retention_policy.on_source_disk_delete_keep == false
? "APPLY_RETENTION_POLICY"
: "KEEP_AUTO_SNAPSHOTS"
)
}
}
dynamic "snapshot_properties" {
for_each = each.value.snapshot_properties != null ? [""] : []
content {
labels = each.value.snapshot_properties.labels
storage_locations = each.value.snapshot_properties.storage_locations
guest_flush = each.value.snapshot_properties.guest_flush
}
}
}
}
resource "google_compute_disk_resource_policy_attachment" "boot" {
for_each = var.boot_disk.snapshot_schedule != null ? toset(var.boot_disk.snapshot_schedule) : []
project = local.project_id
zone = local.zone
name = try(
google_compute_resource_policy.snapshot[each.value].name,
each.value
)
# if independent disk is used for boot disk it will have a different name compared to when created implicitly
disk = (
!local.is_template && var.boot_disk.use_independent_disk != null
? google_compute_disk.boot[0].name
: var.name
)
depends_on = [google_compute_instance.default]
}
resource "google_compute_disk_resource_policy_attachment" "attached" {
for_each = {
for attachment in local.disk_zonal_schedule_attachments :
"${attachment.disk_key}-${attachment.snapshot_schedule}" => attachment
}
project = local.project_id
zone = local.zone
name = try(
google_compute_resource_policy.snapshot[each.value.snapshot_schedule].name,
each.value.snapshot_schedule
)
disk = (
each.value.source.attach != null
? each.value.source.attach
: google_compute_disk.disks[each.value.disk_key].name
)
depends_on = [
google_compute_instance.default,
google_compute_disk.disks
]
}
resource "google_compute_region_disk_resource_policy_attachment" "attached" {
for_each = {
for attachment in local.disk_regional_schedule_attachments :
"${attachment.disk_key}-${attachment.snapshot_schedule}" => attachment
}
project = local.project_id
region = local.region
name = try(
google_compute_resource_policy.snapshot[each.value.snapshot_schedule].name,
each.value.snapshot_schedule
)
disk = (
each.value.source.attach != null
? each.value.source.attach
: google_compute_region_disk.disks[each.value.disk_key].name
)
depends_on = [
google_compute_instance.default,
google_compute_region_disk.disks
]
}