diff --git a/tencentcloud/resource_tc_eks_cluster_test.go b/tencentcloud/resource_tc_eks_cluster_test.go index a5d0c05e68..6707d8ebbc 100644 --- a/tencentcloud/resource_tc_eks_cluster_test.go +++ b/tencentcloud/resource_tc_eks_cluster_test.go @@ -5,10 +5,43 @@ import ( "fmt" "testing" + tke "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" ) +func init() { + resource.AddTestSweepers("tencentcloud_eks_cluster", &resource.Sweeper{ + Name: "tencentcloud_eks_cluster", + F: testSweepEksClusters, + }) +} + +func testSweepEksClusters(region string) error { + client, err := sharedClientForRegion(region) + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + if err != nil { + return err + } + service := EksService{client: client.(*TencentCloudClient).apiV3Conn} + clusters, err := service.DescribeEKSClusters(ctx, "", "tf-eks-test") + if err != nil { + return err + } + for _, c := range clusters { + id := c.ClusterId + req := tke.NewDeleteEKSClusterRequest() + req.ClusterId = &id + err := service.DeleteEksCluster(ctx, req) + if err != nil { + return err + } + } + return nil +} + func TestAccTencentCloudEKSCluster_basic(t *testing.T) { t.Parallel() diff --git a/tencentcloud/resource_tc_instance.go b/tencentcloud/resource_tc_instance.go index fd3b9da83e..ad3d98cf4e 100644 --- a/tencentcloud/resource_tc_instance.go +++ b/tencentcloud/resource_tc_instance.go @@ -1201,7 +1201,7 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{} if errRet != nil { return retryError(errRet, InternalError) } - if instance != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING { + if instance != nil && instance.LatestOperationState != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING { return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState)) } return nil @@ -1226,7 +1226,7 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{} if errRet != nil { return retryError(errRet, InternalError) } - if instance != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING { + if instance != nil && instance.LatestOperationState != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING { return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState)) } return nil @@ -1247,7 +1247,7 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{} if errRet != nil { return retryError(errRet, InternalError) } - if instance != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING { + if instance != nil && instance.LatestOperationState != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING { return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState)) } return nil @@ -1364,7 +1364,7 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{} } // Modifying instance type need restart the instance // so status of CVM must be running when running flag is true - if instance != nil && (*instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING || + if instance != nil && instance.LatestOperationState != nil && (*instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING || (flag && *instance.InstanceState != CVM_STATUS_RUNNING)) { return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState)) } @@ -1390,7 +1390,7 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{} } // Modifying instance type need restart the instance // so status of CVM must be running when running flag is true - if instance != nil && (*instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING || + if instance != nil && instance.LatestOperationState != nil && (*instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING || (flag && *instance.InstanceState != CVM_STATUS_RUNNING)) { return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState)) } diff --git a/tencentcloud/resource_tc_instance_test.go b/tencentcloud/resource_tc_instance_test.go index 78f19921cc..2511f1045b 100644 --- a/tencentcloud/resource_tc_instance_test.go +++ b/tencentcloud/resource_tc_instance_test.go @@ -26,7 +26,7 @@ func testSweepCvmInstance(region string) error { if err != nil { return fmt.Errorf("getting tencentcloud client error: %s", err.Error()) } - client := sharedClient.(TencentCloudClient) + client := sharedClient.(*TencentCloudClient) cvmService := CvmService{ client: client.apiV3Conn, @@ -467,6 +467,7 @@ func TestAccTencentCloudInstanceWithSpotpaid(t *testing.T) { }) } +/* Skip prepaid for now func TestAccTencentCloudInstanceWithPrepaidChargeType(t *testing.T) { t.Parallel() @@ -494,6 +495,8 @@ func TestAccTencentCloudInstanceWithPrepaidChargeType(t *testing.T) { }) } +*/ + func testAccCheckTencentCloudInstanceExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { logId := getLogId(contextNil) diff --git a/tencentcloud/resource_tc_kubernetes_addon_attachment_test.go b/tencentcloud/resource_tc_kubernetes_addon_attachment_test.go index b77028b5f1..80c8931891 100644 --- a/tencentcloud/resource_tc_kubernetes_addon_attachment_test.go +++ b/tencentcloud/resource_tc_kubernetes_addon_attachment_test.go @@ -84,6 +84,7 @@ resource "tencentcloud_kubernetes_cluster" "managed_cluster" { } resource "tencentcloud_kubernetes_addon_attachment" "cbs" { + cluster_id = tencentcloud_kubernetes_cluster.managed_cluster.id name = "cbs" version = "1.0.0" } diff --git a/tencentcloud/resource_tc_mysql_instance_test.go b/tencentcloud/resource_tc_mysql_instance_test.go index 0a53d8d32b..3d03ab7df1 100644 --- a/tencentcloud/resource_tc_mysql_instance_test.go +++ b/tencentcloud/resource_tc_mysql_instance_test.go @@ -5,12 +5,97 @@ import ( "fmt" "testing" + cdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" ) const TestAccTencentCloudMysqlMasterInstance_availability_zone = "ap-guangzhou-3" +const TestAccTencentCloudMysqlInstanceName = "testAccMysql" +const TestAccTencentCloudMysqlInstanceNameVersion1 = "testAccMysql-version1" +const TestAccTencentCloudMysqlInstanceNamePrepaid = "testAccMysqlPrepaid" + +func init() { + resource.AddTestSweepers("tencentcloud_mysql_instance", &resource.Sweeper{ + Name: "tencentcloud_mysql_instance", + F: testSweepMySQLInstance, + }) +} + +func testSweepMySQLInstance(region string) error { + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + cli, err := sharedClientForRegion(region) + if err != nil { + return err + } + client := cli.(*TencentCloudClient).apiV3Conn + service := MysqlService{client: client} + + request := cdb.NewDescribeDBInstancesRequest() + request.InstanceNames = []*string{ + helper.String(TestAccTencentCloudMysqlInstanceName), + helper.String(TestAccTencentCloudMysqlInstanceNameVersion1), + helper.String(TestAccTencentCloudMysqlInstanceNamePrepaid), + } + request.Limit = helper.IntUint64(2000) + + response, err := client.UseMysqlClient().DescribeDBInstances(request) + if err != nil { + return err + } + + if len(response.Response.Items) == 0 { + return nil + } + + for _, v := range response.Response.Items { + id := *v.InstanceId + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + _, err := service.IsolateDBInstance(ctx, id) + if err != nil { + //for the pay order wait + return retryError(err, InternalError) + } + return nil + }) + if err != nil { + return err + } + + err = resource.Retry(7*readRetryTimeout, func() *resource.RetryError { + mysqlInfo, err := service.DescribeDBInstanceById(ctx, id) + + if err != nil { + if _, ok := err.(*errors.TencentCloudSDKError); !ok { + return resource.RetryableError(err) + } else { + return resource.NonRetryableError(err) + } + } + if mysqlInfo == nil { + return nil + } + if *mysqlInfo.Status == MYSQL_STATUS_ISOLATING || *mysqlInfo.Status == MYSQL_STATUS_RUNNING { + return resource.RetryableError(fmt.Errorf("mysql isolating.")) + } + if *mysqlInfo.Status == MYSQL_STATUS_ISOLATED { + return nil + } + return resource.NonRetryableError(fmt.Errorf("after IsolateDBInstance mysql Status is %d", *mysqlInfo.Status)) + }) + + err = service.OfflineIsolatedInstances(ctx, id) + if err != nil { + return err + } + } + + return nil +} func TestAccTencentCloudMysqlMasterInstance_fullslave(t *testing.T) { t.Parallel() @@ -23,7 +108,7 @@ func TestAccTencentCloudMysqlMasterInstance_fullslave(t *testing.T) { Config: testAccMysqlMasterInstance_fullslave(), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckMysqlMasterInstanceExists("tencentcloud_mysql_instance.mysql_master"), - resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "instance_name", "testAccMysql"), + resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "instance_name", TestAccTencentCloudMysqlInstanceName), resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "slave_deploy_mode", "0"), resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "slave_sync_mode", "2"), resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "availability_zone", TestAccTencentCloudMysqlMasterInstance_availability_zone), @@ -46,7 +131,7 @@ func TestAccTencentCloudMysqlMasterInstance_basic_and_update(t *testing.T) { Config: testAccMysqlMasterInstance_basic(), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckMysqlMasterInstanceExists("tencentcloud_mysql_instance.mysql_master"), - resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "instance_name", "testAccMysql"), + resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "instance_name", TestAccTencentCloudMysqlInstanceName), resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "mem_size", "1000"), resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "volume_size", "50"), resource.TestCheckResourceAttr("tencentcloud_mysql_instance.mysql_master", "intranet_port", "3360"), diff --git a/tencentcloud/resource_tc_security_group_test.go b/tencentcloud/resource_tc_security_group_test.go index 7f9f919f81..dd783a799b 100644 --- a/tencentcloud/resource_tc_security_group_test.go +++ b/tencentcloud/resource_tc_security_group_test.go @@ -3,12 +3,90 @@ package tencentcloud import ( "context" "fmt" + "log" + "strings" "testing" + vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" ) +func init() { + resource.AddTestSweepers("tencentcloud_security_group", &resource.Sweeper{ + Name: "tencentcloud_security_group", + F: testSweepSecurityGroups, + }) +} + +func testSweepSecurityGroups(region string) error { + const NamePrefix = "ci-temp-test-sg" + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + sharedClient, err := sharedClientForRegion(region) + if err != nil { + return fmt.Errorf("getting tencentcloud client error: %s", err.Error()) + } + client := sharedClient.(*TencentCloudClient) + service := VpcService{ + client: client.apiV3Conn, + } + + sgs, err := service.DescribeSecurityGroups(ctx, nil, helper.String(NamePrefix), nil, nil) + var sgIds []*string + var candidates []string + var referredSgs = make(map[string][]*string, 0) + + if err != nil { + return fmt.Errorf("DescribeSecurityGroups error: %s", err.Error()) + } + + for _, v := range sgs { + name := *v.SecurityGroupName + id := *v.SecurityGroupId + sgIds = append(sgIds, v.SecurityGroupId) + if !strings.HasPrefix(name, NamePrefix) { + continue + } + candidates = append(candidates, id) + + } + + refReq := vpc.NewDescribeSecurityGroupReferencesRequest() + refReq.SecurityGroupIds = sgIds + + refRes, err := client.apiV3Conn.UseVpcClient().DescribeSecurityGroupReferences(refReq) + if err != nil { + return fmt.Errorf("DescribeSecurityGroupReferences error: %s", err.Error()) + } + for _, v := range refRes.Response.ReferredSecurityGroupSet { + if len(v.ReferredSecurityGroupIds) > 0 { + referredSgs[*v.SecurityGroupId] = v.ReferredSecurityGroupIds + } + } + + res, err := service.DescribeSecurityGroupsAssociate(ctx, candidates) + if err != nil { + return fmt.Errorf("DescribeSecurityGroupsAssociate error: %s", err.Error()) + } + + for _, v := range res { + id := *v.SecurityGroupId + + if *v.TotalCount > 0 || len(referredSgs[id]) > 0 { + continue + } + + if err := service.DeleteSecurityGroup(ctx, id); err != nil { + log.Printf("[ERROR] sweep security group %s error: %s", id, err.Error()) + } + } + return nil +} + func TestAccTencentCloudSecurityGroup_basic(t *testing.T) { t.Parallel() var sgId string