Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(baremetal): add support for os data source #857

Merged
merged 6 commits into from
Apr 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions docs/data-sources/baremetal_os.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
page_title: "Scaleway: scaleway_baremetal_os"
description: |-
Gets information about a baremetal operating system.
---

# scaleway_baremetal_os

Gets information about a baremetal operating system.
For more information, see [the documentation](https://developers.scaleway.com/en/products/baremetal/api).

## Example Usage

```hcl
# Get info by os name and version
data "scaleway_baremetal_os" "by_name" {
name = "Ubuntu"
version = "20.04"
}

# Get info by os id
data "scaleway_baremetal_os" "by_id" {
os_id = "03b7f4ba-a6a1-4305-984e-b54fafbf1681"
}
```

## Argument Reference

- `name` - (Optional) The os name. Only one of `name` and `os_id` should be specified.
- `version` - (Optional) The os version.
- `os_id` - (Optional) The operating system id. Only one of `name` and `os_id` should be specified.
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which the os exists.
92 changes: 92 additions & 0 deletions scaleway/data_source_baremetal_os.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package scaleway

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
"github.com/scaleway/scaleway-sdk-go/scw"
)

func dataSourceScalewayBaremetalOs() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceScalewayBaremetalOsRead,
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Optional: true,
Description: "Exact label of the desired image",
ConflictsWith: []string{"os_id"},
},
"version": {
Type: schema.TypeString,
Optional: true,
Description: "Version string of the desired OS",
ConflictsWith: []string{"os_id"},
},
"os_id": {
Type: schema.TypeString,
Optional: true,
Description: "The ID of the os",
ValidateFunc: validationUUIDorUUIDWithLocality(),
ConflictsWith: []string{"name"},
},
"zone": zoneSchema(),
},
}
}

func dataSourceScalewayBaremetalOsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
api, zone, err := baremetalAPIWithZone(d, meta)
if err != nil {
return diag.FromErr(err)
}

var osVersion, osName string
osID, ok := d.GetOk("os_id")
if ok {
// We fetch the name and version using the os id
osID = d.Get("os_id")
res, err := api.GetOS(&baremetal.GetOSRequest{
Zone: zone,
OsID: osID.(string),
}, scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}
osVersion = res.Version
osName = res.Name
} else {
// Get server by zone and name.
res, err := api.ListOS(&baremetal.ListOSRequest{
Zone: zone,
}, scw.WithAllPages(), scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}
if len(res.Os) == 0 {
return diag.FromErr(fmt.Errorf("no os found with the name %s", d.Get("name")))
}
for _, os := range res.Os {
if os.Name == d.Get("name") && os.Version == d.Get("version") {
osID, osVersion, osName = os.ID, os.Version, os.Name
break
}
}
}

zoneID := datasourceNewZonedID(osID, zone)
d.SetId(zoneID)
err = d.Set("os_id", zoneID)
if err != nil {
return diag.FromErr(err)
}

_ = d.Set("zone", zone)
_ = d.Set("name", osName)
_ = d.Set("version", osVersion)

return nil
}
74 changes: 74 additions & 0 deletions scaleway/data_source_baremetal_os_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package scaleway

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
)

func TestAccScalewayDataSourceBaremetalOS_Basic(t *testing.T) {
tt := NewTestTools(t)
defer tt.Cleanup()

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: testAccCheckScalewayBaremetalServerDestroy(tt),
Steps: []resource.TestStep{
{
Config: `
data "scaleway_baremetal_os" "by_name" {
name = "Ubuntu"
version = "20.04"
}

data "scaleway_baremetal_os" "by_id" {
os_id = "03b7f4ba-a6a1-4305-984e-b54fafbf1681"
}
`,
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayBaremetalOsExists(tt, "data.scaleway_baremetal_os.by_id"),
testAccCheckScalewayBaremetalOsExists(tt, "data.scaleway_baremetal_os.by_name"),

resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_name", "name"),
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_name", "version"),
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_name", "os_id"),

resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_id", "name"),
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_id", "version"),
resource.TestCheckResourceAttrSet("data.scaleway_baremetal_os.by_id", "os_id"),
),
},
},
})
}

func testAccCheckScalewayBaremetalOsExists(tt *TestTools, n string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]

if !ok {
return fmt.Errorf("not found: %s", n)
}

zone, ID, err := parseZonedID(rs.Primary.ID)
if err != nil {
return err
}

baremetalAPI := baremetal.NewAPI(tt.Meta.scwClient)
_, err = baremetalAPI.GetOS(&baremetal.GetOSRequest{
OsID: ID,
Zone: zone,
})

if err != nil {
return err
}

return nil
}
}
1 change: 1 addition & 0 deletions scaleway/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
DataSourcesMap: map[string]*schema.Resource{
"scaleway_account_ssh_key": dataSourceScalewayAccountSSHKey(),
"scaleway_baremetal_offer": dataSourceScalewayBaremetalOffer(),
"scaleway_baremetal_os": dataSourceScalewayBaremetalOs(),
"scaleway_domain_record": dataSourceScalewayDomainRecord(),
"scaleway_domain_zone": dataSourceScalewayDomainZone(),
"scaleway_container_namespace": dataSourceScalewayContainerNamespace(),
Expand Down
Loading