From c92c943b9f0ff0b0a8fbaa6f0e2f49a532088db7 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Thu, 26 Sep 2019 17:22:20 +0800 Subject: [PATCH 01/18] Add retry logic to redis --- tencentcloud/errors.go | 3 ++ .../resource_tc_redis_backup_config.go | 25 +++++++++++---- tencentcloud/resource_tc_redis_instance.go | 32 +++++++++++++++---- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/tencentcloud/errors.go b/tencentcloud/errors.go index c46cf76b59..afea269b80 100644 --- a/tencentcloud/errors.go +++ b/tencentcloud/errors.go @@ -13,4 +13,7 @@ const ( //vpc VPCNotFound = "ResourceNotFound" + + //redis + RedisInstanceNotFound = "ResourceNotFound.InstanceNotExists" ) diff --git a/tencentcloud/resource_tc_redis_backup_config.go b/tencentcloud/resource_tc_redis_backup_config.go index 7b5f0e3b61..ff5d1d3c76 100644 --- a/tencentcloud/resource_tc_redis_backup_config.go +++ b/tencentcloud/resource_tc_redis_backup_config.go @@ -25,7 +25,9 @@ import ( "context" "fmt" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" ) func resourceTencentCloudRedisBackupConfig() *schema.Resource { @@ -86,16 +88,25 @@ func resourceTencentCloudRedisBackupConfigRead(d *schema.ResourceData, meta inte ctx := context.WithValue(context.TODO(), "logId", logId) service := RedisService{client: meta.(*TencentCloudClient).apiV3Conn} - - backupPeriods, backupTime, err := service.DescribeAutoBackupConfig(ctx, d.Id()) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + backupPeriods, backupTime, e := service.DescribeAutoBackupConfig(ctx, d.Id()) + if e != nil { + if sdkErr, ok := e.(*errors.TencentCloudSDKError); ok { + if sdkErr.Code == RedisInstanceNotFound { + d.SetId("") + return nil + } + } + return retryError(e) + } + d.Set("backup_time", backupTime) + d.Set("redis_id", d.Id()) + d.Set("backup_period", backupPeriods) + return nil + }) if err != nil { return err } - - d.Set("backup_time", backupTime) - d.Set("redis_id", d.Id()) - d.Set("backup_period", backupPeriods) - return nil } diff --git a/tencentcloud/resource_tc_redis_instance.go b/tencentcloud/resource_tc_redis_instance.go index 4ad4d4bf08..f914e31e35 100644 --- a/tencentcloud/resource_tc_redis_instance.go +++ b/tencentcloud/resource_tc_redis_instance.go @@ -36,6 +36,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" + redis "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412" ) func resourceTencentCloudRedisInstance() *schema.Resource { @@ -247,18 +248,35 @@ func resourceTencentCloudRedisInstanceRead(d *schema.ResourceData, meta interfac ctx := context.WithValue(context.TODO(), "logId", logId) service := RedisService{client: meta.(*TencentCloudClient).apiV3Conn} - has, _, info, err := service.CheckRedisCreateOk(ctx, d.Id()) - if info != nil { - if *info.Status == REDIS_STATUS_ISOLATE || *info.Status == REDIS_STATUS_TODELETE { + var onlineHas bool = true + var ( + has bool + info *redis.InstanceSet + e error + ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + has, _, info, e = service.CheckRedisCreateOk(ctx, d.Id()) + if info != nil { + if *info.Status == REDIS_STATUS_ISOLATE || *info.Status == REDIS_STATUS_TODELETE { + d.SetId("") + onlineHas = false + return nil + } + } + if e != nil { + return resource.NonRetryableError(e) + } + if !has { d.SetId("") + onlineHas = false return nil } - } + return nil + }) if err != nil { - return err + return fmt.Errorf("Fail to get info from redis, reaseon %s", err.Error()) } - if !has { - d.SetId("") + if !onlineHas { return nil } From e28946a64536d6b5c32259be72ec44c13fd7437a Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Thu, 26 Sep 2019 17:52:32 +0800 Subject: [PATCH 02/18] Relocate the redis error --- tencentcloud/errors.go | 3 --- tencentcloud/extension_redis.go | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tencentcloud/errors.go b/tencentcloud/errors.go index afea269b80..c46cf76b59 100644 --- a/tencentcloud/errors.go +++ b/tencentcloud/errors.go @@ -13,7 +13,4 @@ const ( //vpc VPCNotFound = "ResourceNotFound" - - //redis - RedisInstanceNotFound = "ResourceNotFound.InstanceNotExists" ) diff --git a/tencentcloud/extension_redis.go b/tencentcloud/extension_redis.go index a56f6287c9..d924d13708 100644 --- a/tencentcloud/extension_redis.go +++ b/tencentcloud/extension_redis.go @@ -98,3 +98,6 @@ const ( REDIS_TASK_FAILED = "failed" REDIS_TASK_ERROR = "error" ) + +//sdk redis not found error +const RedisInstanceNotFound = "ResourceNotFound.InstanceNotExists" From 6933d03fe2f39f5169d97c7ab048caa612f1fa9a Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Fri, 27 Sep 2019 20:38:40 +0800 Subject: [PATCH 03/18] Add retry logic to as --- tencentcloud/extension_as.go | 2 + tencentcloud/resource_tc_as_attachment.go | 33 +++++++++-- tencentcloud/resource_tc_as_lifecycle_hook.go | 57 +++++++++++-------- tencentcloud/resource_tc_as_notification.go | 24 +++++--- tencentcloud/resource_tc_as_scaling_config.go | 49 +++++++++------- tencentcloud/resource_tc_as_scaling_policy.go | 44 ++++++++------ tencentcloud/resource_tc_as_schedule.go | 45 +++++++++------ 7 files changed, 163 insertions(+), 91 deletions(-) diff --git a/tencentcloud/extension_as.go b/tencentcloud/extension_as.go index ca10882a1c..ebac3d6112 100644 --- a/tencentcloud/extension_as.go +++ b/tencentcloud/extension_as.go @@ -128,3 +128,5 @@ const ( SCALING_GROUP_ACTIVITY_STATUS_FAILED = "FAILED" SCALING_GROUP_ACTIVITY_STATUS_CANCELLED = "CANCELLED" ) + +const AsScheduleNotFound = "ResourceNotFound.ScheduledActionNotFound" diff --git a/tencentcloud/resource_tc_as_attachment.go b/tencentcloud/resource_tc_as_attachment.go index 3fedb07ca8..f0cbc428b7 100644 --- a/tencentcloud/resource_tc_as_attachment.go +++ b/tencentcloud/resource_tc_as_attachment.go @@ -15,6 +15,7 @@ package tencentcloud import ( "context" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -73,12 +74,17 @@ func resourceTencentCloudAsAttachmentRead(d *schema.ResourceData, meta interface asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - instanceIds, err := asService.DescribeAutoScalingAttachment(ctx, scalingGroupId) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + instanceIds, e := asService.DescribeAutoScalingAttachment(ctx, scalingGroupId) + if e != nil { + return retryError(e) + } + d.Set("instance_ids", instanceIds) + return nil + }) if err != nil { return err } - d.Set("instance_ids", instanceIds) - return nil } @@ -126,15 +132,30 @@ func resourceTencentCloudAsAttachmentDelete(d *schema.ResourceData, meta interfa asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - instanceIds, err := asService.DescribeAutoScalingAttachment(ctx, scalingGroupId) + var ( + instanceIds []string + e error + ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + instanceIds, e = asService.DescribeAutoScalingAttachment(ctx, scalingGroupId) + if e != nil { + return retryError(e) + } + return nil + }) if err != nil { return err } - err = asService.DetachInstances(ctx, scalingGroupId, instanceIds) + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + e = asService.DetachInstances(ctx, scalingGroupId, instanceIds) + if e != nil { + return retryError(e) + } + return nil + }) if err != nil { return err } - return nil } diff --git a/tencentcloud/resource_tc_as_lifecycle_hook.go b/tencentcloud/resource_tc_as_lifecycle_hook.go index 13cf508498..723eaf540c 100644 --- a/tencentcloud/resource_tc_as_lifecycle_hook.go +++ b/tencentcloud/resource_tc_as_lifecycle_hook.go @@ -23,6 +23,7 @@ import ( "fmt" "log" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419" ) @@ -157,33 +158,41 @@ func resourceTencentCloudAsLifecycleHookRead(d *schema.ResourceData, meta interf asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - lifecycleHook, err := asService.DescribeLifecycleHookById(ctx, lifecycleHookId) - if err != nil { - return err - } - - d.Set("scaling_group_id", *lifecycleHook.AutoScalingGroupId) - d.Set("lifecycle_hook_name", *lifecycleHook.LifecycleHookName) - d.Set("lifecycle_transition", *lifecycleHook.LifecycleTransition) - if lifecycleHook.DefaultResult != nil { - d.Set("default_result", *lifecycleHook.DefaultResult) - } - if lifecycleHook.HeartbeatTimeout != nil { - d.Set("heartbeat_timeout", *lifecycleHook.HeartbeatTimeout) - } - if lifecycleHook.NotificationMetadata != nil { - d.Set("notification_metadata", *lifecycleHook.NotificationMetadata) - } - if lifecycleHook.NotificationTarget != nil { - d.Set("notification_target_type", *lifecycleHook.NotificationTarget.TargetType) - if lifecycleHook.NotificationTarget.QueueName != nil { - d.Set("notification_queue_name", *lifecycleHook.NotificationTarget.QueueName) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + lifecycleHook, e := asService.DescribeLifecycleHookById(ctx, lifecycleHookId) + if e != nil { + if e.Error() == "lifecycle hook id is not found" { + d.SetId("") + return nil + } + return retryError(e) } - if lifecycleHook.NotificationTarget.TopicName != nil { - d.Set("notification_topic_name", *lifecycleHook.NotificationTarget.TopicName) + d.Set("scaling_group_id", *lifecycleHook.AutoScalingGroupId) + d.Set("lifecycle_hook_name", *lifecycleHook.LifecycleHookName) + d.Set("lifecycle_transition", *lifecycleHook.LifecycleTransition) + if lifecycleHook.DefaultResult != nil { + d.Set("default_result", *lifecycleHook.DefaultResult) } + if lifecycleHook.HeartbeatTimeout != nil { + d.Set("heartbeat_timeout", *lifecycleHook.HeartbeatTimeout) + } + if lifecycleHook.NotificationMetadata != nil { + d.Set("notification_metadata", *lifecycleHook.NotificationMetadata) + } + if lifecycleHook.NotificationTarget != nil { + d.Set("notification_target_type", *lifecycleHook.NotificationTarget.TargetType) + if lifecycleHook.NotificationTarget.QueueName != nil { + d.Set("notification_queue_name", *lifecycleHook.NotificationTarget.QueueName) + } + if lifecycleHook.NotificationTarget.TopicName != nil { + d.Set("notification_topic_name", *lifecycleHook.NotificationTarget.TopicName) + } + } + return nil + }) + if err != nil { + return err } - return nil } diff --git a/tencentcloud/resource_tc_as_notification.go b/tencentcloud/resource_tc_as_notification.go index 8f46eb6c1f..9927538a00 100644 --- a/tencentcloud/resource_tc_as_notification.go +++ b/tencentcloud/resource_tc_as_notification.go @@ -6,7 +6,7 @@ Example Usage ```hcl resource "tencentcloud_as_notification" "as_notification" { scaling_group_id = "sg-12af45" - notification_type = ["SCALE_OUT_FAILED", "SCALE_IN_SUCCESSFUL", "SCALE_IN_FAILED", "REPLACE_UNHEALTHY_INSTANCE_FAILED"] + notification_types = ["SCALE_OUT_FAILED", "SCALE_IN_SUCCESSFUL", "SCALE_IN_FAILED", "REPLACE_UNHEALTHY_INSTANCE_FAILED"] notification_user_group_ids = ["76955"] } ``` @@ -18,6 +18,7 @@ import ( "fmt" "log" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419" ) @@ -102,15 +103,24 @@ func resourceTencentCloudAsNotificationRead(d *schema.ResourceData, meta interfa asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - notification, err := asService.DescribeNotificationById(ctx, notificationId) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + notification, e := asService.DescribeNotificationById(ctx, notificationId) + if e != nil { + if e.Error() == "notification id is not found" { + d.SetId("") + return nil + } + return retryError(e) + } + + d.Set("scaling_group_id", *notification.AutoScalingGroupId) + d.Set("notification_type", flattenStringList(notification.NotificationTypes)) + d.Set("notification_user_group_ids", flattenStringList(notification.NotificationUserGroupIds)) + return nil + }) if err != nil { return err } - - d.Set("scaling_group_id", *notification.AutoScalingGroupId) - d.Set("notification_type", flattenStringList(notification.NotificationTypes)) - d.Set("notification_user_group_ids", flattenStringList(notification.NotificationUserGroupIds)) - return nil } diff --git a/tencentcloud/resource_tc_as_scaling_config.go b/tencentcloud/resource_tc_as_scaling_config.go index dad85f0b10..04515acb8b 100644 --- a/tencentcloud/resource_tc_as_scaling_config.go +++ b/tencentcloud/resource_tc_as_scaling_config.go @@ -46,6 +46,7 @@ import ( "fmt" "log" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419" ) @@ -369,29 +370,37 @@ func resourceTencentCloudAsScalingConfigRead(d *schema.ResourceData, meta interf asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - config, err := asService.DescribeLaunchConfigurationById(ctx, configurationId) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + config, e := asService.DescribeLaunchConfigurationById(ctx, configurationId) + if e != nil { + if e.Error() == "configuration id is not found" { + d.SetId("") + return nil + } + return retryError(e) + } + d.Set("configuration_name", *config.LaunchConfigurationName) + d.Set("status", *config.LaunchConfigurationStatus) + d.Set("image_id", *config.ImageId) + d.Set("project_id", *config.ProjectId) + d.Set("instance_types", flattenStringList(config.InstanceTypes)) + d.Set("system_disk_type", *config.SystemDisk.DiskType) + d.Set("system_disk_size", *config.SystemDisk.DiskSize) + d.Set("data_disk", flattenDataDiskMappings(config.DataDisks)) + d.Set("internet_charge_type", *config.InternetAccessible.InternetChargeType) + d.Set("internet_max_bandwidth_out", *config.InternetAccessible.InternetMaxBandwidthOut) + d.Set("public_ip_assigned", *config.InternetAccessible.PublicIpAssigned) + d.Set("login_settings.key_ids", flattenStringList(config.LoginSettings.KeyIds)) + d.Set("security_group_ids", flattenStringList(config.SecurityGroupIds)) + d.Set("enhanced_security_service", *config.EnhancedService.SecurityService.Enabled) + d.Set("enhanced_monitor_service", *config.EnhancedService.MonitorService.Enabled) + d.Set("user_data", pointerToString(config.UserData)) + d.Set("instance_tags", flattenInstanceTagsMapping(config.InstanceTags)) + return nil + }) if err != nil { return err } - - d.Set("configuration_name", *config.LaunchConfigurationName) - d.Set("status", *config.LaunchConfigurationStatus) - d.Set("image_id", *config.ImageId) - d.Set("project_id", *config.ProjectId) - d.Set("instance_types", flattenStringList(config.InstanceTypes)) - d.Set("system_disk_type", *config.SystemDisk.DiskType) - d.Set("system_disk_size", *config.SystemDisk.DiskSize) - d.Set("data_disk", flattenDataDiskMappings(config.DataDisks)) - d.Set("internet_charge_type", *config.InternetAccessible.InternetChargeType) - d.Set("internet_max_bandwidth_out", *config.InternetAccessible.InternetMaxBandwidthOut) - d.Set("public_ip_assigned", *config.InternetAccessible.PublicIpAssigned) - d.Set("login_settings.key_ids", flattenStringList(config.LoginSettings.KeyIds)) - d.Set("security_group_ids", flattenStringList(config.SecurityGroupIds)) - d.Set("enhanced_security_service", *config.EnhancedService.SecurityService.Enabled) - d.Set("enhanced_monitor_service", *config.EnhancedService.MonitorService.Enabled) - d.Set("user_data", pointerToString(config.UserData)) - d.Set("instance_tags", flattenInstanceTagsMapping(config.InstanceTags)) - return nil } diff --git a/tencentcloud/resource_tc_as_scaling_policy.go b/tencentcloud/resource_tc_as_scaling_policy.go index 36c9de9480..b8c7129cdc 100644 --- a/tencentcloud/resource_tc_as_scaling_policy.go +++ b/tencentcloud/resource_tc_as_scaling_policy.go @@ -26,6 +26,7 @@ import ( "fmt" "log" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419" ) @@ -171,29 +172,36 @@ func resourceTencentCloudAsScalingPolicyRead(d *schema.ResourceData, meta interf asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - scalingPolicy, err := asService.DescribeScalingPolicyById(ctx, scalingPolicyId) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + scalingPolicy, e := asService.DescribeScalingPolicyById(ctx, scalingPolicyId) + if e != nil { + if e.Error() == "scaling policy id is not found" { + d.SetId("") + return nil + } + return retryError(e) + } + d.Set("scaling_group_id", *scalingPolicy.AutoScalingGroupId) + d.Set("policy_name", *scalingPolicy.ScalingPolicyName) + d.Set("adjustment_type", *scalingPolicy.AdjustmentType) + d.Set("adjustment_value", *scalingPolicy.AdjustmentValue) + d.Set("comparison_operator", *scalingPolicy.MetricAlarm.ComparisonOperator) + d.Set("metric_name", *scalingPolicy.MetricAlarm.MetricName) + d.Set("threshold", *scalingPolicy.MetricAlarm.Threshold) + d.Set("period", *scalingPolicy.MetricAlarm.Period) + d.Set("continuous_time", *scalingPolicy.MetricAlarm.ContinuousTime) + d.Set("statistic", *scalingPolicy.MetricAlarm.Statistic) + d.Set("cooldown", *scalingPolicy.Cooldown) + if scalingPolicy.NotificationUserGroupIds != nil { + d.Set("notification_user_group_ids", flattenStringList(scalingPolicy.NotificationUserGroupIds)) + } + return nil + }) if err != nil { return err } - - d.Set("scaling_group_id", *scalingPolicy.AutoScalingGroupId) - d.Set("policy_name", *scalingPolicy.ScalingPolicyName) - d.Set("adjustment_type", *scalingPolicy.AdjustmentType) - d.Set("adjustment_value", *scalingPolicy.AdjustmentValue) - d.Set("comparison_operator", *scalingPolicy.MetricAlarm.ComparisonOperator) - d.Set("metric_name", *scalingPolicy.MetricAlarm.MetricName) - d.Set("threshold", *scalingPolicy.MetricAlarm.Threshold) - d.Set("period", *scalingPolicy.MetricAlarm.Period) - d.Set("continuous_time", *scalingPolicy.MetricAlarm.ContinuousTime) - d.Set("statistic", *scalingPolicy.MetricAlarm.Statistic) - d.Set("cooldown", *scalingPolicy.Cooldown) - if scalingPolicy.NotificationUserGroupIds != nil { - d.Set("notification_user_group_ids", flattenStringList(scalingPolicy.NotificationUserGroupIds)) - } - return nil } - func resourceTencentCloudAsScalingPolicyUpdate(d *schema.ResourceData, meta interface{}) error { defer logElapsed("resource.tencentcloud_as_scaling_policy.update")() diff --git a/tencentcloud/resource_tc_as_schedule.go b/tencentcloud/resource_tc_as_schedule.go index c2df026ceb..8d8c3181e2 100644 --- a/tencentcloud/resource_tc_as_schedule.go +++ b/tencentcloud/resource_tc_as_schedule.go @@ -23,8 +23,10 @@ import ( "fmt" "log" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" ) func resourceTencentCloudAsSchedule() *schema.Resource { @@ -137,25 +139,36 @@ func resourceTencentCloudAsScheduleRead(d *schema.ResourceData, meta interface{} asService := AsService{ client: meta.(*TencentCloudClient).apiV3Conn, } - scheduledAction, err := asService.DescribeScheduledActionById(ctx, scheduledActionId) - if err != nil { - return err - } + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + scheduledAction, e := asService.DescribeScheduledActionById(ctx, scheduledActionId) + if e != nil { + if sdkErr, ok := e.(*errors.TencentCloudSDKError); ok { + if sdkErr.Code == AsScheduleNotFound { + d.SetId("") + return nil + } + } + return retryError(e) + } - d.Set("scaling_group_id", *scheduledAction.AutoScalingGroupId) - d.Set("schedule_action_name", *scheduledAction.ScheduledActionName) - d.Set("max_size", *scheduledAction.MaxSize) - d.Set("min_size", *scheduledAction.MinSize) - d.Set("desired_capacity", *scheduledAction.DesiredCapacity) - d.Set("start_time", *scheduledAction.StartTime) + d.Set("scaling_group_id", *scheduledAction.AutoScalingGroupId) + d.Set("schedule_action_name", *scheduledAction.ScheduledActionName) + d.Set("max_size", *scheduledAction.MaxSize) + d.Set("min_size", *scheduledAction.MinSize) + d.Set("desired_capacity", *scheduledAction.DesiredCapacity) + d.Set("start_time", *scheduledAction.StartTime) - if scheduledAction.EndTime != nil { - d.Set("end_time", *scheduledAction.EndTime) - } - if scheduledAction.Recurrence != nil { - d.Set("recurrence", *scheduledAction.Recurrence) + if scheduledAction.EndTime != nil { + d.Set("end_time", *scheduledAction.EndTime) + } + if scheduledAction.Recurrence != nil { + d.Set("recurrence", *scheduledAction.Recurrence) + } + return nil + }) + if err != nil { + return err } - return nil } From 333c2430f4be8fc046f02131224fb4fbef448e2c Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Sun, 29 Sep 2019 16:36:36 +0800 Subject: [PATCH 04/18] Add retry to ccn --- tencentcloud/resource_tc_ccn.go | 50 ++++++++++------- tencentcloud/resource_tc_ccn_attachment.go | 56 +++++++++++-------- .../resource_tc_ccn_bandwidth_limit.go | 27 ++++++--- 3 files changed, 84 insertions(+), 49 deletions(-) diff --git a/tencentcloud/resource_tc_ccn.go b/tencentcloud/resource_tc_ccn.go index a441db5a89..a3630b1941 100644 --- a/tencentcloud/resource_tc_ccn.go +++ b/tencentcloud/resource_tc_ccn.go @@ -114,24 +114,29 @@ func resourceTencentCloudCcnRead(d *schema.ResourceData, meta interface{}) error ctx := context.WithValue(context.TODO(), "logId", logId) service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e := service.DescribeCcn(ctx, d.Id()) + if e != nil { + return retryError(e) + } - info, has, err := service.DescribeCcn(ctx, d.Id()) - if err != nil { - return err - } + if has == 0 { + d.SetId("") + return nil + } + + d.Set("name", info.name) + d.Set("description", info.description) + d.Set("qos", strings.ToUpper(info.qos)) + d.Set("state", strings.ToUpper(info.state)) + d.Set("instance_count", info.instanceCount) + d.Set("create_time", info.createTime) - if has == 0 { - d.SetId("") return nil + }) + if err != nil { + return err } - - d.Set("name", info.name) - d.Set("description", info.description) - d.Set("qos", strings.ToUpper(info.qos)) - d.Set("state", strings.ToUpper(info.state)) - d.Set("instance_count", info.instanceCount) - d.Set("create_time", info.createTime) - return nil } @@ -178,14 +183,21 @@ func resourceTencentCloudCcnDelete(d *schema.ResourceData, meta interface{}) err ctx := context.WithValue(context.TODO(), "logId", logId) service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} - - _, has, err := service.DescribeCcn(ctx, d.Id()) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, e := service.DescribeCcn(ctx, d.Id()) + if e != nil { + return retryError(e) + } + if has == 0 { + d.SetId("") + return nil + } + return nil + }) if err != nil { return err } - if has == 0 { - return nil - } + if err = service.DeleteCcn(ctx, d.Id()); err != nil { return err } diff --git a/tencentcloud/resource_tc_ccn_attachment.go b/tencentcloud/resource_tc_ccn_attachment.go index a341406de1..5c43798bfc 100644 --- a/tencentcloud/resource_tc_ccn_attachment.go +++ b/tencentcloud/resource_tc_ccn_attachment.go @@ -153,30 +153,38 @@ func resourceTencentCloudCcnAttachmentRead(d *schema.ResourceData, meta interfac instanceRegion = d.Get("instance_region").(string) instanceId = d.Get("instance_id").(string) ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, e := service.DescribeCcn(ctx, ccnId) + if e != nil { + return retryError(e) + } - _, has, err := service.DescribeCcn(ctx, ccnId) + if has == 0 { + d.SetId("") + return nil + } + return nil + }) if err != nil { return err } - - if has == 0 { - d.SetId("") + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e := service.DescribeCcnAttachedInstance(ctx, ccnId, instanceRegion, instanceType, instanceId) + if e != nil { + return retryError(e) + } + if has == 0 { + d.SetId("") + return nil + } + d.Set("state", strings.ToUpper(info.state)) + d.Set("attached_time", info.attachedTime) + d.Set("cidr_block", info.cidrBlock) return nil - } - - info, has, err := service.DescribeCcnAttachedInstance(ctx, ccnId, instanceRegion, instanceType, instanceId) + }) if err != nil { return err } - if has == 0 { - d.SetId("") - return nil - } - - d.Set("state", strings.ToUpper(info.state)) - d.Set("attached_time", info.attachedTime) - d.Set("cidr_block", info.cidrBlock) - return nil } @@ -194,15 +202,19 @@ func resourceTencentCloudCcnAttachmentDelete(d *schema.ResourceData, meta interf instanceRegion = d.Get("instance_region").(string) instanceId = d.Get("instance_id").(string) ) - - _, has, err := service.DescribeCcn(ctx, ccnId) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, e := service.DescribeCcn(ctx, ccnId) + if e != nil { + return retryError(e) + } + if has == 0 { + return nil + } + return nil + }) if err != nil { return err } - if has == 0 { - return nil - } - if err := service.DetachCcnInstances(ctx, ccnId, instanceRegion, instanceType, instanceId); err != nil { return err } diff --git a/tencentcloud/resource_tc_ccn_bandwidth_limit.go b/tencentcloud/resource_tc_ccn_bandwidth_limit.go index 4e9bd92cff..526d5d9803 100644 --- a/tencentcloud/resource_tc_ccn_bandwidth_limit.go +++ b/tencentcloud/resource_tc_ccn_bandwidth_limit.go @@ -27,6 +27,7 @@ import ( "context" "fmt" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -134,22 +135,32 @@ func resourceTencentCloudCcnBandwidthLimitRead(d *schema.ResourceData, meta inte ccnId = d.Get("ccn_id").(string) region = d.Get("region").(string) ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, e := service.DescribeCcn(ctx, ccnId) + if e != nil { + return retryError(e) + } - _, has, err := service.DescribeCcn(ctx, ccnId) + if has == 0 { + d.SetId("") + return nil + } + return nil + }) if err != nil { return err } - - if has == 0 { - d.SetId("") + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + bandwidth, e := service.DescribeCcnRegionBandwidthLimit(ctx, ccnId, region) + if e != nil { + return retryError(e) + } + d.Set("bandwidth_limit", bandwidth) return nil - } - - bandwidth, err := service.DescribeCcnRegionBandwidthLimit(ctx, ccnId, region) + }) if err != nil { return err } - d.Set("bandwidth_limit", bandwidth) return nil } From 611e2f7a356b074a2def7f09da4de5bb77bcb1d3 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Sun, 29 Sep 2019 19:47:13 +0800 Subject: [PATCH 05/18] Add retry to dc_gateway --- tencentcloud/resource_tc_dc_gateway.go | 54 +++++++++++-------- .../resource_tc_dc_gateway_ccn_route.go | 28 ++++++---- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/tencentcloud/resource_tc_dc_gateway.go b/tencentcloud/resource_tc_dc_gateway.go index bfcafcde39..0b9ff40192 100644 --- a/tencentcloud/resource_tc_dc_gateway.go +++ b/tencentcloud/resource_tc_dc_gateway.go @@ -30,6 +30,7 @@ package tencentcloud import ( "context" "fmt" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "strings" ) @@ -146,25 +147,29 @@ func resourceTencentCloudDcGatewayRead(d *schema.ResourceData, meta interface{}) ctx := context.WithValue(context.TODO(), "logId", logId) service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} - - info, has, err := service.DescribeDirectConnectGateway(ctx, d.Id()) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e := service.DescribeDirectConnectGateway(ctx, d.Id()) + if e != nil { + return retryError(e) + } + + if has == 0 { + d.SetId("") + return nil + } + + d.Set("name", info.name) + d.Set("network_type", info.networkType) + d.Set("network_instance_id", info.networkInstanceId) + d.Set("gateway_type", info.gatewayType) + d.Set("cnn_route_type", info.cnnRouteType) + d.Set("enable_bgp", info.enableBGP) + d.Set("create_time", info.createTime) + return nil + }) if err != nil { return err } - - if has == 0 { - d.SetId("") - return nil - } - - d.Set("name", info.name) - d.Set("network_type", info.networkType) - d.Set("network_instance_id", info.networkInstanceId) - d.Set("gateway_type", info.gatewayType) - d.Set("cnn_route_type", info.cnnRouteType) - d.Set("enable_bgp", info.enableBGP) - d.Set("create_time", info.createTime) - return nil } @@ -190,14 +195,19 @@ func resourceTencentCloudDcGatewayDelete(d *schema.ResourceData, meta interface{ ctx := context.WithValue(context.TODO(), "logId", logId) service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} - _, has, err := service.DescribeDirectConnectGateway(ctx, d.Id()) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, e := service.DescribeDirectConnectGateway(ctx, d.Id()) + if e != nil { + return retryError(e) + } + + if has == 0 { + return nil + } + return nil + }) if err != nil { return err } - - if has == 0 { - return nil - } - return service.DeleteDirectConnectGateway(ctx, d.Id()) } diff --git a/tencentcloud/resource_tc_dc_gateway_ccn_route.go b/tencentcloud/resource_tc_dc_gateway_ccn_route.go index 64e7c700ef..b63d31a0a7 100644 --- a/tencentcloud/resource_tc_dc_gateway_ccn_route.go +++ b/tencentcloud/resource_tc_dc_gateway_ccn_route.go @@ -33,6 +33,7 @@ package tencentcloud import ( "context" "fmt" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "strings" ) @@ -109,20 +110,25 @@ func resourceTencentCloudDcGatewayCcnRouteRead(d *schema.ResourceData, meta inte } dcgId, routeId := items[0], items[1] - info, has, err := service.DescribeDirectConnectGatewayCcnRoute(ctx, dcgId, routeId) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e := service.DescribeDirectConnectGatewayCcnRoute(ctx, dcgId, routeId) + if e != nil { + return retryError(e) + } + + if has == 0 { + d.SetId("") + return nil + } + + d.Set("dcg_id", info.dcgId) + d.Set("cidr_block", info.cidrBlock) + d.Set("as_path", info.asPaths) + return nil + }) if err != nil { return err } - - if has == 0 { - d.SetId("") - return nil - } - - d.Set("dcg_id", info.dcgId) - d.Set("cidr_block", info.cidrBlock) - d.Set("as_path", info.asPaths) - return nil } From 3c72c2b38080a247c7a263388bd1cd2025fc96a8 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Mon, 30 Sep 2019 15:26:59 +0800 Subject: [PATCH 06/18] Add retry to dcx --- tencentcloud/resource_tc_dcx.go | 84 ++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/tencentcloud/resource_tc_dcx.go b/tencentcloud/resource_tc_dcx.go index c5af86bdbb..6d18960ded 100644 --- a/tencentcloud/resource_tc_dcx.go +++ b/tencentcloud/resource_tc_dcx.go @@ -50,6 +50,7 @@ import ( "context" "fmt" "github.com/hashicorp/terraform/helper/hashcode" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "strings" ) @@ -262,52 +263,57 @@ func resourceTencentCloudDcxInstanceRead(d *schema.ResourceData, meta interface{ var ( dcxId = d.Id() ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + item, has, e := service.DescribeDirectConnectTunnel(ctx, dcxId) + if e != nil { + return retryError(e) + } - item, has, err := service.DescribeDirectConnectTunnel(ctx, dcxId) - if err != nil { - return err - } - - if has == 0 { - d.SetId("") - } - - d.Set("dc_id", service.strPt2str(item.DirectConnectId)) - d.Set("name", *item.DirectConnectTunnelName) - d.Set("network_type", strings.ToUpper(service.strPt2str(item.NetworkType))) - d.Set("network_region", service.strPt2str(item.NetworkRegion)) - d.Set("vpc_id", service.strPt2str(item.VpcId)) - d.Set("bandwidth", service.int64Pt2int64(item.Bandwidth)) - - var routeType = strings.ToUpper(service.strPt2str(item.RouteType)) - d.Set("route_type", routeType) + if has == 0 { + d.SetId("") + return nil + } - if routeType == DC_ROUTE_TYPE_BGP { - if item.BgpPeer == nil { - d.Set("bgp_asn", 0) - d.Set("bgp_auth_key", "") + d.Set("dc_id", service.strPt2str(item.DirectConnectId)) + d.Set("name", *item.DirectConnectTunnelName) + d.Set("network_type", strings.ToUpper(service.strPt2str(item.NetworkType))) + d.Set("network_region", service.strPt2str(item.NetworkRegion)) + d.Set("vpc_id", service.strPt2str(item.VpcId)) + d.Set("bandwidth", service.int64Pt2int64(item.Bandwidth)) + + var routeType = strings.ToUpper(service.strPt2str(item.RouteType)) + d.Set("route_type", routeType) + + if routeType == DC_ROUTE_TYPE_BGP { + if item.BgpPeer == nil { + d.Set("bgp_asn", 0) + d.Set("bgp_auth_key", "") + } else { + d.Set("bgp_asn", service.int64Pt2int64(item.BgpPeer.Asn)) + d.Set("bgp_auth_key", service.strPt2str(item.BgpPeer.AuthKey)) + } } else { - d.Set("bgp_asn", service.int64Pt2int64(item.BgpPeer.Asn)) - d.Set("bgp_auth_key", service.strPt2str(item.BgpPeer.AuthKey)) - } - } else { - var routeFilterPrefixes = make([]string, 0, len(item.RouteFilterPrefixes)) - for _, v := range item.RouteFilterPrefixes { - if v.Cidr != nil { - routeFilterPrefixes = append(routeFilterPrefixes, *v.Cidr) + var routeFilterPrefixes = make([]string, 0, len(item.RouteFilterPrefixes)) + for _, v := range item.RouteFilterPrefixes { + if v.Cidr != nil { + routeFilterPrefixes = append(routeFilterPrefixes, *v.Cidr) + } } + d.Set("route_filter_prefixes", routeFilterPrefixes) } - d.Set("route_filter_prefixes", routeFilterPrefixes) - } - d.Set("vlan", service.int64Pt2int64(item.Vlan)) - d.Set("tencent_address", service.strPt2str(item.TencentAddress)) - d.Set("customer_address", service.strPt2str(item.CustomerAddress)) - d.Set("dcg_id", service.strPt2str(item.DirectConnectGatewayId)) - - d.Set("state", strings.ToUpper(service.strPt2str(item.State))) - d.Set("create_time", service.strPt2str(item.CreatedTime)) + d.Set("vlan", service.int64Pt2int64(item.Vlan)) + d.Set("tencent_address", service.strPt2str(item.TencentAddress)) + d.Set("customer_address", service.strPt2str(item.CustomerAddress)) + d.Set("dcg_id", service.strPt2str(item.DirectConnectGatewayId)) + d.Set("state", strings.ToUpper(service.strPt2str(item.State))) + d.Set("create_time", service.strPt2str(item.CreatedTime)) + return nil + }) + if err != nil { + return err + } return nil } From 9288bfd5582995a8f81aceb4d47cb0a7aeb9f1c4 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Mon, 30 Sep 2019 15:27:10 +0800 Subject: [PATCH 07/18] Add retry to gaap --- tencentcloud/resource_tc_gaap_proxy.go | 44 ++++++++---- tencentcloud/resource_tc_gaap_realserver.go | 46 +++++++----- .../resource_tc_gaap_security_policy.go | 27 ++++--- .../resource_tc_gaap_security_rule.go | 70 ++++++++++--------- 4 files changed, 113 insertions(+), 74 deletions(-) diff --git a/tencentcloud/resource_tc_gaap_proxy.go b/tencentcloud/resource_tc_gaap_proxy.go index 8f3dba5bb1..2a0e6a9659 100644 --- a/tencentcloud/resource_tc_gaap_proxy.go +++ b/tencentcloud/resource_tc_gaap_proxy.go @@ -34,6 +34,7 @@ import ( "log" "time" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529" @@ -182,25 +183,38 @@ func resourceTencentCloudGaapProxyRead(d *schema.ResourceData, m interface{}) er id := d.Id() service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} + var ( + proxies []*gaap.ProxyInfo + e error + proxy *gaap.ProxyInfo + onlineHas bool = true + ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + proxies, e = service.DescribeProxies(ctx, []string{id}, nil, nil, nil, nil) + if e != nil { + return retryError(e) + } + for _, p := range proxies { + if p.ProxyId == nil { + return resource.NonRetryableError(errors.New("proxy id is nil")) + } + if *p.ProxyId == id { + proxy = p + break + } + } - proxies, err := service.DescribeProxies(ctx, []string{id}, nil, nil, nil, nil) + if proxy == nil { + d.SetId("") + onlineHas = false + return nil + } + return nil + }) if err != nil { return err } - - var proxy *gaap.ProxyInfo - for _, p := range proxies { - if p.ProxyId == nil { - return errors.New("proxy id is nil") - } - if *p.ProxyId == id { - proxy = p - break - } - } - - if proxy == nil { - d.SetId("") + if !onlineHas { return nil } diff --git a/tencentcloud/resource_tc_gaap_realserver.go b/tencentcloud/resource_tc_gaap_realserver.go index 5effc92d5f..2f32c4cd39 100644 --- a/tencentcloud/resource_tc_gaap_realserver.go +++ b/tencentcloud/resource_tc_gaap_realserver.go @@ -30,6 +30,7 @@ import ( "fmt" "net" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529" ) @@ -130,26 +131,39 @@ func resourceTencentCloudGaapRealserverRead(d *schema.ResourceData, m interface{ id := d.Id() service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} - - realservers, err := service.DescribeRealservers(ctx, nil, nil, nil, -1) - if err != nil { - return err - } - - var realserver *gaap.BindRealServerInfo - for _, rs := range realservers { - if rs.RealServerId == nil { - return errors.New("realserver id is nil") + var ( + realservers []*gaap.BindRealServerInfo + e error + onlineHas bool = true + realserver *gaap.BindRealServerInfo + ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + realservers, e = service.DescribeRealservers(ctx, nil, nil, nil, -1) + if e != nil { + return retryError(e) + } + for _, rs := range realservers { + if rs.RealServerId == nil { + return resource.NonRetryableError(errors.New("realserver id is nil")) + } + + if *rs.RealServerId == id { + realserver = rs + break + } } - if *rs.RealServerId == id { - realserver = rs - break + if realserver == nil { + d.SetId("") + onlineHas = false + return nil } + return nil + }) + if err != nil { + return err } - - if realserver == nil { - d.SetId("") + if !onlineHas { return nil } diff --git a/tencentcloud/resource_tc_gaap_security_policy.go b/tencentcloud/resource_tc_gaap_security_policy.go index cdded7a361..da58f297d4 100644 --- a/tencentcloud/resource_tc_gaap_security_policy.go +++ b/tencentcloud/resource_tc_gaap_security_policy.go @@ -31,6 +31,7 @@ package tencentcloud import ( "context" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -102,21 +103,25 @@ func resourceTencentCloudGaapSecurityPolicyRead(d *schema.ResourceData, m interf id := d.Id() service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + proxyId, status, action, exist, e := service.DescribeSecurityPolicy(ctx, id) + if e != nil { + return resource.NonRetryableError(e) + } - proxyId, status, action, exist, err := service.DescribeSecurityPolicy(ctx, id) - if err != nil { - return err - } + if !exist { + d.SetId("") + return nil + } - if !exist { - d.SetId("") + d.Set("proxy_id", proxyId) + d.Set("action", action) + d.Set("enable", status == GAAP_SECURITY_POLICY_BOUND) return nil + }) + if err != nil { + return err } - - d.Set("proxy_id", proxyId) - d.Set("action", action) - d.Set("enable", status == GAAP_SECURITY_POLICY_BOUND) - return nil } diff --git a/tencentcloud/resource_tc_gaap_security_rule.go b/tencentcloud/resource_tc_gaap_security_rule.go index db7e61d8e0..0f8bdfdeed 100644 --- a/tencentcloud/resource_tc_gaap_security_rule.go +++ b/tencentcloud/resource_tc_gaap_security_rule.go @@ -33,6 +33,7 @@ import ( "fmt" "regexp" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -136,42 +137,47 @@ func resourceTencentCloudGaapSecurityRuleRead(d *schema.ResourceData, m interfac policyId := d.Get("policy_id").(string) service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + rule, e := service.DescribeSecurityRule(ctx, policyId, id) + if e != nil { + return retryError(e) + } + + if rule == nil { + d.SetId("") + return nil + } + + if rule.SourceCidr == nil { + return resource.NonRetryableError(errors.New("security rule cidr IP is nil")) + } + d.Set("cidr_ip", rule.SourceCidr) + + if rule.Action == nil { + return resource.NonRetryableError(errors.New("security rule action is nil")) + } + d.Set("action", rule.Action) + + if rule.AliasName == nil { + return resource.NonRetryableError(errors.New("security rule name is nil")) + } + d.Set("name", rule.AliasName) + + if rule.Protocol == nil { + return resource.NonRetryableError(errors.New("security rule protocol is nil")) + } + d.Set("protocol", rule.Protocol) + + if rule.DestPortRange == nil { + return resource.NonRetryableError(errors.New("security rule port is nil")) + } + d.Set("port", rule.DestPortRange) + return nil + }) - rule, err := service.DescribeSecurityRule(ctx, policyId, id) if err != nil { return err } - - if rule == nil { - d.SetId("") - return nil - } - - if rule.SourceCidr == nil { - return errors.New("security rule cidr IP is nil") - } - d.Set("cidr_ip", rule.SourceCidr) - - if rule.Action == nil { - return errors.New("security rule action is nil") - } - d.Set("action", rule.Action) - - if rule.AliasName == nil { - return errors.New("security rule name is nil") - } - d.Set("name", rule.AliasName) - - if rule.Protocol == nil { - return errors.New("security rule protocol is nil") - } - d.Set("protocol", rule.Protocol) - - if rule.DestPortRange == nil { - return errors.New("security rule port is nil") - } - d.Set("port", rule.DestPortRange) - return nil } From df947912514dafe376f044c24d7d94e28ed6dfc7 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Mon, 30 Sep 2019 15:49:25 +0800 Subject: [PATCH 08/18] Revert "Add retry to gaap" This reverts commit 9288bfd5582995a8f81aceb4d47cb0a7aeb9f1c4. --- tencentcloud/resource_tc_gaap_proxy.go | 44 ++++-------- tencentcloud/resource_tc_gaap_realserver.go | 46 +++++------- .../resource_tc_gaap_security_policy.go | 27 +++---- .../resource_tc_gaap_security_rule.go | 70 +++++++++---------- 4 files changed, 74 insertions(+), 113 deletions(-) diff --git a/tencentcloud/resource_tc_gaap_proxy.go b/tencentcloud/resource_tc_gaap_proxy.go index 2a0e6a9659..8f3dba5bb1 100644 --- a/tencentcloud/resource_tc_gaap_proxy.go +++ b/tencentcloud/resource_tc_gaap_proxy.go @@ -34,7 +34,6 @@ import ( "log" "time" - "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529" @@ -183,38 +182,25 @@ func resourceTencentCloudGaapProxyRead(d *schema.ResourceData, m interface{}) er id := d.Id() service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} - var ( - proxies []*gaap.ProxyInfo - e error - proxy *gaap.ProxyInfo - onlineHas bool = true - ) - err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - proxies, e = service.DescribeProxies(ctx, []string{id}, nil, nil, nil, nil) - if e != nil { - return retryError(e) - } - for _, p := range proxies { - if p.ProxyId == nil { - return resource.NonRetryableError(errors.New("proxy id is nil")) - } - if *p.ProxyId == id { - proxy = p - break - } - } - if proxy == nil { - d.SetId("") - onlineHas = false - return nil - } - return nil - }) + proxies, err := service.DescribeProxies(ctx, []string{id}, nil, nil, nil, nil) if err != nil { return err } - if !onlineHas { + + var proxy *gaap.ProxyInfo + for _, p := range proxies { + if p.ProxyId == nil { + return errors.New("proxy id is nil") + } + if *p.ProxyId == id { + proxy = p + break + } + } + + if proxy == nil { + d.SetId("") return nil } diff --git a/tencentcloud/resource_tc_gaap_realserver.go b/tencentcloud/resource_tc_gaap_realserver.go index 2f32c4cd39..5effc92d5f 100644 --- a/tencentcloud/resource_tc_gaap_realserver.go +++ b/tencentcloud/resource_tc_gaap_realserver.go @@ -30,7 +30,6 @@ import ( "fmt" "net" - "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529" ) @@ -131,39 +130,26 @@ func resourceTencentCloudGaapRealserverRead(d *schema.ResourceData, m interface{ id := d.Id() service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} - var ( - realservers []*gaap.BindRealServerInfo - e error - onlineHas bool = true - realserver *gaap.BindRealServerInfo - ) - err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - realservers, e = service.DescribeRealservers(ctx, nil, nil, nil, -1) - if e != nil { - return retryError(e) - } - for _, rs := range realservers { - if rs.RealServerId == nil { - return resource.NonRetryableError(errors.New("realserver id is nil")) - } - - if *rs.RealServerId == id { - realserver = rs - break - } - } - if realserver == nil { - d.SetId("") - onlineHas = false - return nil - } - return nil - }) + realservers, err := service.DescribeRealservers(ctx, nil, nil, nil, -1) if err != nil { return err } - if !onlineHas { + + var realserver *gaap.BindRealServerInfo + for _, rs := range realservers { + if rs.RealServerId == nil { + return errors.New("realserver id is nil") + } + + if *rs.RealServerId == id { + realserver = rs + break + } + } + + if realserver == nil { + d.SetId("") return nil } diff --git a/tencentcloud/resource_tc_gaap_security_policy.go b/tencentcloud/resource_tc_gaap_security_policy.go index da58f297d4..cdded7a361 100644 --- a/tencentcloud/resource_tc_gaap_security_policy.go +++ b/tencentcloud/resource_tc_gaap_security_policy.go @@ -31,7 +31,6 @@ package tencentcloud import ( "context" - "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -103,25 +102,21 @@ func resourceTencentCloudGaapSecurityPolicyRead(d *schema.ResourceData, m interf id := d.Id() service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} - err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - proxyId, status, action, exist, e := service.DescribeSecurityPolicy(ctx, id) - if e != nil { - return resource.NonRetryableError(e) - } - - if !exist { - d.SetId("") - return nil - } - d.Set("proxy_id", proxyId) - d.Set("action", action) - d.Set("enable", status == GAAP_SECURITY_POLICY_BOUND) - return nil - }) + proxyId, status, action, exist, err := service.DescribeSecurityPolicy(ctx, id) if err != nil { return err } + + if !exist { + d.SetId("") + return nil + } + + d.Set("proxy_id", proxyId) + d.Set("action", action) + d.Set("enable", status == GAAP_SECURITY_POLICY_BOUND) + return nil } diff --git a/tencentcloud/resource_tc_gaap_security_rule.go b/tencentcloud/resource_tc_gaap_security_rule.go index 0f8bdfdeed..db7e61d8e0 100644 --- a/tencentcloud/resource_tc_gaap_security_rule.go +++ b/tencentcloud/resource_tc_gaap_security_rule.go @@ -33,7 +33,6 @@ import ( "fmt" "regexp" - "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -137,47 +136,42 @@ func resourceTencentCloudGaapSecurityRuleRead(d *schema.ResourceData, m interfac policyId := d.Get("policy_id").(string) service := GaapService{client: m.(*TencentCloudClient).apiV3Conn} - err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - rule, e := service.DescribeSecurityRule(ctx, policyId, id) - if e != nil { - return retryError(e) - } - - if rule == nil { - d.SetId("") - return nil - } - - if rule.SourceCidr == nil { - return resource.NonRetryableError(errors.New("security rule cidr IP is nil")) - } - d.Set("cidr_ip", rule.SourceCidr) - - if rule.Action == nil { - return resource.NonRetryableError(errors.New("security rule action is nil")) - } - d.Set("action", rule.Action) - - if rule.AliasName == nil { - return resource.NonRetryableError(errors.New("security rule name is nil")) - } - d.Set("name", rule.AliasName) - - if rule.Protocol == nil { - return resource.NonRetryableError(errors.New("security rule protocol is nil")) - } - d.Set("protocol", rule.Protocol) - - if rule.DestPortRange == nil { - return resource.NonRetryableError(errors.New("security rule port is nil")) - } - d.Set("port", rule.DestPortRange) - return nil - }) + rule, err := service.DescribeSecurityRule(ctx, policyId, id) if err != nil { return err } + + if rule == nil { + d.SetId("") + return nil + } + + if rule.SourceCidr == nil { + return errors.New("security rule cidr IP is nil") + } + d.Set("cidr_ip", rule.SourceCidr) + + if rule.Action == nil { + return errors.New("security rule action is nil") + } + d.Set("action", rule.Action) + + if rule.AliasName == nil { + return errors.New("security rule name is nil") + } + d.Set("name", rule.AliasName) + + if rule.Protocol == nil { + return errors.New("security rule protocol is nil") + } + d.Set("protocol", rule.Protocol) + + if rule.DestPortRange == nil { + return errors.New("security rule port is nil") + } + d.Set("port", rule.DestPortRange) + return nil } From c1392256327a9441817c9582b957035dfe21c62f Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Tue, 8 Oct 2019 11:55:36 +0800 Subject: [PATCH 09/18] Update resource_tc_vpc.go add retry to vpc --- tencentcloud/resource_tc_vpc.go | 69 ++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/tencentcloud/resource_tc_vpc.go b/tencentcloud/resource_tc_vpc.go index 6b709ae250..5b3d18c30d 100644 --- a/tencentcloud/resource_tc_vpc.go +++ b/tencentcloud/resource_tc_vpc.go @@ -166,45 +166,50 @@ func resourceTencentCloudVpcInstanceRead(d *schema.ResourceData, meta interface{ service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} id := d.Id() + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e := service.DescribeVpc(ctx, id) + if e != nil { + return retryError(e) + } - info, has, err := service.DescribeVpc(ctx, id) - if err != nil { - return err - } + // deleted + if has == 0 { + log.Printf("[WARN]%s %s\n", logId, "vpc has been delete") + d.SetId("") + return nil + } - // deleted - if has == 0 { - log.Printf("[WARN]%s %s\n", logId, "vpc has been delete") - d.SetId("") - return nil - } + if has != 1 { + errRet := fmt.Errorf("one vpc_id read get %d vpc info", has) + log.Printf("[CRITAL]%s %s\n", logId, errRet.Error()) + return resource.NonRetryableError(errRet) + } - if has != 1 { - errRet := fmt.Errorf("one vpc_id read get %d vpc info", has) - log.Printf("[CRITAL]%s %s\n", logId, errRet.Error()) - return errRet - } + tags := make(map[string]string, len(info.tags)) + for _, tag := range info.tags { + if tag.Key == nil { + return resource.NonRetryableError(fmt.Errorf("vpc %s tag key is nil", id)) + } + if tag.Value == nil { + return resource.NonRetryableError(fmt.Errorf("vpc %s tag value is nil", id)) + } - tags := make(map[string]string, len(info.tags)) - for _, tag := range info.tags { - if tag.Key == nil { - return fmt.Errorf("vpc %s tag key is nil", id) - } - if tag.Value == nil { - return fmt.Errorf("vpc %s tag value is nil", id) + tags[*tag.Key] = *tag.Value } - tags[*tag.Key] = *tag.Value - } - - d.Set("name", info.name) - d.Set("cidr_block", info.cidr) - d.Set("dns_servers", info.dnsServers) - d.Set("is_multicast", info.isMulticast) - d.Set("create_time", info.createTime) - d.Set("is_default", info.isDefault) - d.Set("tags", tags) + d.Set("name", info.name) + d.Set("cidr_block", info.cidr) + d.Set("dns_servers", info.dnsServers) + d.Set("is_multicast", info.isMulticast) + d.Set("create_time", info.createTime) + d.Set("is_default", info.isDefault) + d.Set("tags", tags) + return nil + }) + if err != nil { + return err + } return nil } From dab6b4b177d7b2ef4330087f59f52c573b39fa3e Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Tue, 8 Oct 2019 11:55:55 +0800 Subject: [PATCH 10/18] Update resource_tc_subnet.go add retry to subnet --- tencentcloud/resource_tc_subnet.go | 34 ++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/tencentcloud/resource_tc_subnet.go b/tencentcloud/resource_tc_subnet.go index 989c44969e..27ac4f78c9 100644 --- a/tencentcloud/resource_tc_subnet.go +++ b/tencentcloud/resource_tc_subnet.go @@ -216,24 +216,36 @@ func resourceTencentCloudVpcSubnetRead(d *schema.ResourceData, meta interface{}) vpcService := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} tagService := TagService{client: meta.(*TencentCloudClient).apiV3Conn} region := meta.(*TencentCloudClient).apiV3Conn.Region + var ( + info VpcSubnetBasicInfo + has int + e error + ) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e = vpcService.DescribeSubnet(ctx, id) + if e != nil { + return retryError(e) + } - info, has, err := vpcService.DescribeSubnet(ctx, id) + // deleted + if has == 0 { + d.SetId("") + return nil + } + + if has != 1 { + errRet := fmt.Errorf("one subnet_id read get %d subnet info", has) + log.Printf("[CRITAL]%s %s", logId, errRet.Error()) + return resource.NonRetryableError(errRet) + } + return nil + }) if err != nil { return err } - - // deleted if has == 0 { - d.SetId("") return nil } - - if has != 1 { - errRet := fmt.Errorf("one subnet_id read get %d subnet info", has) - log.Printf("[CRITAL]%s %s", logId, errRet.Error()) - return errRet - } - tags, err := tagService.DescribeResourceTags(ctx, "vpc", "subnet", region, id) if err != nil { return err From a6c1292be1a925c7b285ca8a886c5bdc2e82b5e9 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Tue, 8 Oct 2019 11:56:16 +0800 Subject: [PATCH 11/18] Update resource_tc_security_group_rule.go add retry to security _group_rule --- .../resource_tc_security_group_rule.go | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/tencentcloud/resource_tc_security_group_rule.go b/tencentcloud/resource_tc_security_group_rule.go index fc7dc39d4e..93c8471aa3 100644 --- a/tencentcloud/resource_tc_security_group_rule.go +++ b/tencentcloud/resource_tc_security_group_rule.go @@ -236,47 +236,51 @@ func resourceTencentCloudSecurityGroupRuleRead(d *schema.ResourceData, m interfa service := VpcService{client: m.(*TencentCloudClient).apiV3Conn} ruleId := d.Id() + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + sgId, policyType, policy, e := service.DescribeSecurityGroupPolicy(ctx, ruleId) + if e != nil { + return retryError(e) + } - sgId, policyType, policy, err := service.DescribeSecurityGroupPolicy(ctx, ruleId) - if err != nil { - return err - } - - if policy == nil { - d.SetId("") - return nil - } + if policy == nil { + d.SetId("") + return nil + } - d.Set("security_group_id", sgId) + d.Set("security_group_id", sgId) - d.Set("type", policyType) + d.Set("type", policyType) - if policy.CidrBlock != nil && *policy.CidrBlock != "" { - d.Set("cidr_ip", *policy.CidrBlock) - } + if policy.CidrBlock != nil && *policy.CidrBlock != "" { + d.Set("cidr_ip", *policy.CidrBlock) + } - if policy.SecurityGroupId != nil && *policy.SecurityGroupId != "" { - d.Set("source_sgid", *policy.SecurityGroupId) - } + if policy.SecurityGroupId != nil && *policy.SecurityGroupId != "" { + d.Set("source_sgid", *policy.SecurityGroupId) + } - if policy.Protocol != nil { - inputProtocol := d.Get("ip_protocol").(string) - if inputProtocol == "" { - inputProtocol = "ALL" + if policy.Protocol != nil { + inputProtocol := d.Get("ip_protocol").(string) + if inputProtocol == "" { + inputProtocol = "ALL" + } + d.Set("ip_protocol", inputProtocol) } - d.Set("ip_protocol", inputProtocol) - } - if policy.Port != nil { - d.Set("port_range", *policy.Port) - } + if policy.Port != nil { + d.Set("port_range", *policy.Port) + } - d.Set("policy", d.Get("policy").(string)) + d.Set("policy", d.Get("policy").(string)) - if policy.PolicyDescription != nil { - d.Set("description", *policy.PolicyDescription) + if policy.PolicyDescription != nil { + d.Set("description", *policy.PolicyDescription) + } + return nil + }) + if err != nil { + return err } - return nil } From 79f85f8efe63dbf062d453572c3d19c0f00c7dc3 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Tue, 8 Oct 2019 11:56:30 +0800 Subject: [PATCH 12/18] Update resource_tc_route_table_entry.go add retry to route_table_entry --- tencentcloud/resource_tc_route_table_entry.go | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/tencentcloud/resource_tc_route_table_entry.go b/tencentcloud/resource_tc_route_table_entry.go index 822b32d532..28be30a39e 100644 --- a/tencentcloud/resource_tc_route_table_entry.go +++ b/tencentcloud/resource_tc_route_table_entry.go @@ -155,34 +155,38 @@ func resourceTencentCloudVpcRouteEntryRead(d *schema.ResourceData, meta interfac if len(items) != 2 { return fmt.Errorf("entry id be destroyed, we can not get route table id") } + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e := service.DescribeRouteTable(ctx, items[1]) + if e != nil { + return retryError(e) + } - info, has, err := service.DescribeRouteTable(ctx, items[1]) - if err != nil { - return err - } + if has == 0 { + d.SetId("") + return nil + } + + if has != 1 { + e = fmt.Errorf("one routeTable id get %d routeTable infos", has) + return resource.NonRetryableError(e) + } - if has == 0 { + for _, v := range info.entryInfos { + if fmt.Sprintf("%d", v.routeEntryId) == items[0] { + d.Set("description", v.description) + d.Set("route_table_id", v.routeEntryId) + d.Set("destination_cidr_block", v.destinationCidr) + d.Set("next_type", v.nextType) + d.Set("next_hub", v.nextBub) + return nil + } + } d.SetId("") return nil - } - - if has != 1 { - err = fmt.Errorf("one routeTable id get %d routeTable infos", has) + }) + if err != nil { return err } - for _, v := range info.entryInfos { - if fmt.Sprintf("%d", v.routeEntryId) == items[0] { - d.Set("description", v.description) - d.Set("route_table_id", v.routeEntryId) - d.Set("destination_cidr_block", v.destinationCidr) - d.Set("next_type", v.nextType) - d.Set("next_hub", v.nextBub) - return nil - } - } - - d.SetId("") - return nil } From 3ee93c657fa1d42941581c2bb8fd698362faa30d Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Tue, 8 Oct 2019 11:56:41 +0800 Subject: [PATCH 13/18] Update resource_tc_route_table.go add retry to route_table --- tencentcloud/resource_tc_route_table.go | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/tencentcloud/resource_tc_route_table.go b/tencentcloud/resource_tc_route_table.go index 62bfcf0059..dd2a1ea769 100644 --- a/tencentcloud/resource_tc_route_table.go +++ b/tencentcloud/resource_tc_route_table.go @@ -145,23 +145,35 @@ func resourceTencentCloudVpcRouteTableRead(d *schema.ResourceData, meta interfac id := d.Id() + var ( + info VpcRouteTableBasicInfo + has int + e error + ) service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} - - info, has, err := service.DescribeRouteTable(ctx, id) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + info, has, e = service.DescribeRouteTable(ctx, id) + if e != nil { + return retryError(e) + } + // deleted + if has == 0 { + d.SetId("") + return nil + } + if has != 1 { + errRet := fmt.Errorf("one route_table_id read get %d route_table info", has) + log.Printf("[CRITAL]%s %s", logId, errRet.Error()) + return resource.NonRetryableError(errRet) + } + return nil + }) if err != nil { return err } - // deleted if has == 0 { - d.SetId("") return nil } - if has != 1 { - errRet := fmt.Errorf("one route_table_id read get %d route_table info", has) - log.Printf("[CRITAL]%s %s", logId, errRet.Error()) - return errRet - } - routeEntryIds := make([]string, 0, len(info.entryInfos)) for _, v := range info.entryInfos { tfRouteEntryId := fmt.Sprintf("%d.%s", v.routeEntryId, id) From 0130f4437ae6d367468085435ba248cef1e10534 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Wed, 9 Oct 2019 09:37:24 +0800 Subject: [PATCH 14/18] delete extra code execution after SetId as "" --- tencentcloud/resource_tc_ccn_attachment.go | 13 +++++++++---- tencentcloud/resource_tc_ccn_bandwidth_limit.go | 9 +++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tencentcloud/resource_tc_ccn_attachment.go b/tencentcloud/resource_tc_ccn_attachment.go index 5c43798bfc..ed280ae7ef 100644 --- a/tencentcloud/resource_tc_ccn_attachment.go +++ b/tencentcloud/resource_tc_ccn_attachment.go @@ -148,10 +148,11 @@ func resourceTencentCloudCcnAttachmentRead(d *schema.ResourceData, meta interfac service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} var ( - ccnId = d.Get("ccn_id").(string) - instanceType = d.Get("instance_type").(string) - instanceRegion = d.Get("instance_region").(string) - instanceId = d.Get("instance_id").(string) + ccnId = d.Get("ccn_id").(string) + instanceType = d.Get("instance_type").(string) + instanceRegion = d.Get("instance_region").(string) + instanceId = d.Get("instance_id").(string) + onlineHas bool = true ) err := resource.Retry(readRetryTimeout, func() *resource.RetryError { _, has, e := service.DescribeCcn(ctx, ccnId) @@ -161,6 +162,7 @@ func resourceTencentCloudCcnAttachmentRead(d *schema.ResourceData, meta interfac if has == 0 { d.SetId("") + onlineHas = false return nil } return nil @@ -168,6 +170,9 @@ func resourceTencentCloudCcnAttachmentRead(d *schema.ResourceData, meta interfac if err != nil { return err } + if !onlineHas { + return nil + } err = resource.Retry(readRetryTimeout, func() *resource.RetryError { info, has, e := service.DescribeCcnAttachedInstance(ctx, ccnId, instanceRegion, instanceType, instanceId) if e != nil { diff --git a/tencentcloud/resource_tc_ccn_bandwidth_limit.go b/tencentcloud/resource_tc_ccn_bandwidth_limit.go index 526d5d9803..fa367117da 100644 --- a/tencentcloud/resource_tc_ccn_bandwidth_limit.go +++ b/tencentcloud/resource_tc_ccn_bandwidth_limit.go @@ -132,8 +132,9 @@ func resourceTencentCloudCcnBandwidthLimitRead(d *schema.ResourceData, meta inte service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} var ( - ccnId = d.Get("ccn_id").(string) - region = d.Get("region").(string) + ccnId = d.Get("ccn_id").(string) + region = d.Get("region").(string) + onlineHas bool = true ) err := resource.Retry(readRetryTimeout, func() *resource.RetryError { _, has, e := service.DescribeCcn(ctx, ccnId) @@ -143,6 +144,7 @@ func resourceTencentCloudCcnBandwidthLimitRead(d *schema.ResourceData, meta inte if has == 0 { d.SetId("") + onlineHas = false return nil } return nil @@ -150,6 +152,9 @@ func resourceTencentCloudCcnBandwidthLimitRead(d *schema.ResourceData, meta inte if err != nil { return err } + if !onlineHas { + return nil + } err = resource.Retry(readRetryTimeout, func() *resource.RetryError { bandwidth, e := service.DescribeCcnRegionBandwidthLimit(ctx, ccnId, region) if e != nil { From ff6e3cce3e908852c793ffe3d85c19af26418d68 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Wed, 9 Oct 2019 09:41:03 +0800 Subject: [PATCH 15/18] delete improper retry from as_attachment --- tencentcloud/resource_tc_as_attachment.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tencentcloud/resource_tc_as_attachment.go b/tencentcloud/resource_tc_as_attachment.go index f0cbc428b7..ab5b24b8f7 100644 --- a/tencentcloud/resource_tc_as_attachment.go +++ b/tencentcloud/resource_tc_as_attachment.go @@ -147,13 +147,7 @@ func resourceTencentCloudAsAttachmentDelete(d *schema.ResourceData, meta interfa return err } - err = resource.Retry(readRetryTimeout, func() *resource.RetryError { - e = asService.DetachInstances(ctx, scalingGroupId, instanceIds) - if e != nil { - return retryError(e) - } - return nil - }) + err = asService.DetachInstances(ctx, scalingGroupId, instanceIds) if err != nil { return err } From 9bb45db1d15b4194bcf4ee7f6bdba2c2a91493ad Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Wed, 9 Oct 2019 14:58:34 +0800 Subject: [PATCH 16/18] add retry to as and add "has" return parameter to as service function --- tencentcloud/resource_tc_as_lifecycle_hook.go | 10 ++-- tencentcloud/resource_tc_as_notification.go | 11 ++-- tencentcloud/resource_tc_as_scaling_config.go | 12 ++-- tencentcloud/resource_tc_as_scaling_group.go | 25 ++++++--- tencentcloud/resource_tc_as_scaling_policy.go | 10 ++-- tencentcloud/service_tencentcloud_as.go | 55 +++++++++---------- 6 files changed, 64 insertions(+), 59 deletions(-) diff --git a/tencentcloud/resource_tc_as_lifecycle_hook.go b/tencentcloud/resource_tc_as_lifecycle_hook.go index 723eaf540c..3ee9bf4a55 100644 --- a/tencentcloud/resource_tc_as_lifecycle_hook.go +++ b/tencentcloud/resource_tc_as_lifecycle_hook.go @@ -159,14 +159,14 @@ func resourceTencentCloudAsLifecycleHookRead(d *schema.ResourceData, meta interf client: meta.(*TencentCloudClient).apiV3Conn, } err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - lifecycleHook, e := asService.DescribeLifecycleHookById(ctx, lifecycleHookId) + lifecycleHook, has, e := asService.DescribeLifecycleHookById(ctx, lifecycleHookId) if e != nil { - if e.Error() == "lifecycle hook id is not found" { - d.SetId("") - return nil - } return retryError(e) } + if has == 0 { + d.SetId("") + return nil + } d.Set("scaling_group_id", *lifecycleHook.AutoScalingGroupId) d.Set("lifecycle_hook_name", *lifecycleHook.LifecycleHookName) d.Set("lifecycle_transition", *lifecycleHook.LifecycleTransition) diff --git a/tencentcloud/resource_tc_as_notification.go b/tencentcloud/resource_tc_as_notification.go index 9927538a00..b2a60bc14d 100644 --- a/tencentcloud/resource_tc_as_notification.go +++ b/tencentcloud/resource_tc_as_notification.go @@ -104,15 +104,14 @@ func resourceTencentCloudAsNotificationRead(d *schema.ResourceData, meta interfa client: meta.(*TencentCloudClient).apiV3Conn, } err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - notification, e := asService.DescribeNotificationById(ctx, notificationId) + notification, has, e := asService.DescribeNotificationById(ctx, notificationId) if e != nil { - if e.Error() == "notification id is not found" { - d.SetId("") - return nil - } return retryError(e) } - + if has == 0 { + d.SetId("") + return nil + } d.Set("scaling_group_id", *notification.AutoScalingGroupId) d.Set("notification_type", flattenStringList(notification.NotificationTypes)) d.Set("notification_user_group_ids", flattenStringList(notification.NotificationUserGroupIds)) diff --git a/tencentcloud/resource_tc_as_scaling_config.go b/tencentcloud/resource_tc_as_scaling_config.go index 04515acb8b..7d80deb705 100644 --- a/tencentcloud/resource_tc_as_scaling_config.go +++ b/tencentcloud/resource_tc_as_scaling_config.go @@ -12,7 +12,7 @@ resource "tencentcloud_as_scaling_config" "launch_configuration" { system_disk_type = "CLOUD_PREMIUM" system_disk_size = "50" - data_disk = { + data_disk { disk_type = "CLOUD_PREMIUM" disk_size = 50 } @@ -371,14 +371,14 @@ func resourceTencentCloudAsScalingConfigRead(d *schema.ResourceData, meta interf client: meta.(*TencentCloudClient).apiV3Conn, } err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - config, e := asService.DescribeLaunchConfigurationById(ctx, configurationId) + config, has, e := asService.DescribeLaunchConfigurationById(ctx, configurationId) if e != nil { - if e.Error() == "configuration id is not found" { - d.SetId("") - return nil - } return retryError(e) } + if has == 0 { + d.SetId("") + return nil + } d.Set("configuration_name", *config.LaunchConfigurationName) d.Set("status", *config.LaunchConfigurationStatus) d.Set("image_id", *config.ImageId) diff --git a/tencentcloud/resource_tc_as_scaling_group.go b/tencentcloud/resource_tc_as_scaling_group.go index 5a88f13602..a6d6c5fccd 100644 --- a/tencentcloud/resource_tc_as_scaling_group.go +++ b/tencentcloud/resource_tc_as_scaling_group.go @@ -353,17 +353,25 @@ func resourceTencentCloudAsScalingGroupRead(d *schema.ResourceData, meta interfa var ( scalingGroup *as.AutoScalingGroup - err error + e error + has int ) - if err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - scalingGroup, err = asService.DescribeAutoScalingGroupById(ctx, scalingGroupId) - if err != nil { - return retryError(err) + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + scalingGroup, has, e = asService.DescribeAutoScalingGroupById(ctx, scalingGroupId) + if e != nil { + return retryError(e) + } + if has == 0 { + d.SetId("") } return nil - }); err != nil { + }) + if err != nil { return err } + if has == 0 { + return nil + } d.Set("scaling_group_name", scalingGroup.AutoScalingGroupName) d.Set("configuration_id", scalingGroup.LaunchConfigurationId) @@ -608,10 +616,13 @@ func resourceTencentCloudAsScalingGroupDelete(d *schema.ResourceData, meta inter // We need read the scaling group in order to check if there are instances. // If so, we need to remove those first. - scalingGroup, err := asService.DescribeAutoScalingGroupById(ctx, scalingGroupId) + scalingGroup, has, err := asService.DescribeAutoScalingGroupById(ctx, scalingGroupId) if err != nil { return err } + if has == 0 { + return nil + } if *scalingGroup.InstanceCount > 0 || *scalingGroup.DesiredCapacity > 0 { if err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { return retryError(asService.ClearScalingGroupInstance(ctx, scalingGroupId)) diff --git a/tencentcloud/resource_tc_as_scaling_policy.go b/tencentcloud/resource_tc_as_scaling_policy.go index b8c7129cdc..7d5a7a0c79 100644 --- a/tencentcloud/resource_tc_as_scaling_policy.go +++ b/tencentcloud/resource_tc_as_scaling_policy.go @@ -173,14 +173,14 @@ func resourceTencentCloudAsScalingPolicyRead(d *schema.ResourceData, meta interf client: meta.(*TencentCloudClient).apiV3Conn, } err := resource.Retry(readRetryTimeout, func() *resource.RetryError { - scalingPolicy, e := asService.DescribeScalingPolicyById(ctx, scalingPolicyId) + scalingPolicy, has, e := asService.DescribeScalingPolicyById(ctx, scalingPolicyId) if e != nil { - if e.Error() == "scaling policy id is not found" { - d.SetId("") - return nil - } return retryError(e) } + if has == 0 { + d.SetId("") + return nil + } d.Set("scaling_group_id", *scalingPolicy.AutoScalingGroupId) d.Set("policy_name", *scalingPolicy.ScalingPolicyName) d.Set("adjustment_type", *scalingPolicy.AdjustmentType) diff --git a/tencentcloud/service_tencentcloud_as.go b/tencentcloud/service_tencentcloud_as.go index 67443c5050..0d9beaa163 100644 --- a/tencentcloud/service_tencentcloud_as.go +++ b/tencentcloud/service_tencentcloud_as.go @@ -16,7 +16,7 @@ type AsService struct { client *connectivity.TencentCloudClient } -func (me *AsService) DescribeLaunchConfigurationById(ctx context.Context, configurationId string) (config *as.LaunchConfiguration, errRet error) { +func (me *AsService) DescribeLaunchConfigurationById(ctx context.Context, configurationId string) (config *as.LaunchConfiguration, has int, errRet error) { logId := getLogId(ctx) request := as.NewDescribeLaunchConfigurationsRequest() request.LaunchConfigurationIds = []*string{&configurationId} @@ -28,13 +28,12 @@ func (me *AsService) DescribeLaunchConfigurationById(ctx context.Context, config errRet = err return } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - - if len(response.Response.LaunchConfigurationSet) < 1 { - errRet = fmt.Errorf("configuration id is not found") + has = len(response.Response.LaunchConfigurationSet) + if has < 1 { return } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) config = response.Response.LaunchConfigurationSet[0] return } @@ -106,7 +105,7 @@ func (me *AsService) DeleteLaunchConfiguration(ctx context.Context, configuratio return nil } -func (me *AsService) DescribeAutoScalingGroupById(ctx context.Context, scalingGroupId string) (scalingGroup *as.AutoScalingGroup, errRet error) { +func (me *AsService) DescribeAutoScalingGroupById(ctx context.Context, scalingGroupId string) (scalingGroup *as.AutoScalingGroup, has int, errRet error) { logId := getLogId(ctx) request := as.NewDescribeAutoScalingGroupsRequest() request.AutoScalingGroupIds = []*string{&scalingGroupId} @@ -118,13 +117,12 @@ func (me *AsService) DescribeAutoScalingGroupById(ctx context.Context, scalingGr errRet = err return } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - - if len(response.Response.AutoScalingGroupSet) < 1 { - errRet = fmt.Errorf("configuration id is not found") + has = len(response.Response.AutoScalingGroupSet) + if has < 1 { return } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) scalingGroup = response.Response.AutoScalingGroupSet[0] return } @@ -362,7 +360,7 @@ func (me *AsService) DescribeAutoScalingAttachment(ctx context.Context, scalingG return } -func (me *AsService) DescribeScalingPolicyById(ctx context.Context, scalingPolicyId string) (scalingPolicy *as.ScalingPolicy, errRet error) { +func (me *AsService) DescribeScalingPolicyById(ctx context.Context, scalingPolicyId string) (scalingPolicy *as.ScalingPolicy, has int, errRet error) { logId := getLogId(ctx) request := as.NewDescribeScalingPoliciesRequest() request.AutoScalingPolicyIds = []*string{&scalingPolicyId} @@ -374,13 +372,12 @@ func (me *AsService) DescribeScalingPolicyById(ctx context.Context, scalingPolic errRet = err return } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - - if len(response.Response.ScalingPolicySet) < 1 { - errRet = fmt.Errorf("scaling policy id is not found") + has = len(response.Response.ScalingPolicySet) + if has < 1 { return } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) scalingPolicy = response.Response.ScalingPolicySet[0] return } @@ -498,7 +495,7 @@ func (me *AsService) DeleteScheduledAction(ctx context.Context, scheduledActonId return nil } -func (me *AsService) DescribeLifecycleHookById(ctx context.Context, lifecycleHookId string) (lifecycleHook *as.LifecycleHook, errRet error) { +func (me *AsService) DescribeLifecycleHookById(ctx context.Context, lifecycleHookId string) (lifecycleHook *as.LifecycleHook, has int, errRet error) { logId := getLogId(ctx) request := as.NewDescribeLifecycleHooksRequest() request.LifecycleHookIds = []*string{&lifecycleHookId} @@ -510,13 +507,12 @@ func (me *AsService) DescribeLifecycleHookById(ctx context.Context, lifecycleHoo errRet = err return } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - - if len(response.Response.LifecycleHookSet) < 1 { - errRet = fmt.Errorf("lifecycle hook id is not found") + has = len(response.Response.LifecycleHookSet) + if has < 1 { return } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) lifecycleHook = response.Response.LifecycleHookSet[0] return } @@ -537,7 +533,7 @@ func (me *AsService) DeleteLifecycleHook(ctx context.Context, lifecycleHookId st return nil } -func (me *AsService) DescribeNotificationById(ctx context.Context, notificationId string) (notification *as.AutoScalingNotification, errRet error) { +func (me *AsService) DescribeNotificationById(ctx context.Context, notificationId string) (notification *as.AutoScalingNotification, has int, errRet error) { logId := getLogId(ctx) request := as.NewDescribeNotificationConfigurationsRequest() request.AutoScalingNotificationIds = []*string{¬ificationId} @@ -549,13 +545,12 @@ func (me *AsService) DescribeNotificationById(ctx context.Context, notificationI errRet = err return } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - - if len(response.Response.AutoScalingNotificationSet) < 1 { - errRet = fmt.Errorf("notification id is not found") + has = len(response.Response.AutoScalingNotificationSet) + if has < 1 { return } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) notification = response.Response.AutoScalingNotificationSet[0] return } From beea748a9ded9a41eaec8a6a77102d617b0728e4 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Wed, 9 Oct 2019 15:35:14 +0800 Subject: [PATCH 17/18] add parameter placehoder into as' test file --- tencentcloud/resource_tc_as_lifecycle_hook_test.go | 4 ++-- tencentcloud/resource_tc_as_scaling_config_test.go | 4 ++-- tencentcloud/resource_tc_as_scaling_group_test.go | 4 ++-- tencentcloud/resource_tc_as_scaling_policy_test.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tencentcloud/resource_tc_as_lifecycle_hook_test.go b/tencentcloud/resource_tc_as_lifecycle_hook_test.go index 916735ba50..ec168c4a30 100644 --- a/tencentcloud/resource_tc_as_lifecycle_hook_test.go +++ b/tencentcloud/resource_tc_as_lifecycle_hook_test.go @@ -57,7 +57,7 @@ func testAccCheckAsLifecycleHookExists(n string) resource.TestCheckFunc { return fmt.Errorf("auto scaling lifecycle hook id is not set") } asService := AsService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn} - _, err := asService.DescribeLifecycleHookById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeLifecycleHookById(ctx, rs.Primary.ID) if err != nil { return err } @@ -77,7 +77,7 @@ func testAccCheckAsLifecycleHookDestroy(s *terraform.State) error { continue } - _, err := asService.DescribeLifecycleHookById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeLifecycleHookById(ctx, rs.Primary.ID) if err == nil { return fmt.Errorf("auto scaling lifecycle hook still exists: %s", rs.Primary.ID) } diff --git a/tencentcloud/resource_tc_as_scaling_config_test.go b/tencentcloud/resource_tc_as_scaling_config_test.go index b384632f35..357e108f38 100644 --- a/tencentcloud/resource_tc_as_scaling_config_test.go +++ b/tencentcloud/resource_tc_as_scaling_config_test.go @@ -103,7 +103,7 @@ func testAccCheckAsScalingConfigExists(n string) resource.TestCheckFunc { return fmt.Errorf("auto scaling configuration id is not set") } asService := AsService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn} - _, err := asService.DescribeLaunchConfigurationById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeLaunchConfigurationById(ctx, rs.Primary.ID) if err != nil { return err } @@ -123,7 +123,7 @@ func testAccCheckAsScalingConfigDestroy(s *terraform.State) error { continue } - _, err := asService.DescribeLaunchConfigurationById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeLaunchConfigurationById(ctx, rs.Primary.ID) if err == nil { return fmt.Errorf("auto scaling configuration still exists: %s", rs.Primary.ID) } diff --git a/tencentcloud/resource_tc_as_scaling_group_test.go b/tencentcloud/resource_tc_as_scaling_group_test.go index e0001ebdca..f1c8059907 100644 --- a/tencentcloud/resource_tc_as_scaling_group_test.go +++ b/tencentcloud/resource_tc_as_scaling_group_test.go @@ -139,7 +139,7 @@ func testAccCheckAsScalingGroupExists(n string) resource.TestCheckFunc { return fmt.Errorf("auto scaling group id is not set") } asService := AsService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn} - _, err := asService.DescribeAutoScalingGroupById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeAutoScalingGroupById(ctx, rs.Primary.ID) if err != nil { return err } @@ -159,7 +159,7 @@ func testAccCheckAsScalingGroupDestroy(s *terraform.State) error { continue } - _, err := asService.DescribeAutoScalingGroupById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeAutoScalingGroupById(ctx, rs.Primary.ID) if err == nil { return fmt.Errorf("auto scaling group still exists: %s", rs.Primary.ID) } diff --git a/tencentcloud/resource_tc_as_scaling_policy_test.go b/tencentcloud/resource_tc_as_scaling_policy_test.go index 8d1ae29f45..5f2614cfdc 100644 --- a/tencentcloud/resource_tc_as_scaling_policy_test.go +++ b/tencentcloud/resource_tc_as_scaling_policy_test.go @@ -66,7 +66,7 @@ func testAccCheckAsScalingPolicyExists(n string) resource.TestCheckFunc { return fmt.Errorf("auto scaling policy id is not set") } asService := AsService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn} - _, err := asService.DescribeScalingPolicyById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeScalingPolicyById(ctx, rs.Primary.ID) if err != nil { return err } @@ -86,7 +86,7 @@ func testAccCheckAsScalingPolicyDestroy(s *terraform.State) error { continue } - _, err := asService.DescribeScalingPolicyById(ctx, rs.Primary.ID) + _, _, err := asService.DescribeScalingPolicyById(ctx, rs.Primary.ID) if err == nil { return fmt.Errorf("auto scaling policy still exists: %s", rs.Primary.ID) } From 117e43c08fba2ae87116f2a00738983d184e87e3 Mon Sep 17 00:00:00 2001 From: JihaoXin <263865242@qq.com> Date: Wed, 9 Oct 2019 16:12:56 +0800 Subject: [PATCH 18/18] add placehoder --- tencentcloud/resource_tc_as_scaling_group.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tencentcloud/resource_tc_as_scaling_group.go b/tencentcloud/resource_tc_as_scaling_group.go index b73d506196..113b2d57e5 100644 --- a/tencentcloud/resource_tc_as_scaling_group.go +++ b/tencentcloud/resource_tc_as_scaling_group.go @@ -343,7 +343,7 @@ func resourceTencentCloudAsScalingGroupCreate(d *schema.ResourceData, meta inter client: meta.(*TencentCloudClient).apiV3Conn, } err := resource.Retry(5*time.Minute, func() *resource.RetryError { - scalingGroup, errRet := asService.DescribeAutoScalingGroupById(ctx, id) + scalingGroup, _, errRet := asService.DescribeAutoScalingGroupById(ctx, id) if errRet != nil { return retryError(errRet, "InternalError") }