alicloud/resource_alicloud_mns_topic_subscription.go (145 lines of code) (raw):

package alicloud import ( "fmt" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ali_mns "github.com/aliyun/aliyun-mns-go-sdk" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAlicloudMNSSubscription() *schema.Resource { return &schema.Resource{ Create: resourceAlicloudMNSSubscriptionCreate, Read: resourceAlicloudMNSSubscriptionRead, Update: resourceAlicloudMNSSubscriptionUpdate, Delete: resourceAlicloudMNSSubscriptionDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Schema: map[string]*schema.Schema{ "topic_name": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(3, 256), }, "name": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(3, 256), }, "endpoint": { Type: schema.TypeString, Required: true, ForceNew: true, }, "filter_tag": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(0, 16), }, "notify_strategy": { Type: schema.TypeString, Optional: true, Default: string(ali_mns.BACKOFF_RETRY), ValidateFunc: validation.StringInSlice([]string{ string(ali_mns.BACKOFF_RETRY), string(ali_mns.EXPONENTIAL_DECAY_RETRY), }, false), }, "notify_content_format": { Type: schema.TypeString, Optional: true, Default: string(ali_mns.SIMPLIFIED), ForceNew: true, }, }, } } func resourceAlicloudMNSSubscriptionCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) topicName := d.Get("topic_name").(string) name := d.Get("name").(string) endpoint := d.Get("endpoint").(string) notifyStrategyStr := d.Get("notify_strategy").(string) notifyContentFormatStr := d.Get("notify_content_format").(string) var filterTag string if v, ok := d.GetOk("filter_tag"); ok { filterTag = v.(string) } notifyStrategy := ali_mns.NotifyStrategyType(notifyStrategyStr) notifyContentFormat := ali_mns.NotifyContentFormatType(notifyContentFormatStr) subRequest := ali_mns.MessageSubsribeRequest{ Endpoint: endpoint, FilterTag: filterTag, NotifyStrategy: notifyStrategy, NotifyContentFormat: notifyContentFormat, } raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { return nil, subscriptionManager.Subscribe(name, subRequest) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_mns_topic_subscription", "Subscribe", AliMnsERROR) } addDebug("Subscribe", raw) d.SetId(fmt.Sprintf("%s%s%s", topicName, COLON_SEPARATED, name)) return resourceAlicloudMNSSubscriptionRead(d, meta) } func resourceAlicloudMNSSubscriptionRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) mnsService := MnsService{client} object, err := mnsService.DescribeMnsTopicSubscription(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") return nil } return WrapError(err) } d.Set("topic_name", object.TopicName) d.Set("name", object.SubscriptionName) d.Set("endpoint", object.Endpoint) d.Set("filter_tag", object.FilterTag) d.Set("notify_strategy", object.NotifyStrategy) d.Set("notify_content_format", object.NotifyContentFormat) return nil } func resourceAlicloudMNSSubscriptionUpdate(d *schema.ResourceData, meta interface{}) error { if d.HasChange("notify_strategy") { client := meta.(*connectivity.AliyunClient) parts, err := ParseResourceId(d.Id(), 2) if err != nil { return WrapError(err) } topicName, name := parts[0], parts[1] notifyStrategy := ali_mns.NotifyStrategyType(d.Get("notify_strategy").(string)) raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { return nil, subscriptionManager.SetSubscriptionAttributes(name, notifyStrategy) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), "SetSubscriptionAttributes", AliMnsERROR) } addDebug("SetSubscriptionAttributes", raw) } return resourceAlicloudMNSSubscriptionRead(d, meta) } func resourceAlicloudMNSSubscriptionDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) mnsService := MnsService{client} parts, err := ParseResourceId(d.Id(), 2) if err != nil { return WrapError(err) } topicName, name := parts[0], parts[1] raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { return nil, subscriptionManager.Unsubscribe(name) }) if err != nil { if mnsService.TopicNotExistFunc(err) || mnsService.SubscriptionNotExistFunc(err) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), "Unsubscribe", AliMnsERROR) } addDebug("Unsubscribe", raw) return WrapError(mnsService.WaitForMnsTopicSubscription(d.Id(), Deleted, DefaultTimeout)) }