@@ -405,6 +405,15 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m an
405405 }
406406 }
407407
408+ // Configure endpoints after instance creation from snapshot
409+ if diags := createPrivateNetworkEndpoints (ctx , rdbAPI , region , res .ID , d ); diags .HasError () {
410+ return diags
411+ }
412+
413+ if diags := createLoadBalancerEndpoint (ctx , rdbAPI , region , res .ID , d ); diags .HasError () {
414+ return diags
415+ }
416+
408417 d .SetId (regional .NewIDString (region , res .ID ))
409418 id = res .ID
410419 } else {
@@ -434,43 +443,16 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m an
434443 }
435444
436445 // Init Endpoints
437- if pn , pnExist := d .GetOk ("private_network" ); pnExist {
438- ipamConfig , staticConfig := getIPConfigCreate (d , "ip_net" )
439-
440- var diags diag.Diagnostics
441-
442- createReq .InitEndpoints , diags = expandPrivateNetwork (pn , pnExist , ipamConfig , staticConfig )
443- if diags .HasError () {
444- return diags
445- }
446-
447- for _ , warning := range diags {
448- tflog .Warn (ctx , warning .Detail )
449- }
446+ endpoints , diags := collectEndpointSpecs (d )
447+ if diags .HasError () {
448+ return diags
450449 }
451450
452- if _ , lbExists := d . GetOk ( "load_balancer" ); lbExists {
453- createReq . InitEndpoints = append ( createReq . InitEndpoints , expandLoadBalancer () )
451+ for _ , warning := range diags {
452+ tflog . Warn ( ctx , warning . Detail )
454453 }
455- // Init Endpoints
456- if pn , pnExist := d .GetOk ("private_network" ); pnExist {
457- ipamConfig , staticConfig := getIPConfigCreate (d , "ip_net" )
458454
459- var diags diag.Diagnostics
460-
461- createReq .InitEndpoints , diags = expandPrivateNetwork (pn , pnExist , ipamConfig , staticConfig )
462- if diags .HasError () {
463- return diags
464- }
465-
466- for _ , warning := range diags {
467- tflog .Warn (ctx , warning .Detail )
468- }
469- }
470-
471- if _ , lbExists := d .GetOk ("load_balancer" ); lbExists {
472- createReq .InitEndpoints = append (createReq .InitEndpoints , expandLoadBalancer ())
473- }
455+ createReq .InitEndpoints = endpoints
474456
475457 if size , ok := d .GetOk ("volume_size_in_gb" ); ok {
476458 if createReq .VolumeType == rdb .VolumeTypeLssd {
@@ -548,6 +530,76 @@ func ResourceRdbInstanceCreate(ctx context.Context, d *schema.ResourceData, m an
548530 return ResourceRdbInstanceRead (ctx , d , m )
549531}
550532
533+ // createPrivateNetworkEndpoints creates private network endpoints for an instance
534+ func createPrivateNetworkEndpoints (ctx context.Context , rdbAPI * rdb.API , region scw.Region , instanceID string , d * schema.ResourceData ) diag.Diagnostics {
535+ if pn , pnExist := d .GetOk ("private_network" ); pnExist {
536+ ipamConfig , staticConfig := getIPConfigCreate (d , "ip_net" )
537+
538+ privateEndpoints , diags := expandPrivateNetwork (pn , pnExist , ipamConfig , staticConfig )
539+ if diags .HasError () {
540+ return diags
541+ }
542+
543+ for _ , warning := range diags {
544+ tflog .Warn (ctx , warning .Detail )
545+ }
546+
547+ for _ , e := range privateEndpoints {
548+ _ , err := rdbAPI .CreateEndpoint (
549+ & rdb.CreateEndpointRequest {Region : region , InstanceID : instanceID , EndpointSpec : e },
550+ scw .WithContext (ctx ))
551+ if err != nil {
552+ return diag .FromErr (err )
553+ }
554+ }
555+ }
556+ return nil
557+ }
558+
559+ // createLoadBalancerEndpoint creates load balancer endpoint for an instance
560+ func createLoadBalancerEndpoint (ctx context.Context , rdbAPI * rdb.API , region scw.Region , instanceID string , d * schema.ResourceData ) diag.Diagnostics {
561+ if _ , lbExists := d .GetOk ("load_balancer" ); lbExists {
562+ _ , err := rdbAPI .CreateEndpoint (& rdb.CreateEndpointRequest {
563+ Region : region ,
564+ InstanceID : instanceID ,
565+ EndpointSpec : expandLoadBalancer (),
566+ }, scw .WithContext (ctx ))
567+ if err != nil {
568+ return diag .FromErr (err )
569+ }
570+ }
571+ return nil
572+ }
573+
574+ // collectEndpointSpecs collects all endpoint specifications for instance creation
575+ func collectEndpointSpecs (d * schema.ResourceData ) ([]* rdb.EndpointSpec , diag.Diagnostics ) {
576+ var endpoints []* rdb.EndpointSpec
577+ var diags diag.Diagnostics
578+
579+ // Add private network endpoints
580+ if pn , pnExist := d .GetOk ("private_network" ); pnExist {
581+ ipamConfig , staticConfig := getIPConfigCreate (d , "ip_net" )
582+
583+ privateEndpoints , pnDiags := expandPrivateNetwork (pn , pnExist , ipamConfig , staticConfig )
584+ if pnDiags .HasError () {
585+ return nil , pnDiags
586+ }
587+
588+ for _ , warning := range pnDiags {
589+ diags = append (diags , warning )
590+ }
591+
592+ endpoints = append (endpoints , privateEndpoints ... )
593+ }
594+
595+ // Add load balancer endpoint
596+ if _ , lbExists := d .GetOk ("load_balancer" ); lbExists {
597+ endpoints = append (endpoints , expandLoadBalancer ())
598+ }
599+
600+ return endpoints , diags
601+ }
602+
551603func ResourceRdbInstanceRead (ctx context.Context , d * schema.ResourceData , m any ) diag.Diagnostics {
552604 rdbAPI , region , ID , err := NewAPIWithRegionAndID (m , d .Id ())
553605 if err != nil {
0 commit comments