Skip to content

Commit a06c7f1

Browse files
authored
fix: is_virtual_network_interface resource_group force new fix (IBM-Cloud#6105)
* fix: is_virtual_network_interface resource_group force new fix * Update resource_ibm_is_instance.go * Update resource_ibm_is_instance_network_attachment.go * Update resource_ibm_is_instance_network_attachment_test.go * Update resource_ibm_is_instance_test.go
1 parent dad7de9 commit a06c7f1

7 files changed

+459
-4
lines changed

ibm/acctest/acctest.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ var (
9090
ISZoneName2 string
9191
ISZoneName3 string
9292
IsResourceGroupID string
93+
IsResourceGroupIDUpdate string
9394
ISResourceCrn string
9495
ISCIDR string
9596
ISCIDR2 string
@@ -856,6 +857,11 @@ func init() {
856857
IsResourceGroupID = "c01d34dff4364763476834c990398zz8"
857858
fmt.Println("[INFO] Set the environment variable SL_RESOURCE_GROUP_ID for testing with different resource group id else it is set to default value 'c01d34dff4364763476834c990398zz8'")
858859
}
860+
IsResourceGroupIDUpdate = os.Getenv("SL_RESOURCE_GROUP_ID_UPDATE")
861+
if IsResourceGroupIDUpdate == "" {
862+
IsResourceGroupIDUpdate = "c01d34dff4364763476834c990398zz8"
863+
fmt.Println("[INFO] Set the environment variable SL_RESOURCE_GROUP_ID_UPDATE for testing with different resource group id else it is set to default value 'c01d34dff4364763476834c990398zz8'")
864+
}
859865
ISResourceCrn = os.Getenv("IS_RESOURCE_INSTANCE_CRN")
860866
if ISResourceCrn == "" {
861867
ISResourceCrn = "crn:v1:bluemix:public:cloud-object-storage:global:a/fugeggfcgjebvrburvgurgvugfr:236764224-f48fu4-f4h84-9db3-4f94fh::"

ibm/service/vpc/resource_ibm_is_instance.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,7 @@ func ResourceIBMISInstance() *schema.Resource {
916916
Type: schema.TypeString,
917917
Optional: true,
918918
Computed: true,
919+
ForceNew: true,
919920
Description: "The virtual network interface id for this instance network attachment.",
920921
},
921922
"allow_ip_spoofing": &schema.Schema{
@@ -1077,6 +1078,7 @@ func ResourceIBMISInstance() *schema.Resource {
10771078
Optional: true,
10781079
ConflictsWith: []string{"primary_network_attachment.0.virtual_network_interface.0.id"},
10791080
Computed: true,
1081+
ForceNew: true,
10801082
Description: "The resource group id for this virtual network interface.",
10811083
},
10821084
"resource_type": &schema.Schema{
@@ -1308,6 +1310,7 @@ func ResourceIBMISInstance() *schema.Resource {
13081310
Type: schema.TypeString,
13091311
Optional: true,
13101312
Computed: true,
1313+
ForceNew: true,
13111314
Description: "The virtual network interface id for this instance network attachment.",
13121315
},
13131316
"allow_ip_spoofing": &schema.Schema{
@@ -1462,6 +1465,7 @@ func ResourceIBMISInstance() *schema.Resource {
14621465
Type: schema.TypeString,
14631466
Optional: true,
14641467
Computed: true,
1468+
ForceNew: true,
14651469
Description: "The resource group id for this virtual network interface.",
14661470
},
14671471
"resource_type": &schema.Schema{

ibm/service/vpc/resource_ibm_is_instance_network_attachment.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ func ResourceIBMIsInstanceNetworkAttachment() *schema.Resource {
9191
Type: schema.TypeString,
9292
Optional: true,
9393
Computed: true,
94+
ForceNew: true,
9495
ConflictsWith: []string{"virtual_network_interface.0.allow_ip_spoofing", "virtual_network_interface.0.auto_delete", "virtual_network_interface.0.enable_infrastructure_nat", "virtual_network_interface.0.ips", "virtual_network_interface.0.name", "virtual_network_interface.0.primary_ip", "virtual_network_interface.0.resource_group", "virtual_network_interface.0.security_groups", "virtual_network_interface.0.security_groups"},
9596
Description: "The virtual network interface id for this instance network attachment.",
9697
},
@@ -251,6 +252,7 @@ func ResourceIBMIsInstanceNetworkAttachment() *schema.Resource {
251252
"resource_group": &schema.Schema{
252253
Type: schema.TypeString,
253254
Optional: true,
255+
ForceNew: true,
254256
ConflictsWith: []string{"virtual_network_interface.0.id"},
255257
Computed: true,
256258
Description: "The resource group id for this virtual network interface.",
@@ -321,7 +323,7 @@ func resourceIBMIsInstanceNetworkAttachmentCreate(context context.Context, d *sc
321323
createInstanceNetworkAttachmentOptions := &vpcv1.CreateInstanceNetworkAttachmentOptions{}
322324

323325
createInstanceNetworkAttachmentOptions.SetInstanceID(d.Get("instance").(string))
324-
virtualNetworkInterfaceModel, err := resourceIBMIsInstanceNetworkAttachmentMapToInstanceNetworkAttachmentPrototypeVirtualNetworkInterface(d.Get("virtual_network_interface.0").(map[string]interface{}))
326+
virtualNetworkInterfaceModel, err := resourceIBMIsInstanceNetworkAttachmentMapToInstanceNetworkAttachmentPrototypeVirtualNetworkInterface(d, d.Get("virtual_network_interface.0").(map[string]interface{}))
325327
if err != nil {
326328
return diag.FromErr(err)
327329
}
@@ -707,15 +709,15 @@ func resourceIBMIsInstanceNetworkAttachmentDelete(context context.Context, d *sc
707709
return nil
708710
}
709711

710-
func resourceIBMIsInstanceNetworkAttachmentMapToInstanceNetworkAttachmentPrototypeVirtualNetworkInterface(modelMap map[string]interface{}) (vpcv1.InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf, error) {
712+
func resourceIBMIsInstanceNetworkAttachmentMapToInstanceNetworkAttachmentPrototypeVirtualNetworkInterface(d *schema.ResourceData, modelMap map[string]interface{}) (vpcv1.InstanceNetworkAttachmentPrototypeVirtualNetworkInterfaceIntf, error) {
711713
model := &vpcv1.InstanceNetworkAttachmentPrototypeVirtualNetworkInterface{}
712-
if modelMap["allow_ip_spoofing"] != nil {
714+
if _, ok := d.GetOkExists("allow_ip_spoofing"); ok {
713715
model.AllowIPSpoofing = core.BoolPtr(modelMap["allow_ip_spoofing"].(bool))
714716
}
715717
if modelMap["auto_delete"] != nil {
716718
model.AutoDelete = core.BoolPtr(modelMap["auto_delete"].(bool))
717719
}
718-
if modelMap["enable_infrastructure_nat"] != nil {
720+
if _, ok := d.GetOkExists("enable_infrastructure_nat"); ok {
719721
model.EnableInfrastructureNat = core.BoolPtr(modelMap["enable_infrastructure_nat"].(bool))
720722
}
721723
if modelMap["ips"] != nil {

ibm/service/vpc/resource_ibm_is_instance_network_attachment_test.go

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,3 +416,200 @@ func testAccCheckIBMIsInstanceNetworkAttachmentDestroy(s *terraform.State) error
416416

417417
return nil
418418
}
419+
420+
// TestAccIBMIsInstanceNetworkAttachmentVniResourceGroupChange tests attachment with external VNI's resource group change
421+
func TestAccIBMIsInstanceNetworkAttachmentVniResourceGroupChange(t *testing.T) {
422+
var conf vpcv1.InstanceNetworkAttachment
423+
vpcname := fmt.Sprintf("tf-vpc-%d", acctest.RandIntRange(10, 100))
424+
name := fmt.Sprintf("tf-vsi-%d", acctest.RandIntRange(10, 100))
425+
vniname := fmt.Sprintf("tf-vni-%d", acctest.RandIntRange(10, 100))
426+
subnetname := fmt.Sprintf("tvni-subnet-%d", acctest.RandIntRange(10, 100))
427+
naname := fmt.Sprintf("tvni-na-%d", acctest.RandIntRange(10, 100))
428+
publicKey := strings.TrimSpace(`
429+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVERRN7/9484SOBJ3HSKxxNG5JN8owAjy5f9yYwcUg+JaUVuytn5Pv3aeYROHGGg+5G346xaq3DAwX6Y5ykr2fvjObgncQBnuU5KHWCECO/4h8uWuwh/kfniXPVjFToc+gnkqA+3RKpAecZhFXwfalQ9mMuYGFxn+fwn8cYEApsJbsEmb0iJwPiZ5hjFC8wREuiTlhPHDgkBLOiycd20op2nXzDbHfCHInquEe/gYxEitALONxm0swBOwJZwlTDOB7C6y2dzlrtxr1L59m7pCkWI4EtTRLvleehBoj3u7jB4usR
430+
`)
431+
sshname := fmt.Sprintf("tf-sshname-%d", acctest.RandIntRange(10, 100))
432+
rg1 := acc.IsResourceGroupID
433+
rg2 := acc.IsResourceGroupIDUpdate
434+
435+
resource.Test(t, resource.TestCase{
436+
PreCheck: func() { acc.TestAccPreCheck(t) },
437+
Providers: acc.TestAccProviders,
438+
CheckDestroy: testAccCheckIBMIsInstanceNetworkAttachmentDestroy,
439+
Steps: []resource.TestStep{
440+
// Initial setup with resource group 1
441+
{
442+
Config: testAccCheckIBMIsInstanceNetworkAttachmentVniResourceGroup(vpcname, subnetname, sshname, publicKey, vniname, name, naname, rg1),
443+
Check: resource.ComposeAggregateTestCheckFunc(
444+
testAccCheckIBMIsInstanceNetworkAttachmentExists("ibm_is_instance_network_attachment.is_instance_network_attachment", conf),
445+
resource.TestCheckResourceAttr("ibm_is_instance_network_attachment.is_instance_network_attachment", "name", naname),
446+
resource.TestCheckResourceAttr("ibm_is_virtual_network_interface.testacc_vni2", "resource_group", rg1),
447+
resource.TestCheckResourceAttrSet("ibm_is_instance_network_attachment.is_instance_network_attachment", "virtual_network_interface.#"),
448+
),
449+
},
450+
// Change to resource group 2, should trigger force-new for VNI and recreate attachment
451+
{
452+
Config: testAccCheckIBMIsInstanceNetworkAttachmentVniResourceGroup(vpcname, subnetname, sshname, publicKey, vniname, name, naname, rg2),
453+
Check: resource.ComposeAggregateTestCheckFunc(
454+
testAccCheckIBMIsInstanceNetworkAttachmentExists("ibm_is_instance_network_attachment.is_instance_network_attachment", conf),
455+
resource.TestCheckResourceAttr("ibm_is_instance_network_attachment.is_instance_network_attachment", "name", naname),
456+
resource.TestCheckResourceAttr("ibm_is_virtual_network_interface.testacc_vni2", "resource_group", rg2),
457+
resource.TestCheckResourceAttrSet("ibm_is_instance_network_attachment.is_instance_network_attachment", "virtual_network_interface.#"),
458+
),
459+
},
460+
},
461+
})
462+
}
463+
464+
// TestAccIBMIsInstanceNetworkAttachmentInlineVniResourceGroupChange tests attachment with inline VNI resource group change
465+
func TestAccIBMIsInstanceNetworkAttachmentInlineVniResourceGroupChange(t *testing.T) {
466+
var conf vpcv1.InstanceNetworkAttachment
467+
vpcname := fmt.Sprintf("tf-vpc-%d", acctest.RandIntRange(10, 100))
468+
name := fmt.Sprintf("tf-vsi-%d", acctest.RandIntRange(10, 100))
469+
subnetname := fmt.Sprintf("tvni-subnet-%d", acctest.RandIntRange(10, 100))
470+
naname := fmt.Sprintf("tvni-na-%d", acctest.RandIntRange(10, 100))
471+
publicKey := strings.TrimSpace(`
472+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVERRN7/9484SOBJ3HSKxxNG5JN8owAjy5f9yYwcUg+JaUVuytn5Pv3aeYROHGGg+5G346xaq3DAwX6Y5ykr2fvjObgncQBnuU5KHWCECO/4h8uWuwh/kfniXPVjFToc+gnkqA+3RKpAecZhFXwfalQ9mMuYGFxn+fwn8cYEApsJbsEmb0iJwPiZ5hjFC8wREuiTlhPHDgkBLOiycd20op2nXzDbHfCHInquEe/gYxEitALONxm0swBOwJZwlTDOB7C6y2dzlrtxr1L59m7pCkWI4EtTRLvleehBoj3u7jB4usR
473+
`)
474+
sshname := fmt.Sprintf("tf-sshname-%d", acctest.RandIntRange(10, 100))
475+
vniname := fmt.Sprintf("tf-vni-%d", acctest.RandIntRange(10, 100))
476+
rg1 := acc.IsResourceGroupID
477+
rg2 := acc.IsResourceGroupIDUpdate
478+
479+
resource.Test(t, resource.TestCase{
480+
PreCheck: func() { acc.TestAccPreCheck(t) },
481+
Providers: acc.TestAccProviders,
482+
CheckDestroy: testAccCheckIBMIsInstanceNetworkAttachmentDestroy,
483+
Steps: []resource.TestStep{
484+
// Initial setup with resource group 1
485+
{
486+
Config: testAccCheckIBMIsInstanceNetworkAttachmentInlineVniResourceGroup(vpcname, subnetname, sshname, publicKey, vniname, name, naname, rg1),
487+
Check: resource.ComposeAggregateTestCheckFunc(
488+
testAccCheckIBMIsInstanceNetworkAttachmentExists("ibm_is_instance_network_attachment.is_instance_network_attachment", conf),
489+
resource.TestCheckResourceAttr("ibm_is_instance_network_attachment.is_instance_network_attachment", "name", naname),
490+
resource.TestCheckResourceAttr("ibm_is_instance_network_attachment.is_instance_network_attachment", "virtual_network_interface.0.resource_group", rg1),
491+
),
492+
},
493+
// Change to resource group 2, should trigger force-new
494+
{
495+
Config: testAccCheckIBMIsInstanceNetworkAttachmentInlineVniResourceGroup(vpcname, subnetname, sshname, publicKey, vniname, name, naname, rg2),
496+
Check: resource.ComposeAggregateTestCheckFunc(
497+
testAccCheckIBMIsInstanceNetworkAttachmentExists("ibm_is_instance_network_attachment.is_instance_network_attachment", conf),
498+
resource.TestCheckResourceAttr("ibm_is_instance_network_attachment.is_instance_network_attachment", "name", naname),
499+
resource.TestCheckResourceAttr("ibm_is_instance_network_attachment.is_instance_network_attachment", "virtual_network_interface.0.resource_group", rg2),
500+
),
501+
},
502+
},
503+
})
504+
}
505+
506+
// Config generators
507+
508+
func testAccCheckIBMIsInstanceNetworkAttachmentVniResourceGroup(vpcname, subnetname, sshname, publicKey, vniname, name, naname, resourceGroup string) string {
509+
return fmt.Sprintf(`
510+
resource "ibm_is_vpc" "testacc_vpc" {
511+
name = "%s"
512+
}
513+
514+
resource "ibm_is_subnet" "testacc_subnet" {
515+
name = "%s"
516+
vpc = ibm_is_vpc.testacc_vpc.id
517+
zone = "%s"
518+
total_ipv4_address_count = 16
519+
}
520+
521+
resource "ibm_is_ssh_key" "testacc_sshkey" {
522+
name = "%s"
523+
public_key = "%s"
524+
}
525+
526+
resource "ibm_is_virtual_network_interface" "testacc_vni" {
527+
name = "%s"
528+
subnet = ibm_is_subnet.testacc_subnet.id
529+
auto_delete = false
530+
}
531+
532+
resource "ibm_is_virtual_network_interface" "testacc_vni2" {
533+
name = "%s2"
534+
subnet = ibm_is_subnet.testacc_subnet.id
535+
resource_group = "%s"
536+
auto_delete = false
537+
}
538+
539+
resource "ibm_is_instance" "testacc_vsi" {
540+
profile = "%s"
541+
name = "%s"
542+
image = "%s"
543+
zone = "%s"
544+
keys = [ibm_is_ssh_key.testacc_sshkey.id]
545+
primary_network_attachment {
546+
name = "vni-primary"
547+
virtual_network_interface {
548+
id = ibm_is_virtual_network_interface.testacc_vni.id
549+
}
550+
}
551+
vpc = ibm_is_vpc.testacc_vpc.id
552+
}
553+
554+
resource "ibm_is_instance_network_attachment" "is_instance_network_attachment" {
555+
instance = ibm_is_instance.testacc_vsi.id
556+
name = "%s"
557+
virtual_network_interface {
558+
id = ibm_is_virtual_network_interface.testacc_vni2.id
559+
}
560+
}
561+
`, vpcname, subnetname, acc.ISZoneName, sshname, publicKey, vniname, vniname, resourceGroup, acc.InstanceProfileName, name, acc.IsImage, acc.ISZoneName, naname)
562+
}
563+
564+
func testAccCheckIBMIsInstanceNetworkAttachmentInlineVniResourceGroup(vpcname, subnetname, sshname, publicKey, vniname, name, naname, resourceGroup string) string {
565+
return fmt.Sprintf(`
566+
resource "ibm_is_vpc" "testacc_vpc" {
567+
name = "%s"
568+
}
569+
570+
resource "ibm_is_subnet" "testacc_subnet" {
571+
name = "%s"
572+
vpc = ibm_is_vpc.testacc_vpc.id
573+
zone = "%s"
574+
total_ipv4_address_count = 16
575+
}
576+
577+
resource "ibm_is_ssh_key" "testacc_sshkey" {
578+
name = "%s"
579+
public_key = "%s"
580+
}
581+
582+
resource "ibm_is_virtual_network_interface" "testacc_vni" {
583+
name = "%s"
584+
subnet = ibm_is_subnet.testacc_subnet.id
585+
enable_infrastructure_nat = true
586+
auto_delete = false
587+
}
588+
589+
resource "ibm_is_instance" "testacc_vsi" {
590+
profile = "%s"
591+
name = "%s"
592+
image = "%s"
593+
zone = "%s"
594+
keys = [ibm_is_ssh_key.testacc_sshkey.id]
595+
primary_network_attachment {
596+
name = "vni-primary"
597+
virtual_network_interface {
598+
id = ibm_is_virtual_network_interface.testacc_vni.id
599+
}
600+
}
601+
vpc = ibm_is_vpc.testacc_vpc.id
602+
}
603+
604+
resource "ibm_is_instance_network_attachment" "is_instance_network_attachment" {
605+
instance = ibm_is_instance.testacc_vsi.id
606+
name = "%s"
607+
virtual_network_interface {
608+
subnet = ibm_is_subnet.testacc_subnet.id
609+
resource_group = "%s"
610+
name = "inline-vni-na"
611+
auto_delete = true
612+
}
613+
}
614+
`, vpcname, subnetname, acc.ISZoneName, sshname, publicKey, vniname, acc.InstanceProfileName, name, acc.IsImage, acc.ISZoneName, naname, resourceGroup)
615+
}

0 commit comments

Comments
 (0)