Skip to content

Commit 324dc24

Browse files
authored
feat(baremetal): add data source for baremetal server (#805)
1 parent bbe69bc commit 324dc24

5 files changed

+15332
-0
lines changed

docs/data-sources/baremetal_server.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
page_title: "Scaleway: scaleway_baremetal_server"
3+
description: |-
4+
Gets information about a baremetal server.
5+
---
6+
7+
# scaleway_baremetal_server
8+
9+
Gets information about a baremetal server.
10+
For more information, see [the documentation](https://developers.scaleway.com/en/products/baremetal/api).
11+
12+
## Example Usage
13+
14+
```hcl
15+
# Get info by server name
16+
data "scaleway_baremetal_server" "by_name" {
17+
name = "foobar"
18+
zone = "fr-par-2"
19+
}
20+
21+
# Get info by server id
22+
data "scaleway_baremetal_server" "by_id" {
23+
server_id = "11111111-1111-1111-1111-111111111111"
24+
}
25+
```
26+
27+
## Argument Reference
28+
29+
- `name` - (Optional) The server name. Only one of `name` and `server_id` should be specified.
30+
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which the server exists.
+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func dataSourceScalewayBaremetalServer() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayBaremetalServer().Schema)
16+
17+
// Set 'Optional' schema elements
18+
addOptionalFieldsToSchema(dsSchema, "name", "zone")
19+
20+
dsSchema["name"].ConflictsWith = []string{"server_id"}
21+
dsSchema["server_id"] = &schema.Schema{
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Description: "The ID of the server",
25+
ValidateFunc: validationUUIDorUUIDWithLocality(),
26+
ConflictsWith: []string{"name"},
27+
}
28+
29+
return &schema.Resource{
30+
ReadContext: dataSourceScalewayBaremetalServerRead,
31+
Schema: dsSchema,
32+
}
33+
}
34+
35+
func dataSourceScalewayBaremetalServerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
36+
api, zone, err := baremetalAPIWithZone(d, meta)
37+
if err != nil {
38+
return diag.FromErr(err)
39+
}
40+
41+
serverID, ok := d.GetOk("server_id")
42+
if !ok { // Get server by zone and name.
43+
res, err := api.ListServers(&baremetal.ListServersRequest{
44+
Zone: zone,
45+
Name: scw.StringPtr(d.Get("name").(string)),
46+
}, scw.WithContext(ctx))
47+
if err != nil {
48+
return diag.FromErr(err)
49+
}
50+
if len(res.Servers) == 0 {
51+
return diag.FromErr(fmt.Errorf("no servers found with the name %s", d.Get("name")))
52+
}
53+
if len(res.Servers) > 1 {
54+
return diag.FromErr(fmt.Errorf("%d servers found with the same name %s", len(res.Servers), d.Get("name")))
55+
}
56+
serverID = res.Servers[0].ID
57+
}
58+
59+
zoneID := datasourceNewZonedID(serverID, zone)
60+
d.SetId(zoneID)
61+
err = d.Set("server_id", zoneID)
62+
if err != nil {
63+
return diag.FromErr(err)
64+
}
65+
return resourceScalewayBaremetalServerRead(ctx, d, meta)
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package scaleway
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccScalewayDataSourceBaremetalServer_Basic(t *testing.T) {
11+
tt := NewTestTools(t)
12+
defer tt.Cleanup()
13+
14+
SSHKeyName := "TestAccScalewayDataSourceBaremetalServer_Basic"
15+
SSHKey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM7HUxRyQtB2rnlhQUcbDGCZcTJg7OvoznOiyC9W6IxH [email protected]"
16+
name := "TestAccScalewayDataSourceBaremetalServer_Basic"
17+
18+
resource.ParallelTest(t, resource.TestCase{
19+
PreCheck: func() { testAccPreCheck(t) },
20+
ProviderFactories: tt.ProviderFactories,
21+
CheckDestroy: testAccCheckScalewayBaremetalServerDestroy(tt),
22+
Steps: []resource.TestStep{
23+
{
24+
Config: fmt.Sprintf(`
25+
resource "scaleway_account_ssh_key" "main" {
26+
name = "%s"
27+
public_key = "%s"
28+
}
29+
30+
resource "scaleway_baremetal_server" "main" {
31+
name = "%s"
32+
zone = "fr-par-2"
33+
description = "test a description"
34+
offer = "EM-A210R-HDD"
35+
os = "d17d6872-0412-45d9-a198-af82c34d3c5c"
36+
37+
ssh_key_ids = [ scaleway_account_ssh_key.main.id ]
38+
}
39+
40+
data "scaleway_baremetal_server" "by_name" {
41+
name = "${scaleway_baremetal_server.main.name}"
42+
zone = "fr-par-2"
43+
}
44+
45+
data "scaleway_baremetal_server" "by_id" {
46+
server_id = "${scaleway_baremetal_server.main.id}"
47+
zone = "fr-par-2"
48+
}
49+
`, SSHKeyName, SSHKey, name),
50+
Check: resource.ComposeTestCheckFunc(
51+
testAccCheckScalewayBaremetalServerExists(tt, "data.scaleway_baremetal_server.by_id"),
52+
testAccCheckScalewayBaremetalServerExists(tt, "data.scaleway_baremetal_server.by_name"),
53+
resource.TestCheckResourceAttrPair(
54+
"data.scaleway_baremetal_server.by_name", "name",
55+
"scaleway_baremetal_server.main", "name"),
56+
resource.TestCheckResourceAttrPair(
57+
"data.scaleway_baremetal_server.by_id", "name",
58+
"scaleway_baremetal_server.main", "name"),
59+
),
60+
},
61+
},
62+
})
63+
}

scaleway/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
110110
"scaleway_account_ssh_key": dataSourceScalewayAccountSSHKey(),
111111
"scaleway_baremetal_offer": dataSourceScalewayBaremetalOffer(),
112112
"scaleway_baremetal_os": dataSourceScalewayBaremetalOs(),
113+
"scaleway_baremetal_server": dataSourceScalewayBaremetalServer(),
113114
"scaleway_domain_record": dataSourceScalewayDomainRecord(),
114115
"scaleway_domain_zone": dataSourceScalewayDomainZone(),
115116
"scaleway_container_namespace": dataSourceScalewayContainerNamespace(),

0 commit comments

Comments
 (0)