Skip to content

Commit 487a7d8

Browse files
committed
feat(cph): add resource cph phone data restore
1 parent 9e3dc55 commit 487a7d8

File tree

4 files changed

+274
-8
lines changed

4 files changed

+274
-8
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
subcategory: "Cloud Phone (CPH)"
3+
layout: "huaweicloud"
4+
page_title: "HuaweiCloud: huaweicloud_cph_phone_data_restore"
5+
description: |-
6+
Manages a CPH phone data restore resource within HuaweiCloud.
7+
---
8+
9+
# huaweicloud_cph_phone_data_restore
10+
11+
Manages a CPH phone data restore resource within HuaweiCloud.
12+
13+
-> The current resource is a one-time resource, and destroying this resource is only removed from the state.
14+
15+
## Example Usage
16+
17+
```hcl
18+
variable "phone_id" {}
19+
variable "bucket_name" {}
20+
variable "object_path" {}
21+
22+
resource "huaweicloud_cph_phone_data_restore" "test" {
23+
phone_id = var.phone_id
24+
bucket_name = var.bucket_name
25+
object_path = var.object_path
26+
}
27+
```
28+
29+
## Argument Reference
30+
31+
The following arguments are supported:
32+
33+
* `region` - (Optional, String, ForceNew) Specifies the region in which to create the resource.
34+
If omitted, the provider-level region will be used.
35+
Changing this creates a new resource.
36+
37+
* `phone_id` - (Required, String) Specifies the phone ID.
38+
39+
* `bucket_name` - (Required, String) Specifies the bucket name of OBS.
40+
41+
* `object_path` - (Required, String) Specifies the object path of OBS.
42+
43+
## Attribute Reference
44+
45+
In addition to all arguments above, the following attributes are exported:
46+
47+
* `id` - The resource ID.
48+
49+
## Timeouts
50+
51+
This resource provides the following timeouts configuration options:
52+
53+
* `create` - Default is 30 minutes.

