Skip to content

Commit be51284

Browse files
authored
feat(baremetal): add support for os data source (#857)
1 parent e511cf1 commit be51284

5 files changed

+586
-0
lines changed

docs/data-sources/baremetal_os.md

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
page_title: "Scaleway: scaleway_baremetal_os"
3+
description: |-
4+
Gets information about a baremetal operating system.
5+
---
6+
7+
# scaleway_baremetal_os
8+
9+
Gets information about a baremetal operating system.
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 os name and version
16+
data "scaleway_baremetal_os" "by_name" {
17+
name = "Ubuntu"
18+
version = "20.04"
19+
}
20+
21+
# Get info by os id
22+
data "scaleway_baremetal_os" "by_id" {
23+
os_id = "03b7f4ba-a6a1-4305-984e-b54fafbf1681"
24+
}
25+
```
26+
27+
## Argument Reference
28+
29+
- `name` - (Optional) The os name. Only one of `name` and `os_id` should be specified.
30+
- `version` - (Optional) The os version.
31+
- `os_id` - (Optional) The operating system id. Only one of `name` and `os_id` should be specified.
32+
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which the os exists.

scaleway/data_source_baremetal_os.go

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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 dataSourceScalewayBaremetalOs() *schema.Resource {
14+
return &schema.Resource{
15+
ReadContext: dataSourceScalewayBaremetalOsRead,
16+
Schema: map[string]*schema.Schema{
17+
"name": {
18+
Type: schema.TypeString,
19+
Optional: true,
20+
Description: "Exact label of the desired image",
21+
ConflictsWith: []string{"os_id"},
22+
},
23+
"version": {
24+
Type: schema.TypeString,
25+
Optional: true,
26+
Description: "Version string of the desired OS",
27+
ConflictsWith: []string{"os_id"},
28+
},
29+
"os_id": {
30+
Type: schema.TypeString,
31+
Optional: true,
32+
Description: "The ID of the os",
33+
ValidateFunc: validationUUIDorUUIDWithLocality(),
34+
ConflictsWith: []string{"name"},
35+
},
36+
"zone": zoneSchema(),
37+
},
38+
}
39+
}
40+
41+
func dataSourceScalewayBaremetalOsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
42+
api, zone, err := baremetalAPIWithZone(d, meta)
43+
if err != nil {
44+
return diag.FromErr(err)
45+
}
46+
47+
var osVersion, osName string
48+
osID, ok := d.GetOk("os_id")
49+
if ok {
50+
// We fetch the name and version using the os id
51+
osID = d.Get("os_id")
52+
res, err := api.GetOS(&baremetal.GetOSRequest{
53+
Zone: zone,
54+
OsID: osID.(string),
55+
}, scw.WithContext(ctx))
56+
if err != nil {
57+
return diag.FromErr(err)
58+
}
59+
osVersion = res.Version
60+
osName = res.Name
61+
} else {
62+
// Get server by zone and name.
63+
res, err := api.ListOS(&baremetal.ListOSRequest{
64+
Zone: zone,
65+
}, scw.WithAllPages(), scw.WithContext(ctx))
66+
if err != nil {
67+
return diag.FromErr(err)
68+
}
69+
if len(res.Os) == 0 {
70+
return diag.FromErr(fmt.Errorf("no os found with the name %s", d.Get("name")))
71+
}
72+
for _, os := range res.Os {
73+
if os.Name == d.Get("name") && os.Version == d.Get("version") {
74+
osID, osVersion, osName = os.ID, os.Version, os.Name
75+
break
76+
}
77+
}
78+
}
79+
80+
zoneID := datasourceNewZonedID(osID, zone)
81+
d.SetId(zoneID)
82+
err = d.Set("os_id", zoneID)
83+
if err != nil {
84+
return diag.FromErr(err)
85+
}
86+
87+
_ = d.Set("zone", zone)
88+
_ = d.Set("name", osName)
89+
_ = d.Set("version", osVersion)
90+
91+
return nil
92+
}
+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package scaleway
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
9+
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
10+
)
11+
12+
func TestAccScalewayDataSourceBaremetalOS_Basic(t *testing.T) {
13+
tt := NewTestTools(t)
14+
defer tt.Cleanup()
15+
16+
resource.ParallelTest(t, resource.TestCase{
17+
PreCheck: func() { testAccPreCheck(t) },
18+
ProviderFactories: tt.ProviderFactories,
19+
CheckDestroy: testAccCheckScalewayBaremetalServerDestroy(tt),
20+
Steps: []resource.TestStep{
21+
{
22+
Config: `
23+
data "scaleway_baremetal_os" "by_name" {
24+
name = "Ubuntu"
25+
version = "20.04"
26+
}
27+
28+
data "scaleway_baremetal_os" "by_id" {
29+
os_id = "03b7f4ba-a6a1-4305-984e-b54fafbf1681"
30+
}
31+
`,
32+
Check: resource.ComposeTestCheckFunc(
33+
testAccCheckScalewayBaremetalOsExists(tt, "data.scaleway_baremetal_os.by_id"),
34+
testAccCheckScalewayBaremetalOsExists(tt, "data.scaleway_baremetal_os.by_name"),
35+
36+
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_name", "name"),
37+
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_name", "version"),
38+
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_name", "os_id"),
39+
40+
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_id", "name"),
41+
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_id", "version"),
42+
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_id", "os_id"),
43+
),
44+
},
45+
},
46+
})
47+
}
48+
49+
func testAccCheckScalewayBaremetalOsExists(tt *TestTools, n string) resource.TestCheckFunc {
50+
return func(s *terraform.State) error {
51+
rs, ok := s.RootModule().Resources[n]
52+
53+
if !ok {
54+
return fmt.Errorf("not found: %s", n)
55+
}
56+
57+
zone, ID, err := parseZonedID(rs.Primary.ID)
58+
if err != nil {
59+
return err
60+
}
61+
62+
baremetalAPI := baremetal.NewAPI(tt.Meta.scwClient)
63+
_, err = baremetalAPI.GetOS(&baremetal.GetOSRequest{
64+
OsID: ID,
65+
Zone: zone,
66+
})
67+
68+
if err != nil {
69+
return err
70+
}
71+
72+
return nil
73+
}
74+
}

scaleway/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
108108
DataSourcesMap: map[string]*schema.Resource{
109109
"scaleway_account_ssh_key": dataSourceScalewayAccountSSHKey(),
110110
"scaleway_baremetal_offer": dataSourceScalewayBaremetalOffer(),
111+
"scaleway_baremetal_os": dataSourceScalewayBaremetalOs(),
111112
"scaleway_domain_record": dataSourceScalewayDomainRecord(),
112113
"scaleway_domain_zone": dataSourceScalewayDomainZone(),
113114
"scaleway_container_namespace": dataSourceScalewayContainerNamespace(),

0 commit comments

Comments
 (0)