Skip to content

Commit 5fd408a

Browse files
committed
test(baremetal): register cassettes
1 parent 6f4378c commit 5fd408a

File tree

5 files changed

+7078
-82
lines changed

5 files changed

+7078
-82
lines changed

internal/acctest/validate_cassettes_test.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@ const servicesDir = "../services"
2525

2626
func exceptionsCassettesCases() map[string]struct{} {
2727
return map[string]struct{}{
28-
"../services/mnq/testdata/sns-topic-basic.cassette.yaml": {},
29-
"../services/mnq/testdata/sns-topic-subscription-basic.cassette.yaml": {},
30-
"../services/mnq/testdata/sqs-already-activated.cassette.yaml": {},
31-
"../services/object/testdata/bucket-cors-empty-origin.cassette.yaml": {},
32-
"../services/object/testdata/bucket-destroy-force.cassette.yaml": {},
33-
"../services/rdb/testdata/data-source-privilege-basic.cassette.yaml": {},
34-
"../services/rdb/testdata/privilege-basic.cassette.yaml": {},
35-
"../services/object/testdata/object-bucket-destroy-force.cassette.yaml": {},
36-
"../services/secret/testdata/secret-protected.cassette.yaml": {},
37-
"../services/secret/testdata/secret-version-type.cassette.yaml": {},
38-
"../services/file/testdata/file-system-invalid-size-granularity-fails.cassette.yaml": {},
39-
"../services/file/testdata/file-system-size-too-small-fails.cassette.yaml": {},
40-
"../services/container/testdata/namespace-vpc-integration.cassette.yaml": {},
41-
"../services/function/testdata/function-namespace-vpc-integration.cassette.yaml": {},
28+
"../services/mnq/testdata/sns-topic-basic.cassette.yaml": {},
29+
"../services/mnq/testdata/sns-topic-subscription-basic.cassette.yaml": {},
30+
"../services/mnq/testdata/sqs-already-activated.cassette.yaml": {},
31+
"../services/object/testdata/bucket-cors-empty-origin.cassette.yaml": {},
32+
"../services/object/testdata/bucket-destroy-force.cassette.yaml": {},
33+
"../services/rdb/testdata/data-source-privilege-basic.cassette.yaml": {},
34+
"../services/rdb/testdata/privilege-basic.cassette.yaml": {},
35+
"../services/object/testdata/object-bucket-destroy-force.cassette.yaml": {},
36+
"../services/secret/testdata/secret-protected.cassette.yaml": {},
37+
"../services/secret/testdata/secret-version-type.cassette.yaml": {},
38+
"../services/file/testdata/file-system-invalid-size-granularity-fails.cassette.yaml": {},
39+
"../services/file/testdata/file-system-size-too-small-fails.cassette.yaml": {},
40+
"../services/container/testdata/namespace-vpc-integration.cassette.yaml": {},
41+
"../services/function/testdata/function-namespace-vpc-integration.cassette.yaml": {},
42+
"../services/baremetal/testdata/server-cloud-init-not-compatible-offer.cassette.yaml": {},
4243
}
4344
}
4445

internal/services/baremetal/server.go

Lines changed: 12 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,8 @@ package baremetal
22

33
import (
44
"context"
5-
"encoding/base64"
65
"encoding/json"
7-
"errors"
86
"fmt"
9-
"os"
10-
"path/filepath"
11-
"strings"
127

138
"github.com/hashicorp/go-cty/cty"
149
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -380,12 +375,8 @@ func ResourceServerCreate(ctx context.Context, d *schema.ResourceData, m any) di
380375
}
381376

382377
if cloudInit, ok := d.GetOk("cloud_init"); ok {
383-
userData, err := LoadUserDataBase64(cloudInit)
384-
if err != nil {
385-
return diag.FromErr(err)
386-
}
387-
388-
req.UserData = &userData
378+
cloudInitStr := []byte(cloudInit.(string))
379+
req.UserData = &cloudInitStr
389380
}
390381

391382
partitioningSchema := baremetal.Schema{}
@@ -478,54 +469,6 @@ func ResourceServerCreate(ctx context.Context, d *schema.ResourceData, m any) di
478469
return ResourceServerRead(ctx, d, m)
479470
}
480471

