Skip to content

Commit 4c10615

Browse files
committed
improvement: allow retry on install task creation and add import
- Improves error handling when creating a dedicated server install task by allowing the POST to fail and be retried. - Adds import on ovh_dedicated_server_install_task resource
1 parent 0d40990 commit 4c10615

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

ovh/resource_dedicated_server_install_task.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package ovh
22

33
import (
44
"fmt"
5+
"log"
56
"net/url"
67
"strconv"
8+
"strings"
79
"time"
810

911
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -16,6 +18,9 @@ func resourceDedicatedServerInstallTask() *schema.Resource {
1618
Update: resourceDedicatedServerInstallTaskUpdate,
1719
Read: resourceDedicatedServerInstallTaskRead,
1820
Delete: resourceDedicatedServerInstallTaskDelete,
21+
Importer: &schema.ResourceImporter{
22+
State: resourceDedicatedServerInstallTaskImportState,
23+
},
1924

2025
Timeouts: &schema.ResourceTimeout{
2126
Create: schema.DefaultTimeout(45 * time.Minute),
@@ -175,6 +180,31 @@ func resourceDedicatedServerInstallTask() *schema.Resource {
175180
}
176181
}
177182

183+
func resourceDedicatedServerInstallTaskImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
184+
//
185+
// After creating an install task, there is no way to get the name of the server (service_name)
186+
// nor the name of template (template_name) used during the creation of the task.
187+
// This is why it is required to provide them when importing.
188+
//
189+
190+
givenId := d.Id()
191+
splitId := strings.SplitN(givenId, "/", 3)
192+
if len(splitId) != 3 {
193+
return nil, fmt.Errorf("Import Id is not service_name/template_name/task_id formatted")
194+
}
195+
serviceName := splitId[0]
196+
templateName := splitId[1]
197+
taskId := splitId[2]
198+
d.SetId(taskId)
199+
d.Set("service_name", serviceName)
200+
d.Set("template_name", templateName)
201+
err := dedicatedServerInstallTaskRead(d, meta)
202+
203+
results := make([]*schema.ResourceData, 1)
204+
results[0] = d
205+
return results, err
206+
}
207+
178208
func resourceDedicatedServerInstallTaskCreate(d *schema.ResourceData, meta interface{}) error {
179209
config := meta.(*Config)
180210
serviceName := d.Get("service_name").(string)
@@ -187,7 +217,9 @@ func resourceDedicatedServerInstallTaskCreate(d *schema.ResourceData, meta inter
187217
task := &DedicatedServerTask{}
188218

189219
if err := config.OVHClient.Post(endpoint, opts, task); err != nil {
190-
return fmt.Errorf("Error calling POST %s:\n\t %q", endpoint, err)
220+
// POST on install tasks can fail randomly so in order to avoid issues, let's allow
221+
// a retry via waitForDedicatedServerTask
222+
log.Printf("[WARN] Ignored error when calling POST %s: %v", endpoint, err)
191223
}
192224

193225
if err := waitForDedicatedServerTask(serviceName, task, config.OVHClient); err != nil {
@@ -273,7 +305,9 @@ func resourceDedicatedServerInstallTaskDelete(d *schema.ResourceData, meta inter
273305

274306
task := &DedicatedServerTask{}
275307
if err := config.OVHClient.Post(endpoint, nil, task); err != nil {
276-
return fmt.Errorf("Error calling POST %s:\n\t %q", endpoint, err)
308+
// POST on install tasks can fail randomly so in order to avoid issues, let's allow
309+
// a retry via waitForDedicatedServerTask
310+
log.Printf("[WARN] Ignored error when calling POST %s: %v", endpoint, err)
277311
}
278312

279313
if err := waitForDedicatedServerTask(serviceName, task, config.OVHClient); err != nil {

website/docs/r/dedicated_server_install_task.html.markdown

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,11 @@ The following attributes are exported:
8383
* `last_update` - Last update in RFC3339 format.
8484
* `start_date` - Task creation date in RFC3339 format.
8585
* `status` - Task status (should be `done`)
86+
87+
## Import
88+
89+
Installation task can be imported using the `service_name` (`nsXXXX.ip...`) of the baremetal server, the `template_name` used and ths `task_id`, separated by "/" E.g.,
90+
91+
```bash
92+
$ terraform import ovh_dedicated_server_install_task nsXXXX.ipXXXX/template_name/12345
93+
```

0 commit comments

Comments
 (0)