Skip to content

Commit 6374f8f

Browse files
committed
Merge branch 'feat/support-custom-resource' of github.com:yfodil/terraform-provider-scaleway into feat/support-custom-resource
2 parents f4d9258 + 5d9cacb commit 6374f8f

30 files changed

+27758
-65194
lines changed

docs/resources/baremetal_server.md

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Creates and manages Scaleway Compute Baremetal servers. For more information, se
1212
### Basic
1313

1414
```terraform
15-
data "scaleway_account_ssh_key" "main" {
15+
data "scaleway_iam_ssh_key" "main" {
1616
name = "main"
1717
}
1818
@@ -27,7 +27,7 @@ resource "scaleway_baremetal_server" "base" {
2727
### With option
2828

2929
```terraform
30-
data "scaleway_account_ssh_key" "main" {
30+
data "scaleway_iam_ssh_key" "main" {
3131
name = "main"
3232
}
3333
@@ -71,7 +71,7 @@ resource "scaleway_baremetal_server" "base" {
7171
### With private network
7272

7373
```terraform
74-
data "scaleway_account_ssh_key" "main" {
74+
data "scaleway_iam_ssh_key" "main" {
7575
name = "main"
7676
}
7777
@@ -111,6 +111,64 @@ resource "scaleway_baremetal_server" "base" {
111111
}
112112
```
113113

114+
### With IPAM IP IDs
115+
116+
```terraform
117+
resource "scaleway_vpc" "vpc01" {
118+
name = "vpc_baremetal"
119+
}
120+
121+
resource "scaleway_vpc_private_network" "pn01" {
122+
name = "private_network_baremetal"
123+
ipv4_subnet {
124+
subnet = "172.16.64.0/22"
125+
}
126+
vpc_id = scaleway_vpc.vpc01.id
127+
}
128+
129+
resource "scaleway_ipam_ip" "ip01" {
130+
address = "172.16.64.7"
131+
source {
132+
private_network_id = scaleway_vpc_private_network.pn01.id
133+
}
134+
}
135+
136+
data "scaleway_iam_ssh_key" "my_key" {
137+
name = "main"
138+
}
139+
140+
data "scaleway_baremetal_os" "my_os" {
141+
zone = "fr-par-1"
142+
name = "Ubuntu"
143+
version = "22.04 LTS (Jammy Jellyfish)"
144+
}
145+
146+
data "scaleway_baremetal_offer" "my_offer" {
147+
zone = "fr-par-1"
148+
name = "EM-A115X-SSD"
149+
}
150+
151+
data "scaleway_baremetal_option" "private_network" {
152+
zone = "fr-par-1"
153+
name = "Private Network"
154+
}
155+
156+
resource "scaleway_baremetal_server" "base" {
157+
zone = "fr-par-2"
158+
offer = data.scaleway_baremetal_offer.my_offer.offer_id
159+
os = data.scaleway_baremetal_os.my_os.os_id
160+
ssh_key_ids = [data.scaleway_account_ssh_key.my_key.id]
161+
162+
options {
163+
id = data.scaleway_baremetal_option.private_network.option_id
164+
}
165+
private_network {
166+
id = scaleway_vpc_private_network.pn01.id
167+
ipam_ip_ids = [scaleway_ipam_ip.ip01.id]
168+
}
169+
}
170+
```
171+
114172
### Without install config
115173

116174
```terraform
@@ -156,6 +214,7 @@ The following arguments are supported:
156214
- `expires_at` - (Optional) The auto expiration date for compatible options
157215
- `private_network` - (Required) The private networks to attach to the server. For more information, see [the documentation](https://www.scaleway.com/en/docs/compute/elastic-metal/how-to/use-private-networks/)
158216
- `id` - (Required) The id of the private network to attach.
217+
- `ipam_ip_ids` - (Optional) List of IPAM IP IDs to assign to the server in the requested private network.
159218
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which the server should be created.
160219
- `project_id` - (Defaults to [provider](../index.md#project_id) `project_id`) The ID of the project the server is associated with.
161220

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/nats-io/jwt/v2 v2.7.0
2424
github.com/nats-io/nats.go v1.37.0
2525
github.com/robfig/cron/v3 v3.0.1
26-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30.0.20241016121547-71e46305b9a0
26+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30.0.20241021115642-2d127a2d76c7
2727
github.com/stretchr/testify v1.9.0
2828
golang.org/x/crypto v0.27.0
2929
gopkg.in/dnaeon/go-vcr.v3 v3.2.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@ github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXq
242242
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
243243
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
244244
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
245-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30.0.20241016121547-71e46305b9a0 h1:bykODWS911XOzQZ+WfJ2NmWmFcB0Iuod5+brNIUeNqE=
246-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30.0.20241016121547-71e46305b9a0/go.mod h1:3jrRJM7638J+P33hKy9MBvfOBxNo8pEGNQQoIv65Ihg=
245+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30.0.20241021115642-2d127a2d76c7 h1:mWi3yS37Lhf73OP2Z4CboKtXJM4mWDAUWFHKSx2WK7k=
246+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30.0.20241021115642-2d127a2d76c7/go.mod h1:3jrRJM7638J+P33hKy9MBvfOBxNo8pEGNQQoIv65Ihg=
247247
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
248248
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
249249
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=

internal/locality/regional/ids.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,14 @@ func ParseID(regionalID string) (region scw.Region, id string, err error) {
6565
region, err = scw.ParseRegion(loc)
6666
return
6767
}
68+
69+
func NewRegionalIDs(region scw.Region, ids []string) []string {
70+
if ids == nil {
71+
return nil
72+
}
73+
flattenedIDs := make([]string, len(ids))
74+
for i, id := range ids {
75+
flattenedIDs[i] = NewIDString(region, id)
76+
}
77+
return flattenedIDs
78+
}

internal/services/baremetal/helpers.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import (
55
"context"
66
"errors"
77
"fmt"
8+
"sort"
89
"time"
910

1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1112
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
13+
baremetalV3 "github.com/scaleway/scaleway-sdk-go/api/baremetal/v3"
1214
"github.com/scaleway/scaleway-sdk-go/scw"
1315
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
1416
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
@@ -47,8 +49,8 @@ func NewAPIWithZoneAndID(m interface{}, id string) (*baremetal.API, zonal.ID, er
4749
}
4850

4951
// returns a new private network API and the zone for a Create request
50-
func newPrivateNetworkAPIWithZone(d *schema.ResourceData, m interface{}) (*baremetal.PrivateNetworkAPI, scw.Zone, error) {
51-
privateNetworkAPI := baremetal.NewPrivateNetworkAPI(meta.ExtractScwClient(m))
52+
func newPrivateNetworkAPIWithZone(d *schema.ResourceData, m interface{}) (*baremetalV3.PrivateNetworkAPI, scw.Zone, error) {
53+
privateNetworkAPI := baremetalV3.NewPrivateNetworkAPI(meta.ExtractScwClient(m))
5254

5355
zone, err := meta.ExtractZone(d, m)
5456
if err != nil {
@@ -58,8 +60,8 @@ func newPrivateNetworkAPIWithZone(d *schema.ResourceData, m interface{}) (*barem
5860
}
5961

6062
// NewPrivateNetworkAPIWithZoneAndID returns a private network API with zone and ID extracted from the state
61-
func NewPrivateNetworkAPIWithZoneAndID(m interface{}, id string) (*baremetal.PrivateNetworkAPI, zonal.ID, error) {
62-
privateNetworkAPI := baremetal.NewPrivateNetworkAPI(meta.ExtractScwClient(m))
63+
func NewPrivateNetworkAPIWithZoneAndID(m interface{}, id string) (*baremetalV3.PrivateNetworkAPI, zonal.ID, error) {
64+
privateNetworkAPI := baremetalV3.NewPrivateNetworkAPI(meta.ExtractScwClient(m))
6365

6466
zone, ID, err := zonal.ParseID(id)
6567
if err != nil {
@@ -73,7 +75,7 @@ func detachAllPrivateNetworkFromServer(ctx context.Context, d *schema.ResourceDa
7375
if err != nil {
7476
return err
7577
}
76-
listPrivateNetwork, err := privateNetworkAPI.ListServerPrivateNetworks(&baremetal.PrivateNetworkAPIListServerPrivateNetworksRequest{
78+
listPrivateNetwork, err := privateNetworkAPI.ListServerPrivateNetworks(&baremetalV3.PrivateNetworkAPIListServerPrivateNetworksRequest{
7779
Zone: zone,
7880
ServerID: &serverID,
7981
}, scw.WithContext(ctx))
@@ -82,7 +84,7 @@ func detachAllPrivateNetworkFromServer(ctx context.Context, d *schema.ResourceDa
8284
}
8385

8486
for _, pn := range listPrivateNetwork.ServerPrivateNetworks {
85-
err := privateNetworkAPI.DeleteServerPrivateNetwork(&baremetal.PrivateNetworkAPIDeleteServerPrivateNetworkRequest{
87+
err := privateNetworkAPI.DeleteServerPrivateNetwork(&baremetalV3.PrivateNetworkAPIDeleteServerPrivateNetworkRequest{
8688
Zone: zone,
8789
ServerID: serverID,
8890
PrivateNetworkID: pn.PrivateNetworkID,
@@ -187,12 +189,26 @@ func customDiffPrivateNetworkOption() func(ctx context.Context, diff *schema.Res
187189
}
188190

189191
func privateNetworkSetHash(v interface{}) int {
190-
var buf bytes.Buffer
191-
192192
m := v.(map[string]interface{})
193-
if pnID, ok := m["id"]; ok {
194-
buf.WriteString(locality.ExpandID(pnID))
193+
id := locality.ExpandID(m["id"].(string))
194+
195+
var buf bytes.Buffer
196+
buf.WriteString(id)
197+
198+
if ipamIPs, ok := m["ipam_ip_ids"]; ok && ipamIPs != nil {
199+
ipamIPsList := ipamIPs.([]interface{})
200+
var ipamIPIDs []string
201+
for _, ip := range ipamIPsList {
202+
if ipStr, ok := ip.(string); ok && ipStr != "" {
203+
ipamIPIDs = append(ipamIPIDs, ipStr)
204+
}
205+
}
206+
sort.Strings(ipamIPIDs)
207+
for _, ipID := range ipamIPIDs {
208+
buf.WriteString("-")
209+
buf.WriteString(ipID)
210+
}
195211
}
196212

197-
return types.StringHashcode(buf.String())
213+
return schema.HashString(buf.String())
198214
}

internal/services/baremetal/server.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1111
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1212
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
13+
baremetalV3 "github.com/scaleway/scaleway-sdk-go/api/baremetal/v3"
1314
"github.com/scaleway/scaleway-sdk-go/scw"
1415
sdkValidation "github.com/scaleway/scaleway-sdk-go/validation"
1516
"github.com/scaleway/terraform-provider-scaleway/v2/internal/cdf"
@@ -220,6 +221,16 @@ If this behaviour is wanted, please set 'reinstall_on_ssh_key_changes' argument
220221
return locality.ExpandID(i.(string))
221222
},
222223
},
224+
"ipam_ip_ids": {
225+
Type: schema.TypeList,
226+
Optional: true,
227+
Computed: true,
228+
Elem: &schema.Schema{
229+
Type: schema.TypeString,
230+
ValidateDiagFunc: verify.IsUUIDorUUIDWithLocality(),
231+
},
232+
Description: "List of IPAM IP IDs to attach to the server",
233+
},
223234
// computed
224235
"vlan": {
225236
Type: schema.TypeInt,
@@ -370,10 +381,10 @@ func ResourceServerCreate(ctx context.Context, d *schema.ResourceData, m interfa
370381

371382
privateNetworkIDs, pnExist := d.GetOk("private_network")
372383
if pnExist {
373-
createBaremetalPrivateNetworkRequest := &baremetal.PrivateNetworkAPISetServerPrivateNetworksRequest{
374-
Zone: zone,
375-
ServerID: server.ID,
376-
PrivateNetworkIDs: expandPrivateNetworks(privateNetworkIDs),
384+
createBaremetalPrivateNetworkRequest := &baremetalV3.PrivateNetworkAPISetServerPrivateNetworksRequest{
385+
Zone: zone,
386+
ServerID: server.ID,
387+
PerPrivateNetworkIpamIPIDs: expandPrivateNetworks(privateNetworkIDs),
377388
}
378389

379390
baremetalPrivateNetwork, err := privateNetworkAPI.SetServerPrivateNetworks(
@@ -457,7 +468,7 @@ func ResourceServerRead(ctx context.Context, d *schema.ResourceData, m interface
457468
_ = d.Set("description", server.Description)
458469
_ = d.Set("options", flattenOptions(server.Zone, server.Options))
459470

460-
listPrivateNetworks, err := privateNetworkAPI.ListServerPrivateNetworks(&baremetal.PrivateNetworkAPIListServerPrivateNetworksRequest{
471+
listPrivateNetworks, err := privateNetworkAPI.ListServerPrivateNetworks(&baremetalV3.PrivateNetworkAPIListServerPrivateNetworksRequest{
461472
Zone: server.Zone,
462473
ServerID: &server.ID,
463474
})
@@ -533,12 +544,12 @@ func ResourceServerUpdate(ctx context.Context, d *schema.ResourceData, m interfa
533544
}
534545

535546
if d.HasChange("private_network") {
536-
privateNetworkIDs := d.Get("private_network")
547+
privateNetworks := d.Get("private_network")
537548

538-
updateBaremetalPrivateNetworkRequest := &baremetal.PrivateNetworkAPISetServerPrivateNetworksRequest{
539-
Zone: zone,
540-
ServerID: server.ID,
541-
PrivateNetworkIDs: expandPrivateNetworks(privateNetworkIDs),
549+
updateBaremetalPrivateNetworkRequest := &baremetalV3.PrivateNetworkAPISetServerPrivateNetworksRequest{
550+
Zone: zone,
551+
ServerID: server.ID,
552+
PerPrivateNetworkIpamIPIDs: expandPrivateNetworks(privateNetworks),
542553
}
543554

544555
baremetalPrivateNetwork, err := privateNetworkAPI.SetServerPrivateNetworks(

0 commit comments

Comments
 (0)