Skip to content

Commit ada770a

Browse files
committed
feat(apple-silicon): add support vpc
1 parent 581183a commit ada770a

File tree

3 files changed

+167
-1
lines changed

3 files changed

+167
-1
lines changed

internal/services/applesilicon/server.go

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package applesilicon
22

33
import (
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))
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package applesilicon
2+
3+
import (
4+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
5+
applesilicon "github.com/scaleway/scaleway-sdk-go/api/applesilicon/v1alpha1"
6+
"github.com/scaleway/scaleway-sdk-go/scw"
7+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
8+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
9+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
10+
)
11+
12+
func expandPrivateNetworks(pn interface{}) map[string]*[]string {
13+
privateNetworks := make(map[string]*[]string)
14+
15+
for _, op := range pn.(*schema.Set).List() {
16+
rawPN := op.(map[string]interface{})
17+
id := locality.ExpandID(rawPN["id"].(string))
18+
19+
ipamIPIDs := &[]string{}
20+
if ipamIPs, ok := rawPN["ipam_ip_ids"]; ok && ipamIPs != nil {
21+
ipamIPsList := ipamIPs.([]interface{})
22+
if len(ipamIPsList) > 0 {
23+
ips := make([]string, len(ipamIPsList))
24+
for i, ip := range ipamIPsList {
25+
ips[i] = locality.ExpandID(ip.(string))
26+
}
27+
ipamIPIDs = &ips
28+
}
29+
}
30+
privateNetworks[id] = ipamIPIDs
31+
}
32+
return privateNetworks
33+
}
34+
35+
func flattenPrivateNetworks(region scw.Region, privateNetworks []*applesilicon.ServerPrivateNetwork) interface{} {
36+
flattenedPrivateNetworks := []map[string]interface{}(nil)
37+
for _, privateNetwork := range privateNetworks {
38+
flattenedPrivateNetworks = append(flattenedPrivateNetworks, map[string]interface{}{
39+
"id": regional.NewIDString(region, privateNetwork.PrivateNetworkID),
40+
"ipam_ip_ids": regional.NewRegionalIDs(region, privateNetwork.IpamIPIDs),
41+
"vlan": types.FlattenUint32Ptr(privateNetwork.Vlan),
42+
"status": privateNetwork.Status,
43+
"created_at": types.FlattenTime(privateNetwork.CreatedAt),
44+
"updated_at": types.FlattenTime(privateNetwork.UpdatedAt),
45+
})
46+
}
47+
return flattenedPrivateNetworks
48+
}

internal/services/applesilicon/waiters.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,19 @@ func waitForAppleSiliconServer(ctx context.Context, api *applesilicon.API, zone
2929

3030
return server, err
3131
}
32+
33+
func waitForAppleSiliconPrivateNetworkServer(ctx context.Context, api *applesilicon.PrivateNetworkAPI, zone scw.Zone, serverID string, timeout time.Duration) (*[]applesilicon.ServerPrivateNetwork, error) {
34+
retryInterval := defaultAppleSiliconServerRetryInterval
35+
if transport.DefaultWaitRetryInterval != nil {
36+
retryInterval = *transport.DefaultWaitRetryInterval
37+
}
38+
39+
privateNetwork, err := api.WaitForServerPrivateNetworks(&applesilicon.WaitForServerRequest{
40+
ServerID: serverID,
41+
Zone: zone,
42+
Timeout: scw.TimeDurationPtr(timeout),
43+
RetryInterval: &retryInterval,
44+
}, scw.WithContext(ctx))
45+
46+
return privateNetwork, err
47+
}

0 commit comments

Comments
 (0)