Repository: terraform-ibm-modules/terraform-ibm-landing-zone-vsi
Pull request #803: feat: add support to use custom VSI and volume name
Author: login: akocbek
Labels: name: released
Created: 2025-03-13T09:48:28Z | Merged: 2025-03-25T04:32:08Z

### Description
- https://github.com/terraform-ibm-modules/terraform-ibm-landing-zone-vsi/issues/783
- https://github.com/terraform-ibm-modules/terraform-ibm-landing-zone-vsi/issues/782
<!--- Replace this text with a summary of the changes in this PR. Include why the changes are needed and context about the changes. List required dependencies. If there is a Git issue for the change, please link to it. --->

When creating VSIs and volumes, we first check if `the custom_vsi_volume_names` input variable exists. 

1. If it does, we look up the specific subnet for the VSI name. If a VSI name is specified, then that name is used; otherwise, the default (current) naming is applied (the same applies to volume names). 
2. If the `custom_vsi_volume_names` input variable does not exist, the default (current) naming is used.

### Release required?
<!--- Identify the type of release. For information about the changes in a semantic versioning release, see [Release versioning](https://terraform-ibm-modules.github.io/documentation/#/versioning). --->

- [ ] No release
- [ ] Patch release (`x.x.X`)
- [x] Minor release (`x.X.x`)
- [ ] Major release (`X.x.x`)

##### Release notes content
Introduced a new input variable, `custom_vsi_volume_names`, to support custom VSI and volume names.
<!--- If a release is required, replace this text with information that users need to know about the release. Write the release notes to help users understand the changes, and include information about how to update from the previous version.

Your notes help the merger write the commit message for the PR that is published in the release notes for the module. --->

### Run the pipeline

If the CI pipeline doesn't run when you create the PR, the PR requires a user with GitHub collaborators access to run the pipeline.

Run the CI pipeline when the PR is ready for review and you expect tests to pass. Add a comment to the PR with the following text:

```
/run pipeline
```

### Checklist for reviewers

- [ ] If relevant, a test for the change is included or updated with this PR.
- [ ] If relevant, documentation for the change is included or updated with this PR.

### For mergers

- Use a conventional commit message to set the release level. Follow the [guidelines](https://terraform-ibm-modules.github.io/documentation/#/merging.md).
- Include information that users need to know about the PR in the commit message. The commit message becomes part of the GitHub release notes.
- Use the **Squash and merge** option.



Diff:
diff --git a/README.md b/README.md
index ab115673..de1ad5a6 100644
--- a/README.md
+++ b/README.md
@@ -198,6 +198,7 @@ No modules.
 | <a name="input_boot_volume_encryption_key"></a> [boot\_volume\_encryption\_key](#input\_boot\_volume\_encryption\_key) | CRN of boot volume encryption key | `string` | `null` | no |
 | <a name="input_boot_volume_snapshot_id"></a> [boot\_volume\_snapshot\_id](#input\_boot\_volume\_snapshot\_id) | The snapshot id of the volume to be used for creating boot volume attachment (if specified, the `image_id` parameter will not be used) | `string` | `null` | no |
 | <a name="input_create_security_group"></a> [create\_security\_group](#input\_create\_security\_group) | Create security group for VSI. If this is passed as false, the default will be used | `bool` | n/a | yes |
+| <a name="input_custom_vsi_volume_names"></a> [custom\_vsi\_volume\_names](#input\_custom\_vsi\_volume\_names) | A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet\_name\_1': { 'vsi\_name\_1': [ 'storage\_volume\_name\_1', 'storage\_volume\_name\_2' ] } } | `map(map(list(string)))` | `{}` | no |
 | <a name="input_dedicated_host_id"></a> [dedicated\_host\_id](#input\_dedicated\_host\_id) | ID of the dedicated host for hosting the VSI's. The enable\_dedicated\_host input shoud be set to true if passing a dedicated host ID | `string` | `null` | no |
 | <a name="input_enable_dedicated_host"></a> [enable\_dedicated\_host](#input\_enable\_dedicated\_host) | Enabling this option will activate dedicated hosts for the VSIs. When enabled, the dedicated\_host\_id input is required. The default value is set to false. Refer [Understanding Dedicated Hosts](https://cloud.ibm.com/docs/vpc?topic=vpc-creating-dedicated-hosts-instances&interface=ui#about-dedicated-hosts) for more details | `bool` | `false` | no |
 | <a name="input_enable_floating_ip"></a> [enable\_floating\_ip](#input\_enable\_floating\_ip) | Create a floating IP for each virtual server created | `bool` | `false` | no |
diff --git a/examples/complete/main.tf b/examples/complete/main.tf
index 20793464..d410ae4e 100644
--- a/examples/complete/main.tf
+++ b/examples/complete/main.tf
@@ -166,6 +166,12 @@ locals {
       cidr = subnet.ipv4_cidr_block
     }
   ]
+  custom_vsi_volume_names = {
+    for idx, subnet in module.slz_vpc.subnet_zone_list : subnet.name =>
+    {
+      "${subnet.name}-vsi-name-1" = ["${subnet.name}-vol-1a"]
+    }
+  }
 }
 
 #############################################################################
@@ -173,6 +179,7 @@ locals {
 #############################################################################
 
 module "slz_vsi" {
+  depends_on                      = [module.slz_vpc]
   source                          = "../../"
   resource_group_id               = module.resource_group.resource_group_id
   image_id                        = var.image_id
@@ -193,6 +200,7 @@ module "slz_vsi" {
   ssh_key_ids                     = [local.ssh_key_id]
   secondary_subnets               = local.secondary_subnet_zone_list
   secondary_security_groups       = local.secondary_security_groups
+  custom_vsi_volume_names         = local.custom_vsi_volume_names
   # Create a floating IPs for the additional VNI
   secondary_floating_ips = [
     for subnet in local.secondary_subnet_zone_list :
diff --git a/main.tf b/main.tf
index 6342c751..faa9b784 100644
--- a/main.tf
+++ b/main.tf
@@ -27,8 +27,9 @@ locals {
       # For each subnet
       for subnet in range(length(var.subnets)) :
       {
-        name           = "${var.subnets[subnet].name}-${count}"
-        vsi_name       = "${var.prefix}-${substr(var.subnets[subnet].id, -4, 4)}-${format("%03d", count + 1)}"
+        name = "${var.subnets[subnet].name}-${count}"
+        # try to lookup for a vsi name inside custom_vsi_volume_names input variable for that specific subnet, if not found then dynamic vsi name is used
+        vsi_name       = try(keys(lookup(var.custom_vsi_volume_names, var.subnets[subnet].name, {}))[count], "${var.prefix}-${substr(var.subnets[subnet].id, -4, 4)}-${format("%03d", count + 1)}")
         subnet_id      = var.subnets[subnet].id
         zone           = var.subnets[subnet].zone
         subnet_name    = var.subnets[subnet].name
diff --git a/modules/fscloud/README.md b/modules/fscloud/README.md
index cbf8d4e6..b2bc409e 100644
--- a/modules/fscloud/README.md
+++ b/modules/fscloud/README.md
@@ -31,6 +31,7 @@ No resources.
 | <a name="input_boot_volume_encryption_key"></a> [boot\_volume\_encryption\_key](#input\_boot\_volume\_encryption\_key) | CRN of boot volume encryption key | `string` | n/a | yes |
 | <a name="input_boot_volume_snapshot_id"></a> [boot\_volume\_snapshot\_id](#input\_boot\_volume\_snapshot\_id) | The snapshot id of the volume to be used for creating boot volume attachment (if specified, the `image_id` parameter will not be used) | `string` | `null` | no |
 | <a name="input_create_security_group"></a> [create\_security\_group](#input\_create\_security\_group) | Create security group for VSI. If this is passed as false, the default will be used | `bool` | n/a | yes |
+| <a name="input_custom_vsi_volume_names"></a> [custom\_vsi\_volume\_names](#input\_custom\_vsi\_volume\_names) | A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet\_name\_1': { 'vsi\_name\_1': [ 'storage\_volume\_name\_1', 'storage\_volume\_name\_2' ] } } | `map(map(list(string)))` | `{}` | no |
 | <a name="input_dedicated_host_id"></a> [dedicated\_host\_id](#input\_dedicated\_host\_id) | ID of the dedicated host for hosting the VSI's. The enable\_dedicated\_host input shoud be set to true if passing a dedicated host ID | `string` | `null` | no |
 | <a name="input_enable_dedicated_host"></a> [enable\_dedicated\_host](#input\_enable\_dedicated\_host) | Enabling this option will activate dedicated hosts for the VSIs. When enabled, the dedicated\_host\_id input is required. The default value is set to false. Refer [Understanding Dedicated Hosts](https://cloud.ibm.com/docs/vpc?topic=vpc-creating-dedicated-hosts-instances&interface=ui#about-dedicated-hosts) for more details | `bool` | `false` | no |
 | <a name="input_enable_floating_ip"></a> [enable\_floating\_ip](#input\_enable\_floating\_ip) | Create a floating IP for each virtual server created | `bool` | `false` | no |
diff --git a/modules/fscloud/main.tf b/modules/fscloud/main.tf
index 0cc8c753..0bed37d2 100644
--- a/modules/fscloud/main.tf
+++ b/modules/fscloud/main.tf
@@ -29,4 +29,5 @@ module "fscloud_vsi" {
   boot_volume_snapshot_id        = var.boot_volume_snapshot_id
   enable_dedicated_host          = var.enable_dedicated_host
   dedicated_host_id              = var.dedicated_host_id
+  custom_vsi_volume_names        = var.custom_vsi_volume_names
 }
diff --git a/modules/fscloud/variables.tf b/modules/fscloud/variables.tf
index 4898b120..21220826 100644
--- a/modules/fscloud/variables.tf
+++ b/modules/fscloud/variables.tf
@@ -245,6 +245,13 @@ variable "access_tags" {
   default     = []
 }
 
+variable "custom_vsi_volume_names" {
+  description = "A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet_name_1': { 'vsi_name_1': [ 'storage_volume_name_1', 'storage_volume_name_2' ] } }"
+  type        = map(map(list(string)))
+  default     = {}
+  nullable    = false
+}
+
 ##############################################################################
 # Snapshot Restore Variables
 ##############################################################################
diff --git a/storage.tf b/storage.tf
index 923fdb3a..0a64c2ea 100644
--- a/storage.tf
+++ b/storage.tf
@@ -11,10 +11,11 @@ locals {
       # For each number in a range from 0 to VSI per subnet
       for count in range(var.vsi_per_subnet) : [
         # For each volume
-        for volume in var.block_storage_volumes :
+        for idx, volume in(var.block_storage_volumes) :
         {
-          name           = "${var.subnets[subnet].name}-${count}-${volume.name}"
-          vol_name       = "${var.prefix}-${substr(var.subnets[subnet].id, -4, 4)}-${format("%03d", count + 1)}-${volume.name}"
+          name = "${var.subnets[subnet].name}-${count}-${volume.name}"
+          # try to lookup for a volume name inside custom_vsi_volume_names input variable for that specific subnet, if not found then dynamic volume name is used
+          vol_name       = try(values(lookup(var.custom_vsi_volume_names, var.subnets[subnet].name, {}))[count][idx], "${var.prefix}-${substr(var.subnets[subnet].id, -4, 4)}-${format("%03d", count + 1)}-${volume.name}")
           zone           = var.subnets[subnet].zone
           profile        = volume.profile
           capacity       = (volume.snapshot_id == null) ? volume.capacity : null
@@ -52,7 +53,7 @@ resource "ibm_is_volume" "volume" {
   capacity        = each.value.capacity
   encryption_key  = each.value.encryption_key
   resource_group  = each.value.resource_group
-  tags            = distinct(concat(var.tags, each.value.tags))
+  tags            = var.tags != null ? distinct(concat(var.tags, each.value.tags)) : null
   access_tags     = var.access_tags
   source_snapshot = each.value.snapshot_id
 }
diff --git a/variables.tf b/variables.tf
index 551e2514..eeb058f3 100644
--- a/variables.tf
+++ b/variables.tf
@@ -413,8 +413,62 @@ variable "load_balancers" {
   }
 }
 
-##############################################################################
+variable "custom_vsi_volume_names" {
+  description = "A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet_name_1': { 'vsi_name_1': [ 'storage_volume_name_1', 'storage_volume_name_2' ] } }"
+  type        = map(map(list(string)))
+  default     = {}
+  nullable    = false
 
+  # Validation to ensure the map has the same number of volumes as the number of block storage volumes defiend in 'block_storage_volumes'
+  validation {
+    condition = alltrue([
+      for subnet_key, subnet_value in coalesce(var.custom_vsi_volume_names, {}) : alltrue([
+        for vsi_key, volumes in subnet_value : length(volumes) == length(var.block_storage_volumes)
+      ])
+    ])
+    error_message = "The number of storage volume names must be the same as the number of block storage volumes defined in 'block_storage_volumes' input variable."
+  }
+
+  # Validation to ensure that volume names are unique
+  validation {
+    condition = alltrue([
+      for subnet, vsi_map in var.custom_vsi_volume_names :
+      alltrue([
+        for vsi_name, volumes in vsi_map :
+        length(volumes) == length(distinct(volumes))
+      ])
+    ])
+    error_message = "Each member of a list of storage volume names for a vsi_name must be unique."
+  }
+
+  # Validation to ensure that number of subnets is not higher than the number of subnets defined in var.subnets
+  validation {
+    condition     = length(keys(var.custom_vsi_volume_names)) <= length(var.subnets)
+    error_message = "The number of subnets defined in the custom_vsi_volume_names input variable should not exceed the number of subnets defined in the subnets input variable."
+  }
+
+  # Validation to ensure that number of VSIs is not higher then the number defined in vsi_per_subnet
+  validation {
+    condition     = length(var.custom_vsi_volume_names) > 0 ? sort([for subnet, vsis in var.custom_vsi_volume_names : length(keys(vsis))])[length([for subnet, vsis in var.custom_vsi_volume_names : length(keys(vsis))]) - 1] <= var.vsi_per_subnet : true
+    error_message = "The number of VSIs defined in the custom_vsi_volume_names input variable should not exceed the number specified in the vsi_per_subnet input variable."
+  }
+
+  # Validation to ensure the VSI names are unique across different subnets
+  validation {
+    condition = length(distinct(flatten([
+      for subnet, vsi_map in var.custom_vsi_volume_names : [
+        for vsi_name, _ in vsi_map : vsi_name
+      ]
+      ]))) == length(flatten([
+      for subnet, vsi_map in var.custom_vsi_volume_names : [
+        for vsi_name, _ in vsi_map : vsi_name
+      ]
+    ]))
+    error_message = "VSI names must be unique across all subnets."
+  }
+}
+
+##############################################################################
 
 ##############################################################################
 # Secondary Interface Variables


Reviews:
user: login: Aashiq-J
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-14T14:57:03Z
user: login: toddgiguere
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-03-21T14:21:52Z
user: login: Aashiq-J
body: LGTM
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-24T13:15:49Z
user: login: toddgiguere
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-24T16:09:01Z
user: login: ocofaigh
body: @akocbek @Aashiq-J @toddgiguere We really should have included in the variable description what the behaviour is when user does not use the `custom_vsi_volume_names` input. AKA a name is programatically determined using the prefix, subnet ID and number padding. Can we fix that in a new PR?
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T09:36:55Z

Review comments:
diff_hunk: @@ -245,6 +245,47 @@ variable "access_tags" {
   default     = []
 }
 
+variable "custom_vsi_volume_names" {
+  description = "A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet_name_1': { 'vsi_name_1': [ 'storage_volume_name_1', 'storage_volume_name_2' ] } }"
+  type        = map(map(list(string)))
+  default     = {}
+  nullable    = false
+
+  # Validation to ensure the map has the same number of volumes as the number of block storage volumes defiend in 'block_storage_volumes'
+  validation {
path: modules/fscloud/variables.tf
user: login: Aashiq-J
body: There is no need to duplicate the validations in here, since the fscloud calls the root module, the validations in the root module is sufficient. 
created_at: 2025-03-14T14:55:25Z
author_association: MEMBER
diff_hunk: @@ -413,8 +413,48 @@ variable "load_balancers" {
   }
 }
 
-##############################################################################
+variable "custom_vsi_volume_names" {
+  description = "A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet_name_1': { 'vsi_name_1': [ 'storage_volume_name_1', 'storage_volume_name_2' ] } }"
+  type        = map(map(list(string)))
+  default     = {}
+  nullable    = false
+
+  # Validation to ensure the map has the same number of volumes as the number of block storage volumes defiend in 'block_storage_volumes'
+  validation {
+    condition = alltrue([
+      for subnet_key, subnet_value in coalesce(var.custom_vsi_volume_names, {}) : alltrue([
+        for vsi_key, volumes in subnet_value : length(volumes) == length(var.block_storage_volumes)
+      ])
+    ])
+    error_message = "The number of storage volume names must be the same as the number of block storage volumes defined in 'block_storage_volumes' input variable."
+  }
+
+  # Validation to ensure that volume names are unique
path: variables.tf
user: login: Aashiq-J
body: similarly, please add a validation to check if the vsi names are unique.
```
│             {
│                 "code": "validation_unique_failed",
│                 "message": "Provided Name (vsi-name-1-vni) is not unique",
│                 "target": {
│                     "name": "name",
│                     "type": "field",
│                     "value": "vsi-name-1-vni"
│                 }
```
Got this error during apply because of duplicate names.
created_at: 2025-03-14T14:56:49Z
author_association: MEMBER
diff_hunk: @@ -413,8 +413,48 @@ variable "load_balancers" {
   }
 }
 
-##############################################################################
+variable "custom_vsi_volume_names" {
+  description = "A map of subnets, VSI names, and storage volume names. Subnet names should correspond to existing subnets, while VSI and storage volume names are used for resource creation. Format example: { 'subnet_name_1': { 'vsi_name_1': [ 'storage_volume_name_1', 'storage_volume_name_2' ] } }"
+  type        = map(map(list(string)))
+  default     = {}
+  nullable    = false
+
+  # Validation to ensure the map has the same number of volumes as the number of block storage volumes defiend in 'block_storage_volumes'
+  validation {
+    condition = alltrue([
+      for subnet_key, subnet_value in coalesce(var.custom_vsi_volume_names, {}) : alltrue([
+        for vsi_key, volumes in subnet_value : length(volumes) == length(var.block_storage_volumes)
+      ])
+    ])
+    error_message = "The number of storage volume names must be the same as the number of block storage volumes defined in 'block_storage_volumes' input variable."
+  }
+
+  # Validation to ensure that volume names are unique
path: variables.tf
user: login: toddgiguere
body: Agree we need this validation
created_at: 2025-03-21T14:21:40Z
author_association: MEMBER

PR comments:
user: login: akocbek
created_at: 2025-03-13T09:48:40Z
body: /run pipeline
author_association: CONTRIBUTOR
user: login: akocbek
created_at: 2025-03-13T09:49:47Z
body: another solution in https://github.com/terraform-ibm-modules/terraform-ibm-landing-zone-vsi/pull/788
author_association: CONTRIBUTOR
user: login: akocbek
created_at: 2025-03-13T10:49:02Z
body: upgrade test failed with
```
Should be false
        	Test:       	TestRunCompleteUpgradeExample
        	Messages:   	Resource(s) identified to be updated 
        	            	Name: vsi_fip
        	            	Address: module.slz_vsi.ibm_is_floating_ip.vsi_fip["slz-vsi-com-upg-r1vzfh-vpc-subnet-b-0"]
        	            	Actions: [update]
        	            	DIFF:
        	            	  Before: 
        	            		{"name":"slz-vsi-com-upg-r1vzfh-f562-001-fip"}
        	            	  After: 
        	            		{"name":"slz-vsi-com-upg-r1vzfh-vpc-subnet-b-vsi-name-1-fip"}
```

```
Terraform used the selected providers to generate the following execution
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: plan. Resource actions are indicated with the following symbols:
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ update in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: Terraform will perform the following actions:
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_floating_ip.vsi_fip["slz-vsi-com-upg-r1vzfh-vpc-subnet-a-0"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_virtual_network_interface.primary_vni["slz-vsi-com-upg-r1vzfh-vpc-subnet-a-0"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ resource "ibm_is_virtual_network_interface" "primary_vni" {
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         id                            = "0717-14b0865a-e8bf-4ade-9250-bde5ddd0c765"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:       ~ name                          = "slz-vsi-com-upg-r1vzfh-1fc3-001-vni" -> "slz-vsi-com-upg-r1vzfh-vpc-subnet-a-vsi-name-1-vni"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         tags                          = []
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (17 unchanged attributes hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (3 unchanged blocks hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:     }
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_virtual_network_interface.primary_vni["slz-vsi-com-upg-r1vzfh-vpc-subnet-b-0"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ resource "ibm_is_virtual_network_interface" "primary_vni" {
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         id                            = "0727-24656621-cc05-4e62-9063-a032d4d5ab4a"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:       ~ name                          = "slz-vsi-com-upg-r1vzfh-f562-001-vni" -> "slz-vsi-com-upg-r1vzfh-vpc-subnet-b-vsi-name-1-vni"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         tags                          = []
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (17 unchanged attributes hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (3 unchanged blocks hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:     }
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_virtual_network_interface.primary_vni["slz-vsi-com-upg-r1vzfh-vpc-subnet-c-0"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ resource "ibm_is_virtual_network_interface" "primary_vni" {
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         id                            = "0737-6dfa0db9-bf18-4490-b69b-04c6c03182fb"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:       ~ name                          = "slz-vsi-com-upg-r1vzfh-a520-001-vni" -> "slz-vsi-com-upg-r1vzfh-vpc-subnet-c-vsi-name-1-vni"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         tags                          = []
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (17 unchanged attributes hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (3 unchanged blocks hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:     }
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_volume.volume["slz-vsi-com-upg-r1vzfh-vpc-subnet-a-0-slz-vsi-com-upg-r1vzfh"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ resource "ibm_is_volume" "volume" {
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         id                         = "r006-ace6270e-822c-458e-a2a8-03d838fbd226"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:       ~ name                       = "slz-vsi-com-upg-r1vzfh-1fc3-001-slz-vsi-com-upg-r1vzfh" -> "slz-vsi-com-upg-r1vzfh-vpc-subnet-a-vol-1a"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         tags                       = []
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (22 unchanged attributes hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:     }
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_volume.volume["slz-vsi-com-upg-r1vzfh-vpc-subnet-b-0-slz-vsi-com-upg-r1vzfh"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ resource "ibm_is_volume" "volume" {
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         id                         = "r006-a3dc8e0d-acc9-492d-b0b7-941dd220e1d7"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:       ~ name                       = "slz-vsi-com-upg-r1vzfh-f562-001-slz-vsi-com-upg-r1vzfh" -> "slz-vsi-com-upg-r1vzfh-vpc-subnet-b-vol-1a"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         tags                       = []
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (22 unchanged attributes hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:     }
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   # module.slz_vsi.ibm_is_volume.volume["slz-vsi-com-upg-r1vzfh-vpc-subnet-c-0-slz-vsi-com-upg-r1vzfh"] will be updated in-place
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:   ~ resource "ibm_is_volume" "volume" {
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         id                         = "r006-d41c7e4e-fb70-4b96-8788-1c69a703b14d"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:       ~ name                       = "slz-vsi-com-upg-r1vzfh-a520-001-slz-vsi-com-upg-r1vzfh" -> "slz-vsi-com-upg-r1vzfh-vpc-subnet-c-vol-1a"
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         tags                       = []
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:         # (22 unchanged attributes hidden)
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206:     }
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: 
TestRunCompleteUpgradeExample 2025-03-13T10:18:26Z command.go:206: Plan: 0 to add, 12 to change, 0 to destroy.
```

with new approach we use custom VSI names inside complete example, therefore VSI and volume name are different . safe to skip upgrade test
author_association: CONTRIBUTOR
user: login: akocbek
created_at: 2025-03-13T10:50:58Z
body: /run pipeline
author_association: CONTRIBUTOR
user: login: akocbek
created_at: 2025-03-24T10:50:08Z
body: /run pipeline
author_association: CONTRIBUTOR
user: login: terraform-ibm-modules-ops
created_at: 2025-03-25T04:32:44Z
body: :tada: This PR is included in version 4.7.0 :tada:

The release is available on [GitHub release](https://github.com/terraform-ibm-modules/terraform-ibm-landing-zone-vsi/releases/tag/v4.7.0)

Your **[semantic-release](https://github.com/semantic-release/semantic-release)** bot :package::rocket:
author_association: CONTRIBUTOR
user: login: akocbek
created_at: 2025-03-25T11:38:01Z
body: https://github.com/terraform-ibm-modules/terraform-ibm-landing-zone-vsi/pull/810
author_association: CONTRIBUTOR