Skip to content

Commit 431db9a

Browse files
authored
Merge pull request #105 from yanndegat/dev/dedicatedserverboot
new datasource: ovh_dedicated_server_boots
2 parents 3a04752 + b954118 commit 431db9a

6 files changed

+205
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"net/url"
6+
"sort"
7+
"strconv"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/hashcode"
10+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
11+
)
12+
13+
func dataSourceDedicatedServerBoots() *schema.Resource {
14+
return &schema.Resource{
15+
Read: dataSourceDedicatedServerBootsRead,
16+
Schema: map[string]*schema.Schema{
17+
"service_name": {
18+
Type: schema.TypeString,
19+
Description: "The internal name of your dedicated server.",
20+
Required: true,
21+
},
22+
23+
"boot_type": {
24+
Type: schema.TypeString,
25+
Optional: true,
26+
Description: "Filter the value of bootType property",
27+
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
28+
err := validateBootType(v.(string))
29+
if err != nil {
30+
errors = append(errors, err)
31+
}
32+
return
33+
},
34+
},
35+
36+
// Computed
37+
"result": {
38+
Type: schema.TypeList,
39+
Computed: true,
40+
Description: "Server compatibles netboots ids",
41+
Elem: &schema.Schema{
42+
Type: schema.TypeInt,
43+
},
44+
},
45+
},
46+
}
47+
}
48+
49+
func dataSourceDedicatedServerBootsRead(d *schema.ResourceData, meta interface{}) error {
50+
config := meta.(*Config)
51+
serviceName := d.Get("service_name").(string)
52+
53+
ids := []int{}
54+
55+
endpoint := fmt.Sprintf(
56+
"/dedicated/server/%s/boot",
57+
url.PathEscape(serviceName),
58+
)
59+
60+
if bootType, ok := d.GetOk("boot_type"); ok {
61+
endpoint = fmt.Sprintf(
62+
"%s?bootType=%s",
63+
endpoint,
64+
url.PathEscape(bootType.(string)),
65+
)
66+
}
67+
68+
if err := config.OVHClient.Get(endpoint, &ids); err != nil {
69+
return fmt.Errorf("Error calling GET %s:\n\t %q", endpoint, err)
70+
}
71+
72+
// setting id by computing a hashcode of all the ids
73+
idsStr := make([]string, len(ids))
74+
for i, id := range ids {
75+
idsStr[i] = strconv.Itoa(id)
76+
}
77+
78+
// sort.Strings sorts in place, returns nothing
79+
sort.Strings(idsStr)
80+
81+
d.SetId(hashcode.Strings(idsStr))
82+
d.Set("result", ids)
83+
return nil
84+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
9+
)
10+
11+
func TestAccDedicatedServerBootsDataSource_basic(t *testing.T) {
12+
13+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() {
15+
testAccPreCheckCredentials(t)
16+
testAccPreCheckDedicatedServer(t)
17+
},
18+
Providers: testAccProviders,
19+
Steps: []resource.TestStep{
20+
{
21+
Config: testAccDedicatedServerBootsDatasourceConfig(""),
22+
Check: resource.TestCheckOutput("test", "true"),
23+
},
24+
{
25+
Config: testAccDedicatedServerBootsDatasourceConfig("harddisk"),
26+
Check: resource.TestCheckOutput("test", "true"),
27+
},
28+
{
29+
Config: testAccDedicatedServerBootsDatasourceConfig("rescue"),
30+
Check: resource.TestCheckOutput("test", "true"),
31+
},
32+
{
33+
Config: testAccDedicatedServerBootsDatasourceConfig("network"),
34+
Check: resource.TestCheckOutput("test", "true"),
35+
},
36+
},
37+
})
38+
}
39+
40+
func testAccDedicatedServerBootsDatasourceConfig(filter string) string {
41+
dedicated_server := os.Getenv("OVH_DEDICATED_SERVER")
42+
if filter == "" {
43+
return fmt.Sprintf(
44+
testAccDedicatedServerBootsDatasourceConfig_Basic,
45+
dedicated_server,
46+
)
47+
}
48+
return fmt.Sprintf(
49+
testAccDedicatedServerBootsDatasourceConfig_Filter,
50+
dedicated_server,
51+
filter,
52+
)
53+
54+
}
55+
56+
const testAccDedicatedServerBootsDatasourceConfig_Basic = `
57+
data "ovh_dedicated_server_boots" "boots" {
58+
service_name = "%s"
59+
}
60+
61+
output test { value = tostring(length(data.ovh_dedicated_server_boots.boots.result) > 0 )}
62+
`
63+
const testAccDedicatedServerBootsDatasourceConfig_Filter = `
64+
data "ovh_dedicated_server_boots" "boots" {
65+
service_name = "%s"
66+
boot_type = "%s"
67+
}
68+
69+
output test { value = tostring(length(data.ovh_dedicated_server_boots.boots.result) > 0 )}
70+
`

