From f81f69093192d536a010270916cf6239b87c5dd1 Mon Sep 17 00:00:00 2001
From: Oriol <oriol.abadal@mongodb.com>
Date: Tue, 28 May 2024 15:37:24 +0200
Subject: [PATCH] fix: Correctly handle GCP updates of
 `mongodbatlas_network_peering` (#2306)

* correctly handle GCP updates of network peering

* changelog

* fix changelog

* remove unnecessary comment

* Update .changelog/2306.txt

Co-authored-by: kanchana-mongodb <54281287+kanchana-mongodb@users.noreply.github.com>

---------

Co-authored-by: kanchana-mongodb <54281287+kanchana-mongodb@users.noreply.github.com>
---
 .changelog/2306.txt                           |  3 ++
 .../resource_network_peering.go               | 10 ++--
 .../resource_network_peering_test.go          | 46 +++++++++++++++++++
 3 files changed, 52 insertions(+), 7 deletions(-)
 create mode 100644 .changelog/2306.txt

diff --git a/.changelog/2306.txt b/.changelog/2306.txt
new file mode 100644
index 0000000000..a0583a3acc
--- /dev/null
+++ b/.changelog/2306.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+resource/mongodbatlas_network_peering: Correctly handles GCP updates of mongodbatlas_network_peering
+```
diff --git a/internal/service/networkpeering/resource_network_peering.go b/internal/service/networkpeering/resource_network_peering.go
index f2612aabff..f6983da344 100644
--- a/internal/service/networkpeering/resource_network_peering.go
+++ b/internal/service/networkpeering/resource_network_peering.go
@@ -135,11 +135,13 @@ func Resource() *schema.Resource {
 				Type:     schema.TypeString,
 				Optional: true,
 				Computed: true,
+				ForceNew: true,
 			},
 			"network_name": {
 				Type:     schema.TypeString,
 				Optional: true,
 				Computed: true,
+				ForceNew: true,
 			},
 			"atlas_gcp_project_id": {
 				Type:     schema.TypeString,
@@ -410,13 +412,7 @@ func resourceUpdate(ctx context.Context, d *schema.ResourceData, meta any) diag.
 		ContainerId:  conversion.GetEncodedID(d.Get("container_id").(string), "container_id"),
 	}
 
-	// Updating any of the attributes for Azure Network Peering forces a recreation of the network peering.
-	// Need to check if GCP and AWS have the same behavior
-	switch peer.GetProviderName() {
-	case "GCP":
-		peer.SetGcpProjectId(d.Get("gcp_project_id").(string))
-		peer.SetNetworkName(d.Get("network_name").(string))
-	default: // AWS by default
+	if peer.GetProviderName() == "AWS" {
 		region, _ := conversion.ValRegion(d.Get("accepter_region_name"), "network_peering")
 		peer.SetAccepterRegionName(region)
 		peer.SetAwsAccountId(d.Get("aws_account_id").(string))
diff --git a/internal/service/networkpeering/resource_network_peering_test.go b/internal/service/networkpeering/resource_network_peering_test.go
index 4d5d3cbc7e..fd76b111ca 100644
--- a/internal/service/networkpeering/resource_network_peering_test.go
+++ b/internal/service/networkpeering/resource_network_peering_test.go
@@ -142,6 +142,52 @@ func TestAccNetworkRSNetworkPeering_basicGCP(t *testing.T) {
 	})
 }
 
+func TestAccNetworkRSNetworkPeering_updateBasicGCP(t *testing.T) {
+	acc.SkipTestForCI(t) // needs GCP configuration
+
+	var (
+		projectID          = os.Getenv("MONGODB_ATLAS_PROJECT_ID")
+		providerName       = "GCP"
+		gcpProjectID       = os.Getenv("GCP_PROJECT_ID")
+		networkName        = acc.RandomName()
+		updatedNetworkName = acc.RandomName()
+	)
+
+	resource.Test(t, resource.TestCase{
+		PreCheck:                 func() { acc.PreCheck(t); acc.PreCheckPeeringEnvGCP(t) },
+		ProtoV6ProviderFactories: acc.TestAccProviderV6Factories,
+		CheckDestroy:             acc.CheckDestroyNetworkPeering,
+		Steps: []resource.TestStep{
+			{
+				Config: configGCP(projectID, providerName, gcpProjectID, networkName),
+				Check: resource.ComposeTestCheckFunc(
+					checkExists(resourceName),
+					resource.TestCheckResourceAttrSet(resourceName, "project_id"),
+					resource.TestCheckResourceAttrSet(resourceName, "container_id"),
+					resource.TestCheckResourceAttrSet(resourceName, "network_name"),
+
+					resource.TestCheckResourceAttr(resourceName, "provider_name", providerName),
+					resource.TestCheckResourceAttr(resourceName, "gcp_project_id", gcpProjectID),
+					resource.TestCheckResourceAttr(resourceName, "network_name", networkName),
+				),
+			},
+			{
+				Config: configGCP(projectID, providerName, gcpProjectID, updatedNetworkName),
+				Check: resource.ComposeTestCheckFunc(
+					checkExists(resourceName),
+					resource.TestCheckResourceAttrSet(resourceName, "project_id"),
+					resource.TestCheckResourceAttrSet(resourceName, "container_id"),
+					resource.TestCheckResourceAttrSet(resourceName, "network_name"),
+
+					resource.TestCheckResourceAttr(resourceName, "provider_name", providerName),
+					resource.TestCheckResourceAttr(resourceName, "gcp_project_id", gcpProjectID),
+					resource.TestCheckResourceAttr(resourceName, "network_name", updatedNetworkName),
+				),
+			},
+		},
+	})
+}
+
 func TestAccNetworkRSNetworkPeering_AWSDifferentRegionName(t *testing.T) {
 	var (
 		vpcID           = os.Getenv("AWS_VPC_ID")