@@ -136,6 +136,16 @@ func resourceMongoDBAtlasNetworkPeering() *schema.Resource {
136
136
Optional : true ,
137
137
Computed : true ,
138
138
},
139
+ "atlas_gcp_project_id" : {
140
+ Type : schema .TypeString ,
141
+ Computed : true ,
142
+ Optional : true ,
143
+ },
144
+ "atlas_vpc_name" : {
145
+ Type : schema .TypeString ,
146
+ Computed : true ,
147
+ Optional : true ,
148
+ },
139
149
"error_message" : {
140
150
Type : schema .TypeString ,
141
151
Computed : true ,
@@ -238,15 +248,10 @@ func resourceMongoDBAtlasNetworkPeeringCreate(d *schema.ResourceData, meta inter
238
248
return fmt .Errorf (errorPeersCreate , err )
239
249
}
240
250
241
- d .SetId (encodeStateID (map [string ]string {
242
- "project_id" : projectID ,
243
- "peer_id" : peer .ID ,
244
- }))
245
-
246
251
stateConf := & resource.StateChangeConf {
247
252
Pending : []string {"INITIATING" , "FINALIZING" , "ADDING_PEER" , "WAITING_FOR_USER" },
248
253
Target : []string {"AVAILABLE" , "PENDING_ACCEPTANCE" },
249
- Refresh : resourceNetworkPeeringRefreshFunc (peer .ID , projectID , conn ),
254
+ Refresh : resourceNetworkPeeringRefreshFunc (peer .ID , projectID , peerRequest . ContainerID , conn ),
250
255
Timeout : 1 * time .Hour ,
251
256
MinTimeout : 10 * time .Second ,
252
257
Delay : 30 * time .Second ,
@@ -258,6 +263,13 @@ func resourceMongoDBAtlasNetworkPeeringCreate(d *schema.ResourceData, meta inter
258
263
return fmt .Errorf (errorPeersCreate , err )
259
264
}
260
265
266
+ // container := cont.(matlas.Container)
267
+ d .SetId (encodeStateID (map [string ]string {
268
+ "project_id" : projectID ,
269
+ "peer_id" : peer .ID ,
270
+ "provider_name" : providerName ,
271
+ }))
272
+
261
273
return resourceMongoDBAtlasNetworkPeeringRead (d , meta )
262
274
}
263
275
@@ -267,11 +279,11 @@ func resourceMongoDBAtlasNetworkPeeringRead(d *schema.ResourceData, meta interfa
267
279
ids := decodeStateID (d .Id ())
268
280
projectID := ids ["project_id" ]
269
281
peerID := ids ["peer_id" ]
282
+ providerName := ids ["provider_name" ]
270
283
271
284
peer , resp , err := conn .Peers .Get (context .Background (), projectID , peerID )
272
285
if err != nil {
273
286
if resp != nil && resp .StatusCode == http .StatusNotFound {
274
-
275
287
return nil
276
288
}
277
289
return fmt .Errorf (errorPeersRead , peerID , err )
@@ -336,6 +348,23 @@ func resourceMongoDBAtlasNetworkPeeringRead(d *schema.ResourceData, meta interfa
336
348
if err := d .Set ("peer_id" , peer .ID ); err != nil {
337
349
return fmt .Errorf ("error setting `peer_id` for Network Peering Connection (%s): %s" , peerID , err )
338
350
}
351
+
352
+ // If provider name is GCP we need to get the parameters to configure the the reciprocal connection
353
+ // between Mongo and Google
354
+ container := & matlas.Container {}
355
+ if strings .ToUpper (providerName ) == "GCP" {
356
+ container , _ , err = conn .Containers .Get (context .Background (), projectID , peer .ContainerID )
357
+ if err != nil {
358
+ return err
359
+ }
360
+ }
361
+ if err := d .Set ("atlas_gcp_project_id" , container .GCPProjectID ); err != nil {
362
+ return fmt .Errorf ("error setting `atlas_gcp_project_id` for Network Peering Connection (%s): %s" , peerID , err )
363
+ }
364
+ if err := d .Set ("atlas_vpc_name" , container .NetworkName ); err != nil {
365
+ return fmt .Errorf ("error setting `atlas_vpc_name` for Network Peering Connection (%s): %s" , peerID , err )
366
+ }
367
+
339
368
return nil
340
369
}
341
370
@@ -404,7 +433,7 @@ func resourceMongoDBAtlasNetworkPeeringUpdate(d *schema.ResourceData, meta inter
404
433
stateConf := & resource.StateChangeConf {
405
434
Pending : []string {"INITIATING" , "FINALIZING" , "ADDING_PEER" , "WAITING_FOR_USER" },
406
435
Target : []string {"AVAILABLE" , "PENDING_ACCEPTANCE" },
407
- Refresh : resourceNetworkPeeringRefreshFunc (peerID , projectID , conn ),
436
+ Refresh : resourceNetworkPeeringRefreshFunc (peerID , projectID , "" , conn ),
408
437
Timeout : d .Timeout (schema .TimeoutCreate ),
409
438
MinTimeout : 30 * time .Second ,
410
439
Delay : 1 * time .Minute ,
@@ -437,10 +466,10 @@ func resourceMongoDBAtlasNetworkPeeringDelete(d *schema.ResourceData, meta inter
437
466
stateConf := & resource.StateChangeConf {
438
467
Pending : []string {"AVAILABLE" , "INITIATING" , "PENDING_ACCEPTANCE" , "FINALIZING" , "ADDING_PEER" , "WAITING_FOR_USER" , "TERMINATING" , "DELETING" },
439
468
Target : []string {"DELETED" },
440
- Refresh : resourceNetworkPeeringRefreshFunc (peerID , projectID , conn ),
469
+ Refresh : resourceNetworkPeeringRefreshFunc (peerID , projectID , "" , conn ),
441
470
Timeout : 1 * time .Hour ,
442
471
MinTimeout : 30 * time .Second ,
443
- Delay : 1 * time .Minute , // Wait 30 secs before starting
472
+ Delay : 10 * time .Second , // Wait 10 secs before starting
444
473
}
445
474
446
475
// Wait, catching any errors
@@ -454,52 +483,55 @@ func resourceMongoDBAtlasNetworkPeeringDelete(d *schema.ResourceData, meta inter
454
483
func resourceMongoDBAtlasNetworkPeeringImportState (d * schema.ResourceData , meta interface {}) ([]* schema.ResourceData , error ) {
455
484
conn := meta .(* matlas.Client )
456
485
457
- parts := strings .SplitN (d .Id (), "-" , 2 )
458
- if len (parts ) != 2 {
459
- return nil , errors .New ("import format error: to import a peer, use the format {project_id}-{peer_id}" )
486
+ parts := strings .SplitN (d .Id (), "-" , 3 )
487
+ if len (parts ) != 3 {
488
+ return nil , errors .New ("import format error: to import a peer, use the format {project_id}-{peer_id}-{provider_name} " )
460
489
}
461
490
462
491
projectID := parts [0 ]
463
492
peerID := parts [1 ]
493
+ providerName := parts [2 ]
464
494
465
495
peer , _ , err := conn .Peers .Get (context .Background (), projectID , peerID )
466
496
if err != nil {
467
497
return nil , fmt .Errorf ("couldn't import peer %s in project %s, error: %s" , peerID , projectID , err )
468
498
}
469
499
470
- d .SetId (encodeStateID (map [string ]string {
471
- "project_id" : projectID ,
472
- "peer_id" : peer .ID ,
473
- }))
474
-
475
- if err := d .Set ("project_id" , projectID ); err != nil {
476
- log .Printf ("[WARN] Error setting project_id for (%s): %s" , peerID , err )
477
- }
478
-
479
- if err := d .Set ("container_id" , peer .ContainerID ); err != nil {
480
- log .Printf ("[WARN] Error setting container_id for (%s): %s" , peerID , err )
481
- }
482
-
483
500
//Check wich provider is using.
484
501
provider := "AWS"
485
502
if peer .VNetName != "" {
486
503
provider = "AZURE"
487
504
} else if peer .NetworkName != "" {
488
505
provider = "GCP"
489
506
}
507
+ if providerName != provider {
508
+ providerName = provider
509
+ }
490
510
491
- if err := d .Set ("provider_name" , provider ); err != nil {
511
+ if err := d .Set ("project_id" , projectID ); err != nil {
512
+ log .Printf ("[WARN] Error setting project_id for (%s): %s" , peerID , err )
513
+ }
514
+ if err := d .Set ("container_id" , peer .ContainerID ); err != nil {
515
+ log .Printf ("[WARN] Error setting container_id for (%s): %s" , peerID , err )
516
+ }
517
+ if err := d .Set ("provider_name" , providerName ); err != nil {
492
518
log .Printf ("[WARN] Error setting provider_name for (%s): %s" , peerID , err )
493
519
}
494
520
521
+ d .SetId (encodeStateID (map [string ]string {
522
+ "project_id" : projectID ,
523
+ "peer_id" : peer .ID ,
524
+ "provider_name" : providerName ,
525
+ }))
526
+
495
527
return []* schema.ResourceData {d }, nil
496
528
}
497
529
498
- func resourceNetworkPeeringRefreshFunc (peerID , projectID string , client * matlas.Client ) resource.StateRefreshFunc {
530
+ func resourceNetworkPeeringRefreshFunc (peerID , projectID , containerID string , client * matlas.Client ) resource.StateRefreshFunc {
499
531
return func () (interface {}, string , error ) {
500
532
c , resp , err := client .Peers .Get (context .Background (), projectID , peerID )
501
533
if err != nil {
502
- if resp .StatusCode == 404 {
534
+ if resp != nil && resp .StatusCode == 404 {
503
535
return 42 , "DELETED" , nil
504
536
}
505
537
log .Printf ("error reading MongoDB Network Peering Connection %s: %s" , peerID , err )
@@ -511,9 +543,24 @@ func resourceNetworkPeeringRefreshFunc(peerID, projectID string, client *matlas.
511
543
if len (c .StatusName ) > 0 {
512
544
status = c .StatusName
513
545
}
514
-
515
546
log .Printf ("[DEBUG] status for MongoDB Network Peering Connection: %s: %s" , peerID , status )
516
547
548
+ /* We need to get the provisioned status from Mongo container that contains the peering connection
549
+ * to validate if it has changed to true. This means that the reciprocal connection in Mongo side
550
+ * is right, and the Mongo parameters used on the Google side to configure the reciprocal connection
551
+ * are now available. */
552
+ if status == "WAITING_FOR_USER" {
553
+ container , _ , err := client .Containers .Get (context .Background (), projectID , containerID )
554
+
555
+ if err != nil {
556
+ return nil , "" , fmt .Errorf (errorContainerRead , containerID , err )
557
+ }
558
+
559
+ if * container .Provisioned {
560
+ return container , "PENDING_ACCEPTANCE" , nil
561
+ }
562
+ }
563
+
517
564
return c , status , nil
518
565
}
519
566
}
0 commit comments