oracle-terraform-modules/terraform-oci-compute-instance

Wrong Additional Block Volume is targeted for change when `var.block_storage_sizes_in_gbs` is updated

kral2 opened this issue · 0 comments

kral2 commented

var.block_storage_sizes_in_gbs is a list of numbers where one BV is created for each element, with BV size is equal to the passed number.

Having a list is problematic when we need an update:

  • removing an element change the index number of each element in the collection
  • wrong BV gets modification (BV delete is possible ...).

The example below will create 3 volumes named xxx_volume0,xxx_volume1,xxx_volume2.

resource "oci_core_volume" "this" {
  count               = var.instance_count * length(var.block_storage_sizes_in_gbs)
  availability_domain = oci_core_instance.this[count.index % var.instance_count].availability_domain
  compartment_id      = var.compartment_ocid
  display_name        = "${oci_core_instance.this[count.index % var.instance_count].display_name}_volume${floor(count.index / var.instance_count)}"
  size_in_gbs = element(
    var.block_storage_sizes_in_gbs,
    floor(count.index / var.instance_count),
  )
  freeform_tags = local.merged_freeform_tags
  defined_tags  = var.defined_tags
}

variable "block_storage_sizes_in_gbs" {
  description = "Sizes of volumes to create and attach to each instance."
  type        = list(number)
  default     = [50,55,56]
}

If var.block_storage_sizes_in_gbs is edited, removing 55 from the list for example:

  • instead of having xxx_volume1 removed, Terraform will remove xxx_volume2 and update size of xxx_volume1 (when possible),
  • whereas the initial intention was to remove xxx_volume1 but not touch xxx_volume0 and xxx_volume2.

To have a consistent behavior, the logic behind var.block_storage_sizes_in_gbs needs to be rewritten using a for_each implementation.