@@ -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 ,
@@ -149,10 +218,21 @@ func ResourceAppleSiliconServerRead(ctx context.Context, d *schema.ResourceData,
149218 _ = d .Set ("ip" , res .IP .String ())
150219 _ = d .Set ("vnc_url" , res .VncURL )
151220 _ = d .Set ("vpc_status" , res .VpcStatus )
152-
153221 _ = d .Set ("zone" , res .Zone .String ())
154222 _ = d .Set ("organization_id" , res .OrganizationID )
155223 _ = d .Set ("project_id" , res .ProjectID )
224+ listPrivateNetworks , err := privateNetworkAPI .ListServerPrivateNetworks (& applesilicon.PrivateNetworkAPIListServerPrivateNetworksRequest {
225+ Zone : res .Zone ,
226+ ServerID : & res .ID ,
227+ })
228+ if err != nil {
229+ return diag .FromErr (err )
230+ }
231+ pnRegion , err := res .Zone .Region ()
232+ if err != nil {
233+ return diag .FromErr (err )
234+ }
235+ _ = d .Set ("private_network" , flattenPrivateNetworks (pnRegion , listPrivateNetworks .ServerPrivateNetworks ))
156236
157237 return nil
158238}
@@ -163,6 +243,8 @@ func ResourceAppleSiliconServerUpdate(ctx context.Context, d *schema.ResourceDat
163243 return diag .FromErr (err )
164244 }
165245
246+ privateNetworkAPI := applesilicon .NewPrivateNetworkAPI (meta .ExtractScwClient (m ))
247+
166248 req := & applesilicon.UpdateServerRequest {
167249 Zone : zone ,
168250 ServerID : ID ,
@@ -175,6 +257,26 @@ func ResourceAppleSiliconServerUpdate(ctx context.Context, d *schema.ResourceDat
175257 if d .HasChange ("enable_vpc" ) {
176258 enableVpc := d .Get ("enable_vpc" ).(bool )
177259 req .EnableVpc = & enableVpc
260+ if ! enableVpc {
261+ listPrivateNetworks , err := privateNetworkAPI .ListServerPrivateNetworks (& applesilicon.PrivateNetworkAPIListServerPrivateNetworksRequest {
262+ Zone : res .Zone ,
263+ ServerID : & res .ID ,
264+ })
265+ if err != nil {
266+ return diag .FromErr (err )
267+ }
268+ for _ , v := range listPrivateNetworks .ServerPrivateNetworks {
269+ err = privateNetworkAPI .DeleteServerPrivateNetwork (& applesilicon.PrivateNetworkAPIDeleteServerPrivateNetworkRequest {
270+ Zone : zone ,
271+ ServerID : v .ServerID ,
272+ PrivateNetworkID : v .PrivateNetworkID ,
273+ })
274+ if err != nil {
275+ return diag .FromErr (err )
276+ }
277+ }
278+
279+ }
178280 }
179281
180282 _ , err = asAPI .UpdateServer (req , scw .WithContext (ctx ))
0 commit comments