@@ -604,176 +604,172 @@ func ResourceInstanceServerRead(ctx context.Context, d *schema.ResourceData, m i
604604 // Read Server
605605 ////
606606
607- if err == nil {
608- state , err := serverStateFlatten (server .State )
609- if err != nil {
610- return diag .FromErr (err )
611- }
607+ state , err := serverStateFlatten (server .State )
608+ if err != nil {
609+ return diag .FromErr (err )
610+ }
612611
613- _ = d .Set ("state" , state )
614- _ = d .Set ("zone" , string (zone ))
615- _ = d .Set ("name" , server .Name )
616- _ = d .Set ("boot_type" , server .BootType )
612+ _ = d .Set ("state" , state )
613+ _ = d .Set ("zone" , string (zone ))
614+ _ = d .Set ("name" , server .Name )
615+ _ = d .Set ("boot_type" , server .BootType )
617616
618- _ = d .Set ("type" , server .CommercialType )
619- if len (server .Tags ) > 0 {
620- _ = d .Set ("tags" , server .Tags )
621- }
617+ _ = d .Set ("type" , server .CommercialType )
618+ if len (server .Tags ) > 0 {
619+ _ = d .Set ("tags" , server .Tags )
620+ }
622621
623- _ = d .Set ("security_group_id" , zonal .NewID (zone , server .SecurityGroup .ID ).String ())
624- // EnableIPv6 is deprecated
625- _ = d .Set ("enable_ipv6" , server .EnableIPv6 ) //nolint:staticcheck
626- _ = d .Set ("enable_dynamic_ip" , server .DynamicIPRequired )
627- _ = d .Set ("organization_id" , server .Organization )
628- _ = d .Set ("project_id" , server .Project )
629- _ = d .Set ("protected" , server .Protected )
630-
631- // Image could be empty in an import context.
632- image := regional .ExpandID (d .Get ("image" ).(string ))
633- if server .Image != nil && (image .ID == "" || scwvalidation .IsUUID (image .ID )) {
634- _ = d .Set ("image" , zonal .NewID (zone , server .Image .ID ).String ())
635- }
622+ _ = d .Set ("security_group_id" , zonal .NewID (zone , server .SecurityGroup .ID ).String ())
623+ // EnableIPv6 is deprecated
624+ _ = d .Set ("enable_ipv6" , server .EnableIPv6 ) //nolint:staticcheck
625+ _ = d .Set ("enable_dynamic_ip" , server .DynamicIPRequired )
626+ _ = d .Set ("organization_id" , server .Organization )
627+ _ = d .Set ("project_id" , server .Project )
628+ _ = d .Set ("protected" , server .Protected )
636629
637- if server .PlacementGroup != nil {
638- _ = d .Set ("placement_group_id" , zonal .NewID (zone , server .PlacementGroup .ID ).String ())
639- _ = d .Set ("placement_group_policy_respected" , server .PlacementGroup .PolicyRespected )
640- }
630+ // Image could be empty in an import context.
631+ image := regional .ExpandID (d .Get ("image" ).(string ))
632+ if server .Image != nil && (image .ID == "" || scwvalidation .IsUUID (image .ID )) {
633+ _ = d .Set ("image" , zonal .NewID (zone , server .Image .ID ).String ())
634+ }
641635
642- if server .PrivateIP != nil {
643- _ = d .Set ("private_ip" , types .FlattenStringPtr (server .PrivateIP ))
644- }
636+ if server .PlacementGroup != nil {
637+ _ = d .Set ("placement_group_id" , zonal .NewID (zone , server .PlacementGroup .ID ).String ())
638+ _ = d .Set ("placement_group_policy_respected" , server .PlacementGroup .PolicyRespected )
639+ }
645640
646- if _ , hasIPID := d .GetOk ("ip_id" ); server .PublicIP != nil && hasIPID { //nolint:staticcheck
647- if ! server .PublicIP .Dynamic { //nolint:staticcheck
648- _ = d .Set ("ip_id" , zonal .NewID (zone , server .PublicIP .ID ).String ()) //nolint:staticcheck
649- } else {
650- _ = d .Set ("ip_id" , "" )
651- }
652- } else {
653- _ = d .Set ("ip_id" , "" )
654- }
641+ if server .PrivateIP != nil {
642+ _ = d .Set ("private_ip" , types .FlattenStringPtr (server .PrivateIP ))
643+ }
655644
656- if server .PublicIP != nil { //nolint:staticcheck
657- _ = d .Set ("public_ip" , server .PublicIP .Address .String ()) //nolint:staticcheck
658- d .SetConnInfo (map [string ]string {
659- "type" : "ssh" ,
660- "host" : server .PublicIP .Address .String (), //nolint:staticcheck
661- })
645+ if _ , hasIPID := d .GetOk ("ip_id" ); server .PublicIP != nil && hasIPID { //nolint:staticcheck
646+ if ! server .PublicIP .Dynamic { //nolint:staticcheck
647+ _ = d .Set ("ip_id" , zonal .NewID (zone , server .PublicIP .ID ).String ()) //nolint:staticcheck
662648 } else {
663- _ = d .Set ("public_ip" , "" )
664- d .SetConnInfo (nil )
649+ _ = d .Set ("ip_id" , "" )
665650 }
651+ } else {
652+ _ = d .Set ("ip_id" , "" )
653+ }
666654
667- if len (server .PublicIPs ) > 0 {
668- _ = d .Set ("public_ips" , flattenServerPublicIPs (server .Zone , server .PublicIPs ))
669- } else {
670- _ = d .Set ("public_ips" , []interface {}{})
671- }
655+ if server .PublicIP != nil { //nolint:staticcheck
656+ _ = d .Set ("public_ip" , server .PublicIP .Address .String ()) //nolint:staticcheck
657+ d .SetConnInfo (map [string ]string {
658+ "type" : "ssh" ,
659+ "host" : server .PublicIP .Address .String (), //nolint:staticcheck
660+ })
661+ } else {
662+ _ = d .Set ("public_ip" , "" )
663+ d .SetConnInfo (nil )
664+ }
672665
673- if _ , hasIPIDs := d . GetOk ( "ip_ids" ); hasIPIDs {
674- _ = d .Set ("ip_ids " , flattenServerIPIDs ( server .PublicIPs ))
675- } else {
676- _ = d .Set ("ip_ids " , []interface {}{})
677- }
666+ if len ( server . PublicIPs ) > 0 {
667+ _ = d .Set ("public_ips " , flattenServerPublicIPs ( server . Zone , server .PublicIPs ))
668+ } else {
669+ _ = d .Set ("public_ips " , []interface {}{})
670+ }
678671
679- if server .IPv6 != nil { //nolint:staticcheck
680- _ = d .Set ("ipv6_address" , server .IPv6 .Address .String ()) //nolint:staticcheck
681- _ = d .Set ("ipv6_gateway" , server .IPv6 .Gateway .String ()) //nolint:staticcheck
672+ if _ , hasIPIDs := d .GetOk ("ip_ids" ); hasIPIDs {
673+ _ = d .Set ("ip_ids" , flattenServerIPIDs (server .PublicIPs ))
674+ } else {
675+ _ = d .Set ("ip_ids" , []interface {}{})
676+ }
682677
683- prefixLength , err := strconv .Atoi (server .IPv6 .Netmask ) //nolint:staticcheck
684- if err != nil {
685- return diag .FromErr (err )
686- }
678+ if server .IPv6 != nil { //nolint:staticcheck
679+ _ = d .Set ("ipv6_address" , server .IPv6 .Address .String ()) //nolint:staticcheck
680+ _ = d .Set ("ipv6_gateway" , server .IPv6 .Gateway .String ()) //nolint:staticcheck
687681
688- _ = d .Set ("ipv6_prefix_length" , prefixLength )
689- } else {
690- _ = d .Set ("ipv6_address" , nil )
691- _ = d .Set ("ipv6_gateway" , nil )
692- _ = d .Set ("ipv6_prefix_length" , nil )
682+ prefixLength , err := strconv .Atoi (server .IPv6 .Netmask ) //nolint:staticcheck
683+ if err != nil {
684+ return diag .FromErr (err )
693685 }
694686
695- var additionalVolumesIDs []string
696-
697- for i , serverVolume := range sortVolumeServer (server .Volumes ) {
698- if i == 0 {
699- rootVolume := map [string ]interface {}{}
700-
701- vs , ok := d .Get ("root_volume" ).([]map [string ]interface {})
702- if ok && len (vs ) > 0 {
703- rootVolume = vs [0 ]
704- }
705-
706- vol , err := api .GetUnknownVolume (& instancehelpers.GetUnknownVolumeRequest {
707- VolumeID : serverVolume .ID ,
708- Zone : server .Zone ,
709- })
710- if err != nil {
711- return diag .FromErr (fmt .Errorf ("failed to read instance volume %s: %w" , serverVolume .ID , err ))
712- }
713-
714- rootVolume ["volume_id" ] = zonal .NewID (zone , vol .ID ).String ()
715- if vol .Size != nil {
716- rootVolume ["size_in_gb" ] = int (uint64 (* vol .Size ) / gb )
717- } else if serverVolume .Size != nil {
718- rootVolume ["size_in_gb" ] = int (uint64 (* serverVolume .Size ) / gb )
719- }
687+ _ = d .Set ("ipv6_prefix_length" , prefixLength )
688+ } else {
689+ _ = d .Set ("ipv6_address" , nil )
690+ _ = d .Set ("ipv6_gateway" , nil )
691+ _ = d .Set ("ipv6_prefix_length" , nil )
692+ }
720693
721- if vol .IsBlockVolume () {
722- rootVolume ["sbs_iops" ] = types .FlattenUint32Ptr (vol .Iops )
723- }
694+ var additionalVolumesIDs []string
724695
725- _ , rootVolumeAttributeSet := d .GetOk ("root_volume" ) // Related to https://github.com/hashicorp/terraform-plugin-sdk/issues/142
726- rootVolume ["delete_on_termination" ] = d .Get ("root_volume.0.delete_on_termination" ).(bool ) || ! rootVolumeAttributeSet
727- rootVolume ["volume_type" ] = serverVolume .VolumeType
728- rootVolume ["boot" ] = serverVolume .Boot
729- rootVolume ["name" ] = serverVolume .Name
696+ for i , serverVolume := range sortVolumeServer (server .Volumes ) {
697+ if i == 0 {
698+ rootVolume := map [string ]interface {}{}
730699
731- _ = d .Set ("root_volume" , []map [string ]interface {}{ rootVolume })
732- } else {
733- additionalVolumesIDs = append ( additionalVolumesIDs , zonal . NewID ( zone , serverVolume . ID ). String ())
700+ vs , ok : = d .Get ("root_volume" ).( []map [string ]interface {})
701+ if ok && len ( vs ) > 0 {
702+ rootVolume = vs [ 0 ]
734703 }
735- }
736704
737- _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
738- if len (additionalVolumesIDs ) > 0 {
739- _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
740- }
741- ////
742- // Read server user data
743- ////
744- allUserData , _ := api .GetAllServerUserData (& instanceSDK.GetAllServerUserDataRequest {
745- Zone : zone ,
746- ServerID : id ,
747- }, scw .WithContext (ctx ))
705+ vol , err := api .GetUnknownVolume (& instancehelpers.GetUnknownVolumeRequest {
706+ VolumeID : serverVolume .ID ,
707+ Zone : server .Zone ,
708+ })
709+ if err != nil {
710+ return diag .FromErr (fmt .Errorf ("failed to read instance volume %s: %w" , serverVolume .ID , err ))
711+ }
748712
749- userData := make (map [string ]interface {})
713+ rootVolume ["volume_id" ] = zonal .NewID (zone , vol .ID ).String ()
714+ if vol .Size != nil {
715+ rootVolume ["size_in_gb" ] = int (uint64 (* vol .Size ) / gb )
716+ } else if serverVolume .Size != nil {
717+ rootVolume ["size_in_gb" ] = int (uint64 (* serverVolume .Size ) / gb )
718+ }
750719
751- for key , value := range allUserData .UserData {
752- userDataValue , err := io .ReadAll (value )
753- if err != nil {
754- return diag .FromErr (err )
720+ if vol .IsBlockVolume () {
721+ rootVolume ["sbs_iops" ] = types .FlattenUint32Ptr (vol .Iops )
755722 }
756723
757- userData [key ] = string (userDataValue )
724+ _ , rootVolumeAttributeSet := d .GetOk ("root_volume" ) // Related to https://github.com/hashicorp/terraform-plugin-sdk/issues/142
725+ rootVolume ["delete_on_termination" ] = d .Get ("root_volume.0.delete_on_termination" ).(bool ) || ! rootVolumeAttributeSet
726+ rootVolume ["volume_type" ] = serverVolume .VolumeType
727+ rootVolume ["boot" ] = serverVolume .Boot
728+ rootVolume ["name" ] = serverVolume .Name
729+
730+ _ = d .Set ("root_volume" , []map [string ]interface {}{rootVolume })
731+ } else {
732+ additionalVolumesIDs = append (additionalVolumesIDs , zonal .NewID (zone , serverVolume .ID ).String ())
758733 }
734+ }
735+
736+ _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
737+ if len (additionalVolumesIDs ) > 0 {
738+ _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
739+ }
740+ ////
741+ // Read server user data
742+ ////
743+ allUserData , _ := api .GetAllServerUserData (& instanceSDK.GetAllServerUserDataRequest {
744+ Zone : zone ,
745+ ServerID : id ,
746+ }, scw .WithContext (ctx ))
759747
760- _ = d . Set ( "user_data" , userData )
748+ userData := make ( map [ string ] interface {} )
761749
762- ////
763- // Read server private networks
764- ////
765- ph , err := newPrivateNICHandler (api .API , id , zone )
750+ for key , value := range allUserData .UserData {
751+ userDataValue , err := io .ReadAll (value )
766752 if err != nil {
767753 return diag .FromErr (err )
768754 }
769755
770- // set private networks
771- err = ph .set (d )
772- if err != nil {
773- return diag .FromErr (err )
774- }
756+ userData [key ] = string (userDataValue )
757+ }
775758
776- return nil
759+ _ = d .Set ("user_data" , userData )
760+
761+ ////
762+ // Read server private networks
763+ ////
764+ ph , err := newPrivateNICHandler (api .API , id , zone )
765+ if err != nil {
766+ return diag .FromErr (err )
767+ }
768+
769+ // set private networks
770+ err = ph .set (d )
771+ if err != nil {
772+ return diag .FromErr (err )
777773 }
778774
779775 return nil
0 commit comments