From 3e8da9cbc749fe398254a8cc1664144b1c5c08d3 Mon Sep 17 00:00:00 2001 From: mikatong Date: Mon, 27 May 2024 16:54:39 +0800 Subject: [PATCH] generate cvm image and key-pair test --- .../services/cvm/resource_tc_image_test.go | 353 +++++++++--------- .../services/cvm/resource_tc_key_pair_test.go | 118 ++++-- 2 files changed, 259 insertions(+), 212 deletions(-) diff --git a/tencentcloud/services/cvm/resource_tc_image_test.go b/tencentcloud/services/cvm/resource_tc_image_test.go index 0925369852..37f2aee1c7 100644 --- a/tencentcloud/services/cvm/resource_tc_image_test.go +++ b/tencentcloud/services/cvm/resource_tc_image_test.go @@ -1,79 +1,207 @@ package cvm_test import ( - tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" - tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" - svccvm "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cvm" - "context" "fmt" "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + svccvm "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cvm" ) -const ( - ImageSnap = "tencentcloud_image.image_snap" - ImageInstance = "tencentcloud_image.image_instance" -) - -func TestAccTencentCloudImageResource(t *testing.T) { +func TestAccTencentCloudCvmImageResource_UseSnapshotId(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ - PreCheck: func() { tcacctest.AccPreCheck(t) }, - Providers: tcacctest.AccProviders, - CheckDestroy: testAccCheckImageDestroy, + PreCheck: func() { + acctest.AccPreCheck(t) + }, + Providers: acctest.AccProviders, + CheckDestroy: testAccCheckCvmImageDestroy, Steps: []resource.TestStep{ - // use snapshot id { - Config: testAccImageWithSnapShot, - Check: resource.ComposeTestCheckFunc( - testAccCheckImageExists(ImageSnap), - resource.TestCheckResourceAttr(ImageSnap, "image_name", "image-snapshot-keep"), - resource.TestCheckResourceAttr(ImageSnap, "snapshot_ids.#", "1"), - resource.TestCheckResourceAttr(ImageSnap, "force_poweroff", "true"), - resource.TestCheckResourceAttr(ImageSnap, "image_description", "create image with snapshot"), - ), + Config: testAccCvmImageResource_UseSnapshotIdCreate, + Check: resource.ComposeTestCheckFunc(testAccCheckCvmImageExists("tencentcloud_image.image_snap"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "image_name", "image-snapshot-keep"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "snapshot_ids.#", "1"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "force_poweroff", "true"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "image_description", "create image with instance")), }, { - Config: testAccImageWithSnapShotUpdate, - Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr(ImageSnap, "image_name", "image-snapshot-update-keep"), - resource.TestCheckResourceAttr(ImageSnap, "snapshot_ids.#", "1"), - resource.TestCheckResourceAttr(ImageSnap, "force_poweroff", "false"), - resource.TestCheckResourceAttr(ImageSnap, "image_description", "update image with snapshot"), - ), + Config: testAccCvmImageResource_UseSnapshotIdChange1, + Check: resource.ComposeTestCheckFunc(testAccCheckCvmImageExists("tencentcloud_image.image_snap"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "image_description", "update image with instance"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "image_name", "image-snapshot-update-keep"), resource.TestCheckResourceAttr("tencentcloud_image.image_snap", "force_poweroff", "false")), }, { - ResourceName: ImageSnap, + ResourceName: "tencentcloud_image.image_snap", ImportState: true, ImportStateVerify: true, ImportStateVerifyIgnore: []string{"force_poweroff"}, }, - // use instance id + }, + }) +} + +const testAccCvmImageResource_UseSnapshotIdCreate = ` + +resource "tencentcloud_image" "image_snap" { + image_name = "image-snapshot-keep" + snapshot_ids = ["snap-gem0ivcj"] + force_poweroff = true + image_description = "create image with instance" +} + +` +const testAccCvmImageResource_UseSnapshotIdChange1 = ` + +resource "tencentcloud_image" "image_snap" { + image_name = "image-snapshot-update-keep" + snapshot_ids = ["snap-gem0ivcj"] + force_poweroff = false + image_description = "update image with instance" +} + +` + +func TestAccTencentCloudCvmImageResource_UseInstanceId(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + acctest.AccPreCheck(t) + }, + Providers: acctest.AccProviders, + CheckDestroy: testAccCheckCvmImageDestroy, + Steps: []resource.TestStep{ { - Config: testAccImageWithInstance, - Check: resource.ComposeTestCheckFunc( - testAccCheckImageExists(ImageInstance), - resource.TestCheckResourceAttr(ImageInstance, "image_name", "image-instance-keep"), - resource.TestCheckResourceAttrSet(ImageInstance, "instance_id"), - resource.TestCheckResourceAttr(ImageInstance, "data_disk_ids.#", "1"), - resource.TestCheckResourceAttr(ImageInstance, "image_description", "create image with instance"), - ), + Config: testAccCvmImageResource_UseInstanceIdCreate, + Check: resource.ComposeTestCheckFunc(testAccCheckCvmImageExists("tencentcloud_image.image_instance"), resource.TestCheckResourceAttr("tencentcloud_image.image_instance", "image_name", "image-instance-keep"), resource.TestCheckResourceAttrSet("tencentcloud_image.image_instance", "instance_id"), resource.TestCheckResourceAttr("tencentcloud_image.image_instance", "data_disk_ids.#", "1"), resource.TestCheckResourceAttr("tencentcloud_image.image_instance", "image_description", "create image with instance")), }, { - Config: testAccImageWithInstanceUpdate, - Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr(ImageInstance, "image_name", "image-instance-update-keep"), - resource.TestCheckResourceAttr(ImageInstance, "image_description", "update image with instance"), - ), + Config: testAccCvmImageResource_UseInstanceIdChange1, + Check: resource.ComposeTestCheckFunc(testAccCheckCvmImageExists("tencentcloud_image.image_instance"), resource.TestCheckResourceAttr("tencentcloud_image.image_instance", "image_name", "image-instance-update-keep"), resource.TestCheckResourceAttr("tencentcloud_image.image_instance", "image_description", "update image with instance")), }, }, }) } -func testAccCheckImageDestroy(s *terraform.State) error { +const testAccCvmImageResource_UseInstanceIdCreate = ` + +data "tencentcloud_availability_zones" "default" { +} +data "tencentcloud_images" "default" { + image_type = ["PUBLIC_IMAGE"] + image_name_regex = "Final" +} +data "tencentcloud_images" "testing" { + image_type = ["PUBLIC_IMAGE"] +} +data "tencentcloud_instance_types" "default" { + + filter { + values = ["ap-guangzhou-7"] + name = "zone" + } + filter { + name = "instance-family" + values = ["S4","SA2"] + } + cpu_core_count = 2 + memory_size = 2 + exclude_sold_out = true +} +resource "tencentcloud_vpc" "vpc" { + name = "image-vpc" + cidr_block = "10.0.0.0/16" +} +resource "tencentcloud_subnet" "subnet" { + vpc_id = tencentcloud_vpc.vpc.id + name = "image-subnet" + cidr_block = "10.0.0.0/16" + availability_zone = "ap-guangzhou-7" +} +resource "tencentcloud_instance" "cvm_image" { + availability_zone = "ap-guangzhou-7" + instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type + + data_disks { + delete_with_instance = true + data_disk_type = "CLOUD_PREMIUM" + data_disk_size = 100 + } + subnet_id = tencentcloud_subnet.subnet.id + system_disk_type = "CLOUD_PREMIUM" + image_id = data.tencentcloud_images.default.images.0.image_id + vpc_id = tencentcloud_vpc.vpc.id + project_id = 0 + instance_name = "cvm-image" +} +resource "tencentcloud_image" "image_instance" { + instance_id = tencentcloud_instance.cvm_image.id + data_disk_ids = [tencentcloud_instance.cvm_image.data_disks.0.data_disk_id] + image_description = "create image with instance" + image_name = "image-instance-keep" +} + +` +const testAccCvmImageResource_UseInstanceIdChange1 = ` + +data "tencentcloud_availability_zones" "default" { +} +data "tencentcloud_images" "default" { + image_type = ["PUBLIC_IMAGE"] + image_name_regex = "Final" +} +data "tencentcloud_images" "testing" { + image_type = ["PUBLIC_IMAGE"] +} +data "tencentcloud_instance_types" "default" { + + filter { + values = ["ap-guangzhou-7"] + name = "zone" + } + filter { + values = ["S4","SA2"] + name = "instance-family" + } + cpu_core_count = 2 + memory_size = 2 + exclude_sold_out = true +} +resource "tencentcloud_vpc" "vpc" { + name = "image-vpc" + cidr_block = "10.0.0.0/16" +} +resource "tencentcloud_subnet" "subnet" { + vpc_id = tencentcloud_vpc.vpc.id + name = "image-subnet" + cidr_block = "10.0.0.0/16" + availability_zone = "ap-guangzhou-7" +} +resource "tencentcloud_instance" "cvm_image" { + availability_zone = "ap-guangzhou-7" + instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type + + data_disks { + delete_with_instance = true + data_disk_type = "CLOUD_PREMIUM" + data_disk_size = 100 + } + subnet_id = tencentcloud_subnet.subnet.id + system_disk_type = "CLOUD_PREMIUM" + image_id = data.tencentcloud_images.default.images.0.image_id + vpc_id = tencentcloud_vpc.vpc.id + project_id = 0 + instance_name = "cvm-image" +} +resource "tencentcloud_image" "image_instance" { + instance_id = tencentcloud_instance.cvm_image.id + data_disk_ids = [tencentcloud_instance.cvm_image.data_disks.0.data_disk_id] + image_description = "update image with instance" + image_name = "image-instance-update-keep" +} + +` + +func testAccCheckCvmImageDestroy(s *terraform.State) error { logId := tccommon.GetLogId(tccommon.ContextNil) ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) @@ -107,7 +235,7 @@ func testAccCheckImageDestroy(s *terraform.State) error { return nil } -func testAccCheckImageExists(n string) resource.TestCheckFunc { +func testAccCheckCvmImageExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { logId := tccommon.GetLogId(tccommon.ContextNil) ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) @@ -130,136 +258,3 @@ func testAccCheckImageExists(n string) resource.TestCheckFunc { return nil } } - -const ( - testAccImageWithSnapShot = tcacctest.DefaultCvmImageVariable + ` - resource "tencentcloud_image" "image_snap" { - image_name = "image-snapshot-keep" - snapshot_ids = [var.snap_id] - force_poweroff = true - image_description = "create image with snapshot" - }` - - testAccImageWithSnapShotUpdate = tcacctest.DefaultCvmImageVariable + ` - resource "tencentcloud_image" "image_snap" { - image_name = "image-snapshot-update-keep" - snapshot_ids = [var.snap_id] - force_poweroff = false - image_description = "update image with snapshot" - }` - - testAccImageWithInstance = tcacctest.DefaultCvmImageVariable + ` - - data "tencentcloud_availability_zones" "default" { - } - data "tencentcloud_images" "default" { - image_type = ["PUBLIC_IMAGE"] - image_name_regex = "Final" - } - data "tencentcloud_images" "testing" { - image_type = ["PUBLIC_IMAGE"] - } - data "tencentcloud_instance_types" "default" { - - filter { - name = "instance-family" - values = ["S4","SA2"] - } - filter { - values = ["ap-guangzhou-7"] - name = "zone" - } - cpu_core_count = 2 - memory_size = 2 - exclude_sold_out = true - } - resource "tencentcloud_vpc" "vpc" { - name = "image-vpc" - cidr_block = "10.0.0.0/16" - } - resource "tencentcloud_subnet" "subnet" { - vpc_id = tencentcloud_vpc.vpc.id - name = "image-subnet" - cidr_block = "10.0.0.0/16" - availability_zone = "ap-guangzhou-7" - } - resource "tencentcloud_instance" "cvm_image" { - subnet_id = tencentcloud_subnet.subnet.id - system_disk_type = "CLOUD_PREMIUM" - project_id = 0 - instance_name = "cvm-image" - availability_zone = "ap-guangzhou-7" - image_id = data.tencentcloud_images.default.images.0.image_id - instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type - vpc_id = tencentcloud_vpc.vpc.id - data_disks { - delete_with_instance = true - data_disk_type = "CLOUD_PREMIUM" - data_disk_size = 100 - } - } - - resource "tencentcloud_image" "image_instance" { - image_name = "image-instance-keep" - instance_id = tencentcloud_instance.cvm_image.id - data_disk_ids = [tencentcloud_instance.cvm_image.data_disks.0.data_disk_id] - image_description = "create image with instance" - }` - - testAccImageWithInstanceUpdate = tcacctest.DefaultCvmImageVariable + ` - data "tencentcloud_availability_zones" "default" { - } - data "tencentcloud_images" "default" { - image_type = ["PUBLIC_IMAGE"] - image_name_regex = "Final" - } - data "tencentcloud_images" "testing" { - image_type = ["PUBLIC_IMAGE"] - } - data "tencentcloud_instance_types" "default" { - - filter { - name = "instance-family" - values = ["S4","SA2"] - } - filter { - values = ["ap-guangzhou-7"] - name = "zone" - } - cpu_core_count = 2 - memory_size = 2 - exclude_sold_out = true - } - resource "tencentcloud_vpc" "vpc" { - name = "image-vpc" - cidr_block = "10.0.0.0/16" - } - resource "tencentcloud_subnet" "subnet" { - vpc_id = tencentcloud_vpc.vpc.id - name = "image-subnet" - cidr_block = "10.0.0.0/16" - availability_zone = "ap-guangzhou-7" - } - resource "tencentcloud_instance" "cvm_image" { - subnet_id = tencentcloud_subnet.subnet.id - system_disk_type = "CLOUD_PREMIUM" - project_id = 0 - instance_name = "cvm-image" - availability_zone = "ap-guangzhou-7" - image_id = data.tencentcloud_images.default.images.0.image_id - instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type - vpc_id = tencentcloud_vpc.vpc.id - data_disks { - delete_with_instance = true - data_disk_type = "CLOUD_PREMIUM" - data_disk_size = 100 - } - } - - resource "tencentcloud_image" "image_instance" { - image_name = "image-instance-update-keep" - instance_id = tencentcloud_instance.cvm_image.id - data_disk_ids = [tencentcloud_instance.cvm_image.data_disks.0.data_disk_id] - image_description = "update image with instance" - }` -) diff --git a/tencentcloud/services/cvm/resource_tc_key_pair_test.go b/tencentcloud/services/cvm/resource_tc_key_pair_test.go index 3dd1303ff4..76bd3b6665 100644 --- a/tencentcloud/services/cvm/resource_tc_key_pair_test.go +++ b/tencentcloud/services/cvm/resource_tc_key_pair_test.go @@ -1,8 +1,11 @@ package cvm_test import ( + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cvm" svccvm "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cvm" "context" @@ -77,20 +80,18 @@ func init() { }) } -func TestAccTencentCloudKeyPairResource_basic(t *testing.T) { +func TestAccTencentCloudCvmKeyPairResource_Basic(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ - PreCheck: func() { tcacctest.AccPreCheck(t) }, - IDRefreshName: "tencentcloud_key_pair.foo", - Providers: tcacctest.AccProviders, - CheckDestroy: testAccCheckKeyPairDestroy, + PreCheck: func() { + acctest.AccPreCheck(t) + }, + Providers: acctest.AccProviders, + CheckDestroy: testAccCheckCvmKeyPairDestroy, Steps: []resource.TestStep{ { - Config: testAccKeyPairPublicKeyBasic, - Check: resource.ComposeTestCheckFunc( - testAccCheckKeyPairExists("tencentcloud_key_pair.foo"), - resource.TestCheckResourceAttr("tencentcloud_key_pair.foo", "key_name", "test_terraform"), - ), + Config: testAccCvmKeyPairResource_BasicCreate, + Check: resource.ComposeTestCheckFunc(testAccCheckCvmKeyPairExists("tencentcloud_key_pair.foo"), resource.TestCheckResourceAttr("tencentcloud_key_pair.foo", "key_name", "test_terraform")), }, { ResourceName: "tencentcloud_key_pair.foo", @@ -100,20 +101,27 @@ func TestAccTencentCloudKeyPairResource_basic(t *testing.T) { }, }) } -func TestAccTencentCloudKeyPairResource_publicKey(t *testing.T) { + +const testAccCvmKeyPairResource_BasicCreate = ` + +resource "tencentcloud_key_pair" "foo" { + key_name = "test_terraform" +} + +` + +func TestAccTencentCloudCvmKeyPairResource_PublicKey(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ - PreCheck: func() { tcacctest.AccPreCheck(t) }, - IDRefreshName: "tencentcloud_key_pair.foo", - Providers: tcacctest.AccProviders, - CheckDestroy: testAccCheckKeyPairDestroy, + PreCheck: func() { + acctest.AccPreCheck(t) + }, + Providers: acctest.AccProviders, + CheckDestroy: testAccCheckCvmKeyPairDestroy, Steps: []resource.TestStep{ { - Config: testAccKeyPairPublicKeyImport, - Check: resource.ComposeTestCheckFunc( - testAccCheckKeyPairExists("tencentcloud_key_pair.foo1"), - resource.TestCheckResourceAttr("tencentcloud_key_pair.foo1", "key_name", "from_terraform"), - ), + Config: testAccCvmKeyPairResource_PublicKeyCreate, + Check: resource.ComposeTestCheckFunc(testAccCheckCvmKeyPairExists("tencentcloud_key_pair.foo1"), resource.TestCheckResourceAttr("tencentcloud_key_pair.foo1", "key_name", "from_terraform")), }, { ResourceName: "tencentcloud_key_pair.foo1", @@ -124,6 +132,62 @@ func TestAccTencentCloudKeyPairResource_publicKey(t *testing.T) { }) } +const testAccCvmKeyPairResource_PublicKeyCreate = ` + +resource "tencentcloud_key_pair" "foo1" { + key_name = "from_terraform" + public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjd8fTnp7Dcuj4mLaQxf9Zs/ORgUL9fQxRCNKkPgP1paTy1I513maMX126i36Lxxl3+FUB52oVbo/FgwlIfX8hyCnv8MCxqnuSDozf1CD0/wRYHcTWAtgHQHBPCC2nJtod6cVC3kB18KeV4U7zsxmwFeBIxojMOOmcOBuh7+trRw==" +} + +` + +func testAccCheckCvmKeyPairExists(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + logId := common.GetLogId(common.ContextNil) + ctx := context.WithValue(context.TODO(), common.LogIdKey, logId) + service := cvm.NewCvmService(acctest.AccProvider.Meta().(common.ProviderMeta).GetAPIV3Conn()) + + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("resource `%s` is not found", n) + } + if rs.Primary.ID == "" { + return fmt.Errorf("resource `%s` is not found", n) + } + id := rs.Primary.ID + + result, err := service.DescribeKeyPairById(ctx, id) + if err != nil { + return err + } + if result == nil { + return fmt.Errorf("resource `%s` create failed", id) + } + return nil + } +} +func testAccCheckCvmKeyPairDestroy(s *terraform.State) error { + logId := common.GetLogId(common.ContextNil) + ctx := context.WithValue(context.TODO(), common.LogIdKey, logId) + service := cvm.NewCvmService(acctest.AccProvider.Meta().(common.ProviderMeta).GetAPIV3Conn()) + + for _, rs := range s.RootModule().Resources { + id := rs.Primary.ID + if rs.Type != "tencentcloud_cvm_key_pair" { + continue + } + result, err := service.DescribeKeyPairById(ctx, id) + if err != nil { + return err + } + if result != nil { + return fmt.Errorf("resource `%s` still exist", id) + } + } + return nil +} + +// used in data_source_tc_key_pairs_test.go func testAccCheckKeyPairExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { logId := tccommon.GetLogId(tccommon.ContextNil) @@ -157,6 +221,7 @@ func testAccCheckKeyPairExists(n string) resource.TestCheckFunc { } } +// used in data_source_tc_key_pairs_test.go func testAccCheckKeyPairDestroy(s *terraform.State) error { logId := tccommon.GetLogId(tccommon.ContextNil) ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) @@ -185,16 +250,3 @@ func testAccCheckKeyPairDestroy(s *terraform.State) error { } return nil } - -const testAccKeyPairPublicKeyBasic = ` -resource "tencentcloud_key_pair" "foo" { - key_name = "test_terraform" -} -` - -const testAccKeyPairPublicKeyImport = ` -resource "tencentcloud_key_pair" "foo1" { - key_name = "from_terraform" - public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjd8fTnp7Dcuj4mLaQxf9Zs/ORgUL9fQxRCNKkPgP1paTy1I513maMX126i36Lxxl3+FUB52oVbo/FgwlIfX8hyCnv8MCxqnuSDozf1CD0/wRYHcTWAtgHQHBPCC2nJtod6cVC3kB18KeV4U7zsxmwFeBIxojMOOmcOBuh7+trRw==" -} -`