diff --git a/ovh/data_source_ovh_dedicated_server_boots.go b/ovh/data_source_ovh_dedicated_server_boots.go new file mode 100644 index 000000000..84546c816 --- /dev/null +++ b/ovh/data_source_ovh_dedicated_server_boots.go @@ -0,0 +1,84 @@ +package ovh + +import ( + "fmt" + "net/url" + "sort" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceDedicatedServerBoots() *schema.Resource { + return &schema.Resource{ + Read: dataSourceDedicatedServerBootsRead, + Schema: map[string]*schema.Schema{ + "service_name": { + Type: schema.TypeString, + Description: "The internal name of your dedicated server.", + Required: true, + }, + + "boot_type": { + Type: schema.TypeString, + Optional: true, + Description: "Filter the value of bootType property", + ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { + err := validateBootType(v.(string)) + if err != nil { + errors = append(errors, err) + } + return + }, + }, + + // Computed + "result": { + Type: schema.TypeList, + Computed: true, + Description: "Server compatibles netboots ids", + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + }, + } +} + +func dataSourceDedicatedServerBootsRead(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + serviceName := d.Get("service_name").(string) + + ids := []int{} + + endpoint := fmt.Sprintf( + "/dedicated/server/%s/boot", + url.PathEscape(serviceName), + ) + + if bootType, ok := d.GetOk("boot_type"); ok { + endpoint = fmt.Sprintf( + "%s?bootType=%s", + endpoint, + url.PathEscape(bootType.(string)), + ) + } + + if err := config.OVHClient.Get(endpoint, &ids); err != nil { + return fmt.Errorf("Error calling GET %s:\n\t %q", endpoint, err) + } + + // setting id by computing a hashcode of all the ids + idsStr := make([]string, len(ids)) + for i, id := range ids { + idsStr[i] = strconv.Itoa(id) + } + + // sort.Strings sorts in place, returns nothing + sort.Strings(idsStr) + + d.SetId(hashcode.Strings(idsStr)) + d.Set("result", ids) + return nil +} diff --git a/ovh/data_source_ovh_dedicated_server_boots_test.go b/ovh/data_source_ovh_dedicated_server_boots_test.go new file mode 100644 index 000000000..59f888eed --- /dev/null +++ b/ovh/data_source_ovh_dedicated_server_boots_test.go @@ -0,0 +1,70 @@ +package ovh + +import ( + "fmt" + "os" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccDedicatedServerBootsDataSource_basic(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheckCredentials(t) + testAccPreCheckDedicatedServer(t) + }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccDedicatedServerBootsDatasourceConfig(""), + Check: resource.TestCheckOutput("test", "true"), + }, + { + Config: testAccDedicatedServerBootsDatasourceConfig("harddisk"), + Check: resource.TestCheckOutput("test", "true"), + }, + { + Config: testAccDedicatedServerBootsDatasourceConfig("rescue"), + Check: resource.TestCheckOutput("test", "true"), + }, + { + Config: testAccDedicatedServerBootsDatasourceConfig("network"), + Check: resource.TestCheckOutput("test", "true"), + }, + }, + }) +} + +func testAccDedicatedServerBootsDatasourceConfig(filter string) string { + dedicated_server := os.Getenv("OVH_DEDICATED_SERVER") + if filter == "" { + return fmt.Sprintf( + testAccDedicatedServerBootsDatasourceConfig_Basic, + dedicated_server, + ) + } + return fmt.Sprintf( + testAccDedicatedServerBootsDatasourceConfig_Filter, + dedicated_server, + filter, + ) + +} + +const testAccDedicatedServerBootsDatasourceConfig_Basic = ` +data "ovh_dedicated_server_boots" "boots" { + service_name = "%s" +} + +output test { value = tostring(length(data.ovh_dedicated_server_boots.boots.result) > 0 )} +` +const testAccDedicatedServerBootsDatasourceConfig_Filter = ` +data "ovh_dedicated_server_boots" "boots" { + service_name = "%s" + boot_type = "%s" +} + +output test { value = tostring(length(data.ovh_dedicated_server_boots.boots.result) > 0 )} +` diff --git a/ovh/helpers.go b/ovh/helpers.go index b725ee175..0e327d393 100644 --- a/ovh/helpers.go +++ b/ovh/helpers.go @@ -50,6 +50,16 @@ func validateStringEnum(value string, enum []string) error { return nil } +func validateBootType(value string) error { + return validateStringEnum(value, []string{ + "harddisk", + "internal", + "ipxeCustomerScript", + "network", + "rescue", + }) +} + func getNilBoolPointer(val interface{}) *bool { if val == nil { return nil diff --git a/ovh/provider.go b/ovh/provider.go index 349994fcd..bf4162a83 100644 --- a/ovh/provider.go +++ b/ovh/provider.go @@ -44,8 +44,9 @@ func Provider() terraform.ResourceProvider { "ovh_cloud_region": dataSourcePublicCloudRegion(), "ovh_cloud_regions": dataSourcePublicCloudRegions(), "ovh_dedicated_installation_templates": dataSourceDedicatedInstallationTemplates(), - "ovh_dedicated_servers": dataSourceDedicatedServers(), "ovh_dedicated_server": dataSourceDedicatedServer(), + "ovh_dedicated_server_boots": dataSourceDedicatedServerBoots(), + "ovh_dedicated_servers": dataSourceDedicatedServers(), "ovh_domain_zone": dataSourceDomainZone(), "ovh_iploadbalancing": dataSourceIpLoadbalancing(), "ovh_me_paymentmean_bankaccount": dataSourceMePaymentmeanBankaccount(), diff --git a/website/docs/d/dedicated_server_boots.html.markdown b/website/docs/d/dedicated_server_boots.html.markdown new file mode 100644 index 000000000..38949c8d5 --- /dev/null +++ b/website/docs/d/dedicated_server_boots.html.markdown @@ -0,0 +1,32 @@ +--- +layout: "ovh" +page_title: "OVH: dedicated_server_boots" +sidebar_current: "docs-ovh-datasource-dedicated-server-boots" +description: |- + Get the list of compatible netboots for a dedicated server associated with your OVH Account. +--- + +# ovh_me_dedicated_server_boots + +Use this data source to get the list of compatible netboots for a dedicated server associated with your OVH Account. + +## Example Usage + +```hcl +data "ovh_dedicated_server_boots" "netboots" { + service_name = "myserver" + boot_type = "harddisk" +} +``` + +## Argument Reference + +* `service_name` - (Required) The internal name of your dedicated server. + +* `boot_type` - (Optional) Filter the value of bootType property (harddisk, rescue, ipxeCustomerScript, internal, network) + +## Attributes Reference + +The following attributes are exported: + +* `result` - The list of dedicated server netboots. diff --git a/website/ovh.erb b/website/ovh.erb index c33f07f24..5e294e83f 100644 --- a/website/ovh.erb +++ b/website/ovh.erb @@ -1,4 +1,4 @@ -<% wrap_layout :inner do %> +<% wrap_layout :inner do %> <% content_for :sidebar do %>