@@ -600,180 +600,198 @@ func ResourceInstanceServerRead(ctx context.Context, d *schema.ResourceData, m i
600600
601601 return diag .FromErr (err )
602602 }
603+
603604 ////
604605 // Read Server
605606 ////
607+ state , err := serverStateFlatten (server .State )
608+ if err != nil {
609+ return diag .FromErr (err )
610+ }
606611
607- if err == nil {
608- state , err := serverStateFlatten (server .State )
609- if err != nil {
610- return diag .FromErr (err )
611- }
612+ _ = d .Set ("state" , state )
613+ _ = d .Set ("zone" , string (zone ))
614+ _ = d .Set ("name" , server .Name )
615+ _ = d .Set ("boot_type" , server .BootType )
612616
613- _ = d .Set ("state " , state )
614- _ = d . Set ( "zone" , string ( zone ))
615- _ = d .Set ("name " , server .Name )
616- _ = d . Set ( "boot_type" , server . BootType )
617+ _ = d .Set ("type " , server . CommercialType )
618+ if len ( server . Tags ) > 0 {
619+ _ = d .Set ("tags " , server .Tags )
620+ }
617621
618- _ = d .Set ("type" , server .CommercialType )
619- if len (server .Tags ) > 0 {
620- _ = d .Set ("tags" , server .Tags )
621- }
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 )
622629
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- }
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+ }
636635
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- }
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+ }
641640
642- if server .PrivateIP != nil {
643- _ = d .Set ("private_ip" , types .FlattenStringPtr (server .PrivateIP ))
644- }
641+ if server .PrivateIP != nil {
642+ _ = d .Set ("private_ip" , types .FlattenStringPtr (server .PrivateIP ))
643+ }
645644
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- }
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
652648 } else {
653649 _ = d .Set ("ip_id" , "" )
654650 }
651+ } else {
652+ _ = d .Set ("ip_id" , "" )
653+ }
655654
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- })
662- } else {
663- _ = d .Set ("public_ip" , "" )
664- d .SetConnInfo (nil )
665- }
666-
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
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+ }
696693
697- for i , serverVolume := range sortVolumeServer (server .Volumes ) {
698- if i == 0 {
699- rootVolume := map [string ]interface {}{}
694+ var additionalVolumesIDs []string
700695
701- vs , ok := d .Get ("root_volume" ).([]map [string ]interface {})
702- if ok && len (vs ) > 0 {
703- rootVolume = vs [0 ]
704- }
696+ for i , serverVolume := range sortVolumeServer (server .Volumes ) {
697+ if i == 0 {
698+ rootVolume := map [string ]interface {}{}
705699
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- }
700+ vs , ok := d .Get ("root_volume" ).([]map [string ]interface {})
701+ if ok && len (vs ) > 0 {
702+ rootVolume = vs [0 ]
703+ }
720704
721- if vol .IsBlockVolume () {
722- rootVolume ["sbs_iops" ] = types .FlattenUint32Ptr (vol .Iops )
723- }
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+ }
724712
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
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+ }
730719
731- _ = d .Set ("root_volume" , []map [string ]interface {}{rootVolume })
732- } else {
733- additionalVolumesIDs = append (additionalVolumesIDs , zonal .NewID (zone , serverVolume .ID ).String ())
720+ if vol .IsBlockVolume () {
721+ rootVolume ["sbs_iops" ] = types .FlattenUint32Ptr (vol .Iops )
734722 }
735- }
736723
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 ))
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
748729
749- userData := make (map [string ]interface {})
730+ _ = d .Set ("root_volume" , []map [string ]interface {}{rootVolume })
731+ } else {
732+ additionalVolumesIDs = append (additionalVolumesIDs , zonal .NewID (zone , serverVolume .ID ).String ())
733+ }
734+ }
750735
751- for key , value := range allUserData .UserData {
752- userDataValue , err := io .ReadAll (value )
753- if err != nil {
754- return diag .FromErr (err )
755- }
736+ _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
737+ if len (additionalVolumesIDs ) > 0 {
738+ _ = d .Set ("additional_volume_ids" , additionalVolumesIDs )
739+ }
756740
757- userData [key ] = string (userDataValue )
758- }
741+ ////
742+ // Read server user data
743+ ////
744+ allUserData , _ := api .GetAllServerUserData (& instanceSDK.GetAllServerUserDataRequest {
745+ Zone : zone ,
746+ ServerID : id ,
747+ }, scw .WithContext (ctx ))
759748
760- _ = d . Set ( "user_data" , userData )
749+ userData := make ( map [ string ] interface {} )
761750
762- ////
763- // Read server private networks
764- ////
765- ph , err := newPrivateNICHandler (api .API , id , zone )
751+ for key , value := range allUserData .UserData {
752+ userDataValue , err := io .ReadAll (value )
766753 if err != nil {
767754 return diag .FromErr (err )
768755 }
769756
770- // set private networks
771- err = ph .set (d )
757+ userData [key ] = string (userDataValue )
758+ }
759+
760+ _ = d .Set ("user_data" , userData )
761+
762+ ////
763+ // Read server private networks
764+ ////
765+ ph , err := newPrivateNICHandler (api .API , id , zone )
766+ if err != nil {
767+ return diag .FromErr (err )
768+ }
769+
770+ // set private networks
771+ err = ph .set (d )
772+ if err != nil {
773+ return diag .FromErr (err )
774+ }
775+
776+ ////
777+ // Display warning if server will soon reach End of Service
778+ ////
779+ if server .EndOfService {
780+ compatibleTypes , err := api .GetServerCompatibleTypes (& instanceSDK.GetServerCompatibleTypesRequest {
781+ Zone : zone ,
782+ ServerID : id ,
783+ }, scw .WithContext (ctx ))
772784 if err != nil {
773785 return diag .FromErr (err )
774786 }
775787
776- return nil
788+ return diag.Diagnostics {diag.Diagnostic {
789+ Severity : diag .Warning ,
790+ Detail : fmt .Sprintf ("Instance type %q will soon reach End of Service" , server .CommercialType ),
791+ Summary : fmt .Sprintf (`Your Instance will soon reach End of Service. You can check the exact date on the Scaleway console. We recommend that you migrate your Instance before that.
792+ Here are the best options for %q, ordered by relevance: [%s]` , server .CommercialType , strings .Join (compatibleTypes .CompatibleTypes , ", " )),
793+ AttributePath : cty .GetAttrPath ("type" ),
794+ }}
777795 }
778796
779797 return nil
0 commit comments