Skip to content

Commit 5bcc76c

Browse files
authored
feat/tdmq-support (#1922)
* feat/tdmq-support * feat/tdmq-support * feat/tdmq-support * feat/tdmq-support
1 parent d4cec2b commit 5bcc76c

18 files changed

+2510
-198
lines changed

.changelog/1922.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:new-resource
2+
tencentcloud_tdmq_send_rocketmq_message
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_tdmq_rabbitmq_user
7+
```
8+
9+
```release-note:new-resource
10+
tencentcloud_tdmq_rabbitmq_virtual_host
11+
```

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ require (
7878
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcm v1.0.547
7979
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.680
8080
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdcpg v1.0.533
81-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.670
81+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.691
8282
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.578
8383
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.529
8484
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.644

go.sum

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.683 h1:HGTN
862862
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.683/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
863863
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.687/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
864864
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.688/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
865-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.689 h1:zjqgWiWoBtkcxcsDYkDMLvvahSm1LQ3NtZ7R9kfz5qE=
866865
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.689/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
867866
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.691 h1:LCYZQu5j55bcPz8QTFwEyMKtTUzFL47R4H90728VNq0=
868867
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.691/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
@@ -945,8 +944,10 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.680 h1:e5xJXZY
945944
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.680/go.mod h1:pwgZJLN5WL93J44Q8HfkUYDvHYgkSFxL9EuqPv28nLs=
946945
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdcpg v1.0.533 h1:r6HQhmHzPp1oSGhwkNzUzIRlpnpb8Jhtcn1yKhg9ml4=
947946
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdcpg v1.0.533/go.mod h1:5sIIchyV9sXIVAqsD3UWts+qQJ0qoc55sL2WuiY8Ugs=
948-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.670 h1:8HqKhy7wbSsgacBs0iYWh/A0/zvCPzKPS++olMaf9EQ=
949-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.670/go.mod h1:2K+biNqsIm4z1q8Op13WPWw6J/SnvimIqEllSw+aUQ8=
947+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.689 h1:EiwKuO2RzouHn2q85Uf57i0bEkbbMtARfyjb0tVij+A=
948+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.689/go.mod h1:xotbaKQPQl3T1CLPHowGNWJ4dxuCGiM7OwfV6+IU0Zk=
949+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.691 h1:1mh98DoSMgIP2YVfGLYANH2l8xm5XnPxAOmfxh3BQ1U=
950+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.691/go.mod h1:9TbaS6CPnhkzVXUCTVt2gVIResf4jDgvSlsS8k+LTQM=
950951
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.578 h1:vBpQhUroO+FAslUmsDWGi8nvczsqZBWVgQwlnyT0Aj8=
951952
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.578/go.mod h1:UlojGQh/9wb7/uXPNi7PvMral1CNAskVDNgqJEV83l0=
952953
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.529 h1:vWUgseUvHs1fW/Ok+x3ld9UIhrYRNO9Yr8ccX8wmkkY=

tencentcloud/provider.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,13 @@ TDMQ for RocketMQ(trocket)
13991399
tencentcloud_tdmq_rocketmq_topic
14001400
tencentcloud_tdmq_rocketmq_group
14011401
tencentcloud_tdmq_rocketmq_environment_role
1402+
tencentcloud_tdmq_send_rocketmq_message
1403+
1404+
TDMQ for RabbitMQ(trabbit)
1405+
Resource
1406+
tencentcloud_tdmq_rabbitmq_user
1407+
tencentcloud_tdmq_rabbitmq_virtual_host
1408+
14021409
14031410
Cloud Infinite(CI)
14041411
Resource
@@ -2593,6 +2600,9 @@ func Provider() *schema.Provider {
25932600
"tencentcloud_tdmq_role": resourceTencentCloudTdmqRole(),
25942601
"tencentcloud_tdmq_namespace_role_attachment": resourceTencentCloudTdmqNamespaceRoleAttachment(),
25952602
"tencentcloud_tdmq_subscription_attachment": resourceTencentCloudTdmqSubscriptionAttachment(),
2603+
"tencentcloud_tdmq_rabbitmq_user": resourceTencentCloudTdmqRabbitmqUser(),
2604+
"tencentcloud_tdmq_rabbitmq_virtual_host": resourceTencentCloudTdmqRabbitmqVirtualHost(),
2605+
"tencentcloud_tdmq_send_rocketmq_message": resourceTencentCloudTdmqSendRocketmqMessage(),
25962606
"tencentcloud_cos_bucket_policy": resourceTencentCloudCosBucketPolicy(),
25972607
"tencentcloud_cos_bucket_domain_certificate_attachment": resourceTencentCloudCosBucketDomainCertificateAttachment(),
25982608
"tencentcloud_cos_bucket_inventory": resourceTencentCloudCosBucketInventory(),
Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
/*
2+
Provides a resource to create a tdmq rabbitmq_user
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_tdmq_rabbitmq_user" "rabbitmq_user" {
8+
instance_id = "amqp-kzbe8p3n"
9+
user = "keep-user"
10+
password = "asdf1234"
11+
description = "test user"
12+
tags = ["management", "monitoring"]
13+
max_connections = 3
14+
max_channels = 3
15+
}
16+
```
17+
*/
18+
package tencentcloud
19+
20+
import (
21+
"context"
22+
"fmt"
23+
"log"
24+
"strings"
25+
26+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
27+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
28+
tdmq "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq/v20200217"
29+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
30+
)
31+
32+
func resourceTencentCloudTdmqRabbitmqUser() *schema.Resource {
33+
return &schema.Resource{
34+
Create: resourceTencentCloudTdmqRabbitmqUserCreate,
35+
Read: resourceTencentCloudTdmqRabbitmqUserRead,
36+
Update: resourceTencentCloudTdmqRabbitmqUserUpdate,
37+
Delete: resourceTencentCloudTdmqRabbitmqUserDelete,
38+
39+
Schema: map[string]*schema.Schema{
40+
"instance_id": {
41+
Required: true,
42+
Type: schema.TypeString,
43+
Description: "Cluster instance ID.",
44+
},
45+
"user": {
46+
Required: true,
47+
Type: schema.TypeString,
48+
Description: "Username, used when logging in.",
49+
},
50+
"password": {
51+
Required: true,
52+
Type: schema.TypeString,
53+
Sensitive: true,
54+
Description: "Password, used when logging in.",
55+
},
56+
"description": {
57+
Optional: true,
58+
Type: schema.TypeString,
59+
Description: "Describe.",
60+
},
61+
"tags": {
62+
Optional: true,
63+
Type: schema.TypeList,
64+
Elem: &schema.Schema{Type: schema.TypeString},
65+
Description: "User tag, used to determine the permission range for changing user access to RabbitMQ Management. Management: regular console user, monitoring: management console user, other values: non console user.",
66+
},
67+
"max_connections": {
68+
Optional: true,
69+
Type: schema.TypeInt,
70+
Description: "The maximum number of connections for this user, if not filled in, there is no limit.",
71+
},
72+
"max_channels": {
73+
Optional: true,
74+
Type: schema.TypeInt,
75+
Description: "The maximum number of channels for this user, if not filled in, there is no limit.",
76+
},
77+
},
78+
}
79+
}
80+
81+
func resourceTencentCloudTdmqRabbitmqUserCreate(d *schema.ResourceData, meta interface{}) error {
82+
defer logElapsed("resource.tencentcloud_tdmq_rabbitmq_user.create")()
83+
defer inconsistentCheck(d, meta)()
84+
85+
var (
86+
logId = getLogId(contextNil)
87+
request = tdmq.NewCreateRabbitMQUserRequest()
88+
response = tdmq.NewCreateRabbitMQUserResponse()
89+
instanceId string
90+
user string
91+
)
92+
93+
if v, ok := d.GetOk("instance_id"); ok {
94+
request.InstanceId = helper.String(v.(string))
95+
instanceId = v.(string)
96+
}
97+
98+
if v, ok := d.GetOk("user"); ok {
99+
request.User = helper.String(v.(string))
100+
}
101+
102+
if v, ok := d.GetOk("password"); ok {
103+
request.Password = helper.String(v.(string))
104+
}
105+
106+
if v, ok := d.GetOk("description"); ok {
107+
request.Description = helper.String(v.(string))
108+
}
109+
110+
if v, ok := d.GetOk("tags"); ok {
111+
request.Tags = helper.InterfacesStringsPoint(v.([]interface{}))
112+
}
113+
114+
if v, ok := d.GetOkExists("max_connections"); ok {
115+
request.MaxConnections = helper.IntInt64(v.(int))
116+
}
117+
118+
if v, ok := d.GetOkExists("max_channels"); ok {
119+
request.MaxChannels = helper.IntInt64(v.(int))
120+
}
121+
122+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
123+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseTdmqClient().CreateRabbitMQUser(request)
124+
if e != nil {
125+
return retryError(e)
126+
} else {
127+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
128+
}
129+
130+
response = result
131+
return nil
132+
})
133+
134+
if err != nil {
135+
log.Printf("[CRITAL]%s create tdmq rabbitmqUser failed, reason:%+v", logId, err)
136+
return err
137+
}
138+
139+
user = *response.Response.User
140+
141+
d.SetId(strings.Join([]string{instanceId, user}, FILED_SP))
142+
143+
return resourceTencentCloudTdmqRabbitmqUserRead(d, meta)
144+
}
145+
146+
func resourceTencentCloudTdmqRabbitmqUserRead(d *schema.ResourceData, meta interface{}) error {
147+
defer logElapsed("resource.tencentcloud_tdmq_rabbitmq_user.read")()
148+
defer inconsistentCheck(d, meta)()
149+
150+
var (
151+
logId = getLogId(contextNil)
152+
ctx = context.WithValue(context.TODO(), logIdKey, logId)
153+
service = TdmqService{client: meta.(*TencentCloudClient).apiV3Conn}
154+
)
155+
156+
idSplit := strings.Split(d.Id(), FILED_SP)
157+
if len(idSplit) != 2 {
158+
return fmt.Errorf("id is broken,%s", idSplit)
159+
}
160+
161+
instanceId := idSplit[0]
162+
user := idSplit[1]
163+
164+
rabbitmqUser, err := service.DescribeTdmqRabbitmqUserById(ctx, instanceId, user)
165+
if err != nil {
166+
return err
167+
}
168+
169+
if rabbitmqUser == nil {
170+
d.SetId("")
171+
log.Printf("[WARN]%s resource `TdmqRabbitmqUser` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
172+
return nil
173+
}
174+
175+
if rabbitmqUser.InstanceId != nil {
176+
_ = d.Set("instance_id", rabbitmqUser.InstanceId)
177+
}
178+
179+
if rabbitmqUser.User != nil {
180+
_ = d.Set("user", rabbitmqUser.User)
181+
}
182+
183+
if rabbitmqUser.Password != nil {
184+
_ = d.Set("password", rabbitmqUser.Password)
185+
}
186+
187+
if rabbitmqUser.Description != nil {
188+
_ = d.Set("description", rabbitmqUser.Description)
189+
}
190+
191+
if rabbitmqUser.Tags != nil {
192+
_ = d.Set("tags", rabbitmqUser.Tags)
193+
}
194+
195+
return nil
196+
}
197+
198+
func resourceTencentCloudTdmqRabbitmqUserUpdate(d *schema.ResourceData, meta interface{}) error {
199+
defer logElapsed("resource.tencentcloud_tdmq_rabbitmq_user.update")()
200+
defer inconsistentCheck(d, meta)()
201+
202+
var (
203+
logId = getLogId(contextNil)
204+
request = tdmq.NewModifyRabbitMQUserRequest()
205+
)
206+
207+
idSplit := strings.Split(d.Id(), FILED_SP)
208+
if len(idSplit) != 2 {
209+
return fmt.Errorf("id is broken,%s", idSplit)
210+
}
211+
212+
instanceId := idSplit[0]
213+
user := idSplit[1]
214+
215+
immutableArgs := []string{"instance_id", "user", "password"}
216+
217+
for _, v := range immutableArgs {
218+
if d.HasChange(v) {
219+
return fmt.Errorf("argument `%s` cannot be changed", v)
220+
}
221+
}
222+
223+
if d.HasChange("description") || d.HasChange("max_connections") || d.HasChange("max_channels") {
224+
request.InstanceId = &instanceId
225+
request.User = &user
226+
227+
if v, ok := d.GetOk("password"); ok {
228+
request.Password = helper.String(v.(string))
229+
}
230+
231+
if v, ok := d.GetOk("description"); ok {
232+
request.Description = helper.String(v.(string))
233+
}
234+
235+
if v, ok := d.GetOkExists("max_connections"); ok {
236+
request.MaxConnections = helper.IntInt64(v.(int))
237+
}
238+
239+
if v, ok := d.GetOkExists("max_channels"); ok {
240+
request.MaxChannels = helper.IntInt64(v.(int))
241+
}
242+
243+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
244+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseTdmqClient().ModifyRabbitMQUser(request)
245+
if e != nil {
246+
return retryError(e)
247+
} else {
248+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
249+
}
250+
251+
return nil
252+
})
253+
254+
if err != nil {
255+
log.Printf("[CRITAL]%s update tdmq rabbitmqUser failed, reason:%+v", logId, err)
256+
return err
257+
}
258+
}
259+
260+
return resourceTencentCloudTdmqRabbitmqUserRead(d, meta)
261+
}
262+
263+
func resourceTencentCloudTdmqRabbitmqUserDelete(d *schema.ResourceData, meta interface{}) error {
264+
defer logElapsed("resource.tencentcloud_tdmq_rabbitmq_user.delete")()
265+
defer inconsistentCheck(d, meta)()
266+
267+
var (
268+
logId = getLogId(contextNil)
269+
ctx = context.WithValue(context.TODO(), logIdKey, logId)
270+
service = TdmqService{client: meta.(*TencentCloudClient).apiV3Conn}
271+
)
272+
273+
idSplit := strings.Split(d.Id(), FILED_SP)
274+
if len(idSplit) != 2 {
275+
return fmt.Errorf("id is broken,%s", idSplit)
276+
}
277+
278+
instanceId := idSplit[0]
279+
user := idSplit[1]
280+
281+
if err := service.DeleteTdmqRabbitmqUserById(ctx, instanceId, user); err != nil {
282+
return err
283+
}
284+
285+
return nil
286+
}

0 commit comments

Comments
 (0)