huaweicloud/provider.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,14 +1564,15 @@ func Provider() *schema.Provider {
15641564
"huaweicloud_coc_script": coc.ResourceScript(),
15651565
"huaweicloud_coc_script_execute": coc.ResourceScriptExecute(),
15661566

1567-
"huaweicloud_cph_server": cph.ResourceCphServer(),
1568-
"huaweicloud_cph_adb_command": cph.ResourceAdbCommand(),
1569-
"huaweicloud_cph_phone_stop": cph.ResourcePhoneStop(),
1570-
"huaweicloud_cph_server_restart": cph.ResourceServerRestart(),
1571-
"huaweicloud_cph_phone_reset": cph.ResourcePhoneReset(),
1572-
"huaweicloud_cph_share_app": cph.ResourceShareApp(),
1573-
"huaweicloud_cph_phone_property": cph.ResourcePhoneProperty(),
1574-
"huaweicloud_cph_phone_restart": cph.ResourcePhoneRestart(),
1567+
"huaweicloud_cph_server": cph.ResourceCphServer(),
1568+
"huaweicloud_cph_adb_command": cph.ResourceAdbCommand(),
1569+
"huaweicloud_cph_phone_stop": cph.ResourcePhoneStop(),
1570+
"huaweicloud_cph_server_restart": cph.ResourceServerRestart(),
1571+
"huaweicloud_cph_phone_reset": cph.ResourcePhoneReset(),
1572+
"huaweicloud_cph_share_app": cph.ResourceShareApp(),
1573+
"huaweicloud_cph_phone_property": cph.ResourcePhoneProperty(),
1574+
"huaweicloud_cph_phone_restart": cph.ResourcePhoneRestart(),
1575+
"huaweicloud_cph_phone_data_restore": cph.ResourcePhoneDataRestore(),
15751576

15761577
"huaweicloud_cse_microservice": cse.ResourceMicroservice(),
15771578
"huaweicloud_cse_microservice_engine": cse.ResourceMicroserviceEngine(),
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package cph
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
9+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/services/acceptance"
10+
)
11+
12+
func TestAccCphPhoneDataRestore_basic(t *testing.T) {
13+
name := acceptance.RandomAccResourceName()
14+
15+
resource.ParallelTest(t, resource.TestCase{
16+
PreCheck: func() {
17+
acceptance.TestAccPreCheck(t)
18+
acceptance.TestAccPrecheckCphObsBucketName(t)
19+
acceptance.TestAccPrecheckCphAdbObjectPath(t)
20+
},
21+
ProviderFactories: acceptance.TestAccProviderFactories,
22+
CheckDestroy: nil,
23+
Steps: []resource.TestStep{
24+
{
25+
Config: testCphPhoneDataRestore_basic(name),
26+
},
27+
{
28+
Config: testCphServerBase(name),
29+
Check: resource.ComposeTestCheckFunc(
30+
waitForDeletionCooldownComplete(),
31+
),
32+
},
33+
},
34+
})
35+
}
36+
37+
func testCphPhoneDataRestore_basic(name string) string {
38+
return fmt.Sprintf(`
39+
%[1]s
40+
41+
data "huaweicloud_cph_phones" "test" {
42+
server_id = huaweicloud_cph_server.test.id
43+
}
44+
45+
resource "huaweicloud_cph_phone_data_restore" "test" {
46+
phone_id = data.huaweicloud_cph_phones.test.phones[0].phone_id
47+
bucket_name = "%[2]s"
48+
object_path = "%[3]s"
49+
}
50+
`, testCphServer_basic(name), acceptance.HW_CPH_OBS_BUCKET_NAME, acceptance.HW_CPH_OBS_OBJECT_PATH)
51+
}
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package cph
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
"time"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
13+
14+
"github.com/chnsz/golangsdk"
15+
16+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/config"
17+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/utils"
18+
)
19+
20+
var phoneDataRestoreNonUpdatableParams = []string{
21+
"phone_id",
22+
"bucket_name",
23+
"object_path",
24+
}
25+
26+
// @API CPH POST /v1/{project_id}/cloud-phone/phones/batch-restore
27+
// @API CPH GET /v1/{project_id}/cloud-phone/phones/{phone_id}
28+
func ResourcePhoneDataRestore() *schema.Resource {
29+
return &schema.Resource{
30+
CreateContext: resourcePhoneDataRestoreCreate,
31+
UpdateContext: resourcePhoneDataRestoreUpdate,
32+
ReadContext: resourcePhoneDataRestoreRead,
33+
DeleteContext: resourcePhoneDataRestoreDelete,
34+
35+
Timeouts: &schema.ResourceTimeout{
36+
Create: schema.DefaultTimeout(30 * time.Minute),
37+
},
38+
39+
CustomizeDiff: config.FlexibleForceNew(phoneDataRestoreNonUpdatableParams),
40+
41+
Schema: map[string]*schema.Schema{
42+
"region": {
43+
Type: schema.TypeString,
44+
Optional: true,
45+
Computed: true,
46+
ForceNew: true,
47+
},
48+
"phone_id": {
49+
Type: schema.TypeString,
50+
Required: true,
51+
Description: `Specifies the phone ID.`,
52+
},
53+
"bucket_name": {
54+
Type: schema.TypeString,
55+
Required: true,
56+
Description: `Specifies the bucket name of OBS.`,
57+
},
58+
"object_path": {
59+
Type: schema.TypeString,
60+
Required: true,
61+
Description: `Specifies the object path of OBS.`,
62+
},
63+
"enable_force_new": {
64+
Type: schema.TypeString,
65+
Optional: true,
66+
ValidateFunc: validation.StringInSlice([]string{"true", "false"}, false),
67+
Description: utils.SchemaDesc("", utils.SchemaDescInput{Internal: true}),
68+
},
69+
},
70+
}
71+
}
72+
73+
func resourcePhoneDataRestoreCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
74+
cfg := meta.(*config.Config)
75+
region := cfg.GetRegion(d)
76+
77+
client, err := cfg.NewServiceClient("cph", region)
78+
if err != nil {
79+
return diag.Errorf("error creating CPH client: %s", err)
80+
}
81+
82+
// createPhoneDataRestore: create CPH phone data restore
83+
createPhoneDataRestoreHttpUrl := "v1/{project_id}/cloud-phone/phones/batch-restore"
84+
createPhoneDataRestorePath := client.Endpoint + createPhoneDataRestoreHttpUrl
85+
createPhoneDataRestorePath = strings.ReplaceAll(createPhoneDataRestorePath, "{project_id}", client.ProjectID)
86+
87+
createPhoneDataRestoreOpt := golangsdk.RequestOpts{
88+
KeepResponseBody: true,
89+
}
90+
91+
createPhoneDataRestoreOpt.JSONBody = map[string]interface{}{
92+
"restore_infos": []map[string]interface{}{
93+
{
94+
"phone_id": d.Get("phone_id"),
95+
"bucket_name": d.Get("bucket_name"),
96+
"object_path": d.Get("object_path"),
97+
},
98+
},
99+
}
100+
createPhoneDataRestoreResp, err := client.Request("POST", createPhoneDataRestorePath, &createPhoneDataRestoreOpt)
101+
if err != nil {
102+
return diag.Errorf("error creating CPH phone data restore: %s", err)
103+
}
104+
105+
resp, err := utils.FlattenResponse(createPhoneDataRestoreResp)
106+
if err != nil {
107+
return diag.FromErr(err)
108+
}
109+
id := utils.PathSearch("jobs|[0].phone_id", resp, "").(string)
110+
if id == "" {
111+
return diag.Errorf("unable to find the phone ID from the API response")
112+
}
113+
d.SetId(id)
114+
115+
errorCode := utils.PathSearch("jobs|[0].error_code", resp, "").(string)
116+
if errorCode != "" {
117+
errorMsg := utils.PathSearch("jobs|[0].error_msg", resp, "").(string)
118+
return diag.Errorf("failed to restore CPH phone (phone_id: %s) data, error_code: %s, error_msg: %s", id, errorCode, errorMsg)
119+
}
120+
121+
err = checkPhoneDataRestoreJobStatus(ctx, client, d.Id(), d.Timeout(schema.TimeoutCreate))
122+
if err != nil {
123+
return diag.FromErr(err)
124+
}
125+
126+
return nil
127+
}
128+
129+
func resourcePhoneDataRestoreRead(_ context.Context, _ *schema.ResourceData, _ interface{}) diag.Diagnostics {
130+
return nil
131+
}
132+
133+
func resourcePhoneDataRestoreUpdate(_ context.Context, _ *schema.ResourceData, _ interface{}) diag.Diagnostics {
134+
return nil
135+
}
136+
137+
func resourcePhoneDataRestoreDelete(_ context.Context, _ *schema.ResourceData, _ interface{}) diag.Diagnostics {
138+
errorMsg := "Deleting CPH phone data restore resource is not supported. The resource is only removed from the state."
139+
return diag.Diagnostics{
140+
diag.Diagnostic{
141+
Severity: diag.Warning,
142+
Summary: errorMsg,
143+
},
144+
}
145+
}
146+
147+
func checkPhoneDataRestoreJobStatus(ctx context.Context, client *golangsdk.ServiceClient, id string, timeout time.Duration) error {
148+
stateConf := &resource.StateChangeConf{
149+
Pending: []string{"PENDING"},
150+
Target: []string{"COMPLETED"},
151+
Refresh: jobStatusRefreshFunc(client, id),
152+
Timeout: timeout,
153+
PollInterval: 10 * timeout,
154+
Delay: 10 * time.Second,
155+
}
156+
_, err := stateConf.WaitForStateContext(ctx)
157+
if err != nil {
158+
return fmt.Errorf("error waiting for CPH phone data restore to be completed: %s", err)
159+
}
160+
return nil
161+
}

0 commit comments

Comments
 (0)