Skip to content

Commit a621f2c

Browse files
authored
resource/alicloud_message_service_subscription: Refactored the resource alicloud_message_service_subscription; Added the field create_time, dlq_policy (#8400)
1 parent d748dac commit a621f2c

5 files changed

+468
-183
lines changed

alicloud/provider.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1770,7 +1770,7 @@ func Provider() terraform.ResourceProvider {
17701770
"alicloud_api_gateway_plugin_attachment": resourceAlicloudApiGatewayPluginAttachment(),
17711771
"alicloud_message_service_queue": resourceAliCloudMessageServiceQueue(),
17721772
"alicloud_message_service_topic": resourceAliCloudMessageServiceTopic(),
1773-
"alicloud_message_service_subscription": resourceAlicloudMessageServiceSubscription(),
1773+
"alicloud_message_service_subscription": resourceAliCloudMessageServiceSubscription(),
17741774
"alicloud_cen_transit_router_prefix_list_association": resourceAlicloudCenTransitRouterPrefixListAssociation(),
17751775
"alicloud_dms_enterprise_proxy": resourceAlicloudDmsEnterpriseProxy(),
17761776
"alicloud_vpc_public_ip_address_pool_cidr_block": resourceAliCloudVpcPublicIpAddressPoolCidrBlock(),

alicloud/resource_alicloud_message_service_subscription.go

+170-84
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,140 @@
1+
// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you!
12
package alicloud
23

34
import (
5+
"encoding/json"
46
"fmt"
7+
"github.com/PaesslerAG/jsonpath"
8+
"log"
59
"time"
610

711
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
812
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
913
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
10-
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
1114
)
1215

13-
func resourceAlicloudMessageServiceSubscription() *schema.Resource {
16+
func resourceAliCloudMessageServiceSubscription() *schema.Resource {
1417
return &schema.Resource{
15-
Create: resourceAlicloudMessageServiceSubscriptionCreate,
16-
Read: resourceAlicloudMessageServiceSubscriptionRead,
17-
Update: resourceAlicloudMessageServiceSubscriptionUpdate,
18-
Delete: resourceAlicloudMessageServiceSubscriptionDelete,
18+
Create: resourceAliCloudMessageServiceSubscriptionCreate,
19+
Read: resourceAliCloudMessageServiceSubscriptionRead,
20+
Update: resourceAliCloudMessageServiceSubscriptionUpdate,
21+
Delete: resourceAliCloudMessageServiceSubscriptionDelete,
1922
Importer: &schema.ResourceImporter{
2023
State: schema.ImportStatePassthrough,
2124
},
2225
Timeouts: &schema.ResourceTimeout{
23-
Create: schema.DefaultTimeout(3 * time.Minute),
24-
Update: schema.DefaultTimeout(3 * time.Minute),
25-
Delete: schema.DefaultTimeout(3 * time.Minute),
26+
Create: schema.DefaultTimeout(5 * time.Minute),
27+
Update: schema.DefaultTimeout(5 * time.Minute),
28+
Delete: schema.DefaultTimeout(5 * time.Minute),
2629
},
2730
Schema: map[string]*schema.Schema{
28-
"topic_name": {
31+
"create_time": {
32+
Type: schema.TypeInt,
33+
Computed: true,
34+
},
35+
"dlq_policy": {
36+
Type: schema.TypeList,
37+
Optional: true,
38+
Computed: true,
39+
MaxItems: 1,
40+
Elem: &schema.Resource{
41+
Schema: map[string]*schema.Schema{
42+
"dead_letter_target_queue": {
43+
Type: schema.TypeString,
44+
Optional: true,
45+
},
46+
"enabled": {
47+
Type: schema.TypeBool,
48+
Optional: true,
49+
},
50+
},
51+
},
52+
},
53+
"endpoint": {
2954
Type: schema.TypeString,
3055
Required: true,
3156
ForceNew: true,
3257
},
33-
"subscription_name": {
58+
"filter_tag": {
3459
Type: schema.TypeString,
35-
Required: true,
60+
Optional: true,
3661
ForceNew: true,
3762
},
38-
"endpoint": {
63+
"notify_content_format": {
3964
Type: schema.TypeString,
40-
Required: true,
65+
Optional: true,
4166
ForceNew: true,
67+
Computed: true,
4268
},
43-
"push_type": {
44-
Type: schema.TypeString,
45-
Required: true,
46-
ForceNew: true,
47-
ValidateFunc: validation.StringInSlice([]string{"http", "queue", "mpush", "alisms", "email"}, false),
69+
"notify_strategy": {
70+
Type: schema.TypeString,
71+
Optional: true,
72+
Computed: true,
4873
},
49-
"filter_tag": {
50-
Type: schema.TypeString,
51-
Optional: true,
52-
ForceNew: true,
53-
ValidateFunc: validation.StringLenBetween(0, 16),
74+
"push_type": {
75+
Type: schema.TypeString,
76+
Required: true,
5477
},
55-
"notify_content_format": {
56-
Type: schema.TypeString,
57-
Optional: true,
58-
Computed: true,
59-
ForceNew: true,
60-
ValidateFunc: validation.StringInSlice([]string{"XML", "JSON", "SIMPLIFIED"}, false),
78+
"subscription_name": {
79+
Type: schema.TypeString,
80+
Required: true,
81+
ForceNew: true,
6182
},
62-
"notify_strategy": {
63-
Type: schema.TypeString,
64-
Optional: true,
65-
Computed: true,
66-
ValidateFunc: validation.StringInSlice([]string{"BACKOFF_RETRY", "EXPONENTIAL_DECAY_RETRY"}, false),
83+
"topic_name": {
84+
Type: schema.TypeString,
85+
Required: true,
86+
ForceNew: true,
6787
},
6888
},
6989
}
7090
}
7191

72-
func resourceAlicloudMessageServiceSubscriptionCreate(d *schema.ResourceData, meta interface{}) error {
92+
func resourceAliCloudMessageServiceSubscriptionCreate(d *schema.ResourceData, meta interface{}) error {
93+
7394
client := meta.(*connectivity.AliyunClient)
74-
var response map[string]interface{}
95+
7596
action := "Subscribe"
76-
request := make(map[string]interface{})
97+
var request map[string]interface{}
98+
var response map[string]interface{}
99+
query := make(map[string]interface{})
77100
var err error
78-
101+
request = make(map[string]interface{})
79102
request["TopicName"] = d.Get("topic_name")
80103
request["SubscriptionName"] = d.Get("subscription_name")
81-
request["Endpoint"] = d.Get("endpoint")
82-
request["PushType"] = d.Get("push_type")
83104

84-
if v, ok := d.GetOk("filter_tag"); ok {
85-
request["MessageTag"] = v
105+
if v, ok := d.GetOk("notify_strategy"); ok {
106+
request["NotifyStrategy"] = v
86107
}
87-
88108
if v, ok := d.GetOk("notify_content_format"); ok {
89109
request["NotifyContentFormat"] = v
90110
}
111+
if v, ok := d.GetOk("filter_tag"); ok {
112+
request["MessageTag"] = v
113+
}
114+
request["Endpoint"] = d.Get("endpoint")
115+
request["PushType"] = d.Get("push_type")
116+
objectDataLocalMap := make(map[string]interface{})
91117

92-
if v, ok := d.GetOk("notify_strategy"); ok {
93-
request["NotifyStrategy"] = v
118+
if v := d.Get("dlq_policy"); !IsNil(v) {
119+
deadLetterTargetQueue1, _ := jsonpath.Get("$[0].dead_letter_target_queue", v)
120+
if deadLetterTargetQueue1 != nil && deadLetterTargetQueue1 != "" {
121+
objectDataLocalMap["DeadLetterTargetQueue"] = deadLetterTargetQueue1
122+
}
123+
enabled1, _ := jsonpath.Get("$[0].enabled", v)
124+
if enabled1 != nil && enabled1 != "" {
125+
objectDataLocalMap["Enabled"] = enabled1
126+
}
127+
128+
objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap)
129+
if err != nil {
130+
return WrapError(err)
131+
}
132+
request["DlqPolicy"] = string(objectDataLocalMapJson)
94133
}
95134

96-
wait := incrementalWait(3*time.Second, 3*time.Second)
97-
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutCreate)), func() *resource.RetryError {
98-
response, err = client.RpcPost("Mns-open", "2022-01-19", action, nil, request, false)
135+
wait := incrementalWait(3*time.Second, 5*time.Second)
136+
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
137+
response, err = client.RpcPost("Mns-open", "2022-01-19", action, query, request, true)
99138
if err != nil {
100139
if NeedRetry(err) {
101140
wait()
@@ -111,46 +150,69 @@ func resourceAlicloudMessageServiceSubscriptionCreate(d *schema.ResourceData, me
111150
return WrapErrorf(err, DefaultErrorMsg, "alicloud_message_service_subscription", action, AlibabaCloudSdkGoERROR)
112151
}
113152

114-
d.SetId(fmt.Sprint(request["TopicName"], ":", request["SubscriptionName"]))
153+
d.SetId(fmt.Sprintf("%v:%v", request["TopicName"], request["SubscriptionName"]))
115154

116-
return resourceAlicloudMessageServiceSubscriptionRead(d, meta)
155+
return resourceAliCloudMessageServiceSubscriptionRead(d, meta)
117156
}
118157

119-
func resourceAlicloudMessageServiceSubscriptionRead(d *schema.ResourceData, meta interface{}) error {
158+
func resourceAliCloudMessageServiceSubscriptionRead(d *schema.ResourceData, meta interface{}) error {
120159
client := meta.(*connectivity.AliyunClient)
121-
mnsOpenService := MnsOpenService{client}
160+
messageServiceServiceV2 := MessageServiceServiceV2{client}
122161

123-
object, err := mnsOpenService.DescribeMessageServiceSubscription(d.Id())
162+
objectRaw, err := messageServiceServiceV2.DescribeMessageServiceSubscription(d.Id())
124163
if err != nil {
125-
if NotFoundError(err) {
164+
if !d.IsNewResource() && NotFoundError(err) {
165+
log.Printf("[DEBUG] Resource alicloud_message_service_subscription DescribeMessageServiceSubscription Failed!!! %s", err)
126166
d.SetId("")
127167
return nil
128168
}
129169
return WrapError(err)
130170
}
131171

132-
d.Set("topic_name", object["TopicName"])
133-
d.Set("subscription_name", object["SubscriptionName"])
134-
d.Set("endpoint", object["Endpoint"])
135-
d.Set("filter_tag", object["FilterTag"])
136-
d.Set("notify_content_format", object["NotifyContentFormat"])
137-
d.Set("notify_strategy", object["NotifyStrategy"])
172+
d.Set("create_time", objectRaw["CreateTime"])
173+
d.Set("endpoint", objectRaw["Endpoint"])
174+
d.Set("filter_tag", objectRaw["FilterTag"])
175+
d.Set("notify_content_format", objectRaw["NotifyContentFormat"])
176+
d.Set("notify_strategy", objectRaw["NotifyStrategy"])
177+
d.Set("subscription_name", objectRaw["SubscriptionName"])
178+
d.Set("topic_name", objectRaw["TopicName"])
179+
180+
dlqPolicyMaps := make([]map[string]interface{}, 0)
181+
dlqPolicyMap := make(map[string]interface{})
182+
dlqPolicyRaw := make(map[string]interface{})
183+
if objectRaw["DlqPolicy"] != nil {
184+
dlqPolicyRaw = objectRaw["DlqPolicy"].(map[string]interface{})
185+
}
186+
if len(dlqPolicyRaw) > 0 {
187+
dlqPolicyMap["dead_letter_target_queue"] = dlqPolicyRaw["DeadLetterTargetQueue"]
188+
dlqPolicyMap["enabled"] = dlqPolicyRaw["Enabled"]
189+
190+
dlqPolicyMaps = append(dlqPolicyMaps, dlqPolicyMap)
191+
}
192+
if err := d.Set("dlq_policy", dlqPolicyMaps); err != nil {
193+
return err
194+
}
138195

139196
return nil
140197
}
141198

142-
func resourceAlicloudMessageServiceSubscriptionUpdate(d *schema.ResourceData, meta interface{}) error {
199+
func resourceAliCloudMessageServiceSubscriptionUpdate(d *schema.ResourceData, meta interface{}) error {
143200
client := meta.(*connectivity.AliyunClient)
201+
var request map[string]interface{}
144202
var response map[string]interface{}
203+
var query map[string]interface{}
145204
update := false
205+
206+
var err error
146207
parts, err := ParseResourceId(d.Id(), 2)
147208
if err != nil {
148209
return WrapError(err)
149210
}
150-
request := map[string]interface{}{
151-
"TopicName": parts[0],
152-
"SubscriptionName": parts[1],
153-
}
211+
action := "SetSubscriptionAttributes"
212+
request = make(map[string]interface{})
213+
query = make(map[string]interface{})
214+
request["TopicName"] = parts[0]
215+
request["SubscriptionName"] = parts[1]
154216

155217
if d.HasChange("notify_strategy") {
156218
update = true
@@ -159,11 +221,35 @@ func resourceAlicloudMessageServiceSubscriptionUpdate(d *schema.ResourceData, me
159221
request["NotifyStrategy"] = v
160222
}
161223

224+
if d.HasChange("dlq_policy") {
225+
update = true
226+
objectDataLocalMap := make(map[string]interface{})
227+
228+
if v := d.Get("dlq_policy"); v != nil {
229+
enabled1, _ := jsonpath.Get("$[0].enabled", v)
230+
if enabled1 != nil && (d.HasChange("dlq_policy.0.enabled") || enabled1 != "") {
231+
objectDataLocalMap["Enabled"] = enabled1
232+
233+
if objectDataLocalMap["Enabled"].(bool) {
234+
deadLetterTargetQueue1, _ := jsonpath.Get("$[0].dead_letter_target_queue", v)
235+
if deadLetterTargetQueue1 != nil && (d.HasChange("dlq_policy.0.dead_letter_target_queue") || deadLetterTargetQueue1 != "") {
236+
objectDataLocalMap["DeadLetterTargetQueue"] = deadLetterTargetQueue1
237+
}
238+
}
239+
}
240+
241+
objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap)
242+
if err != nil {
243+
return WrapError(err)
244+
}
245+
request["DlqPolicy"] = string(objectDataLocalMapJson)
246+
}
247+
}
248+
162249
if update {
163-
action := "SetSubscriptionAttributes"
164-
wait := incrementalWait(3*time.Second, 3*time.Second)
165-
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
166-
response, err = client.RpcPost("Mns-open", "2022-01-19", action, nil, request, false)
250+
wait := incrementalWait(3*time.Second, 5*time.Second)
251+
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
252+
response, err = client.RpcPost("Mns-open", "2022-01-19", action, query, request, true)
167253
if err != nil {
168254
if NeedRetry(err) {
169255
wait()
@@ -174,33 +260,33 @@ func resourceAlicloudMessageServiceSubscriptionUpdate(d *schema.ResourceData, me
174260
return nil
175261
})
176262
addDebug(action, response, request)
177-
178263
if err != nil {
179264
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
180265
}
181266
}
182267

183-
return resourceAlicloudMessageServiceSubscriptionRead(d, meta)
268+
return resourceAliCloudMessageServiceSubscriptionRead(d, meta)
184269
}
185270

186-
func resourceAlicloudMessageServiceSubscriptionDelete(d *schema.ResourceData, meta interface{}) error {
187-
client := meta.(*connectivity.AliyunClient)
188-
action := "Unsubscribe"
189-
var response map[string]interface{}
190-
var err error
271+
func resourceAliCloudMessageServiceSubscriptionDelete(d *schema.ResourceData, meta interface{}) error {
191272

273+
client := meta.(*connectivity.AliyunClient)
192274
parts, err := ParseResourceId(d.Id(), 2)
193275
if err != nil {
194276
return WrapError(err)
195277
}
196-
request := map[string]interface{}{
197-
"TopicName": parts[0],
198-
"SubscriptionName": parts[1],
199-
}
278+
action := "Unsubscribe"
279+
var request map[string]interface{}
280+
var response map[string]interface{}
281+
query := make(map[string]interface{})
282+
request = make(map[string]interface{})
283+
request["SubscriptionName"] = parts[1]
284+
request["TopicName"] = parts[0]
285+
286+
wait := incrementalWait(3*time.Second, 5*time.Second)
287+
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
288+
response, err = client.RpcPost("Mns-open", "2022-01-19", action, query, request, true)
200289

201-
wait := incrementalWait(3*time.Second, 3*time.Second)
202-
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutDelete)), func() *resource.RetryError {
203-
response, err = client.RpcPost("Mns-open", "2022-01-19", action, nil, request, false)
204290
if err != nil {
205291
if NeedRetry(err) {
206292
wait()

0 commit comments

Comments
 (0)