ovh/helpers.go

+10
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ func validateStringEnum(value string, enum []string) error {
5050
return nil
5151
}
5252

53+
func validateBootType(value string) error {
54+
return validateStringEnum(value, []string{
55+
"harddisk",
56+
"internal",
57+
"ipxeCustomerScript",
58+
"network",
59+
"rescue",
60+
})
61+
}
62+
5363
func getNilBoolPointer(val interface{}) *bool {
5464
if val == nil {
5565
return nil

ovh/provider.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ func Provider() terraform.ResourceProvider {
4444
"ovh_cloud_region": dataSourcePublicCloudRegion(),
4545
"ovh_cloud_regions": dataSourcePublicCloudRegions(),
4646
"ovh_dedicated_installation_templates": dataSourceDedicatedInstallationTemplates(),
47-
"ovh_dedicated_servers": dataSourceDedicatedServers(),
4847
"ovh_dedicated_server": dataSourceDedicatedServer(),
48+
"ovh_dedicated_server_boots": dataSourceDedicatedServerBoots(),
49+
"ovh_dedicated_servers": dataSourceDedicatedServers(),
4950
"ovh_domain_zone": dataSourceDomainZone(),
5051
"ovh_iploadbalancing": dataSourceIpLoadbalancing(),
5152
"ovh_me_paymentmean_bankaccount": dataSourceMePaymentmeanBankaccount(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
layout: "ovh"
3+
page_title: "OVH: dedicated_server_boots"
4+
sidebar_current: "docs-ovh-datasource-dedicated-server-boots"
5+
description: |-
6+
Get the list of compatible netboots for a dedicated server associated with your OVH Account.
7+
---
8+
9+
# ovh_me_dedicated_server_boots
10+
11+
Use this data source to get the list of compatible netboots for a dedicated server associated with your OVH Account.
12+
13+
## Example Usage
14+
15+
```hcl
16+
data "ovh_dedicated_server_boots" "netboots" {
17+
service_name = "myserver"
18+
boot_type = "harddisk"
19+
}
20+
```
21+
22+
## Argument Reference
23+
24+
* `service_name` - (Required) The internal name of your dedicated server.
25+
26+
* `boot_type` - (Optional) Filter the value of bootType property (harddisk, rescue, ipxeCustomerScript, internal, network)
27+
28+
## Attributes Reference
29+
30+
The following attributes are exported:
31+
32+
* `result` - The list of dedicated server netboots.

website/ovh.erb

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<% wrap_layout :inner do %>
1+
<% wrap_layout :inner do %>
22
<% content_for :sidebar do %>
33
<div class="docs-sidebar hidden-print affix-top" role="complementary">
44
<ul class="nav docs-sidenav">
@@ -22,12 +22,15 @@
2222
<li<%= sidebar_current("docs-ovh-datasource-dedicated-installation-templates") %>>
2323
<a href="/docs/providers/ovh/d/dedicated_installation_templates.html">ovh_dedicated_installation_templates</a>
2424
</li>
25-
<li<%= sidebar_current("docs-ovh-datasource-dedicated-servers") %>>
26-
<a href="/docs/providers/ovh/d/dedicated_servers.html">ovh_dedicated_servers</a>
27-
</li>
2825
<li<%= sidebar_current("docs-ovh-datasource-dedicated-server-x") %>>
2926
<a href="/docs/providers/ovh/d/dedicated_server.html">ovh_dedicated_server</a>
3027
</li>
28+
<li<%= sidebar_current("docs-ovh-datasource-dedicated-server-boots") %>>
29+
<a href="/docs/providers/ovh/d/dedicated_server_boots.html">ovh_dedicated_server_boots</a>
30+
</li>
31+
<li<%= sidebar_current("docs-ovh-datasource-dedicated-servers") %>>
32+
<a href="/docs/providers/ovh/d/dedicated_servers.html">ovh_dedicated_servers</a>
33+
</li>
3134
<li<%= sidebar_current("docs-ovh-datasource-domain-zone") %>>
3235
<a href="/docs/providers/ovh/d/domain_zone.html">ovh_domain_zone</a>
3336
</li>
@@ -77,7 +80,6 @@
7780
<li<%= sidebar_current("docs-ovh-resource-cloud-user") %>>
7881
<a href="/docs/providers/ovh/r/cloud_user.html">ovh_cloud_user</a>
7982
</li>
80-
8183
<li<%= sidebar_current("docs-ovh-resource-publiccloud-private-network-x") %>>
8284
<a href="/docs/providers/ovh/r/publiccloud_private_network.html">ovh_publiccloud_private_network</a>
8385
</li>

0 commit comments

Comments
 (0)