@@ -126,6 +126,7 @@ func ResourceServer() *schema.Resource {
126126 "name" : {
127127 Type : schema .TypeString ,
128128 Computed : true ,
129+ Optional : true ,
129130 Description : "Name of the root volume" ,
130131 },
131132 "size_in_gb" : {
@@ -519,7 +520,7 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
519520 }
520521
521522 ////
522- // Configure Block Volume
523+ // Configure Volumes
523524 ////
524525 var diags diag.Diagnostics
525526
@@ -530,6 +531,11 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
530531 }
531532 }
532533
534+ err = renameRootVolumeIfNeeded (d , api , zone , res .Server .Volumes )
535+ if err != nil {
536+ return diag .FromErr (err )
537+ }
538+
533539 ////
534540 // Set user data
535541 ////
@@ -639,10 +645,6 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
639645 return append (diags , ResourceInstanceServerRead (ctx , d , m )... )
640646}
641647
642- func errorCheck (err error , message string ) bool {
643- return strings .Contains (err .Error (), message )
644- }
645-
646648//gocyclo:ignore
647649func ResourceInstanceServerRead (ctx context.Context , d * schema.ResourceData , m any ) diag.Diagnostics {
648650 api , zone , id , err := instancehelpers .InstanceAndBlockAPIWithZoneAndID (m , d .Id ())
@@ -701,6 +703,9 @@ func ResourceInstanceServerRead(ctx context.Context, d *schema.ResourceData, m a
701703 _ = d .Set ("placement_group_policy_respected" , server .PlacementGroup .PolicyRespected )
702704 }
703705
706+ ////
707+ // Read server's public IPs
708+ ////
704709 if ipID , hasIPID := d .GetOk ("ip_id" ); hasIPID {
705710 publicIP := FindIPInList (ipID .(string ), server .PublicIPs )
706711 if publicIP != nil && ! publicIP .Dynamic {
@@ -733,52 +738,28 @@ func ResourceInstanceServerRead(ctx context.Context, d *schema.ResourceData, m a
733738 _ = d .Set ("admin_password_encryption_ssh_key_id" , server .AdminPasswordEncryptionSSHKeyID )
734739 }
735740
736- var additionalVolumesIDs []string
741+ ////
742+ // Read server's volumes
743+ ////
744+ rootVolume := make (map [string ]any , 1 )
745+ additionalVolumesIDs := make ([]string , 0 , len (server .Volumes )- 1 )
737746
738747 for i , serverVolume := range sortVolumeServer (server .Volumes ) {
739748 if i == 0 {
740- rootVolume := map [string ]any {}
741-
742- vs , ok := d .Get ("root_volume" ).([]map [string ]any )
743- if ok && len (vs ) > 0 {
744- rootVolume = vs [0 ]
745- }
746-
747- vol , err := api .GetUnknownVolume (& instancehelpers.GetUnknownVolumeRequest {
748- VolumeID : serverVolume .ID ,
749- Zone : server .Zone ,
750- })
749+ rootVolume , err = flattenServerVolume (api , serverVolume , zone )
751750 if err != nil {
752- return diag .FromErr (fmt .Errorf ("failed to read instance volume %s: %w" , serverVolume .ID , err ))
753- }
754-
755- rootVolume ["volume_id" ] = zonal .NewID (zone , vol .ID ).String ()
756- if vol .Size != nil {
757- rootVolume ["size_in_gb" ] = int (uint64 (* vol .Size ) / gb )
758- } else if serverVolume .Size != nil {
759- rootVolume ["size_in_gb" ] = int (uint64 (* serverVolume .Size ) / gb )
760- }
761-
762- if vol .IsBlockVolume () {
763- rootVolume ["sbs_iops" ] = types .FlattenUint32Ptr (vol .Iops )
751+ return diag .FromErr (err )
764752 }
765753
766754 _ , rootVolumeAttributeSet := d .GetOk ("root_volume" ) // Related to https://github.com/hashicorp/terraform-plugin-sdk/issues/142
767755 rootVolume ["delete_on_termination" ] = d .Get ("root_volume.0.delete_on_termination" ).(bool ) || ! rootVolumeAttributeSet
768- rootVolume ["volume_type" ] = serverVolume .VolumeType
769- rootVolume ["boot" ] = serverVolume .Boot
770- rootVolume ["name" ] = serverVolume .Name
771-
772- _ = d .Set ("root_volume" , []map [string ]any {rootVolume })
773756 } else {
774757 additionalVolumesIDs = append (additionalVolumesIDs , zonal .NewID (zone , serverVolume .ID ).String ())
775758 }
776759 }
777760
761+ _ = d .Set ("root_volume" , []map [string ]any {rootVolume })
778762 _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
779- if len (additionalVolumesIDs ) > 0 {
780- _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
781- }
782763
783764 ////
784765 // Read server user data
@@ -1165,7 +1146,7 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m
11651146 }
11661147 }
11671148
1168- _ , err = waitForServer (ctx , api .API , zone , id , d .Timeout (schema .TimeoutUpdate ))
1149+ server , err = waitForServer (ctx , api .API , zone , id , d .Timeout (schema .TimeoutUpdate ))
11691150 if err != nil {
11701151 return diag .FromErr (err )
11711152 }
@@ -1181,6 +1162,11 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m
11811162 warnings = append (warnings , ResourceInstanceServerUpdateRootVolumeIOPS (ctx , api , zone , id , types .ExpandUint32Ptr (d .Get ("root_volume.0.sbs_iops" )))... )
11821163 }
11831164
1165+ err = renameRootVolumeIfNeeded (d , api , zone , server .Volumes )
1166+ if err != nil {
1167+ return diag .FromErr (err )
1168+ }
1169+
11841170 return append (warnings , ResourceInstanceServerRead (ctx , d , m )... )
11851171}
11861172
@@ -1707,3 +1693,28 @@ func GetEndOfServiceDate(ctx context.Context, client *scw.Client, zone scw.Zone,
17071693
17081694 return "" , fmt .Errorf ("could not find product catalog entry for %q in %s" , commercialType , zone )
17091695}
1696+
1697+ func renameRootVolumeIfNeeded (d * schema.ResourceData , api * instancehelpers.BlockAndInstanceAPI , zone scw.Zone , volumes map [string ]* instanceSDK.VolumeServer ) error {
1698+ if volumes == nil || volumes ["0" ] == nil || volumes ["0" ].Name != nil {
1699+ return nil
1700+ }
1701+
1702+ if rootVolumeName , setByUser := meta .GetRawConfigForKey (d , "root_volume.0.name" , cty .String ); setByUser {
1703+ if * volumes ["0" ].Name != rootVolumeName {
1704+ _ , err := api .UpdateVolume (& instanceSDK.UpdateVolumeRequest {
1705+ Zone : zone ,
1706+ VolumeID : volumes ["0" ].ID ,
1707+ Name : scw .StringPtr (rootVolumeName .(string )),
1708+ })
1709+ if err != nil {
1710+ return err
1711+ }
1712+ }
1713+ }
1714+
1715+ return nil
1716+ }
1717+
1718+ func errorCheck (err error , message string ) bool {
1719+ return strings .Contains (err .Error (), message )
1720+ }
0 commit comments