481-
func LoadUserDataBase64(cloudInit any) ([]byte, error) {
482-
value := cloudInit.(string)
483-
484-
var content []byte
485-
486-
// If value refers to an existing file, read it. Otherwise treat value as the content.
487-
if fi, err := os.Stat(value); err == nil {
488-
// Only allow regular files
489-
if !fi.Mode().IsRegular() {
490-
return nil, fmt.Errorf("cloud_init path is not a regular file: %s", value)
491-
}
492-
493-
// Resolve absolute path and ensure it is within the current working directory
494-
absPath, err := filepath.Abs(value)
495-
if err != nil {
496-
return nil, err
497-
}
498-
499-
cwd, err := os.Getwd()
500-
if err != nil {
501-
return nil, err
502-
}
503-
504-
absPath = filepath.Clean(absPath)
505-
cwd = filepath.Clean(cwd)
506-
507-
if absPath != cwd && !strings.HasPrefix(absPath, cwd+string(os.PathSeparator)) {
508-
return nil, fmt.Errorf("reading cloud_init from outside working directory is disallowed: %s", value)
509-
}
510-
511-
data, err := os.ReadFile(absPath)
512-
if err != nil {
513-
return nil, err
514-
}
515-
516-
content = data
517-
} else if errors.Is(err, os.ErrNotExist) {
518-
content = []byte(value)
519-
} else {
520-
return nil, err
521-
}
522-
523-
encoded := base64.StdEncoding.EncodeToString(content)
524-
userData := []byte(encoded)
525-
526-
return userData, nil
527-
}
528-
529472
func ResourceServerRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
530473
api, zonedID, err := NewAPIWithZoneAndID(m, d.Id())
531474
if err != nil {
@@ -583,7 +526,13 @@ func ResourceServerRead(ctx context.Context, d *schema.ResourceData, m any) diag
583526
_ = d.Set("ipv4", flattenIPv4s(server.IPs))
584527
_ = d.Set("ipv6", flattenIPv6s(server.IPs))
585528
_ = d.Set("protected", server.Protected)
586-
_ = d.Set("cloud_init", server.UserData)
529+
530+
var cloudInit string
531+
if server.UserData != nil {
532+
cloudInit = string(*server.UserData)
533+
}
534+
535+
_ = d.Set("cloud_init", cloudInit)
587536

588537
if server.Install != nil {
589538
_ = d.Set("os", zonal.NewIDString(server.Zone, os.ID))
@@ -767,14 +716,9 @@ func ResourceServerUpdate(ctx context.Context, d *schema.ResourceData, m any) di
767716
hasChanged := false
768717

769718
if d.HasChange("cloud_init") {
770-
cloudInit := d.Get("cloud_init").(string)
771-
772-
userData, err := LoadUserDataBase64(cloudInit)
773-
if err != nil {
774-
return diag.FromErr(err)
775-
}
776-
777-
req.UserData = &userData
719+
cloudInit, _ := d.Get("cloud_init").(string)
720+
cloudInitStr := []byte(cloudInit)
721+
req.UserData = &cloudInitStr
778722
hasChanged = true
779723
}
780724

internal/services/baremetal/server_test.go

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,179 @@ func TestAccServer_Basic(t *testing.T) {
116116
})
117117
}
118118

