175 lines
5.4 KiB
HCL
175 lines
5.4 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 = try(var.instance_schedule.create_config, null)
|
|
ischedule_attach = var.instance_schedule == null ? null : (
|
|
var.instance_schedule.create_config != null
|
|
# created policy with optional attach to allow policy destroy
|
|
? (
|
|
var.instance_schedule.create_config.active
|
|
? [google_compute_resource_policy.schedule.0.id]
|
|
: null
|
|
)
|
|
# externally managed policy
|
|
: [var.instance_schedule.resource_policy_id]
|
|
)
|
|
}
|
|
|
|
resource "google_compute_resource_policy" "schedule" {
|
|
count = local.ischedule != null ? 1 : 0
|
|
project = var.project_id
|
|
region = substr(var.zone, 0, length(var.zone) - 2)
|
|
name = var.name
|
|
description = coalesce(
|
|
local.ischedule.description, "Schedule policy for ${var.name}."
|
|
)
|
|
instance_schedule_policy {
|
|
expiration_time = local.ischedule.expiration_time
|
|
start_time = local.ischedule.start_time
|
|
time_zone = local.ischedule.timezone
|
|
dynamic "vm_start_schedule" {
|
|
for_each = local.ischedule.vm_start != null ? [""] : []
|
|
content {
|
|
schedule = local.ischedule.vm_start
|
|
}
|
|
}
|
|
dynamic "vm_stop_schedule" {
|
|
for_each = local.ischedule.vm_stop != null ? [""] : []
|
|
content {
|
|
schedule = local.ischedule.vm_stop
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "google_compute_resource_policy" "snapshot" {
|
|
for_each = var.snapshot_schedules
|
|
project = var.project_id
|
|
region = substr(var.zone, 0, length(var.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" {
|
|
count = var.boot_disk.snapshot_schedule != null ? 1 : 0
|
|
project = var.project_id
|
|
zone = var.zone
|
|
name = try(
|
|
google_compute_resource_policy.snapshot[var.boot_disk.snapshot_schedule].name,
|
|
var.boot_disk.snapshot_schedule
|
|
)
|
|
disk = var.name
|
|
depends_on = [google_compute_instance.default]
|
|
}
|
|
|
|
resource "google_compute_disk_resource_policy_attachment" "attached" {
|
|
for_each = {
|
|
for k, v in local.attached_disks_zonal :
|
|
k => v if v.snapshot_schedule != null
|
|
}
|
|
project = var.project_id
|
|
zone = var.zone
|
|
name = try(
|
|
google_compute_resource_policy.snapshot[each.value.snapshot_schedule].name,
|
|
each.value.snapshot_schedule
|
|
)
|
|
disk = (
|
|
each.value.source_type == "attach"
|
|
? each.value.source
|
|
: google_compute_disk.disks[each.key].name
|
|
)
|
|
depends_on = [
|
|
google_compute_instance.default,
|
|
google_compute_disk.disks
|
|
]
|
|
}
|
|
|
|
resource "google_compute_region_disk_resource_policy_attachment" "attached" {
|
|
for_each = {
|
|
for k, v in local.attached_disks_regional :
|
|
k => v if v.snapshot_schedule != null
|
|
}
|
|
project = var.project_id
|
|
region = substr(var.zone, 0, length(var.zone) - 2)
|
|
name = try(
|
|
google_compute_resource_policy.snapshot[each.value.snapshot_schedule].name,
|
|
each.value.snapshot_schedule
|
|
)
|
|
disk = (
|
|
each.value.source_type == "attach"
|
|
? each.value.source
|
|
: google_compute_region_disk.disks[each.key].name
|
|
)
|
|
depends_on = [
|
|
google_compute_instance.default,
|
|
google_compute_region_disk.disks
|
|
]
|
|
}
|