-
Notifications
You must be signed in to change notification settings - Fork 383
Description
TL;DR
There is missing optional
parameter in submodule compute_disk_snapshot
variables.
snapshot_schedule
originally accepts only one of: daily_schedule, hourly_schedule or weekly_schedule
but in module it requests to define them all.
Expected behavior
module "disk_snapshots" {
count = var.enable_disks_snapshot ? 1 : 0
source = "git@github.com:terraform-google-modules/terraform-google-vm.git?ref=v13.1.1"
disks = [
"${local.boot_disk_id}",
"${google_compute_disk.data_disk.id}"
]
module_depends_on = [
"${google_compute_instance.instance.name}",
"${google_compute_disk.data_disk.name}"
]
name = "${var.name}-snapshot-policy"
project = var.project_id
region = var.region
snapshot_properties = {
labels = var.labels
guest_flush = false
storage_locations = [
var.region
]
}
snapshot_retention_policy = {
max_retention_days = var.snapshot_retention_days
on_source_disk_delete = var.keep_snapshots_after_delete ? "KEEP_AUTO_SNAPSHOTS" : "APPLY_RETENTION_POLICY"
}
snapshot_schedule = {
daily_schedule = {
days_in_cycle = 1
start_time = var.snapshot_start_time
}
}
}
Then after plan I expect to create resources related to module
so in this particular example I have a one VM with two disks: boot
and data
and it should create snapshot policy with attachment to both.
Observed behavior
When I'll set only one schedule (MARK: I kept others in errors commented for visibility)
snapshot_schedule = {
daily_schedule = {
days_in_cycle = 1
start_time = var.snapshot_start_time
}
}
Then I have an error:
│ Error: Invalid value for input variable
│
│ on module/main.tf line 76, in module "disk_snapshots":
│ 76: snapshot_schedule = {
│ 77: daily_schedule = {
│ 78: days_in_cycle = 1
│ 79: start_time = var.snapshot_start_time
│ 80: }
│ 81: #hourly_schedule = {
│ 82: # hours_in_cycle = 24
│ 83: # start_time = var.snapshot_start_time
│ 84: #}
│ 85: #weekly_schedule = {
│ 86: # day_of_weeks = [
│ 87: # {
│ 88: # day = "MONDAY"
│ 89: # start_time = var.snapshot_start_time
│ 90: # },
│ 91: # {
│ 92: # day = "TUESDAY"
│ 93: # start_time = var.snapshot_start_time
│ 94: # },
│ 95: # ]
│ 96: #}
│ 97: }
│
│ The given value is not suitable for
│ module.vm.module.disk_snapshots.var.snapshot_schedule declared at
│ .terraform/modules/vm.disk_snapshots/modules/compute_disk_snapshot/variables.tf:42,1-29:
│ attributes "hourly_schedule" and "weekly_schedule" are required.
To satisfy the requirements I set them all
snapshot_schedule = {
daily_schedule = {
days_in_cycle = 1
start_time = var.snapshot_start_time
}
hourly_schedule = {
hours_in_cycle = 24
start_time = var.snapshot_start_time
}
weekly_schedule = {
day_of_weeks = [
{
day = "MONDAY"
start_time = var.snapshot_start_time
},
{
day = "TUESDAY"
start_time = var.snapshot_start_time
},
]
}
}
And I got following error
│ Error: Invalid combination of arguments
│
│ with module.vm["<instance_name>"].module.disk_snapshots[0].google_compute_resource_policy.policy,
│ on .terraform/modules/vm.disk_snapshots/modules/compute_disk_snapshot/main.tf line 34, in resource "google_compute_resource_policy" "policy":
│ 34: schedule {
│
│ "snapshot_schedule_policy.0.schedule.0.daily_schedule": only one of
│ `snapshot_schedule_policy.0.schedule.0.daily_schedule,snapshot_schedule_policy.0.schedule.0.hourly_schedule,snapshot_schedule_policy.0.schedule.0.weekly_schedule`
│ can be specified, but
│ `snapshot_schedule_policy.0.schedule.0.daily_schedule,snapshot_schedule_policy.0.schedule.0.hourly_schedule,snapshot_schedule_policy.0.schedule.0.weekly_schedule`
│ were specified.
╵
╷
│ Error: Invalid combination of arguments
│
│ with module.vm["<instance_name>"].module.disk_snapshots[0].google_compute_resource_policy.policy,
│ on .terraform/modules/vm.disk_snapshots/modules/compute_disk_snapshot/main.tf line 34, in resource "google_compute_resource_policy" "policy":
│ 34: schedule {
│
│ "snapshot_schedule_policy.0.schedule.0.hourly_schedule": only one of
│ `snapshot_schedule_policy.0.schedule.0.daily_schedule,snapshot_schedule_policy.0.schedule.0.hourly_schedule,snapshot_schedule_policy.0.schedule.0.weekly_schedule`
│ can be specified, but
│ `snapshot_schedule_policy.0.schedule.0.daily_schedule,snapshot_schedule_policy.0.schedule.0.hourly_schedule,snapshot_schedule_policy.0.schedule.0.weekly_schedule`
│ were specified.
╵
╷
│ Error: Invalid combination of arguments
│
│ with module.vm["<instance_name>"].module.disk_snapshots[0].google_compute_resource_policy.policy,
│ on .terraform/modules/vm.disk_snapshots/modules/compute_disk_snapshot/main.tf line 34, in resource "google_compute_resource_policy" "policy":
│ 34: schedule {
│
│ "snapshot_schedule_policy.0.schedule.0.weekly_schedule": only one of
│ `snapshot_schedule_policy.0.schedule.0.daily_schedule,snapshot_schedule_policy.0.schedule.0.hourly_schedule,snapshot_schedule_policy.0.schedule.0.weekly_schedule`
│ can be specified, but
│ `snapshot_schedule_policy.0.schedule.0.daily_schedule,snapshot_schedule_policy.0.schedule.0.hourly_schedule,snapshot_schedule_policy.0.schedule.0.weekly_schedule`
│ were specified.
So the error says that I have to use only one of those possibilities.
Terraform Configuration
- Installing hashicorp/google v4.85.0...
- Installed hashicorp/google v4.85.0 (signed by HashiCorp)
- Installing hashicorp/null v3.2.3...
- Installed hashicorp/null v3.2.3 (signed by HashiCorp)
Terraform Version
Terraform v1.6.3
on linux_amd64
terragrunt version v0.53.2
Additional information
I forked this locally to check what can be done.
It just require a small improvement by adding optional( )
attribute for them as below.
variable "snapshot_schedule" {
description = "The scheduled to be used by the snapshot policy. For more details see https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_resource_policy#schedule"
type = object(
{
daily_schedule = optional(object(
{
days_in_cycle = number
start_time = string
}
))
hourly_schedule = optional(object(
{
hours_in_cycle = number
start_time = string
}
))
weekly_schedule = optional(object(
{
day_of_weeks = set(object(
{
day = string
start_time = string
}
))
}
))
}
)
}