119+
func TestAccServer_CloudInit(t *testing.T) {
120+
tt := acctest.NewTestTools(t)
121+
defer tt.Cleanup()
122+
123+
if !IsOfferAvailable(OfferName, scw.Zone(Zone), tt) {
124+
t.Skip("Offer is out of stock")
125+
}
126+
127+
SSHKeyName := "TestAccServer_CloudInit"
128+
name := "TestAccServer_CloudInit"
129+
130+
resource.ParallelTest(t, resource.TestCase{
131+
ProtoV6ProviderFactories: tt.ProviderFactories,
132+
CheckDestroy: baremetalchecks.CheckServerDestroy(tt),
133+
134+
Steps: []resource.TestStep{
135+
{
136+
Config: fmt.Sprintf(`
137+
variable "cloud_init" {
138+
type = string
139+
default = <<EOF
140+
#cloud-config
141+
apt_update: true
142+
apt_upgrade: true
143+
EOF
144+
}
145+
146+
data "scaleway_baremetal_os" "my_os" {
147+
zone = "%s"
148+
name = "Ubuntu"
149+
version = "22.04 LTS (Jammy Jellyfish)"
150+
}
151+
152+
resource "scaleway_iam_ssh_key" "main" {
153+
name = "%s"
154+
public_key = "%s"
155+
}
156+
157+
resource "scaleway_baremetal_server" "base" {
158+
name = "%s"
159+
zone = "%s"
160+
description = "test a description"
161+
offer = "%s"
162+
os = data.scaleway_baremetal_os.my_os.os_id
163+
164+
cloud_init = var.cloud_init
165+
166+
tags = ["terraform-test", "scaleway_baremetal_server", "cloudinit"]
167+
ssh_key_ids = [scaleway_iam_ssh_key.main.id]
168+
}
169+
`, Zone, SSHKeyName, SSHKeyBaremetal, name, Zone, OfferName),
170+
171+
Check: resource.ComposeTestCheckFunc(
172+
testAccCheckBaremetalServerExists(tt, "scaleway_baremetal_server.base"),
173+
resource.TestCheckResourceAttr("scaleway_baremetal_server.base", "name", name),
174+
resource.TestCheckResourceAttr("scaleway_baremetal_server.base", "offer_name", OfferName),
175+
resource.TestCheckResourceAttr("scaleway_baremetal_server.base", "cloud_init", "#cloud-config\napt_update: true\napt_upgrade: true\n"),
176+
),
177+
},
178+
179+
{
180+
// Update cloud-init + reinstall
181+
Config: fmt.Sprintf(`
182+
variable "cloud_init" {
183+
type = string
184+
default = <<EOF
185+
#cloud-config
186+
apt_update: true
187+
apt_upgrade: true
188+
189+
packages:
190+
- curl
191+
EOF
192+
}
193+
194+
data "scaleway_baremetal_os" "my_os" {
195+
zone = "%s"
196+
name = "Ubuntu"
197+
version = "22.04 LTS (Jammy Jellyfish)"
198+
}
199+
200+
resource "scaleway_iam_ssh_key" "main" {
201+
name = "%s"
202+
public_key = "%s"
203+
}
204+
205+
resource "scaleway_baremetal_server" "base" {
206+
name = "%s"
207+
zone = "%s"
208+
description = "test a description"
209+
offer = "%s"
210+
os = data.scaleway_baremetal_os.my_os.os_id
211+
212+
cloud_init = var.cloud_init
213+
214+
tags = ["terraform-test", "scaleway_baremetal_server", "cloudinit", "edited"]
215+
ssh_key_ids = [scaleway_iam_ssh_key.main.id]
216+
}
217+
`, Zone, SSHKeyName, SSHKeyBaremetal, name, Zone, OfferName),
218+
219+
Check: resource.ComposeTestCheckFunc(
220+
testAccCheckBaremetalServerExists(tt, "scaleway_baremetal_server.base"),
221+
resource.TestCheckResourceAttr(
222+
"scaleway_baremetal_server.base",
223+
"cloud_init",
224+
"#cloud-config\napt_update: true\napt_upgrade: true\n\npackages:\n - curl\n",
225+
),
226+
resource.TestCheckResourceAttr("scaleway_baremetal_server.base", "tags.#", "4"),
227+
),
228+
},
229+
},
230+
})
231+
}
232+
233+
func TestAccServer_CloudInitNotCompatibleOffer(t *testing.T) {
234+
tt := acctest.NewTestTools(t)
235+
defer tt.Cleanup()
236+
237+
if !IsOfferAvailable(OfferName, scw.Zone(Zone), tt) {
238+
t.Skip("Offer is out of stock")
239+
}
240+
241+
SSHKeyName := "TestAccServer_CloudInitIncompatibleOffer"
242+
name := "TestAccServer_CloudInitIncompatibleOffer"
243+
OfferNameNotCompatible := "EM-L110X-SATA"
244+
245+
resource.ParallelTest(t, resource.TestCase{
246+
ProtoV6ProviderFactories: tt.ProviderFactories,
247+
CheckDestroy: baremetalchecks.CheckServerDestroy(tt),
248+
249+
Steps: []resource.TestStep{
250+
{
251+
Config: fmt.Sprintf(`
252+
variable "cloud_init" {
253+
type = string
254+
default = <<EOF
255+
#cloud-config
256+
apt_update: true
257+
apt_upgrade: true
258+
EOF
259+
}
260+
261+
data "scaleway_baremetal_os" "my_os" {
262+
zone = "%s"
263+
name = "Ubuntu"
264+
version = "22.04 LTS (Jammy Jellyfish)"
265+
}
266+
267+
resource "scaleway_iam_ssh_key" "main" {
268+
name = "%s"
269+
public_key = "%s"
270+
}
271+
272+
resource "scaleway_baremetal_server" "base" {
273+
name = "%s"
274+
zone = "%s"
275+
description = "test a description"
276+
offer = "%s"
277+
os = data.scaleway_baremetal_os.my_os.os_id
278+
279+
cloud_init = var.cloud_init
280+
281+
tags = ["terraform-test", "scaleway_baremetal_server", "cloudinit"]
282+
ssh_key_ids = [scaleway_iam_ssh_key.main.id]
283+
}
284+
`, Zone, SSHKeyName, SSHKeyBaremetal, name, Zone, OfferNameNotCompatible),
285+
286+
ExpectError: regexp.MustCompile("cloud-init is not supported on this offer"),
287+
},
288+
},
289+
})
290+
}
291+
119292
func TestAccServer_RequiredInstallConfig(t *testing.T) {
120293
tt := acctest.NewTestTools(t)
121294
defer tt.Cleanup()

internal/services/baremetal/testdata/server-cloud-init-not-compatible-offer.cassette.yaml

Lines changed: 550 additions & 0 deletions
Large diffs are not rendered by default.

internal/services/baremetal/testdata/server-cloud-init.cassette.yaml

Lines changed: 6328 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)