Skip to content

Commit 797f907

Browse files
committed
feat(dms): add new resource to restart nodes
1 parent 92a3fe8 commit 797f907

File tree

4 files changed

+229
-0
lines changed

4 files changed

+229
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
---
2+
subcategory: "Distributed Message Service (DMS)"
3+
layout: "huaweicloud"
4+
page_title: "HuaweiCloud: huaweicloud_dms_rocketmq_instance_restart"
5+
description: |-
6+
Restart a DMS RocketMQ instance resource within HuaweiCloud.
7+
---
8+
9+
# huaweicloud_dms_rocketmq_instance_restart
10+
11+
Restart a DMS RocketMQ instance resource within HuaweiCloud.
12+
13+
## Example Usage
14+
15+
```hcl
16+
variable "instance_id" {}
17+
18+
data "huaweicloud_dms_rocketmq_instance_nodes" "test" {
19+
instance_id = var.instance_id
20+
}
21+
22+
resource "huaweicloud_dms_rocketmq_instance_restart" "test" {
23+
instance_id = var.instance_id
24+
25+
nodes = [
26+
data.huaweicloud_dms_rocketmq_instance_nodes.test.nodes[0].id,
27+
data.huaweicloud_dms_rocketmq_instance_nodes.test.nodes[1].id
28+
]
29+
}
30+
```
31+
32+
## Argument Reference
33+
34+
The following arguments are supported:
35+
36+
* `region` - (Optional, String, ForceNew) Specifies the region in which to restart the RocketMQ instance.
37+
If omitted, the provider-level region will be used. Changing this parameter will create a new resource.
38+
39+
* `instance_id` - (Required, String, NonUpdatable) Specifies the ID of the RocketMQ instance to be restarted.
40+
41+
* `nodes` - (Required, List, NonUpdatable) Specifies the list of node IDs to be restarted.
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+
## Import
50+
51+
The RocketMQ instance restart resource cannot be imported.
52+
53+
## Timeouts
54+
55+
This resource does not support timeout configuration.

huaweicloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,6 +2265,7 @@ func Provider() *schema.Provider {
22652265
"huaweicloud_dms_rabbitmq_user": rabbitmq.ResourceDmsRabbitmqUser(),
22662266

22672267
"huaweicloud_dms_rocketmq_instance": rocketmq.ResourceDmsRocketMQInstance(),
2268+
"huaweicloud_dms_rocketmq_instance_restart": rocketmq.ResourceDmsRocketMQInstanceRestart(),
22682269
"huaweicloud_dms_rocketmq_consumer_group": rocketmq.ResourceDmsRocketMQConsumerGroup(),
22692270
"huaweicloud_dms_rocketmq_consumption_verify": rocketmq.ResourceDmsRocketMQConsumptionVerify(),
22702271
"huaweicloud_dms_rocketmq_message_offset_reset": rocketmq.ResourceDmsRocketMQMessageOffsetReset(),
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package rocketmq
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 TestAccDmsRocketMQInstanceRestart_basic(t *testing.T) {
13+
var (
14+
dataSourceName = "huaweicloud_dms_rocketmq_instance_restart.test"
15+
instanceID = acceptance.HW_DMS_ROCKETMQ_INSTANCE_ID
16+
)
17+
18+
resource.ParallelTest(t, resource.TestCase{
19+
PreCheck: func() {
20+
acceptance.TestAccPreCheck(t)
21+
acceptance.TestAccPreCheckDMSRocketMQInstanceID(t)
22+
},
23+
ProviderFactories: acceptance.TestAccProviderFactories,
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccDmsRocketMQInstanceRestart_basic(instanceID),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttr(dataSourceName, "instance_id", instanceID),
29+
resource.TestCheckResourceAttr(dataSourceName, "nodes.#", "2"),
30+
resource.TestCheckResourceAttrSet(dataSourceName, "nodes.0"),
31+
),
32+
},
33+
},
34+
})
35+
}
36+
37+
func testAccDmsRocketMQInstanceRestart_basic(instanceID string) string {
38+
return fmt.Sprintf(`
39+
%s
40+
41+
resource "huaweicloud_dms_rocketmq_instance_restart" "test" {
42+
instance_id = data.huaweicloud_dms_rocketmq_instance_nodes.test.instance_id
43+
44+
nodes = [
45+
try(data.huaweicloud_dms_rocketmq_instance_nodes.test.nodes[0].id),
46+
try(data.huaweicloud_dms_rocketmq_instance_nodes.test.nodes[1].id)
47+
]
48+
}
49+
`, testAccDmsRocketMQInstanceNodes_basic(instanceID))
50+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package rocketmq
2+
3+
import (
4+
"context"
5+
"strings"
6+
7+
"github.com/hashicorp/go-uuid"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
12+
13+
"github.com/chnsz/golangsdk"
14+
15+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/config"
16+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/utils"
17+
)
18+
19+
var instanceRestartNonUpdatableParams = []string{"instance_id", "nodes"}
20+
21+
// @API RocketMQ POST /v2/{project_id}/{engine}/instances/{instance_id}/restart
22+
func ResourceDmsRocketMQInstanceRestart() *schema.Resource {
23+
return &schema.Resource{
24+
CreateContext: resourceDmsRocketMQInstanceRestartCreate,
25+
ReadContext: resourceDmsRocketMQInstanceRestartRead,
26+
DeleteContext: resourceDmsRocketMQInstanceRestartDelete,
27+
28+
CustomizeDiff: customdiff.All(
29+
config.FlexibleForceNew(instanceRestartNonUpdatableParams),
30+
),
31+
32+
Schema: map[string]*schema.Schema{
33+
"region": {
34+
Type: schema.TypeString,
35+
Optional: true,
36+
ForceNew: true,
37+
Computed: true,
38+
Description: `The region where the RocketMQ instance is located.`,
39+
},
40+
"instance_id": {
41+
Type: schema.TypeString,
42+
Required: true,
43+
Description: `The ID of the RocketMQ instance to be restarted.`,
44+
},
45+
"nodes": {
46+
Type: schema.TypeList,
47+
Required: true,
48+
Elem: &schema.Schema{Type: schema.TypeString},
49+
Description: `The list of node names to be restarted.`,
50+
},
51+
52+
// Internal
53+
"enable_force_new": {
54+
Type: schema.TypeString,
55+
Optional: true,
56+
ValidateFunc: validation.StringInSlice([]string{"true", "false"}, false),
57+
Description: utils.SchemaDesc("", utils.SchemaDescInput{Internal: true}),
58+
},
59+
},
60+
}
61+
}
62+
63+
func resourceDmsRocketMQInstanceRestartCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
64+
cfg := meta.(*config.Config)
65+
region := cfg.GetRegion(d)
66+
client, err := cfg.NewServiceClient("dmsv2", region)
67+
if err != nil {
68+
return diag.Errorf("error creating DMS client: %s", err)
69+
}
70+
71+
instanceId := d.Get("instance_id").(string)
72+
73+
httpUrl := "v2/{project_id}/rocketmq/instances/{instance_id}/restart"
74+
httpUrl = strings.ReplaceAll(httpUrl, "{project_id}", client.ProjectID)
75+
httpUrl = strings.ReplaceAll(httpUrl, "{instance_id}", instanceId)
76+
restartPath := client.Endpoint + httpUrl
77+
78+
opt := golangsdk.RequestOpts{
79+
KeepResponseBody: true,
80+
MoreHeaders: map[string]string{
81+
"Content-Type": "application/json",
82+
},
83+
}
84+
85+
// Add nodes parameter to request body if specified
86+
if nodesRaw := d.Get("nodes").([]interface{}); len(nodesRaw) > 0 {
87+
nodes := make([]string, len(nodesRaw))
88+
for i, node := range nodesRaw {
89+
nodes[i] = node.(string)
90+
}
91+
opt.JSONBody = map[string]interface{}{
92+
"nodes": nodes,
93+
}
94+
}
95+
96+
_, err = client.Request("POST", restartPath, &opt)
97+
if err != nil {
98+
return diag.Errorf("error restarting RocketMQ instance: %s", err)
99+
}
100+
101+
randUUID, err := uuid.GenerateUUID()
102+
if err != nil {
103+
return diag.Errorf("unable to generate resource ID: %s", err)
104+
}
105+
d.SetId(randUUID)
106+
107+
return resourceDmsRocketMQInstanceRestartRead(ctx, d, meta)
108+
}
109+
110+
func resourceDmsRocketMQInstanceRestartRead(_ context.Context, _ *schema.ResourceData, _ interface{}) diag.Diagnostics {
111+
return nil
112+
}
113+
114+
func resourceDmsRocketMQInstanceRestartDelete(_ context.Context, _ *schema.ResourceData, _ interface{}) diag.Diagnostics {
115+
errorMsg := `This resource is a one-time action resource used to restart RocketMQ instance. Deleting this resource will
116+
not clear the restart operation record, but will only remove the resource information from the tfstate file.`
117+
return diag.Diagnostics{
118+
diag.Diagnostic{
119+
Severity: diag.Warning,
120+
Summary: errorMsg,
121+
},
122+
}
123+
}

0 commit comments

Comments
 (0)