@@ -2,6 +2,9 @@ package applesilicon
22
33import (
44 "context"
5+ "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
6+ "github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
7+ "github.com/scaleway/terraform-provider-scaleway/v2/internal/verify"
58 "time"
69
710 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -47,6 +50,55 @@ func ResourceServer() *schema.Resource {
4750 Default : false ,
4851 Description : "Whether or not to enable VPC access" ,
4952 },
53+ "private_network" : {
54+ Type : schema .TypeSet ,
55+ Optional : true ,
56+ Description : "The private networks to attach to the server" ,
57+ Elem : & schema.Resource {
58+ Schema : map [string ]* schema.Schema {
59+ "id" : {
60+ Type : schema .TypeString ,
61+ Description : "The private network ID" ,
62+ Required : true ,
63+ ValidateDiagFunc : verify .IsUUIDorUUIDWithLocality (),
64+ StateFunc : func (i interface {}) string {
65+ return locality .ExpandID (i .(string ))
66+ },
67+ },
68+ "ipam_ip_ids" : {
69+ Type : schema .TypeList ,
70+ Optional : true ,
71+ Computed : true ,
72+ Elem : & schema.Schema {
73+ Type : schema .TypeString ,
74+ ValidateDiagFunc : verify .IsUUIDorUUIDWithLocality (),
75+ },
76+ Description : "List of IPAM IP IDs to attach to the server" ,
77+ },
78+ // computed
79+ "vlan" : {
80+ Type : schema .TypeInt ,
81+ Computed : true ,
82+ Description : "The VLAN ID associated to the private network" ,
83+ },
84+ "status" : {
85+ Type : schema .TypeString ,
86+ Computed : true ,
87+ Description : "The private network status" ,
88+ },
89+ "created_at" : {
90+ Type : schema .TypeString ,
91+ Computed : true ,
92+ Description : "The date and time of the creation of the private network" ,
93+ },
94+ "updated_at" : {
95+ Type : schema .TypeString ,
96+ Computed : true ,
97+ Description : "The date and time of the last update of the private network" ,
98+ },
99+ },
100+ },
101+ },
50102 // Computed
51103 "ip" : {
52104 Type : schema .TypeString ,
@@ -106,6 +158,7 @@ func ResourceAppleSiliconServerCreate(ctx context.Context, d *schema.ResourceDat
106158 }
107159
108160 res , err := asAPI .CreateServer (createReq , scw .WithContext (ctx ))
161+
109162 if err != nil {
110163 return diag .FromErr (err )
111164 }
@@ -117,6 +170,20 @@ func ResourceAppleSiliconServerCreate(ctx context.Context, d *schema.ResourceDat
117170 return diag .FromErr (err )
118171 }
119172
173+ if pn , ok := d .GetOk ("private_network" ); ok {
174+ privateNetworkAPI := applesilicon .NewPrivateNetworkAPI (meta .ExtractScwClient (m ))
175+ req := & applesilicon.PrivateNetworkAPISetServerPrivateNetworksRequest {
176+ Zone : zone ,
177+ ServerID : res .ID ,
178+ PerPrivateNetworkIpamIPIDs : expandPrivateNetworks (pn ),
179+ }
180+ _ , err := privateNetworkAPI .SetServerPrivateNetworks (req , scw .WithContext (ctx ))
181+ if err != nil {
182+ return diag .FromErr (err )
183+ }
184+ _ , err = waitForAppleSiliconPrivateNetworkServer (ctx , privateNetworkAPI , zone , res .ID , d .Timeout (schema .TimeoutCreate ))
185+ }
186+
120187 return ResourceAppleSiliconServerRead (ctx , d , m )
121188}
122189
@@ -126,6 +193,8 @@ func ResourceAppleSiliconServerRead(ctx context.Context, d *schema.ResourceData,
126193 return diag .FromErr (err )
127194 }
128195
196+ privateNetworkAPI := applesilicon .NewPrivateNetworkAPI (meta .ExtractScwClient (m ))
197+
129198 res , err := asAPI .GetServer (& applesilicon.GetServerRequest {
130199 Zone : zone ,
131200 ServerID : ID ,
@@ -147,10 +216,21 @@ func ResourceAppleSiliconServerRead(ctx context.Context, d *schema.ResourceData,
147216 _ = d .Set ("ip" , res .IP .String ())
148217 _ = d .Set ("vnc_url" , res .VncURL )
149218 _ = d .Set ("vpc_status" , res .VpcStatus )
150-
151219 _ = d .Set ("zone" , res .Zone .String ())
152220 _ = d .Set ("organization_id" , res .OrganizationID )
153221 _ = d .Set ("project_id" , res .ProjectID )
222+ listPrivateNetworks , err := privateNetworkAPI .ListServerPrivateNetworks (& applesilicon.PrivateNetworkAPIListServerPrivateNetworksRequest {
223+ Zone : res .Zone ,
224+ ServerID : & res .ID ,
225+ })
226+ if err != nil {
227+ return diag .FromErr (err )
228+ }
229+ pnRegion , err := res .Zone .Region ()
230+ if err != nil {
231+ return diag .FromErr (err )
232+ }
233+ _ = d .Set ("private_network" , flattenPrivateNetworks (pnRegion , listPrivateNetworks .ServerPrivateNetworks ))
154234
155235 return nil
156236}
@@ -161,6 +241,8 @@ func ResourceAppleSiliconServerUpdate(ctx context.Context, d *schema.ResourceDat
161241 return diag .FromErr (err )
162242 }
163243
244+ privateNetworkAPI := applesilicon .NewPrivateNetworkAPI (meta .ExtractScwClient (m ))
245+
164246 req := & applesilicon.UpdateServerRequest {
165247 Zone : zone ,
166248 ServerID : ID ,
@@ -173,6 +255,26 @@ func ResourceAppleSiliconServerUpdate(ctx context.Context, d *schema.ResourceDat
173255 if d .HasChange ("enable_vpc" ) {
174256 enableVpc := d .Get ("enable_vpc" ).(bool )
175257 req .EnableVpc = & enableVpc
258+ if ! enableVpc {
259+ listPrivateNetworks , err := privateNetworkAPI .ListServerPrivateNetworks (& applesilicon.PrivateNetworkAPIListServerPrivateNetworksRequest {
260+ Zone : res .Zone ,
261+ ServerID : & res .ID ,
262+ })
263+ if err != nil {
264+ return diag .FromErr (err )
265+ }
266+ for _ , v := range listPrivateNetworks .ServerPrivateNetworks {
267+ err = privateNetworkAPI .DeleteServerPrivateNetwork (& applesilicon.PrivateNetworkAPIDeleteServerPrivateNetworkRequest {
268+ Zone : zone ,
269+ ServerID : v .ServerID ,
270+ PrivateNetworkID : v .PrivateNetworkID ,
271+ })
272+ if err != nil {
273+ return diag .FromErr (err )
274+ }
275+ }
276+
277+ }
176278 }
177279
178280 _ , err = asAPI .UpdateServer (req , scw .WithContext (ctx ))
0 commit comments