From 1b99d91fcb4a564cc0b4393e90a51813ff07867c Mon Sep 17 00:00:00 2001 From: gailwang Date: Mon, 15 Jun 2020 21:53:43 +0800 Subject: [PATCH 01/17] add resrouce `tencentcloud_postgresql_instance`; add data source `tencentcloud_postgresql_instances` and `tencentcloud_postgresql_speccodes` --- examples/tencentcloud-postgresql/main.tf | 48 + examples/tencentcloud-postgresql/variables.tf | 3 + examples/tencentcloud-postgresql/version.tf | 3 + go.mod | 2 +- go.sum | 4 +- tencentcloud/connectivity/client.go | 15 + .../data_source_tc_postgresql_instances.go | 208 ++ ...ata_source_tc_postgresql_instances_test.go | 60 + .../data_source_tc_postgresql_speccodes.go | 131 ++ ...ata_source_tc_postgresql_speccodes_test.go | 39 + tencentcloud/extension_postgresql.go | 27 + tencentcloud/provider.go | 3 + .../resource_tc_postgresql_instance.go | 521 +++++ .../resource_tc_postgresql_instance_test.go | 159 ++ .../service_tencentcloud_postgresql.go | 422 ++++ .../tencentcloud/postgres/v20170312/client.go | 869 ++++++++ .../tencentcloud/postgres/v20170312/models.go | 1967 +++++++++++++++++ vendor/modules.txt | 3 +- .../docs/d/postgresql_instances.html.markdown | 58 + .../docs/d/postgresql_speccodes.html.markdown | 42 + .../docs/r/postgresql_instance.html.markdown | 56 + 21 files changed, 4636 insertions(+), 4 deletions(-) create mode 100644 examples/tencentcloud-postgresql/main.tf create mode 100644 examples/tencentcloud-postgresql/variables.tf create mode 100644 examples/tencentcloud-postgresql/version.tf create mode 100644 tencentcloud/data_source_tc_postgresql_instances.go create mode 100644 tencentcloud/data_source_tc_postgresql_instances_test.go create mode 100644 tencentcloud/data_source_tc_postgresql_speccodes.go create mode 100644 tencentcloud/data_source_tc_postgresql_speccodes_test.go create mode 100644 tencentcloud/extension_postgresql.go create mode 100644 tencentcloud/resource_tc_postgresql_instance.go create mode 100644 tencentcloud/resource_tc_postgresql_instance_test.go create mode 100644 tencentcloud/service_tencentcloud_postgresql.go create mode 100644 vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/client.go create mode 100644 vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/models.go create mode 100644 website/docs/d/postgresql_instances.html.markdown create mode 100644 website/docs/d/postgresql_speccodes.html.markdown create mode 100644 website/docs/r/postgresql_instance.html.markdown diff --git a/examples/tencentcloud-postgresql/main.tf b/examples/tencentcloud-postgresql/main.tf new file mode 100644 index 0000000000..b1c3b637f6 --- /dev/null +++ b/examples/tencentcloud-postgresql/main.tf @@ -0,0 +1,48 @@ + +provider "tencentcloud" { + region = "ap-guangzhou" +} + +resource "tencentcloud_vpc" "foo" { + name = "example" + cidr_block = "10.0.0.0/16" +} + +resource "tencentcloud_subnet" "foo" { + name = "example" + availability_zone = var.availability_zone + vpc_id = tencentcloud_vpc.foo.id + cidr_block = "10.0.0.0/24" + is_multicast = false +} + +resource "tencentcloud_postgresql_instance" "example" { + name = "tf_postsql_instance_111" + availability_zone = var.availability_zone + charge_type = "postpaid" + vpc_id = tencentcloud_vpc.foo.id + subnet_id = tencentcloud_subnet.foo.id + engine_version = "9.3.5" + root_password = "1qaA2k1wgvfa3ZZZ" + charset = "UTF8" + spec_code = "cdb.pg.z1.2g" + project_id = 0 + memory = 2 + storage = 10 +} + +data "tencentcloud_postgresql_instances" "id_example" { + id = tencentcloud_postgresql_instance.example.id +} + +data "tencentcloud_postgresql_instances" "project_example" { + project_id = 0 +} + +data "tencentcloud_postgresql_instances" "charge_example" { + name = tencentcloud_postgresql_instance.example.name +} + +data "tencentcloud_postgresql_speccodes" "example" { + availability_zone = var.availability_zone +} diff --git a/examples/tencentcloud-postgresql/variables.tf b/examples/tencentcloud-postgresql/variables.tf new file mode 100644 index 0000000000..233f24b02c --- /dev/null +++ b/examples/tencentcloud-postgresql/variables.tf @@ -0,0 +1,3 @@ +variable "availability_zone" { + default = "ap-guangzhou-2" +} diff --git a/examples/tencentcloud-postgresql/version.tf b/examples/tencentcloud-postgresql/version.tf new file mode 100644 index 0000000000..133d0d73e7 --- /dev/null +++ b/examples/tencentcloud-postgresql/version.tf @@ -0,0 +1,3 @@ +terraform { + required_version = ">= 0.12" +} \ No newline at end of file diff --git a/go.mod b/go.mod index ad8fdb9eaf..9c8077ae2b 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mattn/go-colorable v0.1.6 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 - github.com/tencentcloud/tencentcloud-sdk-go v3.0.187+incompatible + github.com/tencentcloud/tencentcloud-sdk-go v3.0.189+incompatible github.com/yangwenmai/ratelimit v0.0.0-20180104140304-44221c2292e1 github.com/zclconf/go-cty v1.4.2 // indirect golang.org/x/sys v0.0.0-20200523222454-059865788121 // indirect diff --git a/go.sum b/go.sum index 32c8c71a1d..d28808df10 100644 --- a/go.sum +++ b/go.sum @@ -454,8 +454,8 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.187+incompatible h1:9hr93p945INwxa67N68EUJuIkUE2iGnMq/YZ6x3JHik= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.187+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.189+incompatible h1:eLVHwxLW2HFvr48l5sqROircYlq6Lp39EXhyCkK6Jlw= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.189+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tetafro/godot v0.3.7 h1:+mecr7RKrUKB5UQ1gwqEMn13sDKTyDR8KNIquB9mm+8= github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= diff --git a/tencentcloud/connectivity/client.go b/tencentcloud/connectivity/client.go index 39d6a99d34..057ea1e2ed 100644 --- a/tencentcloud/connectivity/client.go +++ b/tencentcloud/connectivity/client.go @@ -24,6 +24,7 @@ import ( gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529" mongodb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20180408" monitor "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor/v20180724" + postrge "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312" redis "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412" scf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf/v20180416" sts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sts/v20180813" @@ -64,6 +65,7 @@ type TencentCloudClient struct { cdnConn *cdn.Client monitorConn *monitor.Client esConn *es.Client + postgreConn *postrge.Client } // NewClientProfile returns a new ClientProfile @@ -398,3 +400,16 @@ func (me *TencentCloudClient) UseEsClient() *es.Client { return me.esConn } + +// UsePostgreClient returns es client for service +func (me *TencentCloudClient) UsePostgresqlClient() *postrge.Client { + if me.postgreConn != nil { + return me.postgreConn + } + + cpf := me.NewClientProfile(300) + me.postgreConn, _ = postrge.NewClient(me.Credential, me.Region, cpf) + me.postgreConn.WithHttpTransport(&LogRoundTripper{}) + + return me.postgreConn +} diff --git a/tencentcloud/data_source_tc_postgresql_instances.go b/tencentcloud/data_source_tc_postgresql_instances.go new file mode 100644 index 0000000000..8eb76c525b --- /dev/null +++ b/tencentcloud/data_source_tc_postgresql_instances.go @@ -0,0 +1,208 @@ +/* +Use this data source to query postgresql instances + +Example Usage + +```hcl +data "tencentcloud_postgresql_instances" "name"{ + name = "test" +} + +data "tencentcloud_postgresql_instances" "project"{ + project_id = 0 +} + +data "tencentcloud_postgresql_instances" "id"{ + id = "postgres-h9t4fde1" +} +``` +*/ +package tencentcloud + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + postgresql "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312" + "github.com/terraform-providers/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func dataSourceTencentCloudPostgresqlInstances() *schema.Resource { + return &schema.Resource{ + Read: dataSourceTencentCloudPostgresqlInstanceRead, + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Optional: true, + Description: "Name of the postgresql instance to be queey.", + }, + "id": { + Type: schema.TypeString, + Optional: true, + Description: "Name of the postgresql instance to be query.", + }, + "project_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Project id of the postgresql instance to be query.", + }, + "result_output_file": { + Type: schema.TypeString, + Optional: true, + Description: "Used to save results.", + }, + "instance_list": { + Type: schema.TypeList, + Computed: true, + Description: "A list of postgresql instances. Each element contains the following attributes.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeString, + Computed: true, + Description: "Id of the postgresql instance.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of the postgresql instance.", + }, + "charge_type": { + Type: schema.TypeString, + Computed: true, + Description: "Pay type of the postgresql instance.", + }, + "auto_renew_flag": { + Type: schema.TypeInt, + Computed: true, + Description: "Auto renew flag.", + }, + "engine_version": { + Type: schema.TypeString, + Computed: true, + Description: "Version of the postgresql db engine.", + }, + "vpc_id": { + Type: schema.TypeString, + Computed: true, + Description: "ID of VPC.", + }, + "subnet_id": { + Type: schema.TypeString, + Computed: true, + Description: "ID of subnet.", + }, + "storage": { + Type: schema.TypeInt, + Computed: true, + Description: "Disk size (in GB).", + }, + "memory": { + Type: schema.TypeInt, + Computed: true, + Description: "Memory size (in GB).", + }, + "project_id": { + Type: schema.TypeInt, + Computed: true, + Description: "Project ID, default value is 0.", + }, + "availability_zone": { + Type: schema.TypeString, + Computed: true, + Description: "Availability zone.", + }, + "public_access_switch": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether to enable the access to an instance from public network or not.", + }, + "public_access_host": { + Type: schema.TypeString, + Computed: true, + Description: "host for public access.", + }, + "create_time": { + Type: schema.TypeString, + Computed: true, + Description: "Create time of the postgresql instance.", + }, + }, + }, + }, + }, + } +} + +func dataSourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("data_source.tencentcloud_postgresql_instances.read") + + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + service := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} + + filter := make([]*postgresql.Filter, 0) + if v, ok := d.GetOk("name"); ok { + filter = append(filter, &postgresql.Filter{Name: helper.String("db-instance-name"), Values: []*string{helper.String(v.(string))}}) + } + if v, ok := d.GetOk("id"); ok { + filter = append(filter, &postgresql.Filter{Name: helper.String("db-instance-id"), Values: []*string{helper.String(v.(string))}}) + } + if v, ok := d.GetOk("project_id"); ok { + filter = append(filter, &postgresql.Filter{Name: helper.String("db-project-id"), Values: []*string{helper.String(v.(string))}}) + } + + instanceList, err := service.DescribePostgresqlInstances(ctx, filter) + + if err != nil { + instanceList, err = service.DescribePostgresqlInstances(ctx, filter) + } + + if err != nil { + return err + } + + ids := make([]string, 0, len(instanceList)) + list := make([]map[string]interface{}, 0, len(instanceList)) + + for _, v := range instanceList { + listItem := make(map[string]interface{}) + listItem["id"] = *v.DBInstanceId + listItem["name"] = *v.DBInstanceName + listItem["charge_type"] = *v.PayType + listItem["auto_renew_flag"] = int(*v.AutoRenew) + listItem["project_id"] = int(*v.ProjectId) + listItem["storage"] = int(*v.DBInstanceStorage) + listItem["memory"] = int(*v.DBInstanceMemory) + listItem["availability_zone"] = *v.Zone + listItem["create_time"] = *v.CreateTime + listItem["vpc_id"] = *v.VpcId + listItem["subnet_id"] = *v.SubnetId + listItem["engine_version"] = *v.DBVersion + listItem["public_access_switch"] = false + listItem["public_access_host"] = "" + for _, netInfo := range v.DBInstanceNetInfo { + if *netInfo.NetType == "public" { + if *netInfo.Status == "open" { + listItem["public_access_switch"] = true + } + listItem["public_access_host"] = *netInfo.Address + } + } + list = append(list, listItem) + ids = append(ids, *v.DBInstanceId) + } + + d.SetId(helper.DataResourceIdsHash(ids)) + if e := d.Set("instance_list", list); e != nil { + log.Printf("[CRITAL]%s provider set list fail, reason:%s\n", logId, e.Error()) + return e + } + output, ok := d.GetOk("result_output_file") + if ok && output.(string) != "" { + return writeToFile(output.(string), list) + } + return nil +} diff --git a/tencentcloud/data_source_tc_postgresql_instances_test.go b/tencentcloud/data_source_tc_postgresql_instances_test.go new file mode 100644 index 0000000000..eeec9ddc7c --- /dev/null +++ b/tencentcloud/data_source_tc_postgresql_instances_test.go @@ -0,0 +1,60 @@ +package tencentcloud + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +var testDataPostgresqlInstancesName = "data.tencentcloud_postgresql_instances.id_test" + +func TestAccTencentCloudDataPostgresqlInstances(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckLBDestroy, + Steps: []resource.TestStep{ + { + Config: testAccTencentCloudDataPostgresqlInstanceBasic, + Check: resource.ComposeTestCheckFunc( + testAccCheckPostgresqlInstanceExists("tencentcloud_postgresql_instance.test"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#", "1"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "list.0.id"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "list.0.create_time"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "list.0.id"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.0.charge_type", "POSTPAID_BY_HOUR"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.engine_version", "9.3.5"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.project_id", "0"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.mem_size", "2"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.volume_size", "1"), + //resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.volume_size", "1"), + ), + }, + }, + }) +} + +const testAccTencentCloudDataPostgresqlInstanceBasic = ` +variable "availability_zone"{ +default = "ap-guangzhou-2" +} + +resource "tencentcloud_postgresql_instance" "test" { +name = "tf_postsql_instance" +availability_zone = var.availability_zone +charge_type = "postpaid" +vpc_id = "` + defaultVpcId + `" +subnet_id = "subnet-pyio7yog" +engine_version = "9.3.5" +root_password = "1qaA2k1wgvfa3ZZZ" +charset = "UTF8" +spec_code = "cdb.pg.z1.2g" +project_id = 0 +memory = 2 +storage = 100 +} + +data "tencentcloud_postgresql_instances" "id_test"{ + id = tencentcloud_postgresql_instance.test.id +} +` diff --git a/tencentcloud/data_source_tc_postgresql_speccodes.go b/tencentcloud/data_source_tc_postgresql_speccodes.go new file mode 100644 index 0000000000..d4b4f70c63 --- /dev/null +++ b/tencentcloud/data_source_tc_postgresql_speccodes.go @@ -0,0 +1,131 @@ +/* +Use this data source to get the available product configs of the postgresql instance. + +Example Usage + +```hcl +data "tencentcloud_postgresql_speccodes" "foo"{ + availability_zone = "ap-shanghai-2" +} +``` +*/ +package tencentcloud + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceTencentCloudPostgresqlSpeccodes() *schema.Resource { + return &schema.Resource{ + Read: dataSourceTencentCloudPostgresqlSpeccodesRead, + Schema: map[string]*schema.Schema{ + "availability_zone": { + Type: schema.TypeString, + Required: true, + Description: "The zone of the postgresql instance to query.", + }, + "result_output_file": { + Type: schema.TypeString, + Optional: true, + Description: "Used to save results.", + }, + "list": { + Type: schema.TypeList, + Computed: true, + Description: "A list of zones will be exported and its every element contains the following attributes:", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeString, + Computed: true, + Description: "Id of the speccode of the postgresql instance. This parameter is used as `spec_code` for the creation of postgresql instance.", + }, + "memory": { + Type: schema.TypeInt, + Computed: true, + Description: "Memory size(in GB).", + }, + "storage_min": { + Type: schema.TypeInt, + Computed: true, + Description: "The minimum volume size(in GB).", + }, + "storage_max": { + Type: schema.TypeInt, + Computed: true, + Description: "The max volume size(in GB).", + }, + "cpu_number": { + Type: schema.TypeInt, + Computed: true, + Description: "The CPU number of the postgresql instance.", + }, + "qps": { + Type: schema.TypeInt, + Computed: true, + Description: "The QPS of the postgresql instance.", + }, + "version": { + Type: schema.TypeString, + Computed: true, + Description: "The version of the postgresql instance.", + }, + "version_name": { + Type: schema.TypeString, + Computed: true, + Description: "The version name of the postgresql instance.", + }, + }, + }, + }, + }, + } +} + +func dataSourceTencentCloudPostgresqlSpeccodesRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("data_source.tencentcloud_postgresql_speccodes.read")() + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + service := PostgresqlService{ + client: meta.(*TencentCloudClient).apiV3Conn, + } + + zone := d.Get("availability_zone").(string) + speccodes, err := service.DescribeSpecCodes(ctx, zone) + if err != nil { + speccodes, err = service.DescribeSpecCodes(ctx, zone) + } + if err != nil { + log.Printf("err %+v", err) + return err + } + + list := make([]map[string]interface{}, 0, len(speccodes)) + + for _, v := range speccodes { + listItem := make(map[string]interface{}) + listItem["id"] = *v.SpecCode + listItem["memory"] = int(*v.Memory) + listItem["storage_min"] = int(*v.MinStorage) + listItem["storage_max"] = int(*v.MaxStorage) + listItem["cpu_number"] = int(*v.Cpu) + listItem["qps"] = int(*v.Qps) + listItem["version"] = *v.Version + listItem["version_name"] = *v.VersionName + list = append(list, listItem) + } + d.SetId("speccode." + zone) + if e := d.Set("list", list); e != nil { + log.Printf("[CRITAL]%s provider set list fail, reason:%s\n", logId, e.Error()) + return e + } + output, ok := d.GetOk("result_output_file") + if ok && output.(string) != "" { + return writeToFile(output.(string), list) + } + return nil +} diff --git a/tencentcloud/data_source_tc_postgresql_speccodes_test.go b/tencentcloud/data_source_tc_postgresql_speccodes_test.go new file mode 100644 index 0000000000..b92e681722 --- /dev/null +++ b/tencentcloud/data_source_tc_postgresql_speccodes_test.go @@ -0,0 +1,39 @@ +package tencentcloud + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccTencentCloudPostgresqlSpeccodes_basic(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccTencentCloudPostgresqlSpeccodesConfigBasic, + Check: resource.ComposeTestCheckFunc( + testAccCheckTencentCloudDataSourceID("data.tencentcloud_postgresql_speccodes.foo"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.#"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.id"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.memory"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.storage_min"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.storage_max"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.cpu_number"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.qps"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.version"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.version_name"), + ), + }, + }, + }) +} + +const testAccTencentCloudPostgresqlSpeccodesConfigBasic = ` +data "tencentcloud_postgresql_speccodes" "foo"{ + availability_zone = "ap-guangzhou-3" +} +` diff --git a/tencentcloud/extension_postgresql.go b/tencentcloud/extension_postgresql.go new file mode 100644 index 0000000000..4f73f105a0 --- /dev/null +++ b/tencentcloud/extension_postgresql.go @@ -0,0 +1,27 @@ +package tencentcloud + +const ( + POSTGRESQL_PAYTYPE_PREPAID = "prepaid" + POSTGRESQL_PAYTYPE_POSTPAID = "postpaid" +) + +var POSTGRESQL_PAYTYPE = []string{POSTGRESQL_PAYTYPE_POSTPAID} + +const ( + POSTGRESQL_DB_VERSION_9_3_5 = "9.3.5" + POSTGRESQL_DB_VERSION_9_5_4 = "9.5.4" + POSTGRESQL_DB_VERSION_10_4 = "10.4" +) + +var POSTSQL_DB_VERSION = []string{POSTGRESQL_DB_VERSION_9_3_5, POSTGRESQL_DB_VERSION_9_5_4, POSTGRESQL_DB_VERSION_10_4} + +const ( + POSTGRESQL_DB_CHARSET_UTF8 = "UTF8" + POSTGRESQL_DB_CHARSET_LATIN1 = "LATIN1" +) + +var POSTSQL_DB_CHARSET = []string{POSTGRESQL_DB_CHARSET_UTF8, POSTGRESQL_DB_CHARSET_LATIN1} + +const ( + POSTGRESQL_STAUTS_RUNNING = "running" +) diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 2ec65cc31e..465daaeb03 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -582,6 +582,8 @@ func Provider() terraform.ResourceProvider { "tencentcloud_monitor_policy_groups": dataSourceTencentMonitorPolicyGroups(), "tencentcloud_monitor_product_namespace": dataSourceTencentMonitorProductNamespace(), "tencentcloud_elasticsearch_instances": dataSourceTencentCloudElasticsearchInstances(), + "tencentcloud_postgresql_instances": dataSourceTencentCloudPostgresqlInstances(), + "tencentcloud_postgresql_speccodes": dataSourceTencentCloudPostgresqlSpeccodes(), }, ResourcesMap: map[string]*schema.Resource{ @@ -692,6 +694,7 @@ func Provider() terraform.ResourceProvider { "tencentcloud_monitor_binding_object": resourceTencentMonitorBindingObject(), "tencentcloud_monitor_binding_receiver": resourceTencentMonitorBindingAlarmReceiver(), "tencentcloud_elasticsearch_instance": resourceTencentCloudElasticsearchInstance(), + "tencentcloud_postgresql_instance": resourceTencentCloudPostgresqlInstance(), }, ConfigureFunc: providerConfigure, diff --git a/tencentcloud/resource_tc_postgresql_instance.go b/tencentcloud/resource_tc_postgresql_instance.go new file mode 100644 index 0000000000..11fd377038 --- /dev/null +++ b/tencentcloud/resource_tc_postgresql_instance.go @@ -0,0 +1,521 @@ +/* +Use this resource to create postgresql instance + +Example Usage + +```hcl +resource "tencentcloud_postgresql_instance" "foo" { + name = "example" + availability_zone = var.availability_zone + charge_type = "postpaid" + vpc_id = "vpc-409mvdvv" + subnet_id = "subnet-nf9n81ps" + engine_version = "9.3.5" + root_password = "1qaA2k1wgvfa3ZZZ" + charset = "UTF8" + spec_code = "cdb.pg.z1.2g" + project_id = 0 + memory = 2 + storage = 100 +} + +Import + +postgresql instance can be imported using the id, e.g. + +``` +$ terraform import tencentcloud_postgresql_instance.foo postgres-cda1iex1 +``` + +``` +*/ +package tencentcloud + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func resourceTencentCloudPostgresqlInstance() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudPostgresqlInstanceCreate, + Read: resourceTencentCloudPostgresqlInstanceRead, + Update: resourceTencentCloudPostgresqlInstanceUpdate, + Delete: resourceTencentCLoudPostgresqlInstanceDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validateStringLengthInRange(1, 60), + Description: "Name of the postgresql instance.", + }, + "charge_type": { + Type: schema.TypeString, + Optional: true, + Default: POSTGRESQL_PAYTYPE_POSTPAID, + ForceNew: true, + ValidateFunc: validateAllowedStringValue(POSTGRESQL_PAYTYPE), + Description: "Pay type of the postgresql instance. For now, only `POSTPAID` is valid.", + }, + "engine_version": { + Type: schema.TypeString, + ForceNew: true, + Optional: true, + ValidateFunc: validateAllowedStringValue(POSTSQL_DB_VERSION), + Default: POSTSQL_DB_VERSION[len(POSTSQL_DB_VERSION)-1], + Description: "Version of the postgresql engine. Allowed values are `9.3.5`, `9.5.4`, `10.4`.", + }, + "vpc_id": { + Type: schema.TypeString, + ForceNew: true, + Optional: true, + Description: "ID of VPC.", + }, + "subnet_id": { + Type: schema.TypeString, + ForceNew: true, + Optional: true, + Description: "ID of subnet.", + }, + "storage": { + Type: schema.TypeInt, + Required: true, + Description: "Disk size (in GB). Allowed value is range from 10 to 1000, and the value must be a multiple of 10.", + }, + "memory": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + Description: "Memory size (in MB).", + }, + "project_id": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + Description: "Project ID, default value is 0.", + }, + "availability_zone": { + Type: schema.TypeString, + ForceNew: true, + Optional: true, + Computed: true, + Description: "Availability zone.", + }, + "spec_code": { + Type: schema.TypeString, + ForceNew: true, + Required: true, + Description: "The id of specification of the postgresql instance, like `cdb.pg.z1.2g`, which can be queried with data source `tencentcloud_postgresql_speccodes`.", + }, + "root_password": { + Type: schema.TypeString, + Required: true, + Sensitive: true, + ValidateFunc: validateMysqlPassword, + Description: "Password of root account. This parameter can be specified when you purchase master instances, but it should be ignored when you purchase read-only instances or disaster recovery instances.", + }, + "charset": { + Type: schema.TypeString, + Optional: true, + Default: POSTGRESQL_DB_CHARSET_UTF8, + ForceNew: true, + ValidateFunc: validateAllowedStringValue(POSTSQL_DB_CHARSET), + Description: "Charset of the root account. Valid values are `UTF8`,`LATIN1`.", + }, + "public_access_switch": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Indicates whether to enable the access to an instance from public network or not.", + }, + //Computed values + "public_access_host": { + Type: schema.TypeString, + Computed: true, + Description: "Host for public access.", + }, + "public_access_port": { + Type: schema.TypeString, + Computed: true, + Description: "Port for public access.", + }, + "inner_access_ip": { + Type: schema.TypeString, + Computed: true, + Description: "Ip for inner access.", + }, + "inner_access_port": { + Type: schema.TypeString, + Computed: true, + Description: "Port for inner access.", + }, + "create_time": { + Type: schema.TypeString, + Computed: true, + Description: "Create time of the postgresql instance.", + }, + }, + } +} + +func resourceTencentCloudPostgresqlInstanceCreate(d *schema.ResourceData, meta interface{}) error { + + defer logElapsed("resource.tencentcloud_postgresql_instance.create")() + + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + postgresqlService := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} + + var ( + name = d.Get("name").(string) + dbVersion = d.Get("engine_version").(string) + payType = d.Get("charge_type").(string) + specCode = d.Get("spec_code").(string) + projectId = d.Get("project_id").(int) + subnetId = d.Get("subnet_id").(string) + vpcId = d.Get("vpc_id").(string) + zone = d.Get("availability_zone").(string) + storage = d.Get("storage").(int) + ) + + var period = 1 + //the sdk asks to set value with 1 when paytype is postpaid + + var instanceId string + var outErr, inErr error + + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + instanceId, inErr = postgresqlService.CreatePostgresqlInstance(ctx, name, dbVersion, payType, specCode, 0, projectId, period, subnetId, vpcId, zone, storage) + if inErr != nil { + return retryError(inErr) + } + return nil + }) + if outErr != nil { + return outErr + } + + //check creation done + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + instance, has, err := postgresqlService.DescribePostgresqlInstanceById(ctx, instanceId) + if err != nil { + return retryError(err) + } else if has && *instance.DBInstanceStatus == "init" { + return nil + } else if !has { + return resource.NonRetryableError(fmt.Errorf("create postgresql instance fail")) + } else { + return resource.RetryableError(fmt.Errorf("creating postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) + } + }) + + if err != nil { + return err + } + + var ( + password = d.Get("root_password").(string) + charset = d.Get("charset").(string) + ) + + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.InitPostgresqlInstance(ctx, instanceId, password, charset) + if inErr != nil { + return retryError(inErr) + } + return nil + }) + if outErr != nil { + return outErr + } + //check init status + + //set open public access + public_access_switch := false + if v, ok := d.GetOkExists("public_access_switch"); ok { + public_access_switch = v.(bool) + } + + if public_access_switch { + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.ModifyPublicService(ctx, true, instanceId) + if inErr != nil { + return retryError(inErr) + } + return nil + }) + if outErr != nil { + return outErr + } + } + + //set name + err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err := postgresqlService.ModifyPostgresqlInstanceName(ctx, instanceId, d.Get("name").(string)) + if err != nil { + return retryError(err) + } + return nil + }) + if err != nil { + return err + } + + //check creation done + err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if err != nil { + return err + } + + d.SetId(instanceId) + return resourceTencentCloudPostgresqlInstanceRead(d, meta) +} + +func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_postgresql_instance.update")() + + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + postgresqlService := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} + instanceId := d.Id() + d.Partial(true) + + //update name + if d.HasChange("name") { + name := d.Get("name").(string) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err := postgresqlService.ModifyPostgresqlInstanceName(ctx, instanceId, name) + if err != nil { + return retryError(err) + } + return nil + }) + if err != nil { + return err + } + //check update public service done + err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if err != nil { + return err + } + d.SetPartial("name") + } + + //upgrade storage and memory size + if d.HasChange("memory") || d.HasChange("storage") { + memory := d.Get("memory").(int) + storage := d.Get("storage").(int) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err := postgresqlService.UpgradePostgresqlInstance(ctx, instanceId, memory, storage) + if err != nil { + return retryError(err) + } + return nil + }) + if err != nil { + return err + } + //check update public service done + err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if err != nil { + return err + } + d.SetPartial("memory") + d.SetPartial("storage") + } + + //update project id + if d.HasChange("project_id") { + projectId := d.Get("project_id").(int) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err := postgresqlService.ModifyPostgresqlInstanceProjectId(ctx, instanceId, projectId) + if err != nil { + return retryError(err) + } + return nil + }) + if err != nil { + return err + } + + //check update project id done + err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if err != nil { + return err + } + d.SetPartial("project_id") + } + + //update public access + if d.HasChange("public_access_switch") { + public_access_switch := false + if v, ok := d.GetOkExists("public_access_switch"); ok { + public_access_switch = v.(bool) + } + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err := postgresqlService.ModifyPublicService(ctx, public_access_switch, instanceId) + if err != nil { + return retryError(err) + } + return nil + }) + if err != nil { + return err + } + //check update public service done + err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if err != nil { + return err + } + d.SetPartial("public_access_switch") + } + + //update root password + if d.HasChange("root_password") { + //to avoid other updating process conflicts with updating password, set the password updating with the last step, there is no way to figure out whether changing password is done + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err := postgresqlService.SetPostgresqlInstanceRootPassword(ctx, instanceId, d.Get("root_password").(string)) + if err != nil { + return retryError(err) + } + return nil + }) + if err != nil { + return err + } + //check update password done + err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if err != nil { + return err + } + d.SetPartial("root_password") + } + + return resourceTencentCloudPostgresqlInstanceRead(d, meta) +} + +func resourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta interface{}) error { + + defer logElapsed("resource.tencentcloud_postgresql_instance.read")() + + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + postgresqlService := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} + instance, has, err := postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) + if err != nil { + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + instance, has, err = postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) + if err != nil { + return retryError(err) + } + return nil + }) + } + if err != nil { + return err + } + if !has { + d.SetId("") + return nil + } + + _ = d.Set("project_id", int(*instance.ProjectId)) + _ = d.Set("availability_zone", instance.Zone) + _ = d.Set("vpc_id", instance.VpcId) + _ = d.Set("subnet_id", instance.SubnetId) + _ = d.Set("engine_version", instance.DBVersion) + _ = d.Set("name", instance.DBInstanceName) + _ = d.Set("charge_type", instance.PayType) + _ = d.Set("charset", instance.DBCharset) + + //net status + public_access_switch := false + if len(instance.DBInstanceNetInfo) > 0 { + for _, v := range instance.DBInstanceNetInfo { + if *v.NetType == "public" { + if *v.Status == "opened" { + public_access_switch = true + } + _ = d.Set("public_access_host", v.Address) + _ = d.Set("public_access_port", v.Port) + } + if *v.NetType == "inner" { + _ = d.Set("inner_access_ip", v.Ip) + _ = d.Set("inner_access_port", v.Port) + } + } + } + _ = d.Set("public_access_host", public_access_switch) + + //computed + _ = d.Set("create_time", instance.CreateTime) + _ = d.Set("status", instance.DBInstanceStatus) + _ = d.Set("memory", instance.DBInstanceMemory) + _ = d.Set("storage", instance.DBInstanceStorage) + + //ignore spec_code + + return nil +} + +func resourceTencentCLoudPostgresqlInstanceDelete(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_postgresql_instance.delete")() + + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + instanceId := d.Id() + postgresqlService := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} + + //check status + err := postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + + if err != nil { + return err + } + + err = postgresqlService.DeletePostgresqlInstance(ctx, instanceId) + + if err != nil { + err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + err = postgresqlService.DeletePostgresqlInstance(ctx, instanceId) + if err != nil { + return retryError(err) + } + return nil + }) + } + + if err != nil { + return err + } + + _, has, err := postgresqlService.DescribePostgresqlInstanceById(ctx, instanceId) + if err != nil || has { + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, err = postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) + if err != nil { + return retryError(err) + } + if has { + err = fmt.Errorf("delete postgresql instance %s fail, instance still exists from SDK DescribePostgresqlInstanceById", instanceId) + return resource.RetryableError(err) + } + return nil + }) + } + if err != nil { + return err + } + return nil +} diff --git a/tencentcloud/resource_tc_postgresql_instance_test.go b/tencentcloud/resource_tc_postgresql_instance_test.go new file mode 100644 index 0000000000..af96d476a7 --- /dev/null +++ b/tencentcloud/resource_tc_postgresql_instance_test.go @@ -0,0 +1,159 @@ +package tencentcloud + +import ( + "context" + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" +) + +var testPostgresqlInstanceResourceName = "tencentcloud_postgresql_instance" +var testPostgresqlInstanceResourceKey = testPostgresqlInstanceResourceName + ".test" + +func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckPostgresqlInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccPostgresqlInstance, + Check: resource.ComposeTestCheckFunc( + testAccCheckPostgresqlInstanceExists(testPostgresqlInstanceResourceKey), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "id"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "name", "tf_postsql_instance"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "postpaid"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "vpc_id"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "subnet_id"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "memory", "2"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "storage", "100"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "spec_code", "cdb.pg.z1.2g"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "project_id", "0"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "create_time"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "false"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "root_password", "1qaA2k1wgvfa3ZZZ"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "availability_zone"), + ), + }, + { + ResourceName: testPostgresqlInstanceResourceKey, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"root_password", "spec_code", "public_access_switch", "charset"}, + }, + + { + Config: testAccPostgresqlInstanceUpdate, + Check: resource.ComposeTestCheckFunc( + testAccCheckPostgresqlInstanceExists(testPostgresqlInstanceResourceKey), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "id"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "name", "tf_postsql_instance_update"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "postpaid"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "vpc_id"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "subnet_id"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "memory", "4"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "storage", "250"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "spec_code", "cdb.pg.z1.2g"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "create_time"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "project_id", "1154137"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "true"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "root_password", "1qaA2k1wgvfa3ZZZZ"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "availability_zone"), + ), + }, + }, + }) +} + +func testAccCheckPostgresqlInstanceDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != testPostgresqlInstanceResourceName { + continue + } + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + service := PostgresqlService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn} + + _, has, err := service.DescribePostgresqlInstanceById(ctx, rs.Primary.ID) + + if !has { + return nil + } else { + if err != nil { + return err + } + return fmt.Errorf("delete postgresql instance %s fail", rs.Primary.ID) + } + } + return nil +} + +func testAccCheckPostgresqlInstanceExists(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("resource %s is not found", n) + } + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + service := PostgresqlService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn} + + _, has, err := service.DescribePostgresqlInstanceById(ctx, rs.Primary.ID) + if err != nil { + _, has, err = service.DescribePostgresqlInstanceById(ctx, rs.Primary.ID) + } + if err != nil { + return err + } + if has { + return nil + } else { + return fmt.Errorf("postgresql instance %s is not found", rs.Primary.ID) + } + } +} + +const testAccPostgresqlInstanceBasic = ` +variable "availability_zone"{ +default = "ap-guangzhou-2" +} +` + +const testAccPostgresqlInstance string = testAccPostgresqlInstanceBasic + ` +resource "tencentcloud_postgresql_instance" "test" { + name = "tf_postsql_instance" + availability_zone = var.availability_zone + charge_type = "postpaid" + vpc_id = "` + defaultVpcId + `" + subnet_id = "subnet-pyio7yog" + engine_version = "9.3.5" + root_password = "1qaA2k1wgvfa3ZZZ" + charset = "UTF8" + spec_code = "cdb.pg.z1.2g" + project_id = 0 + memory = 2 + storage = 100 +} +` + +const testAccPostgresqlInstanceUpdate string = testAccPostgresqlInstanceBasic + ` +resource "tencentcloud_postgresql_instance" "test" { + name = "tf_postsql_instance_update" + availability_zone = var.availability_zone + charge_type = "postpaid" + vpc_id = "` + defaultVpcId + `" + subnet_id = "subnet-pyio7yog" + engine_version = "9.3.5" + root_password = "1qaA2k1wgvfa3ZZZZ" + charset = "UTF8" + spec_code = "cdb.pg.z1.2g" + project_id = 1154137 + public_access_switch = true + memory = 4 + storage = 250 +} +` diff --git a/tencentcloud/service_tencentcloud_postgresql.go b/tencentcloud/service_tencentcloud_postgresql.go new file mode 100644 index 0000000000..bf32df582c --- /dev/null +++ b/tencentcloud/service_tencentcloud_postgresql.go @@ -0,0 +1,422 @@ +package tencentcloud + +import ( + "context" + "errors" + "fmt" + "log" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" + postgresql "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312" + "github.com/terraform-providers/terraform-provider-tencentcloud/tencentcloud/connectivity" + "github.com/terraform-providers/terraform-provider-tencentcloud/tencentcloud/internal/helper" + "github.com/terraform-providers/terraform-provider-tencentcloud/tencentcloud/ratelimit" +) + +type PostgresqlService struct { + client *connectivity.TencentCloudClient +} + +func (me *PostgresqlService) CreatePostgresqlInstance(ctx context.Context, name string, dbVersion string, chargeType string, specCode string, autoRenewFlag int, projectId int, period int, subnetId string, vpcId string, zone string, storage int) (instanceId string, errRet error) { + logId := getLogId(ctx) + request := postgresql.NewCreateDBInstancesRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.Name = helper.String(name) + request.DBVersion = helper.String(dbVersion) + request.InstanceChargeType = helper.String(chargeType) + request.SpecCode = helper.String(specCode) + request.AutoRenewFlag = helper.IntInt64(autoRenewFlag) + request.ProjectId = helper.Int64(int64(projectId)) + request.Period = helper.Int64Uint64(int64(period)) + request.SubnetId = helper.String(subnetId) + request.VpcId = helper.String(vpcId) + request.Storage = helper.IntUint64(storage) + request.Zone = helper.String(zone) + request.InstanceCount = helper.Int64Uint64(1) + + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().CreateDBInstances(request) + if err != nil { + errRet = err + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + } + if len(response.Response.DBInstanceIdSet) == 0 { + errRet = errors.New("TencentCloud SDK returns empty postgresql ID") + return + } else if len(response.Response.DBInstanceIdSet) > 1 { + errRet = errors.New("TencentCloud SDK returns more than one postgresql ID") + return + } + instanceId = *response.Response.DBInstanceIdSet[0] + return +} + +func (me *PostgresqlService) InitPostgresqlInstance(ctx context.Context, instanceId string, password string, charset string) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewInitDBInstancesRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.Charset = helper.String(charset) + request.AdminName = helper.String("root") + request.AdminPassword = helper.String(password) + request.DBInstanceIdSet = []*string{&instanceId} + + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().InitDBInstances(request) + if err != nil { + errRet = err + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + } + if len(response.Response.DBInstanceIdSet) == 0 { + errRet = errors.New("TencentCloud SDK returns empty postgresql instance ID") + } else if len(response.Response.DBInstanceIdSet) > 1 { + errRet = errors.New("TencentCloud SDK returns more than one postgresql instance ID") + } + + return +} + +func (me *PostgresqlService) DescribeSpecCodes(ctx context.Context, zone string) (specCodeList []*postgresql.SpecItemInfo, errRet error) { + logId := getLogId(ctx) + request := postgresql.NewDescribeProductConfigRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.Zone = helper.String(zone) + + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().DescribeProductConfig(request) + if err != nil { + errRet = err + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + } + + specCodeList = response.Response.SpecInfoList[0].SpecItemInfoList + return +} + +func (me *PostgresqlService) ModifyPublicService(ctx context.Context, openInternet bool, instanceId string) (errRet error) { + logId := getLogId(ctx) + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s-open:%t] fail,reason[%s]", logId, "modifyInternetService", openInternet, errRet.Error()) + } + }() + + if openInternet { + request := postgresql.NewOpenDBExtranetAccessRequest() + request.DBInstanceId = helper.String(instanceId) + ratelimit.Check(request.GetAction()) + + response, err := me.client.UsePostgresqlClient().OpenDBExtranetAccess(request) + if err != nil { + errRet = err + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + } + + /* + time.Sleep(10 * time.Second) + + //get instance internet status + instance, has, err := me.DescribePostgresqlInstanceById(ctx, instanceId) + if err != nil { + return err + } + if !has { + errRet = fmt.Errorf("describe postgresql instance error %s", instanceId) + return + } + for _, v := range instance.DBInstanceNetInfo { + if *v.NetType == "public" { + if *v.Status == "opening" { //const + + //sleep and retry + } else if *v.Status == "opened" { + return nil + } else { + err = fmt.Errorf("open public accress failed ,instance Id %s, status %s", instanceId, *v.Status) + return err + } + } else { + continue + } + } + //get no public access + err = fmt.Errorf("There is no public access with posgresql instance %s", instanceId) + return err + */ + + } else { + request := postgresql.NewCloseDBExtranetAccessRequest() + request.DBInstanceId = helper.String(instanceId) + ratelimit.Check(request.GetAction()) + + response, err := me.client.UsePostgresqlClient().CloseDBExtranetAccess(request) + if err != nil { + errRet = err + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + } + + /* + time.Sleep(10 * time.Second) + //get instance internet status + instance, has, err := me.DescribePostgresqlInstanceById(ctx, instanceId) + if err != nil { + return err + } + if !has { + errRet = fmt.Errorf("describe postgresql instance error %s", instanceId) + return + } + for _, v := range instance.DBInstanceNetInfo { + if *v.NetType == "public" { + if *v.Status == "closing" { //const + //sleep and retry + } else if *v.Status == "closed" { + return nil + } else { + err = fmt.Errorf("close public accress failed ,instance Id %s, status %s", instanceId, *v.Status) + return err + } + } else { + continue + } + } + //get no public access + err = fmt.Errorf("There is no public access with posgresql instance %s", instanceId) + return err + + */ + } + return +} + +func (me *PostgresqlService) DescribePostgresqlInstanceById(ctx context.Context, instanceId string) (instance *postgresql.DBInstance, has bool, errRet error) { + logId := getLogId(ctx) + request := postgresql.NewDescribeDBInstanceAttributeRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceId = helper.String(instanceId) + + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().DescribeDBInstanceAttribute(request) + if err != nil { + ee, ok := err.(*sdkErrors.TencentCloudSDKError) + if !ok { + errRet = err + return + } + if ee.Code == "InvalidParameter" { + errRet = nil + } else { + errRet = err + } + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + return + } + instance = response.Response.DBInstance + if instance != nil { + has = true + } + return +} + +func (me *PostgresqlService) DescribePostgresqlInstances(ctx context.Context, filter []*postgresql.Filter) (instanceList []*postgresql.DBInstance, errRet error) { + logId := getLogId(ctx) + request := postgresql.NewDescribeDBInstancesRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + + var offset, limit uint64 = 0, 20 + + request.Offset = &offset + request.Limit = &limit + request.Filters = filter + + for { + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().DescribeDBInstances(request) + if err != nil { + errRet = err + return + } + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + } + instanceList = append(instanceList, response.Response.DBInstanceSet...) + if len(response.Response.DBInstanceSet) < int(limit) { + return + } + offset += limit + } +} + +func (me *PostgresqlService) ModifyPostgresqlInstanceName(ctx context.Context, instanceId string, name string) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewModifyDBInstanceNameRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceId = helper.String(instanceId) + request.InstanceName = helper.String(name) + + ratelimit.Check(request.GetAction()) + _, err := me.client.UsePostgresqlClient().ModifyDBInstanceName(request) + if err != nil { + errRet = err + } + + return +} + +func (me *PostgresqlService) UpgradePostgresqlInstance(ctx context.Context, instanceId string, memory int, storage int) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewUpgradeDBInstanceRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceId = helper.String(instanceId) + request.Storage = helper.IntInt64(storage) + request.Memory = helper.IntInt64(memory) + + ratelimit.Check(request.GetAction()) + _, err := me.client.UsePostgresqlClient().UpgradeDBInstance(request) + if err != nil { + errRet = err + } + + return +} + +func (me *PostgresqlService) ModifyPostgresqlInstanceProjectId(ctx context.Context, instanceId string, projectId int) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewModifyDBInstancesProjectRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceIdSet = []*string{&instanceId} + request.ProjectId = helper.String(strconv.Itoa(projectId)) + + ratelimit.Check(request.GetAction()) + _, err := me.client.UsePostgresqlClient().ModifyDBInstancesProject(request) + if err != nil { + errRet = err + } + return +} + +func (me *PostgresqlService) SetPostgresqlInstanceAutoRenewFlag(ctx context.Context, instanceId string, autoRenewFlag int) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewSetAutoRenewFlagRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceIdSet = []*string{&instanceId} + request.AutoRenewFlag = helper.IntInt64(autoRenewFlag) + + ratelimit.Check(request.GetAction()) + _, err := me.client.UsePostgresqlClient().SetAutoRenewFlag(request) + if err != nil { + errRet = err + } + return +} + +func (me *PostgresqlService) DeletePostgresqlInstance(ctx context.Context, instanceId string) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewDestroyDBInstanceRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceId = helper.String(instanceId) + + ratelimit.Check(request.GetAction()) + _, err := me.client.UsePostgresqlClient().DestroyDBInstance(request) + if err != nil { + errRet = err + } + return +} + +func (me *PostgresqlService) SetPostgresqlInstanceRootPassword(ctx context.Context, instanceId string, password string) (errRet error) { + logId := getLogId(ctx) + request := postgresql.NewResetAccountPasswordRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.DBInstanceId = helper.String(instanceId) + request.UserName = helper.String("root") + request.Password = helper.String(password) + + ratelimit.Check(request.GetAction()) + _, err := me.client.UsePostgresqlClient().ResetAccountPassword(request) + if err != nil { + errRet = err + } + return +} + +func (me *PostgresqlService) CheckDBInstanceStatus(ctx context.Context, instanceId string) error { + //check status + err := resource.Retry(2*readRetryTimeout, func() *resource.RetryError { + instance, has, err := me.DescribePostgresqlInstanceById(ctx, instanceId) + if err != nil { + return retryError(err) + } else if has && *instance.DBInstanceStatus == POSTGRESQL_STAUTS_RUNNING { + return nil + } else if !has { + return resource.NonRetryableError(fmt.Errorf("check postgresql instance fail")) + } else { + return resource.RetryableError(fmt.Errorf("checking postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) + } + }) + + return err +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/client.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/client.go new file mode 100644 index 0000000000..122c70b531 --- /dev/null +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/client.go @@ -0,0 +1,869 @@ +// Copyright (c) 2017-2018 THL A29 Limited, a Tencent company. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v20170312 + +import ( + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + tchttp "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" +) + +const APIVersion = "2017-03-12" + +type Client struct { + common.Client +} + +// Deprecated +func NewClientWithSecretId(secretId, secretKey, region string) (client *Client, err error) { + cpf := profile.NewClientProfile() + client = &Client{} + client.Init(region).WithSecretId(secretId, secretKey).WithProfile(cpf) + return +} + +func NewClient(credential *common.Credential, region string, clientProfile *profile.ClientProfile) (client *Client, err error) { + client = &Client{} + client.Init(region). + WithCredential(credential). + WithProfile(clientProfile) + return +} + + +func NewCloseDBExtranetAccessRequest() (request *CloseDBExtranetAccessRequest) { + request = &CloseDBExtranetAccessRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "CloseDBExtranetAccess") + return +} + +func NewCloseDBExtranetAccessResponse() (response *CloseDBExtranetAccessResponse) { + response = &CloseDBExtranetAccessResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(CloseDBExtranetAccess)用于关闭实例外网链接。 +func (c *Client) CloseDBExtranetAccess(request *CloseDBExtranetAccessRequest) (response *CloseDBExtranetAccessResponse, err error) { + if request == nil { + request = NewCloseDBExtranetAccessRequest() + } + response = NewCloseDBExtranetAccessResponse() + err = c.Send(request, response) + return +} + +func NewCloseServerlessDBExtranetAccessRequest() (request *CloseServerlessDBExtranetAccessRequest) { + request = &CloseServerlessDBExtranetAccessRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "CloseServerlessDBExtranetAccess") + return +} + +func NewCloseServerlessDBExtranetAccessResponse() (response *CloseServerlessDBExtranetAccessResponse) { + response = &CloseServerlessDBExtranetAccessResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 关闭serverlessDB实例外网 +func (c *Client) CloseServerlessDBExtranetAccess(request *CloseServerlessDBExtranetAccessRequest) (response *CloseServerlessDBExtranetAccessResponse, err error) { + if request == nil { + request = NewCloseServerlessDBExtranetAccessRequest() + } + response = NewCloseServerlessDBExtranetAccessResponse() + err = c.Send(request, response) + return +} + +func NewCreateDBInstancesRequest() (request *CreateDBInstancesRequest) { + request = &CreateDBInstancesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "CreateDBInstances") + return +} + +func NewCreateDBInstancesResponse() (response *CreateDBInstancesResponse) { + response = &CreateDBInstancesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (CreateDBInstances) 用于创建一个或者多个PostgreSQL实例。 +func (c *Client) CreateDBInstances(request *CreateDBInstancesRequest) (response *CreateDBInstancesResponse, err error) { + if request == nil { + request = NewCreateDBInstancesRequest() + } + response = NewCreateDBInstancesResponse() + err = c.Send(request, response) + return +} + +func NewCreateServerlessDBInstanceRequest() (request *CreateServerlessDBInstanceRequest) { + request = &CreateServerlessDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "CreateServerlessDBInstance") + return +} + +func NewCreateServerlessDBInstanceResponse() (response *CreateServerlessDBInstanceResponse) { + response = &CreateServerlessDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (CreateServerlessDBInstance) 用于创建一个ServerlessDB实例,创建成功返回实例ID。 +func (c *Client) CreateServerlessDBInstance(request *CreateServerlessDBInstanceRequest) (response *CreateServerlessDBInstanceResponse, err error) { + if request == nil { + request = NewCreateServerlessDBInstanceRequest() + } + response = NewCreateServerlessDBInstanceResponse() + err = c.Send(request, response) + return +} + +func NewDeleteServerlessDBInstanceRequest() (request *DeleteServerlessDBInstanceRequest) { + request = &DeleteServerlessDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DeleteServerlessDBInstance") + return +} + +func NewDeleteServerlessDBInstanceResponse() (response *DeleteServerlessDBInstanceResponse) { + response = &DeleteServerlessDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DeleteServerlessDBInstance) 用于删除一个ServerlessDB实例。 +func (c *Client) DeleteServerlessDBInstance(request *DeleteServerlessDBInstanceRequest) (response *DeleteServerlessDBInstanceResponse, err error) { + if request == nil { + request = NewDeleteServerlessDBInstanceRequest() + } + response = NewDeleteServerlessDBInstanceResponse() + err = c.Send(request, response) + return +} + +func NewDescribeAccountsRequest() (request *DescribeAccountsRequest) { + request = &DescribeAccountsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeAccounts") + return +} + +func NewDescribeAccountsResponse() (response *DescribeAccountsResponse) { + response = &DescribeAccountsResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(DescribeAccounts)用于获取实例用户列表。 +func (c *Client) DescribeAccounts(request *DescribeAccountsRequest) (response *DescribeAccountsResponse, err error) { + if request == nil { + request = NewDescribeAccountsRequest() + } + response = NewDescribeAccountsResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDBBackupsRequest() (request *DescribeDBBackupsRequest) { + request = &DescribeDBBackupsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDBBackups") + return +} + +func NewDescribeDBBackupsResponse() (response *DescribeDBBackupsResponse) { + response = &DescribeDBBackupsResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(DescribeDBBackups)用于查询实例备份列表。 +func (c *Client) DescribeDBBackups(request *DescribeDBBackupsRequest) (response *DescribeDBBackupsResponse, err error) { + if request == nil { + request = NewDescribeDBBackupsRequest() + } + response = NewDescribeDBBackupsResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDBErrlogsRequest() (request *DescribeDBErrlogsRequest) { + request = &DescribeDBErrlogsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDBErrlogs") + return +} + +func NewDescribeDBErrlogsResponse() (response *DescribeDBErrlogsResponse) { + response = &DescribeDBErrlogsResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(DescribeDBErrlogs)用于获取错误日志。 +func (c *Client) DescribeDBErrlogs(request *DescribeDBErrlogsRequest) (response *DescribeDBErrlogsResponse, err error) { + if request == nil { + request = NewDescribeDBErrlogsRequest() + } + response = NewDescribeDBErrlogsResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDBInstanceAttributeRequest() (request *DescribeDBInstanceAttributeRequest) { + request = &DescribeDBInstanceAttributeRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDBInstanceAttribute") + return +} + +func NewDescribeDBInstanceAttributeResponse() (response *DescribeDBInstanceAttributeResponse) { + response = &DescribeDBInstanceAttributeResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DescribeDBInstanceAttribute) 用于查询某个实例的详情信息。 +func (c *Client) DescribeDBInstanceAttribute(request *DescribeDBInstanceAttributeRequest) (response *DescribeDBInstanceAttributeResponse, err error) { + if request == nil { + request = NewDescribeDBInstanceAttributeRequest() + } + response = NewDescribeDBInstanceAttributeResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDBInstancesRequest() (request *DescribeDBInstancesRequest) { + request = &DescribeDBInstancesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDBInstances") + return +} + +func NewDescribeDBInstancesResponse() (response *DescribeDBInstancesResponse) { + response = &DescribeDBInstancesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DescribeDBInstances) 用于查询一个或多个实例的详细信息。 +func (c *Client) DescribeDBInstances(request *DescribeDBInstancesRequest) (response *DescribeDBInstancesResponse, err error) { + if request == nil { + request = NewDescribeDBInstancesRequest() + } + response = NewDescribeDBInstancesResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDBSlowlogsRequest() (request *DescribeDBSlowlogsRequest) { + request = &DescribeDBSlowlogsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDBSlowlogs") + return +} + +func NewDescribeDBSlowlogsResponse() (response *DescribeDBSlowlogsResponse) { + response = &DescribeDBSlowlogsResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(DescribeDBSlowlogs)用于获取慢查询日志。 +func (c *Client) DescribeDBSlowlogs(request *DescribeDBSlowlogsRequest) (response *DescribeDBSlowlogsResponse, err error) { + if request == nil { + request = NewDescribeDBSlowlogsRequest() + } + response = NewDescribeDBSlowlogsResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDBXlogsRequest() (request *DescribeDBXlogsRequest) { + request = &DescribeDBXlogsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDBXlogs") + return +} + +func NewDescribeDBXlogsResponse() (response *DescribeDBXlogsResponse) { + response = &DescribeDBXlogsResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(DescribeDBXlogs)用于获取实例Xlog列表。 +func (c *Client) DescribeDBXlogs(request *DescribeDBXlogsRequest) (response *DescribeDBXlogsResponse, err error) { + if request == nil { + request = NewDescribeDBXlogsRequest() + } + response = NewDescribeDBXlogsResponse() + err = c.Send(request, response) + return +} + +func NewDescribeDatabasesRequest() (request *DescribeDatabasesRequest) { + request = &DescribeDatabasesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeDatabases") + return +} + +func NewDescribeDatabasesResponse() (response *DescribeDatabasesResponse) { + response = &DescribeDatabasesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 接口(DescribeDatabases)用来拉取数据库列表 +func (c *Client) DescribeDatabases(request *DescribeDatabasesRequest) (response *DescribeDatabasesResponse, err error) { + if request == nil { + request = NewDescribeDatabasesRequest() + } + response = NewDescribeDatabasesResponse() + err = c.Send(request, response) + return +} + +func NewDescribeOrdersRequest() (request *DescribeOrdersRequest) { + request = &DescribeOrdersRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeOrders") + return +} + +func NewDescribeOrdersResponse() (response *DescribeOrdersResponse) { + response = &DescribeOrdersResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(DescribeOrders)用于获取订单信息。 +func (c *Client) DescribeOrders(request *DescribeOrdersRequest) (response *DescribeOrdersResponse, err error) { + if request == nil { + request = NewDescribeOrdersRequest() + } + response = NewDescribeOrdersResponse() + err = c.Send(request, response) + return +} + +func NewDescribeProductConfigRequest() (request *DescribeProductConfigRequest) { + request = &DescribeProductConfigRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeProductConfig") + return +} + +func NewDescribeProductConfigResponse() (response *DescribeProductConfigResponse) { + response = &DescribeProductConfigResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DescribeProductConfig) 用于查询售卖规格配置。 +func (c *Client) DescribeProductConfig(request *DescribeProductConfigRequest) (response *DescribeProductConfigResponse, err error) { + if request == nil { + request = NewDescribeProductConfigRequest() + } + response = NewDescribeProductConfigResponse() + err = c.Send(request, response) + return +} + +func NewDescribeRegionsRequest() (request *DescribeRegionsRequest) { + request = &DescribeRegionsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeRegions") + return +} + +func NewDescribeRegionsResponse() (response *DescribeRegionsResponse) { + response = &DescribeRegionsResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DescribeRegions) 用于查询售卖地域信息。 +func (c *Client) DescribeRegions(request *DescribeRegionsRequest) (response *DescribeRegionsResponse, err error) { + if request == nil { + request = NewDescribeRegionsRequest() + } + response = NewDescribeRegionsResponse() + err = c.Send(request, response) + return +} + +func NewDescribeServerlessDBInstancesRequest() (request *DescribeServerlessDBInstancesRequest) { + request = &DescribeServerlessDBInstancesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeServerlessDBInstances") + return +} + +func NewDescribeServerlessDBInstancesResponse() (response *DescribeServerlessDBInstancesResponse) { + response = &DescribeServerlessDBInstancesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 用于查询一个或多个serverlessDB实例的详细信息 +func (c *Client) DescribeServerlessDBInstances(request *DescribeServerlessDBInstancesRequest) (response *DescribeServerlessDBInstancesResponse, err error) { + if request == nil { + request = NewDescribeServerlessDBInstancesRequest() + } + response = NewDescribeServerlessDBInstancesResponse() + err = c.Send(request, response) + return +} + +func NewDescribeZonesRequest() (request *DescribeZonesRequest) { + request = &DescribeZonesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DescribeZones") + return +} + +func NewDescribeZonesResponse() (response *DescribeZonesResponse) { + response = &DescribeZonesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DescribeZones) 用于查询支持的可用区信息。 +func (c *Client) DescribeZones(request *DescribeZonesRequest) (response *DescribeZonesResponse, err error) { + if request == nil { + request = NewDescribeZonesRequest() + } + response = NewDescribeZonesResponse() + err = c.Send(request, response) + return +} + +func NewDestroyDBInstanceRequest() (request *DestroyDBInstanceRequest) { + request = &DestroyDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "DestroyDBInstance") + return +} + +func NewDestroyDBInstanceResponse() (response *DestroyDBInstanceResponse) { + response = &DestroyDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (DestroyDBInstance) 用于销毁指定DBInstanceId对应的实例。 +func (c *Client) DestroyDBInstance(request *DestroyDBInstanceRequest) (response *DestroyDBInstanceResponse, err error) { + if request == nil { + request = NewDestroyDBInstanceRequest() + } + response = NewDestroyDBInstanceResponse() + err = c.Send(request, response) + return +} + +func NewInitDBInstancesRequest() (request *InitDBInstancesRequest) { + request = &InitDBInstancesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "InitDBInstances") + return +} + +func NewInitDBInstancesResponse() (response *InitDBInstancesResponse) { + response = &InitDBInstancesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (InitDBInstances) 用于初始化云数据库PostgreSQL实例。 +func (c *Client) InitDBInstances(request *InitDBInstancesRequest) (response *InitDBInstancesResponse, err error) { + if request == nil { + request = NewInitDBInstancesRequest() + } + response = NewInitDBInstancesResponse() + err = c.Send(request, response) + return +} + +func NewInquiryPriceCreateDBInstancesRequest() (request *InquiryPriceCreateDBInstancesRequest) { + request = &InquiryPriceCreateDBInstancesRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "InquiryPriceCreateDBInstances") + return +} + +func NewInquiryPriceCreateDBInstancesResponse() (response *InquiryPriceCreateDBInstancesResponse) { + response = &InquiryPriceCreateDBInstancesResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口 (InquiryPriceCreateDBInstances) 用于查询购买一个或多个实例的价格信息。 +func (c *Client) InquiryPriceCreateDBInstances(request *InquiryPriceCreateDBInstancesRequest) (response *InquiryPriceCreateDBInstancesResponse, err error) { + if request == nil { + request = NewInquiryPriceCreateDBInstancesRequest() + } + response = NewInquiryPriceCreateDBInstancesResponse() + err = c.Send(request, response) + return +} + +func NewInquiryPriceRenewDBInstanceRequest() (request *InquiryPriceRenewDBInstanceRequest) { + request = &InquiryPriceRenewDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "InquiryPriceRenewDBInstance") + return +} + +func NewInquiryPriceRenewDBInstanceResponse() (response *InquiryPriceRenewDBInstanceResponse) { + response = &InquiryPriceRenewDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(InquiryPriceRenewDBInstance)用于查询续费实例的价格。 +func (c *Client) InquiryPriceRenewDBInstance(request *InquiryPriceRenewDBInstanceRequest) (response *InquiryPriceRenewDBInstanceResponse, err error) { + if request == nil { + request = NewInquiryPriceRenewDBInstanceRequest() + } + response = NewInquiryPriceRenewDBInstanceResponse() + err = c.Send(request, response) + return +} + +func NewInquiryPriceUpgradeDBInstanceRequest() (request *InquiryPriceUpgradeDBInstanceRequest) { + request = &InquiryPriceUpgradeDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "InquiryPriceUpgradeDBInstance") + return +} + +func NewInquiryPriceUpgradeDBInstanceResponse() (response *InquiryPriceUpgradeDBInstanceResponse) { + response = &InquiryPriceUpgradeDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(InquiryPriceUpgradeDBInstance)用于查询升级实例的价格。 +func (c *Client) InquiryPriceUpgradeDBInstance(request *InquiryPriceUpgradeDBInstanceRequest) (response *InquiryPriceUpgradeDBInstanceResponse, err error) { + if request == nil { + request = NewInquiryPriceUpgradeDBInstanceRequest() + } + response = NewInquiryPriceUpgradeDBInstanceResponse() + err = c.Send(request, response) + return +} + +func NewModifyAccountRemarkRequest() (request *ModifyAccountRemarkRequest) { + request = &ModifyAccountRemarkRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "ModifyAccountRemark") + return +} + +func NewModifyAccountRemarkResponse() (response *ModifyAccountRemarkResponse) { + response = &ModifyAccountRemarkResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(ModifyAccountRemark)用于修改帐号备注。 +func (c *Client) ModifyAccountRemark(request *ModifyAccountRemarkRequest) (response *ModifyAccountRemarkResponse, err error) { + if request == nil { + request = NewModifyAccountRemarkRequest() + } + response = NewModifyAccountRemarkResponse() + err = c.Send(request, response) + return +} + +func NewModifyDBInstanceNameRequest() (request *ModifyDBInstanceNameRequest) { + request = &ModifyDBInstanceNameRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "ModifyDBInstanceName") + return +} + +func NewModifyDBInstanceNameResponse() (response *ModifyDBInstanceNameResponse) { + response = &ModifyDBInstanceNameResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(ModifyDBInstanceName)用于修改postgresql实例名字。 +func (c *Client) ModifyDBInstanceName(request *ModifyDBInstanceNameRequest) (response *ModifyDBInstanceNameResponse, err error) { + if request == nil { + request = NewModifyDBInstanceNameRequest() + } + response = NewModifyDBInstanceNameResponse() + err = c.Send(request, response) + return +} + +func NewModifyDBInstancesProjectRequest() (request *ModifyDBInstancesProjectRequest) { + request = &ModifyDBInstancesProjectRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "ModifyDBInstancesProject") + return +} + +func NewModifyDBInstancesProjectResponse() (response *ModifyDBInstancesProjectResponse) { + response = &ModifyDBInstancesProjectResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(ModifyDBInstancesProject)用于将实例转至其他项目。 +func (c *Client) ModifyDBInstancesProject(request *ModifyDBInstancesProjectRequest) (response *ModifyDBInstancesProjectResponse, err error) { + if request == nil { + request = NewModifyDBInstancesProjectRequest() + } + response = NewModifyDBInstancesProjectResponse() + err = c.Send(request, response) + return +} + +func NewOpenDBExtranetAccessRequest() (request *OpenDBExtranetAccessRequest) { + request = &OpenDBExtranetAccessRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "OpenDBExtranetAccess") + return +} + +func NewOpenDBExtranetAccessResponse() (response *OpenDBExtranetAccessResponse) { + response = &OpenDBExtranetAccessResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(OpenDBExtranetAccess)用于开通外网。 +func (c *Client) OpenDBExtranetAccess(request *OpenDBExtranetAccessRequest) (response *OpenDBExtranetAccessResponse, err error) { + if request == nil { + request = NewOpenDBExtranetAccessRequest() + } + response = NewOpenDBExtranetAccessResponse() + err = c.Send(request, response) + return +} + +func NewOpenServerlessDBExtranetAccessRequest() (request *OpenServerlessDBExtranetAccessRequest) { + request = &OpenServerlessDBExtranetAccessRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "OpenServerlessDBExtranetAccess") + return +} + +func NewOpenServerlessDBExtranetAccessResponse() (response *OpenServerlessDBExtranetAccessResponse) { + response = &OpenServerlessDBExtranetAccessResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 开通serverlessDB实例外网 +func (c *Client) OpenServerlessDBExtranetAccess(request *OpenServerlessDBExtranetAccessRequest) (response *OpenServerlessDBExtranetAccessResponse, err error) { + if request == nil { + request = NewOpenServerlessDBExtranetAccessRequest() + } + response = NewOpenServerlessDBExtranetAccessResponse() + err = c.Send(request, response) + return +} + +func NewRenewInstanceRequest() (request *RenewInstanceRequest) { + request = &RenewInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "RenewInstance") + return +} + +func NewRenewInstanceResponse() (response *RenewInstanceResponse) { + response = &RenewInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(RenewInstance)用于续费实例。 +func (c *Client) RenewInstance(request *RenewInstanceRequest) (response *RenewInstanceResponse, err error) { + if request == nil { + request = NewRenewInstanceRequest() + } + response = NewRenewInstanceResponse() + err = c.Send(request, response) + return +} + +func NewResetAccountPasswordRequest() (request *ResetAccountPasswordRequest) { + request = &ResetAccountPasswordRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "ResetAccountPassword") + return +} + +func NewResetAccountPasswordResponse() (response *ResetAccountPasswordResponse) { + response = &ResetAccountPasswordResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(ResetAccountPassword)用于重置实例的账户密码。 +func (c *Client) ResetAccountPassword(request *ResetAccountPasswordRequest) (response *ResetAccountPasswordResponse, err error) { + if request == nil { + request = NewResetAccountPasswordRequest() + } + response = NewResetAccountPasswordResponse() + err = c.Send(request, response) + return +} + +func NewRestartDBInstanceRequest() (request *RestartDBInstanceRequest) { + request = &RestartDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "RestartDBInstance") + return +} + +func NewRestartDBInstanceResponse() (response *RestartDBInstanceResponse) { + response = &RestartDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(RestartDBInstance)用于重启实例。 +func (c *Client) RestartDBInstance(request *RestartDBInstanceRequest) (response *RestartDBInstanceResponse, err error) { + if request == nil { + request = NewRestartDBInstanceRequest() + } + response = NewRestartDBInstanceResponse() + err = c.Send(request, response) + return +} + +func NewSetAutoRenewFlagRequest() (request *SetAutoRenewFlagRequest) { + request = &SetAutoRenewFlagRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "SetAutoRenewFlag") + return +} + +func NewSetAutoRenewFlagResponse() (response *SetAutoRenewFlagResponse) { + response = &SetAutoRenewFlagResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(SetAutoRenewFlag)用于设置自动续费。 +func (c *Client) SetAutoRenewFlag(request *SetAutoRenewFlagRequest) (response *SetAutoRenewFlagResponse, err error) { + if request == nil { + request = NewSetAutoRenewFlagRequest() + } + response = NewSetAutoRenewFlagResponse() + err = c.Send(request, response) + return +} + +func NewUpgradeDBInstanceRequest() (request *UpgradeDBInstanceRequest) { + request = &UpgradeDBInstanceRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + request.Init().WithApiInfo("postgres", APIVersion, "UpgradeDBInstance") + return +} + +func NewUpgradeDBInstanceResponse() (response *UpgradeDBInstanceResponse) { + response = &UpgradeDBInstanceResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// 本接口(UpgradeDBInstance)用于升级实例。 +func (c *Client) UpgradeDBInstance(request *UpgradeDBInstanceRequest) (response *UpgradeDBInstanceResponse, err error) { + if request == nil { + request = NewUpgradeDBInstanceRequest() + } + response = NewUpgradeDBInstanceResponse() + err = c.Send(request, response) + return +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/models.go new file mode 100644 index 0000000000..935aea2de9 --- /dev/null +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312/models.go @@ -0,0 +1,1967 @@ +// Copyright (c) 2017-2018 THL A29 Limited, a Tencent company. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v20170312 + +import ( + "encoding/json" + + tchttp "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http" +) + +type AccountInfo struct { + + // 实例ID,形如postgres-lnp6j617 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 帐号 + UserName *string `json:"UserName,omitempty" name:"UserName"` + + // 帐号备注 + Remark *string `json:"Remark,omitempty" name:"Remark"` + + // 帐号状态。 1-创建中,2-正常,3-修改中,4-密码重置中,-1-删除中 + Status *int64 `json:"Status,omitempty" name:"Status"` + + // 帐号创建时间 + CreateTime *string `json:"CreateTime,omitempty" name:"CreateTime"` + + // 帐号最后一次更新时间 + UpdateTime *string `json:"UpdateTime,omitempty" name:"UpdateTime"` +} + +type CloseDBExtranetAccessRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-6r233v55 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *CloseDBExtranetAccessRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CloseDBExtranetAccessRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CloseDBExtranetAccessResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 异步任务流程ID + FlowId *int64 `json:"FlowId,omitempty" name:"FlowId"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *CloseDBExtranetAccessResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CloseDBExtranetAccessResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CloseServerlessDBExtranetAccessRequest struct { + *tchttp.BaseRequest + + // 实例唯一标识符 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例名称 + DBInstanceName *string `json:"DBInstanceName,omitempty" name:"DBInstanceName"` +} + +func (r *CloseServerlessDBExtranetAccessRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CloseServerlessDBExtranetAccessRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CloseServerlessDBExtranetAccessResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *CloseServerlessDBExtranetAccessResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CloseServerlessDBExtranetAccessResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CreateDBInstancesRequest struct { + *tchttp.BaseRequest + + // 售卖规格ID。该参数可以通过调用DescribeProductConfig的返回值中的SpecCode字段来获取。 + SpecCode *string `json:"SpecCode,omitempty" name:"SpecCode"` + + // PostgreSQL内核版本,目前支持:9.3.5、9.5.4、10.4三种版本。 + DBVersion *string `json:"DBVersion,omitempty" name:"DBVersion"` + + // 实例容量大小,单位:GB。 + Storage *uint64 `json:"Storage,omitempty" name:"Storage"` + + // 一次性购买的实例数量。取值1-100 + InstanceCount *uint64 `json:"InstanceCount,omitempty" name:"InstanceCount"` + + // 购买时长,单位:月。目前只支持1,2,3,4,5,6,7,8,9,10,11,12,24,36这些值,按量计费模式下该参数传1。 + Period *uint64 `json:"Period,omitempty" name:"Period"` + + // 可用区ID。该参数可以通过调用 DescribeZones 接口的返回值中的Zone字段来获取。 + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // 项目ID。 + ProjectId *int64 `json:"ProjectId,omitempty" name:"ProjectId"` + + // 实例计费类型。目前支持:PREPAID(预付费,即包年包月),POSTPAID_BY_HOUR(后付费,即按量计费)。 + InstanceChargeType *string `json:"InstanceChargeType,omitempty" name:"InstanceChargeType"` + + // 是否自动使用代金券。1(是),0(否),默认不使用。 + AutoVoucher *uint64 `json:"AutoVoucher,omitempty" name:"AutoVoucher"` + + // 代金券ID列表,目前仅支持指定一张代金券。 + VoucherIds []*string `json:"VoucherIds,omitempty" name:"VoucherIds" list` + + // 私有网络ID。 + VpcId *string `json:"VpcId,omitempty" name:"VpcId"` + + // 私有网络子网ID。 + SubnetId *string `json:"SubnetId,omitempty" name:"SubnetId"` + + // 续费标记:0-正常续费(默认);1-自动续费; + AutoRenewFlag *int64 `json:"AutoRenewFlag,omitempty" name:"AutoRenewFlag"` + + // 活动ID + ActivityId *int64 `json:"ActivityId,omitempty" name:"ActivityId"` + + // 实例名(后续支持) + Name *string `json:"Name,omitempty" name:"Name"` +} + +func (r *CreateDBInstancesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CreateDBInstancesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CreateDBInstancesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 订单号列表。每个实例对应一个订单号。 + DealNames []*string `json:"DealNames,omitempty" name:"DealNames" list` + + // 冻结流水号 + BillId *string `json:"BillId,omitempty" name:"BillId"` + + // 创建成功的实例ID集合,只在后付费情景下有返回值 + DBInstanceIdSet []*string `json:"DBInstanceIdSet,omitempty" name:"DBInstanceIdSet" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *CreateDBInstancesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CreateDBInstancesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CreateServerlessDBInstanceRequest struct { + *tchttp.BaseRequest + + // 可用区ID。公测阶段仅支持ap-shanghai-2、ap-beijing-1,ap-guangzhou-2. + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // DB实例名称,同一个账号下该值必须唯一。 + DBInstanceName *string `json:"DBInstanceName,omitempty" name:"DBInstanceName"` + + // PostgreSQL内核版本,目前只支持:10.4。 + DBVersion *string `json:"DBVersion,omitempty" name:"DBVersion"` + + // PostgreSQL数据库字符集,目前支持UTF8。 + DBCharset *string `json:"DBCharset,omitempty" name:"DBCharset"` + + // 项目ID。 + ProjectId *uint64 `json:"ProjectId,omitempty" name:"ProjectId"` + + // 私有网络ID。 + VpcId *string `json:"VpcId,omitempty" name:"VpcId"` + + // 私有网络子网ID。 + SubnetId *string `json:"SubnetId,omitempty" name:"SubnetId"` +} + +func (r *CreateServerlessDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CreateServerlessDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type CreateServerlessDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 实例ID,该ID全局唯一,如:postgres-xxxxx + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *CreateServerlessDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *CreateServerlessDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DBBackup struct { + + // 备份文件唯一标识 + Id *int64 `json:"Id,omitempty" name:"Id"` + + // 文件生成的开始时间 + StartTime *string `json:"StartTime,omitempty" name:"StartTime"` + + // 文件生成的结束时间 + EndTime *string `json:"EndTime,omitempty" name:"EndTime"` + + // 文件大小(K) + Size *int64 `json:"Size,omitempty" name:"Size"` + + // 策略(0-实例备份;1-多库备份) + Strategy *int64 `json:"Strategy,omitempty" name:"Strategy"` + + // 类型(0-定时) + Way *int64 `json:"Way,omitempty" name:"Way"` + + // 备份方式(1-完整) + Type *int64 `json:"Type,omitempty" name:"Type"` + + // 状态(1-创建中;2-成功;3-失败) + Status *int64 `json:"Status,omitempty" name:"Status"` + + // DB列表 + DbList []*string `json:"DbList,omitempty" name:"DbList" list` + + // 内网下载地址 + InternalAddr *string `json:"InternalAddr,omitempty" name:"InternalAddr"` + + // 外网下载地址 + ExternalAddr *string `json:"ExternalAddr,omitempty" name:"ExternalAddr"` +} + +type DBInstance struct { + + // 实例所属地域,如: ap-guangzhou,对应RegionSet的Region字段 + Region *string `json:"Region,omitempty" name:"Region"` + + // 实例所属可用区, 如:ap-guangzhou-3,对应ZoneSet的Zone字段 + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // 项目ID + ProjectId *uint64 `json:"ProjectId,omitempty" name:"ProjectId"` + + // 私有网络ID + VpcId *string `json:"VpcId,omitempty" name:"VpcId"` + + // SubnetId + SubnetId *string `json:"SubnetId,omitempty" name:"SubnetId"` + + // 实例ID + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例名称 + DBInstanceName *string `json:"DBInstanceName,omitempty" name:"DBInstanceName"` + + // 实例状态 + DBInstanceStatus *string `json:"DBInstanceStatus,omitempty" name:"DBInstanceStatus"` + + // 实例分配的内存大小,单位:GB + DBInstanceMemory *uint64 `json:"DBInstanceMemory,omitempty" name:"DBInstanceMemory"` + + // 实例分配的存储空间大小,单位:GB + DBInstanceStorage *uint64 `json:"DBInstanceStorage,omitempty" name:"DBInstanceStorage"` + + // 实例分配的CPU数量,单位:个 + DBInstanceCpu *uint64 `json:"DBInstanceCpu,omitempty" name:"DBInstanceCpu"` + + // 售卖规格ID + DBInstanceClass *string `json:"DBInstanceClass,omitempty" name:"DBInstanceClass"` + + // 实例类型,类型有:1、primary(主实例);2、readonly(只读实例);3、guard(灾备实例);4、temp(临时实例) + DBInstanceType *string `json:"DBInstanceType,omitempty" name:"DBInstanceType"` + + // 实例版本,目前只支持standard(双机高可用版, 一主一从) + DBInstanceVersion *string `json:"DBInstanceVersion,omitempty" name:"DBInstanceVersion"` + + // 实例DB字符集 + DBCharset *string `json:"DBCharset,omitempty" name:"DBCharset"` + + // PostgreSQL内核版本 + DBVersion *string `json:"DBVersion,omitempty" name:"DBVersion"` + + // 实例创建时间 + CreateTime *string `json:"CreateTime,omitempty" name:"CreateTime"` + + // 实例执行最后一次更新的时间 + UpdateTime *string `json:"UpdateTime,omitempty" name:"UpdateTime"` + + // 实例到期时间 + ExpireTime *string `json:"ExpireTime,omitempty" name:"ExpireTime"` + + // 实例隔离时间 + IsolatedTime *string `json:"IsolatedTime,omitempty" name:"IsolatedTime"` + + // 计费模式,1、prepaid(包年包月,预付费);2、postpaid(按量计费,后付费) + PayType *string `json:"PayType,omitempty" name:"PayType"` + + // 是否自动续费,1:自动续费,0:不自动续费 + AutoRenew *uint64 `json:"AutoRenew,omitempty" name:"AutoRenew"` + + // 实例网络连接信息 + DBInstanceNetInfo []*DBInstanceNetInfo `json:"DBInstanceNetInfo,omitempty" name:"DBInstanceNetInfo" list` + + // 机器类型 + Type *string `json:"Type,omitempty" name:"Type"` + + // 用户的AppId + AppId *uint64 `json:"AppId,omitempty" name:"AppId"` + + // 实例的Uid + Uid *uint64 `json:"Uid,omitempty" name:"Uid"` +} + +type DBInstanceNetInfo struct { + + // DNS域名 + Address *string `json:"Address,omitempty" name:"Address"` + + // Ip + Ip *string `json:"Ip,omitempty" name:"Ip"` + + // 连接Port地址 + Port *uint64 `json:"Port,omitempty" name:"Port"` + + // 网络类型,1、inner(内网地址);2、public(外网地址) + NetType *string `json:"NetType,omitempty" name:"NetType"` + + // 网络连接状态 + Status *string `json:"Status,omitempty" name:"Status"` +} + +type DeleteServerlessDBInstanceRequest struct { + *tchttp.BaseRequest + + // DB实例名称,实例名和实例ID必须至少传一个,如果同时存在,将只以实例ID为准。 + DBInstanceName *string `json:"DBInstanceName,omitempty" name:"DBInstanceName"` + + // DB实例ID,实例名和实例ID必须至少传一个,如果同时存在,将只以实例ID为准。 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *DeleteServerlessDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DeleteServerlessDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DeleteServerlessDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DeleteServerlessDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DeleteServerlessDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeAccountsRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-6fego161 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 分页返回,每页最大返回数目,默认20,取值范围为1-100 + Limit *int64 `json:"Limit,omitempty" name:"Limit"` + + // 分页返回,返回第几页的用户数据。页码从0开始计数 + Offset *int64 `json:"Offset,omitempty" name:"Offset"` + + // 返回数据按照创建时间或者用户名排序。取值只能为createTime或者name。createTime-按照创建时间排序;name-按照用户名排序 + OrderBy *string `json:"OrderBy,omitempty" name:"OrderBy"` + + // 返回结果是升序还是降序。取值只能为desc或者asc。desc-降序;asc-升序 + OrderByType *string `json:"OrderByType,omitempty" name:"OrderByType"` +} + +func (r *DescribeAccountsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeAccountsRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeAccountsResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 本次调用接口共返回了多少条数据。 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 帐号列表详细信息。 + Details []*AccountInfo `json:"Details,omitempty" name:"Details" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeAccountsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeAccountsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBBackupsRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-4wdeb0zv。 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 备份方式(1-全量)。目前只支持全量,取值为1。 + Type *int64 `json:"Type,omitempty" name:"Type"` + + // 查询开始时间,形如2018-06-10 17:06:38,起始时间不得小于7天以前 + StartTime *string `json:"StartTime,omitempty" name:"StartTime"` + + // 查询结束时间,形如2018-06-10 17:06:38 + EndTime *string `json:"EndTime,omitempty" name:"EndTime"` + + // 备份列表分页返回,每页返回数量,默认为 20,最小为1,最大值为 100。(当该参数不传或者传0时按默认值处理) + Limit *int64 `json:"Limit,omitempty" name:"Limit"` + + // 返回结果中的第几页,从第0页开始。默认为0。 + Offset *int64 `json:"Offset,omitempty" name:"Offset"` +} + +func (r *DescribeDBBackupsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBBackupsRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBBackupsResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 返回备份列表中备份文件的个数 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 备份列表 + BackupList []*DBBackup `json:"BackupList,omitempty" name:"BackupList" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDBBackupsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBBackupsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBErrlogsRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-5bq3wfjd + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 查询起始时间,形如2018-01-01 00:00:00,起始时间不得小于7天以前 + StartTime *string `json:"StartTime,omitempty" name:"StartTime"` + + // 查询结束时间,形如2018-01-01 00:00:00 + EndTime *string `json:"EndTime,omitempty" name:"EndTime"` + + // 数据库名字 + DatabaseName *string `json:"DatabaseName,omitempty" name:"DatabaseName"` + + // 搜索关键字 + SearchKeys []*string `json:"SearchKeys,omitempty" name:"SearchKeys" list` + + // 分页返回,每页返回的最大数量。取值为1-100 + Limit *int64 `json:"Limit,omitempty" name:"Limit"` + + // 分页返回,返回第几页的数据,从第0页开始计数 + Offset *int64 `json:"Offset,omitempty" name:"Offset"` +} + +func (r *DescribeDBErrlogsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBErrlogsRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBErrlogsResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 本次调用返回了多少条数据 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 错误日志列表 + Details []*ErrLogDetail `json:"Details,omitempty" name:"Details" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDBErrlogsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBErrlogsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBInstanceAttributeRequest struct { + *tchttp.BaseRequest + + // 实例ID + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *DescribeDBInstanceAttributeRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBInstanceAttributeRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBInstanceAttributeResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 实例详细信息。 + DBInstance *DBInstance `json:"DBInstance,omitempty" name:"DBInstance"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDBInstanceAttributeResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBInstanceAttributeResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBInstancesRequest struct { + *tchttp.BaseRequest + + // 过滤条件,目前支持:db-instance-id、db-instance-name、db-project-id、db-pay-mode。 + Filters []*Filter `json:"Filters,omitempty" name:"Filters" list` + + // 每页显示数量,默认返回10条。 + Limit *uint64 `json:"Limit,omitempty" name:"Limit"` + + // 分页序号,从0开始。 + Offset *uint64 `json:"Offset,omitempty" name:"Offset"` + + // 排序指标,如实例名、创建时间等,支持DBInstanceId,CreateTime,Name,EndTime + OrderBy *string `json:"OrderBy,omitempty" name:"OrderBy"` + + // 排序方式,包括升序、降序 + OrderByType *string `json:"OrderByType,omitempty" name:"OrderByType"` +} + +func (r *DescribeDBInstancesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBInstancesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBInstancesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 查询到的实例数量。 + TotalCount *uint64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 实例详细信息集合。 + DBInstanceSet []*DBInstance `json:"DBInstanceSet,omitempty" name:"DBInstanceSet" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDBInstancesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBInstancesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBSlowlogsRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-lnp6j617 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 查询起始时间,形如2018-06-10 17:06:38,起始时间不得小于7天以前 + StartTime *string `json:"StartTime,omitempty" name:"StartTime"` + + // 查询结束时间,形如2018-06-10 17:06:38 + EndTime *string `json:"EndTime,omitempty" name:"EndTime"` + + // 数据库名字 + DatabaseName *string `json:"DatabaseName,omitempty" name:"DatabaseName"` + + // 按照何种指标排序,取值为sum_calls或者sum_cost_time。sum_calls-总调用次数;sum_cost_time-总的花费时间 + OrderBy *string `json:"OrderBy,omitempty" name:"OrderBy"` + + // 排序规则。desc-降序;asc-升序 + OrderByType *string `json:"OrderByType,omitempty" name:"OrderByType"` + + // 分页返回结果,每页最大返回数量,取值为1-100,默认20 + Limit *int64 `json:"Limit,omitempty" name:"Limit"` + + // 分页返回结果,返回结果的第几页,从0开始计数 + Offset *int64 `json:"Offset,omitempty" name:"Offset"` +} + +func (r *DescribeDBSlowlogsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBSlowlogsRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBSlowlogsResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 本次返回多少条数据 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 慢查询日志详情 + Detail *SlowlogDetail `json:"Detail,omitempty" name:"Detail"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDBSlowlogsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBSlowlogsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBXlogsRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-4wdeb0zv。 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 查询开始时间,形如2018-06-10 17:06:38,起始时间不得小于7天以前 + StartTime *string `json:"StartTime,omitempty" name:"StartTime"` + + // 查询结束时间,形如2018-06-10 17:06:38 + EndTime *string `json:"EndTime,omitempty" name:"EndTime"` + + // 分页返回,表示返回第几页的条目。从第0页开始计数。 + Offset *int64 `json:"Offset,omitempty" name:"Offset"` + + // 分页返回,表示每页有多少条目。取值为1-100。 + Limit *int64 `json:"Limit,omitempty" name:"Limit"` +} + +func (r *DescribeDBXlogsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBXlogsRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDBXlogsResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 表示此次返回结果有多少条数据。 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // Xlog列表 + XlogList []*Xlog `json:"XlogList,omitempty" name:"XlogList" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDBXlogsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDBXlogsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDatabasesRequest struct { + *tchttp.BaseRequest + + // 实例ID + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *DescribeDatabasesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDatabasesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeDatabasesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 数据库信息 + Items []*string `json:"Items,omitempty" name:"Items" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeDatabasesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeDatabasesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeOrdersRequest struct { + *tchttp.BaseRequest + + // 订单名集合 + DealNames []*string `json:"DealNames,omitempty" name:"DealNames" list` +} + +func (r *DescribeOrdersRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeOrdersRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeOrdersResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 订单数量 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 订单数组 + Deals []*PgDeal `json:"Deals,omitempty" name:"Deals" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeOrdersResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeOrdersResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeProductConfigRequest struct { + *tchttp.BaseRequest + + // 可用区名称 + Zone *string `json:"Zone,omitempty" name:"Zone"` +} + +func (r *DescribeProductConfigRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeProductConfigRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeProductConfigResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 售卖规格列表。 + SpecInfoList []*SpecInfo `json:"SpecInfoList,omitempty" name:"SpecInfoList" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeProductConfigResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeProductConfigResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeRegionsRequest struct { + *tchttp.BaseRequest +} + +func (r *DescribeRegionsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeRegionsRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeRegionsResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 返回的结果数量。 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 地域信息集合。 + RegionSet []*RegionInfo `json:"RegionSet,omitempty" name:"RegionSet" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeRegionsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeRegionsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeServerlessDBInstancesRequest struct { + *tchttp.BaseRequest + + // 查询条件 + Filter []*Filter `json:"Filter,omitempty" name:"Filter" list` + + // 查询个数 + Limit *uint64 `json:"Limit,omitempty" name:"Limit"` + + // 偏移量 + Offset *uint64 `json:"Offset,omitempty" name:"Offset"` +} + +func (r *DescribeServerlessDBInstancesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeServerlessDBInstancesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeServerlessDBInstancesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 查询结果数 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 查询结果 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBInstanceSet []*ServerlessDBInstance `json:"DBInstanceSet,omitempty" name:"DBInstanceSet" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeServerlessDBInstancesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeServerlessDBInstancesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeZonesRequest struct { + *tchttp.BaseRequest +} + +func (r *DescribeZonesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeZonesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DescribeZonesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 返回的结果数量。 + TotalCount *int64 `json:"TotalCount,omitempty" name:"TotalCount"` + + // 可用区信息集合。 + ZoneSet []*ZoneInfo `json:"ZoneSet,omitempty" name:"ZoneSet" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DescribeZonesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DescribeZonesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DestroyDBInstanceRequest struct { + *tchttp.BaseRequest + + // 待删除实例标识符 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *DestroyDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DestroyDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type DestroyDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *DestroyDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *DestroyDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ErrLogDetail struct { + + // 用户名 + UserName *string `json:"UserName,omitempty" name:"UserName"` + + // 数据库名字 + Database *string `json:"Database,omitempty" name:"Database"` + + // 错误发生时间 + ErrTime *string `json:"ErrTime,omitempty" name:"ErrTime"` + + // 错误消息 + ErrMsg *string `json:"ErrMsg,omitempty" name:"ErrMsg"` +} + +type Filter struct { + + // 过滤键的名称。 + Name *string `json:"Name,omitempty" name:"Name"` + + // 一个或者多个过滤值。 + Values []*string `json:"Values,omitempty" name:"Values" list` +} + +type InitDBInstancesRequest struct { + *tchttp.BaseRequest + + // 实例ID集合。 + DBInstanceIdSet []*string `json:"DBInstanceIdSet,omitempty" name:"DBInstanceIdSet" list` + + // 实例根账号用户名。 + AdminName *string `json:"AdminName,omitempty" name:"AdminName"` + + // 实例根账号用户名对应的密码。 + AdminPassword *string `json:"AdminPassword,omitempty" name:"AdminPassword"` + + // 实例字符集,目前只支持:UTF8、LATIN1。 + Charset *string `json:"Charset,omitempty" name:"Charset"` +} + +func (r *InitDBInstancesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InitDBInstancesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InitDBInstancesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 实例ID集合。 + DBInstanceIdSet []*string `json:"DBInstanceIdSet,omitempty" name:"DBInstanceIdSet" list` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *InitDBInstancesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InitDBInstancesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InquiryPriceCreateDBInstancesRequest struct { + *tchttp.BaseRequest + + // 可用区ID。该参数可以通过调用 DescribeZones 接口的返回值中的Zone字段来获取。 + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // 规格ID。该参数可以通过调用DescribeProductConfig接口的返回值中的SpecCode字段来获取。 + SpecCode *string `json:"SpecCode,omitempty" name:"SpecCode"` + + // 存储容量大小,单位:GB。 + Storage *uint64 `json:"Storage,omitempty" name:"Storage"` + + // 实例数量。目前最大数量不超过100,如需一次性创建更多实例,请联系客服支持。 + InstanceCount *uint64 `json:"InstanceCount,omitempty" name:"InstanceCount"` + + // 购买时长,单位:月。目前只支持1,2,3,4,5,6,7,8,9,10,11,12,24,36这些值。 + Period *uint64 `json:"Period,omitempty" name:"Period"` + + // 计费ID。该参数可以通过调用DescribeProductConfig接口的返回值中的Pid字段来获取。 + Pid *uint64 `json:"Pid,omitempty" name:"Pid"` + + // 实例计费类型。目前只支持:PREPAID(预付费,即包年包月)。 + InstanceChargeType *string `json:"InstanceChargeType,omitempty" name:"InstanceChargeType"` +} + +func (r *InquiryPriceCreateDBInstancesRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InquiryPriceCreateDBInstancesRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InquiryPriceCreateDBInstancesResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 原始价格,单位:分 + OriginalPrice *uint64 `json:"OriginalPrice,omitempty" name:"OriginalPrice"` + + // 折后价格,单位:分 + Price *uint64 `json:"Price,omitempty" name:"Price"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *InquiryPriceCreateDBInstancesResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InquiryPriceCreateDBInstancesResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InquiryPriceRenewDBInstanceRequest struct { + *tchttp.BaseRequest + + // 实例ID + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 续费周期,按月计算,最大不超过48 + Period *int64 `json:"Period,omitempty" name:"Period"` +} + +func (r *InquiryPriceRenewDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InquiryPriceRenewDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InquiryPriceRenewDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 总费用,打折前的。比如24650表示246.5元 + OriginalPrice *int64 `json:"OriginalPrice,omitempty" name:"OriginalPrice"` + + // 实际需要付款金额。比如24650表示246.5元 + Price *int64 `json:"Price,omitempty" name:"Price"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *InquiryPriceRenewDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InquiryPriceRenewDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InquiryPriceUpgradeDBInstanceRequest struct { + *tchttp.BaseRequest + + // 实例的磁盘大小,单位GB + Storage *int64 `json:"Storage,omitempty" name:"Storage"` + + // 实例的内存大小,单位GB + Memory *int64 `json:"Memory,omitempty" name:"Memory"` + + // 实例ID,形如postgres-hez4fh0v + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例计费类型,预付费或者后付费。PREPAID-预付费。目前只支持预付费。 + InstanceChargeType *string `json:"InstanceChargeType,omitempty" name:"InstanceChargeType"` +} + +func (r *InquiryPriceUpgradeDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InquiryPriceUpgradeDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type InquiryPriceUpgradeDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 总费用,打折前的 + OriginalPrice *int64 `json:"OriginalPrice,omitempty" name:"OriginalPrice"` + + // 实际需要付款金额 + Price *int64 `json:"Price,omitempty" name:"Price"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *InquiryPriceUpgradeDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *InquiryPriceUpgradeDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ModifyAccountRemarkRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-4wdeb0zv + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例用户名 + UserName *string `json:"UserName,omitempty" name:"UserName"` + + // 用户UserName对应的新备注 + Remark *string `json:"Remark,omitempty" name:"Remark"` +} + +func (r *ModifyAccountRemarkRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ModifyAccountRemarkRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ModifyAccountRemarkResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *ModifyAccountRemarkResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ModifyAccountRemarkResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ModifyDBInstanceNameRequest struct { + *tchttp.BaseRequest + + // 数据库实例ID,形如postgres-6fego161 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 新的数据库实例名字 + InstanceName *string `json:"InstanceName,omitempty" name:"InstanceName"` +} + +func (r *ModifyDBInstanceNameRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ModifyDBInstanceNameRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ModifyDBInstanceNameResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *ModifyDBInstanceNameResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ModifyDBInstanceNameResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ModifyDBInstancesProjectRequest struct { + *tchttp.BaseRequest + + // postgresql实例ID数组 + DBInstanceIdSet []*string `json:"DBInstanceIdSet,omitempty" name:"DBInstanceIdSet" list` + + // postgresql实例所属新项目的ID + ProjectId *string `json:"ProjectId,omitempty" name:"ProjectId"` +} + +func (r *ModifyDBInstancesProjectRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ModifyDBInstancesProjectRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ModifyDBInstancesProjectResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 转移项目成功的实例个数 + Count *int64 `json:"Count,omitempty" name:"Count"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *ModifyDBInstancesProjectResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ModifyDBInstancesProjectResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type NormalQueryItem struct { + + // 用户名 + UserName *string `json:"UserName,omitempty" name:"UserName"` + + // 调用次数 + Calls *int64 `json:"Calls,omitempty" name:"Calls"` + + // 粒度点 + CallsGrids []*int64 `json:"CallsGrids,omitempty" name:"CallsGrids" list` + + // 花费总时间 + CostTime *float64 `json:"CostTime,omitempty" name:"CostTime"` + + // 影响的行数 + Rows *int64 `json:"Rows,omitempty" name:"Rows"` + + // 花费最小时间 + MinCostTime *float64 `json:"MinCostTime,omitempty" name:"MinCostTime"` + + // 花费最大时间 + MaxCostTime *float64 `json:"MaxCostTime,omitempty" name:"MaxCostTime"` + + // 最早一条慢SQL时间 + FirstTime *string `json:"FirstTime,omitempty" name:"FirstTime"` + + // 最晚一条慢SQL时间 + LastTime *string `json:"LastTime,omitempty" name:"LastTime"` + + // 读共享内存块数 + SharedReadBlks *int64 `json:"SharedReadBlks,omitempty" name:"SharedReadBlks"` + + // 写共享内存块数 + SharedWriteBlks *int64 `json:"SharedWriteBlks,omitempty" name:"SharedWriteBlks"` + + // 读io总耗时 + ReadCostTime *int64 `json:"ReadCostTime,omitempty" name:"ReadCostTime"` + + // 写io总耗时 + WriteCostTime *int64 `json:"WriteCostTime,omitempty" name:"WriteCostTime"` + + // 数据库名字 + DatabaseName *string `json:"DatabaseName,omitempty" name:"DatabaseName"` + + // 脱敏后的慢SQL + NormalQuery *string `json:"NormalQuery,omitempty" name:"NormalQuery"` +} + +type OpenDBExtranetAccessRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-hez4fh0v + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *OpenDBExtranetAccessRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *OpenDBExtranetAccessRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type OpenDBExtranetAccessResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 异步任务流程ID + FlowId *int64 `json:"FlowId,omitempty" name:"FlowId"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *OpenDBExtranetAccessResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *OpenDBExtranetAccessResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type OpenServerlessDBExtranetAccessRequest struct { + *tchttp.BaseRequest + + // 实例的唯一标识符 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例名称 + DBInstanceName *string `json:"DBInstanceName,omitempty" name:"DBInstanceName"` +} + +func (r *OpenServerlessDBExtranetAccessRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *OpenServerlessDBExtranetAccessRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type OpenServerlessDBExtranetAccessResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *OpenServerlessDBExtranetAccessResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *OpenServerlessDBExtranetAccessResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type PgDeal struct { + + // 订单名 + DealName *string `json:"DealName,omitempty" name:"DealName"` + + // 所属用户 + OwnerUin *string `json:"OwnerUin,omitempty" name:"OwnerUin"` + + // 订单涉及多少个实例 + Count *int64 `json:"Count,omitempty" name:"Count"` + + // 付费模式。1-预付费;0-后付费 + PayMode *int64 `json:"PayMode,omitempty" name:"PayMode"` + + // 异步任务流程ID + FlowId *int64 `json:"FlowId,omitempty" name:"FlowId"` + + // 实例ID数组 + DBInstanceIdSet []*string `json:"DBInstanceIdSet,omitempty" name:"DBInstanceIdSet" list` +} + +type RegionInfo struct { + + // 该地域对应的英文名称 + Region *string `json:"Region,omitempty" name:"Region"` + + // 该地域对应的中文名称 + RegionName *string `json:"RegionName,omitempty" name:"RegionName"` + + // 该地域对应的数字编号 + RegionId *uint64 `json:"RegionId,omitempty" name:"RegionId"` + + // 可用状态,UNAVAILABLE表示不可用,AVAILABLE表示可用 + RegionState *string `json:"RegionState,omitempty" name:"RegionState"` +} + +type RenewInstanceRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-6fego161 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 续费多少个月 + Period *int64 `json:"Period,omitempty" name:"Period"` + + // 是否自动使用代金券,1是,0否,默认不使用 + AutoVoucher *int64 `json:"AutoVoucher,omitempty" name:"AutoVoucher"` + + // 代金券ID列表,目前仅支持指定一张代金券 + VoucherIds []*string `json:"VoucherIds,omitempty" name:"VoucherIds" list` +} + +func (r *RenewInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *RenewInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type RenewInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 订单名 + DealName *string `json:"DealName,omitempty" name:"DealName"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *RenewInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *RenewInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ResetAccountPasswordRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-4wdeb0zv + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例账户名 + UserName *string `json:"UserName,omitempty" name:"UserName"` + + // UserName账户对应的新密码 + Password *string `json:"Password,omitempty" name:"Password"` +} + +func (r *ResetAccountPasswordRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ResetAccountPasswordRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ResetAccountPasswordResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *ResetAccountPasswordResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *ResetAccountPasswordResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type RestartDBInstanceRequest struct { + *tchttp.BaseRequest + + // 实例ID,形如postgres-6r233v55 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` +} + +func (r *RestartDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *RestartDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type RestartDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 异步流程ID + FlowId *int64 `json:"FlowId,omitempty" name:"FlowId"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *RestartDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *RestartDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type ServerlessDBAccount struct { + + // 用户名 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBUser *string `json:"DBUser,omitempty" name:"DBUser"` + + // 密码 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBPassword *string `json:"DBPassword,omitempty" name:"DBPassword"` + + // 连接数限制 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBConnLimit *int64 `json:"DBConnLimit,omitempty" name:"DBConnLimit"` +} + +type ServerlessDBInstance struct { + + // 实例id,唯一标识符 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 实例名称 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBInstanceName *string `json:"DBInstanceName,omitempty" name:"DBInstanceName"` + + // 实例状态 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBInstanceStatus *string `json:"DBInstanceStatus,omitempty" name:"DBInstanceStatus"` + + // 地域 + // 注意:此字段可能返回 null,表示取不到有效值。 + Region *string `json:"Region,omitempty" name:"Region"` + + // 可用区 + // 注意:此字段可能返回 null,表示取不到有效值。 + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // projectId + // 注意:此字段可能返回 null,表示取不到有效值。 + ProjectId *int64 `json:"ProjectId,omitempty" name:"ProjectId"` + + // VpcId + // 注意:此字段可能返回 null,表示取不到有效值。 + VpcId *string `json:"VpcId,omitempty" name:"VpcId"` + + // 子网id + // 注意:此字段可能返回 null,表示取不到有效值。 + SubnetId *string `json:"SubnetId,omitempty" name:"SubnetId"` + + // 字符集 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBCharset *string `json:"DBCharset,omitempty" name:"DBCharset"` + + // 数据库版本 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBVersion *string `json:"DBVersion,omitempty" name:"DBVersion"` + + // 创建时间 + // 注意:此字段可能返回 null,表示取不到有效值。 + CreateTime *string `json:"CreateTime,omitempty" name:"CreateTime"` + + // 实例网络信息 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBInstanceNetInfo []*ServerlessDBInstanceNetInfo `json:"DBInstanceNetInfo,omitempty" name:"DBInstanceNetInfo" list` + + // 实例账户信息 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBAccountSet []*ServerlessDBAccount `json:"DBAccountSet,omitempty" name:"DBAccountSet" list` + + // 实例下的db信息 + // 注意:此字段可能返回 null,表示取不到有效值。 + DBDatabaseList []*string `json:"DBDatabaseList,omitempty" name:"DBDatabaseList" list` +} + +type ServerlessDBInstanceNetInfo struct { + + // 地址 + // 注意:此字段可能返回 null,表示取不到有效值。 + Address *string `json:"Address,omitempty" name:"Address"` + + // ip地址 + // 注意:此字段可能返回 null,表示取不到有效值。 + Ip *string `json:"Ip,omitempty" name:"Ip"` + + // 端口号 + // 注意:此字段可能返回 null,表示取不到有效值。 + Port *int64 `json:"Port,omitempty" name:"Port"` + + // 状态 + // 注意:此字段可能返回 null,表示取不到有效值。 + Status *string `json:"Status,omitempty" name:"Status"` + + // 网络类型 + // 注意:此字段可能返回 null,表示取不到有效值。 + NetType *string `json:"NetType,omitempty" name:"NetType"` +} + +type SetAutoRenewFlagRequest struct { + *tchttp.BaseRequest + + // 实例ID数组 + DBInstanceIdSet []*string `json:"DBInstanceIdSet,omitempty" name:"DBInstanceIdSet" list` + + // 续费标记。0-正常续费;1-自动续费;2-到期不续费 + AutoRenewFlag *int64 `json:"AutoRenewFlag,omitempty" name:"AutoRenewFlag"` +} + +func (r *SetAutoRenewFlagRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *SetAutoRenewFlagRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type SetAutoRenewFlagResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 设置成功的实例个数 + Count *int64 `json:"Count,omitempty" name:"Count"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *SetAutoRenewFlagResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *SetAutoRenewFlagResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type SlowlogDetail struct { + + // 花费总时间 + TotalTime *float64 `json:"TotalTime,omitempty" name:"TotalTime"` + + // 调用总次数 + TotalCalls *int64 `json:"TotalCalls,omitempty" name:"TotalCalls"` + + // 脱敏后的慢SQL列表 + NormalQueries []*NormalQueryItem `json:"NormalQueries,omitempty" name:"NormalQueries" list` +} + +type SpecInfo struct { + + // 地域英文编码,对应RegionSet的Region字段 + Region *string `json:"Region,omitempty" name:"Region"` + + // 区域英文编码,对应ZoneSet的Zone字段 + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // 规格详细信息列表 + SpecItemInfoList []*SpecItemInfo `json:"SpecItemInfoList,omitempty" name:"SpecItemInfoList" list` +} + +type SpecItemInfo struct { + + // 规格ID + SpecCode *string `json:"SpecCode,omitempty" name:"SpecCode"` + + // PostgreSQL的内核版本编号 + Version *string `json:"Version,omitempty" name:"Version"` + + // 内核编号对应的完整版本名称 + VersionName *string `json:"VersionName,omitempty" name:"VersionName"` + + // CPU核数 + Cpu *uint64 `json:"Cpu,omitempty" name:"Cpu"` + + // 内存大小,单位:MB + Memory *uint64 `json:"Memory,omitempty" name:"Memory"` + + // 该规格所支持最大存储容量,单位:GB + MaxStorage *uint64 `json:"MaxStorage,omitempty" name:"MaxStorage"` + + // 该规格所支持最小存储容量,单位:GB + MinStorage *uint64 `json:"MinStorage,omitempty" name:"MinStorage"` + + // 该规格的预估QPS + Qps *uint64 `json:"Qps,omitempty" name:"Qps"` + + // 该规格对应的计费ID + Pid *uint64 `json:"Pid,omitempty" name:"Pid"` + + // 机器类型 + Type *string `json:"Type,omitempty" name:"Type"` +} + +type UpgradeDBInstanceRequest struct { + *tchttp.BaseRequest + + // 升级后的实例内存大小,单位GB + Memory *int64 `json:"Memory,omitempty" name:"Memory"` + + // 升级后的实例磁盘大小,单位GB + Storage *int64 `json:"Storage,omitempty" name:"Storage"` + + // 实例ID,形如postgres-lnp6j617 + DBInstanceId *string `json:"DBInstanceId,omitempty" name:"DBInstanceId"` + + // 是否自动使用代金券,1是,0否,默认不使用 + AutoVoucher *int64 `json:"AutoVoucher,omitempty" name:"AutoVoucher"` + + // 代金券ID列表,目前仅支持指定一张代金券 + VoucherIds []*string `json:"VoucherIds,omitempty" name:"VoucherIds" list` + + // 活动ID + ActivityId *int64 `json:"ActivityId,omitempty" name:"ActivityId"` +} + +func (r *UpgradeDBInstanceRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *UpgradeDBInstanceRequest) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type UpgradeDBInstanceResponse struct { + *tchttp.BaseResponse + Response *struct { + + // 交易名字。 + DealName *string `json:"DealName,omitempty" name:"DealName"` + + // 冻结流水号 + BillId *string `json:"BillId,omitempty" name:"BillId"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitempty" name:"RequestId"` + } `json:"Response"` +} + +func (r *UpgradeDBInstanceResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +func (r *UpgradeDBInstanceResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +type Xlog struct { + + // 备份文件唯一标识 + Id *int64 `json:"Id,omitempty" name:"Id"` + + // 文件生成的开始时间 + StartTime *string `json:"StartTime,omitempty" name:"StartTime"` + + // 文件生成的结束时间 + EndTime *string `json:"EndTime,omitempty" name:"EndTime"` + + // 内网下载地址 + InternalAddr *string `json:"InternalAddr,omitempty" name:"InternalAddr"` + + // 外网下载地址 + ExternalAddr *string `json:"ExternalAddr,omitempty" name:"ExternalAddr"` + + // 备份文件大小 + Size *int64 `json:"Size,omitempty" name:"Size"` +} + +type ZoneInfo struct { + + // 该可用区的英文名称 + Zone *string `json:"Zone,omitempty" name:"Zone"` + + // 该可用区的中文名称 + ZoneName *string `json:"ZoneName,omitempty" name:"ZoneName"` + + // 该可用区对应的数字编号 + ZoneId *uint64 `json:"ZoneId,omitempty" name:"ZoneId"` + + // 可用状态,UNAVAILABLE表示不可用,AVAILABLE表示可用 + ZoneState *string `json:"ZoneState,omitempty" name:"ZoneState"` +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 093fefe950..e7e80d403c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -522,7 +522,7 @@ github.com/stretchr/testify/mock github.com/subosito/gotenv # github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 github.com/tdakkota/asciicheck -# github.com/tencentcloud/tencentcloud-sdk-go v3.0.187+incompatible +# github.com/tencentcloud/tencentcloud-sdk-go v3.0.189+incompatible github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam/v20190116 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312 @@ -541,6 +541,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es/v20180416 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20180408 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor/v20180724 +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf/v20180416 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sts/v20180813 diff --git a/website/docs/d/postgresql_instances.html.markdown b/website/docs/d/postgresql_instances.html.markdown new file mode 100644 index 0000000000..74cac39214 --- /dev/null +++ b/website/docs/d/postgresql_instances.html.markdown @@ -0,0 +1,58 @@ +--- +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_postgresql_instances" +sidebar_current: "docs-tencentcloud-datasource-postgresql_instances" +description: |- + Use this data source to query postgresql instances +--- + +# tencentcloud_postgresql_instances + +Use this data source to query postgresql instances + +## Example Usage + +```hcl +data "tencentcloud_postgresql_instances" "name" { + name = "test" +} + +data "tencentcloud_postgresql_instances" "project" { + project_id = 0 +} + +data "tencentcloud_postgresql_instances" "id" { + id = "postgres-h9t4fde1" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `id` - (Optional) Name of the postgresql instance to be query. +* `name` - (Optional) Name of the postgresql instance to be queey. +* `project_id` - (Optional) Project id of the postgresql instance to be query. +* `result_output_file` - (Optional) Used to save results. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `instance_list` - A list of postgresql instances. Each element contains the following attributes. + * `auto_renew_flag` - Auto renew flag. + * `availability_zone` - Availability zone. + * `charge_type` - Pay type of the postgresql instance. + * `create_time` - Create time of the postgresql instance. + * `engine_version` - Version of the postgresql db engine. + * `id` - Id of the postgresql instance. + * `memory` - Memory size (in GB). + * `name` - Name of the postgresql instance. + * `project_id` - Project ID, default value is 0. + * `public_access_host` - host for public access. + * `public_access_switch` - Indicates whether to enable the access to an instance from public network or not. + * `storage` - Disk size (in GB). + * `subnet_id` - ID of subnet. + * `vpc_id` - ID of VPC. + + diff --git a/website/docs/d/postgresql_speccodes.html.markdown b/website/docs/d/postgresql_speccodes.html.markdown new file mode 100644 index 0000000000..ed0edbf143 --- /dev/null +++ b/website/docs/d/postgresql_speccodes.html.markdown @@ -0,0 +1,42 @@ +--- +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_postgresql_speccodes" +sidebar_current: "docs-tencentcloud-datasource-postgresql_speccodes" +description: |- + Use this data source to get the available product configs of the postgresql instance. +--- + +# tencentcloud_postgresql_speccodes + +Use this data source to get the available product configs of the postgresql instance. + +## Example Usage + +```hcl +data "tencentcloud_postgresql_speccodes" "foo" { + availability_zone = "ap-shanghai-2" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `availability_zone` - (Required) The zone of the postgresql instance to query. +* `result_output_file` - (Optional) Used to save results. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `list` - A list of zones will be exported and its every element contains the following attributes: + * `cpu_number` - The CPU number of the postgresql instance. + * `id` - Id of the speccode of the postgresql instance. This parameter is used as `spec_code` for the creation of postgresql instance. + * `memory` - Memory size(in GB). + * `qps` - The QPS of the postgresql instance. + * `storage_max` - The max volume size(in GB). + * `storage_min` - The minimum volume size(in GB). + * `version_name` - The version name of the postgresql instance. + * `version` - The version of the postgresql instance. + + diff --git a/website/docs/r/postgresql_instance.html.markdown b/website/docs/r/postgresql_instance.html.markdown new file mode 100644 index 0000000000..6813743598 --- /dev/null +++ b/website/docs/r/postgresql_instance.html.markdown @@ -0,0 +1,56 @@ +--- +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_postgresql_instance" +sidebar_current: "docs-tencentcloud-resource-postgresql_instance" +description: |- + Use this resource to create postgresql instance +--- + +# tencentcloud_postgresql_instance + +Use this resource to create postgresql instance + +## Example Usage + + + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Name of the postgresql instance. +* `root_password` - (Required) Password of root account. This parameter can be specified when you purchase master instances, but it should be ignored when you purchase read-only instances or disaster recovery instances. +* `spec_code` - (Required, ForceNew) The id of specification of the postgresql instance, like `cdb.pg.z1.2g`, which can be queried with data source `tencentcloud_postgresql_speccodes`. +* `storage` - (Required) Disk size (in GB). Allowed value is range from 10 to 1000, and the value must be a multiple of 10. +* `availability_zone` - (Optional, ForceNew) Availability zone. +* `charge_type` - (Optional, ForceNew) Pay type of the postgresql instance. For now, only `POSTPAID` is valid. +* `charset` - (Optional, ForceNew) Charset of the root account. Valid values are `UTF8`,`LATIN1`. +* `engine_version` - (Optional, ForceNew) Version of the postgresql engine. Allowed values are `9.3.5`, `9.5.4`, `10.4`. +* `memory` - (Optional) Memory size (in MB). +* `project_id` - (Optional) Project ID, default value is 0. +* `public_access_switch` - (Optional) Indicates whether to enable the access to an instance from public network or not. +* `subnet_id` - (Optional, ForceNew) ID of subnet. +* `vpc_id` - (Optional, ForceNew) ID of VPC. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `create_time` - Create time of the postgresql instance. +* `inner_access_ip` - Ip for inner access. +* `inner_access_port` - Port for inner access. +* `public_access_host` - Host for public access. +* `public_access_port` - Port for public access. + + +## Import + +postgresql instance can be imported using the id, e.g. + +``` +$ terraform import tencentcloud_postgresql_instance.foo postgres-cda1iex1 +``` + +``` + From 5414c0352955529c88989067ee7577b3ce4cd7a1 Mon Sep 17 00:00:00 2001 From: gailwang Date: Mon, 15 Jun 2020 21:57:09 +0800 Subject: [PATCH 02/17] remove extra tf info --- examples/tencentcloud-postgresql/main.tf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/examples/tencentcloud-postgresql/main.tf b/examples/tencentcloud-postgresql/main.tf index b1c3b637f6..23e5e992f5 100644 --- a/examples/tencentcloud-postgresql/main.tf +++ b/examples/tencentcloud-postgresql/main.tf @@ -1,8 +1,3 @@ - -provider "tencentcloud" { - region = "ap-guangzhou" -} - resource "tencentcloud_vpc" "foo" { name = "example" cidr_block = "10.0.0.0/16" From 797bdb8b1197b62b9d6ae835611ac7850cf26db0 Mon Sep 17 00:00:00 2001 From: gailwang Date: Mon, 15 Jun 2020 21:59:49 +0800 Subject: [PATCH 03/17] add changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c06ddf50de..525aa6aac5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ ## 1.37.0 (Unreleased) + +FEATURES: +* **New Resource**: `tencentcloud_postgresql_instance` +* **New Data Source**: `tencentcloud_postgresql_instances` +* **New Data Source**: `tencentcloud_postgresql_speccodes` + ## 1.36.1 (June 12, 2020) ENHANCEMENTS: From 36946cd6c105b3ec0f627076fa6d5ecfbe56c7df Mon Sep 17 00:00:00 2001 From: gailwang Date: Mon, 15 Jun 2020 22:08:55 +0800 Subject: [PATCH 04/17] fix error with attributes test --- ...ata_source_tc_postgresql_instances_test.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/tencentcloud/data_source_tc_postgresql_instances_test.go b/tencentcloud/data_source_tc_postgresql_instances_test.go index eeec9ddc7c..d89a4ee516 100644 --- a/tencentcloud/data_source_tc_postgresql_instances_test.go +++ b/tencentcloud/data_source_tc_postgresql_instances_test.go @@ -18,16 +18,15 @@ func TestAccTencentCloudDataPostgresqlInstances(t *testing.T) { Config: testAccTencentCloudDataPostgresqlInstanceBasic, Check: resource.ComposeTestCheckFunc( testAccCheckPostgresqlInstanceExists("tencentcloud_postgresql_instance.test"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#", "1"), - resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "list.0.id"), - resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "list.0.create_time"), - resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "list.0.id"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.0.charge_type", "POSTPAID_BY_HOUR"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.engine_version", "9.3.5"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.project_id", "0"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.mem_size", "2"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.volume_size", "1"), - //resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "list.#.volume_size", "1"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#", "1"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.id"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.create_time"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.id"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.charge_type", "POSTPAID_BY_HOUR"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.engine_version", "9.3.5"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.project_id", "0"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.mem_size", "2"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.volume_size", "1"), ), }, }, From 21fc827e43df2bbf302d96619489916a8e0d6be6 Mon Sep 17 00:00:00 2001 From: gailwang Date: Mon, 15 Jun 2020 22:24:20 +0800 Subject: [PATCH 05/17] fix spelling error --- .../data_source_tc_postgresql_instances_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tencentcloud/data_source_tc_postgresql_instances_test.go b/tencentcloud/data_source_tc_postgresql_instances_test.go index d89a4ee516..5038f689d5 100644 --- a/tencentcloud/data_source_tc_postgresql_instances_test.go +++ b/tencentcloud/data_source_tc_postgresql_instances_test.go @@ -22,11 +22,11 @@ func TestAccTencentCloudDataPostgresqlInstances(t *testing.T) { resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.id"), resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.create_time"), resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.id"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.charge_type", "POSTPAID_BY_HOUR"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.engine_version", "9.3.5"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.project_id", "0"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.mem_size", "2"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.#.volume_size", "1"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.charge_type", "postpaid"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.engine_version", "9.3.5"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.project_id", "0"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.memory", "2"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.storage", "100"), ), }, }, From 2202d83f1e3d2c4514583b34f6cb0ef5e2cb18d8 Mon Sep 17 00:00:00 2001 From: gailwang Date: Tue, 16 Jun 2020 16:22:49 +0800 Subject: [PATCH 06/17] fix bugs; rename; add attributes --- examples/tencentcloud-postgresql/main.tf | 4 +- tencentcloud/connectivity/client.go | 10 +- .../data_source_tc_postgresql_instances.go | 64 ++++-- ...ata_source_tc_postgresql_instances_test.go | 6 +- ...=> data_source_tc_postgresql_specinfos.go} | 33 ++- ...ta_source_tc_postgresql_specinfos_test.go} | 28 +-- tencentcloud/extension_postgresql.go | 7 +- tencentcloud/provider.go | 2 +- .../resource_tc_postgresql_instance.go | 214 ++++++++++-------- .../resource_tc_postgresql_instance_test.go | 14 +- .../service_tencentcloud_postgresql.go | 142 ++++++------ .../docs/d/postgresql_instances.html.markdown | 8 +- .../docs/d/postgresql_specinfos.html.markdown | 42 ++++ .../docs/r/postgresql_instance.html.markdown | 8 +- 14 files changed, 342 insertions(+), 240 deletions(-) rename tencentcloud/{data_source_tc_postgresql_speccodes.go => data_source_tc_postgresql_specinfos.go} (78%) rename tencentcloud/{data_source_tc_postgresql_speccodes_test.go => data_source_tc_postgresql_specinfos_test.go} (62%) create mode 100644 website/docs/d/postgresql_specinfos.html.markdown diff --git a/examples/tencentcloud-postgresql/main.tf b/examples/tencentcloud-postgresql/main.tf index 23e5e992f5..120387aadf 100644 --- a/examples/tencentcloud-postgresql/main.tf +++ b/examples/tencentcloud-postgresql/main.tf @@ -14,7 +14,7 @@ resource "tencentcloud_subnet" "foo" { resource "tencentcloud_postgresql_instance" "example" { name = "tf_postsql_instance_111" availability_zone = var.availability_zone - charge_type = "postpaid" + charge_type = "POSTPAID_BY_HOUR" vpc_id = tencentcloud_vpc.foo.id subnet_id = tencentcloud_subnet.foo.id engine_version = "9.3.5" @@ -38,6 +38,6 @@ data "tencentcloud_postgresql_instances" "charge_example" { name = tencentcloud_postgresql_instance.example.name } -data "tencentcloud_postgresql_speccodes" "example" { +data "tencentcloud_postgresql_specinfos" "example" { availability_zone = var.availability_zone } diff --git a/tencentcloud/connectivity/client.go b/tencentcloud/connectivity/client.go index 057ea1e2ed..1a16059a1a 100644 --- a/tencentcloud/connectivity/client.go +++ b/tencentcloud/connectivity/client.go @@ -24,7 +24,7 @@ import ( gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529" mongodb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20180408" monitor "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor/v20180724" - postrge "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312" + postgre "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312" redis "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412" scf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf/v20180416" sts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sts/v20180813" @@ -65,7 +65,7 @@ type TencentCloudClient struct { cdnConn *cdn.Client monitorConn *monitor.Client esConn *es.Client - postgreConn *postrge.Client + postgreConn *postgre.Client } // NewClientProfile returns a new ClientProfile @@ -401,14 +401,14 @@ func (me *TencentCloudClient) UseEsClient() *es.Client { return me.esConn } -// UsePostgreClient returns es client for service -func (me *TencentCloudClient) UsePostgresqlClient() *postrge.Client { +// UsePostgreClient returns postgresql client for service +func (me *TencentCloudClient) UsePostgresqlClient() *postgre.Client { if me.postgreConn != nil { return me.postgreConn } cpf := me.NewClientProfile(300) - me.postgreConn, _ = postrge.NewClient(me.Credential, me.Region, cpf) + me.postgreConn, _ = postgre.NewClient(me.Credential, me.Region, cpf) me.postgreConn.WithHttpTransport(&LogRoundTripper{}) return me.postgreConn diff --git a/tencentcloud/data_source_tc_postgresql_instances.go b/tencentcloud/data_source_tc_postgresql_instances.go index 8eb76c525b..6bf3d2d8b4 100644 --- a/tencentcloud/data_source_tc_postgresql_instances.go +++ b/tencentcloud/data_source_tc_postgresql_instances.go @@ -101,7 +101,7 @@ func dataSourceTencentCloudPostgresqlInstances() *schema.Resource { "memory": { Type: schema.TypeInt, Computed: true, - Description: "Memory size (in GB).", + Description: "Memory size (in MB).", }, "project_id": { Type: schema.TypeInt, @@ -121,7 +121,27 @@ func dataSourceTencentCloudPostgresqlInstances() *schema.Resource { "public_access_host": { Type: schema.TypeString, Computed: true, - Description: "host for public access.", + Description: "Host for public access.", + }, + "public_access_port": { + Type: schema.TypeInt, + Computed: true, + Description: "Port for public access.", + }, + "private_access_ip": { + Type: schema.TypeString, + Computed: true, + Description: "Ip address for private access.", + }, + "private_access_port": { + Type: schema.TypeInt, + Computed: true, + Description: "Port for private access.", + }, + "charset": { + Type: schema.TypeString, + Computed: true, + Description: "Charset of the postgresql instance.", }, "create_time": { Type: schema.TypeString, @@ -136,7 +156,7 @@ func dataSourceTencentCloudPostgresqlInstances() *schema.Resource { } func dataSourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta interface{}) error { - defer logElapsed("data_source.tencentcloud_postgresql_instances.read") + defer logElapsed("data_source.tencentcloud_postgresql_instances.read")() logId := getLogId(contextNil) ctx := context.WithValue(context.TODO(), logIdKey, logId) @@ -169,28 +189,38 @@ func dataSourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta i for _, v := range instanceList { listItem := make(map[string]interface{}) - listItem["id"] = *v.DBInstanceId - listItem["name"] = *v.DBInstanceName - listItem["charge_type"] = *v.PayType - listItem["auto_renew_flag"] = int(*v.AutoRenew) - listItem["project_id"] = int(*v.ProjectId) - listItem["storage"] = int(*v.DBInstanceStorage) - listItem["memory"] = int(*v.DBInstanceMemory) - listItem["availability_zone"] = *v.Zone - listItem["create_time"] = *v.CreateTime - listItem["vpc_id"] = *v.VpcId - listItem["subnet_id"] = *v.SubnetId - listItem["engine_version"] = *v.DBVersion + listItem["id"] = v.DBInstanceId + listItem["name"] = v.DBInstanceName + listItem["auto_renew_flag"] = v.AutoRenew + listItem["project_id"] = v.ProjectId + listItem["storage"] = v.DBInstanceStorage + listItem["memory"] = v.DBInstanceMemory + listItem["availability_zone"] = v.Zone + listItem["create_time"] = v.CreateTime + listItem["vpc_id"] = v.VpcId + listItem["subnet_id"] = v.SubnetId + listItem["engine_version"] = v.DBVersion listItem["public_access_switch"] = false + listItem["charset"] = v.DBCharset listItem["public_access_host"] = "" for _, netInfo := range v.DBInstanceNetInfo { if *netInfo.NetType == "public" { - if *netInfo.Status == "open" { + if *netInfo.Status == "opened" || *netInfo.Status == "1" { listItem["public_access_switch"] = true } - listItem["public_access_host"] = *netInfo.Address + listItem["public_access_host"] = netInfo.Address + listItem["public_access_port"] = netInfo.Port + } + if *netInfo.NetType == "private" { + listItem["private_access_ip"] = netInfo.Ip + listItem["private_access_port"] = netInfo.Port } } + if *v.PayType == POSTGRESQL_PAYTYPE_PREPAID { + listItem["charge_type"] = COMMON_PAYTYPE_PREPAID + } else { + listItem["charge_type"] = COMMON_PAYTYPE_POSTPAID + } list = append(list, listItem) ids = append(ids, *v.DBInstanceId) } diff --git a/tencentcloud/data_source_tc_postgresql_instances_test.go b/tencentcloud/data_source_tc_postgresql_instances_test.go index 5038f689d5..3917f98ebc 100644 --- a/tencentcloud/data_source_tc_postgresql_instances_test.go +++ b/tencentcloud/data_source_tc_postgresql_instances_test.go @@ -22,11 +22,15 @@ func TestAccTencentCloudDataPostgresqlInstances(t *testing.T) { resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.id"), resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.create_time"), resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.id"), - resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.charge_type", "postpaid"), + resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.charge_type", "POSTPAID_BY_HOUR"), resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.engine_version", "9.3.5"), resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.project_id", "0"), resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.memory", "2"), resource.TestCheckResourceAttr(testDataPostgresqlInstancesName, "instance_list.0.storage", "100"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.private_access_ip"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.private_access_port"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.public_access_switch"), + resource.TestCheckResourceAttrSet(testDataPostgresqlInstancesName, "instance_list.0.charset"), ), }, }, diff --git a/tencentcloud/data_source_tc_postgresql_speccodes.go b/tencentcloud/data_source_tc_postgresql_specinfos.go similarity index 78% rename from tencentcloud/data_source_tc_postgresql_speccodes.go rename to tencentcloud/data_source_tc_postgresql_specinfos.go index d4b4f70c63..5520060907 100644 --- a/tencentcloud/data_source_tc_postgresql_speccodes.go +++ b/tencentcloud/data_source_tc_postgresql_specinfos.go @@ -4,7 +4,7 @@ Use this data source to get the available product configs of the postgresql inst Example Usage ```hcl -data "tencentcloud_postgresql_speccodes" "foo"{ +data "tencentcloud_postgresql_specinfos" "foo"{ availability_zone = "ap-shanghai-2" } ``` @@ -18,9 +18,9 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) -func dataSourceTencentCloudPostgresqlSpeccodes() *schema.Resource { +func dataSourceTencentCloudPostgresqlSpecinfos() *schema.Resource { return &schema.Resource{ - Read: dataSourceTencentCloudPostgresqlSpeccodesRead, + Read: dataSourceTencentCloudPostgresqlSpecinfosRead, Schema: map[string]*schema.Schema{ "availability_zone": { Type: schema.TypeString, @@ -46,7 +46,7 @@ func dataSourceTencentCloudPostgresqlSpeccodes() *schema.Resource { "memory": { Type: schema.TypeInt, Computed: true, - Description: "Memory size(in GB).", + Description: "Memory size(in MB).", }, "storage_min": { Type: schema.TypeInt, @@ -85,8 +85,8 @@ func dataSourceTencentCloudPostgresqlSpeccodes() *schema.Resource { } } -func dataSourceTencentCloudPostgresqlSpeccodesRead(d *schema.ResourceData, meta interface{}) error { - defer logElapsed("data_source.tencentcloud_postgresql_speccodes.read")() +func dataSourceTencentCloudPostgresqlSpecinfosRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("data_source.tencentcloud_postgresql_specinfos.read")() logId := getLogId(contextNil) ctx := context.WithValue(context.TODO(), logIdKey, logId) @@ -95,12 +95,11 @@ func dataSourceTencentCloudPostgresqlSpeccodesRead(d *schema.ResourceData, meta } zone := d.Get("availability_zone").(string) - speccodes, err := service.DescribeSpecCodes(ctx, zone) + speccodes, err := service.DescribeSpecinfos(ctx, zone) if err != nil { - speccodes, err = service.DescribeSpecCodes(ctx, zone) + speccodes, err = service.DescribeSpecinfos(ctx, zone) } if err != nil { - log.Printf("err %+v", err) return err } @@ -108,14 +107,14 @@ func dataSourceTencentCloudPostgresqlSpeccodesRead(d *schema.ResourceData, meta for _, v := range speccodes { listItem := make(map[string]interface{}) - listItem["id"] = *v.SpecCode - listItem["memory"] = int(*v.Memory) - listItem["storage_min"] = int(*v.MinStorage) - listItem["storage_max"] = int(*v.MaxStorage) - listItem["cpu_number"] = int(*v.Cpu) - listItem["qps"] = int(*v.Qps) - listItem["version"] = *v.Version - listItem["version_name"] = *v.VersionName + listItem["id"] = v.SpecCode + listItem["memory"] = v.Memory + listItem["storage_min"] = v.MinStorage + listItem["storage_max"] = v.MaxStorage + listItem["cpu_number"] = v.Cpu + listItem["qps"] = v.Qps + listItem["version"] = v.Version + listItem["version_name"] = v.VersionName list = append(list, listItem) } d.SetId("speccode." + zone) diff --git a/tencentcloud/data_source_tc_postgresql_speccodes_test.go b/tencentcloud/data_source_tc_postgresql_specinfos_test.go similarity index 62% rename from tencentcloud/data_source_tc_postgresql_speccodes_test.go rename to tencentcloud/data_source_tc_postgresql_specinfos_test.go index b92e681722..e7078d22db 100644 --- a/tencentcloud/data_source_tc_postgresql_speccodes_test.go +++ b/tencentcloud/data_source_tc_postgresql_specinfos_test.go @@ -6,7 +6,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/resource" ) -func TestAccTencentCloudPostgresqlSpeccodes_basic(t *testing.T) { +func TestAccTencentCloudPostgresqlSpecinfos_basic(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) @@ -14,26 +14,26 @@ func TestAccTencentCloudPostgresqlSpeccodes_basic(t *testing.T) { Providers: testAccProviders, Steps: []resource.TestStep{ { - Config: testAccTencentCloudPostgresqlSpeccodesConfigBasic, + Config: testAccTencentCloudPostgresqlSpecinfosConfigBasic, Check: resource.ComposeTestCheckFunc( - testAccCheckTencentCloudDataSourceID("data.tencentcloud_postgresql_speccodes.foo"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.#"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.id"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.memory"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.storage_min"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.storage_max"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.cpu_number"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.qps"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.version"), - resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_speccodes.foo", "list.0.version_name"), + testAccCheckTencentCloudDataSourceID("data.tencentcloud_postgresql_specinfos.foo"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.#"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.id"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.memory"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.storage_min"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.storage_max"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.cpu_number"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.qps"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.version"), + resource.TestCheckResourceAttrSet("data.tencentcloud_postgresql_specinfos.foo", "list.0.version_name"), ), }, }, }) } -const testAccTencentCloudPostgresqlSpeccodesConfigBasic = ` -data "tencentcloud_postgresql_speccodes" "foo"{ +const testAccTencentCloudPostgresqlSpecinfosConfigBasic = ` +data "tencentcloud_postgresql_specinfos" "foo"{ availability_zone = "ap-guangzhou-3" } ` diff --git a/tencentcloud/extension_postgresql.go b/tencentcloud/extension_postgresql.go index 4f73f105a0..b6bc5cc0b1 100644 --- a/tencentcloud/extension_postgresql.go +++ b/tencentcloud/extension_postgresql.go @@ -5,7 +5,12 @@ const ( POSTGRESQL_PAYTYPE_POSTPAID = "postpaid" ) -var POSTGRESQL_PAYTYPE = []string{POSTGRESQL_PAYTYPE_POSTPAID} +const ( + COMMON_PAYTYPE_PREPAID = "PREPAID" + COMMON_PAYTYPE_POSTPAID = "POSTPAID_BY_HOUR" +) + +var POSTGRESQL_PAYTYPE = []string{COMMON_PAYTYPE_POSTPAID} const ( POSTGRESQL_DB_VERSION_9_3_5 = "9.3.5" diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 465daaeb03..c19726625e 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -583,7 +583,7 @@ func Provider() terraform.ResourceProvider { "tencentcloud_monitor_product_namespace": dataSourceTencentMonitorProductNamespace(), "tencentcloud_elasticsearch_instances": dataSourceTencentCloudElasticsearchInstances(), "tencentcloud_postgresql_instances": dataSourceTencentCloudPostgresqlInstances(), - "tencentcloud_postgresql_speccodes": dataSourceTencentCloudPostgresqlSpeccodes(), + "tencentcloud_postgresql_specinfos": dataSourceTencentCloudPostgresqlSpecinfos(), }, ResourcesMap: map[string]*schema.Resource{ diff --git a/tencentcloud/resource_tc_postgresql_instance.go b/tencentcloud/resource_tc_postgresql_instance.go index 11fd377038..1291154acd 100644 --- a/tencentcloud/resource_tc_postgresql_instance.go +++ b/tencentcloud/resource_tc_postgresql_instance.go @@ -7,7 +7,7 @@ Example Usage resource "tencentcloud_postgresql_instance" "foo" { name = "example" availability_zone = var.availability_zone - charge_type = "postpaid" + charge_type = "POSTPAID_BY_HOUR" vpc_id = "vpc-409mvdvv" subnet_id = "subnet-nf9n81ps" engine_version = "9.3.5" @@ -62,7 +62,7 @@ func resourceTencentCloudPostgresqlInstance() *schema.Resource { Default: POSTGRESQL_PAYTYPE_POSTPAID, ForceNew: true, ValidateFunc: validateAllowedStringValue(POSTGRESQL_PAYTYPE), - Description: "Pay type of the postgresql instance. For now, only `POSTPAID` is valid.", + Description: "Pay type of the postgresql instance. For now, only `POSTPAID_BY_HOUR` is valid.", }, "engine_version": { Type: schema.TypeString, @@ -112,7 +112,7 @@ func resourceTencentCloudPostgresqlInstance() *schema.Resource { Type: schema.TypeString, ForceNew: true, Required: true, - Description: "The id of specification of the postgresql instance, like `cdb.pg.z1.2g`, which can be queried with data source `tencentcloud_postgresql_speccodes`.", + Description: "The id of specification of the postgresql instance, like `cdb.pg.z1.2g`, which can be queried with data source `tencentcloud_postgresql_specinfos`.", }, "root_password": { Type: schema.TypeString, @@ -142,19 +142,19 @@ func resourceTencentCloudPostgresqlInstance() *schema.Resource { Description: "Host for public access.", }, "public_access_port": { - Type: schema.TypeString, + Type: schema.TypeInt, Computed: true, Description: "Port for public access.", }, - "inner_access_ip": { + "private_access_ip": { Type: schema.TypeString, Computed: true, - Description: "Ip for inner access.", + Description: "Ip for private access.", }, - "inner_access_port": { - Type: schema.TypeString, + "private_access_port": { + Type: schema.TypeInt, Computed: true, - Description: "Port for inner access.", + Description: "Port for private access.", }, "create_time": { Type: schema.TypeString, @@ -166,7 +166,6 @@ func resourceTencentCloudPostgresqlInstance() *schema.Resource { } func resourceTencentCloudPostgresqlInstanceCreate(d *schema.ResourceData, meta interface{}) error { - defer logElapsed("resource.tencentcloud_postgresql_instance.create")() logId := getLogId(contextNil) @@ -189,6 +188,12 @@ func resourceTencentCloudPostgresqlInstanceCreate(d *schema.ResourceData, meta i var period = 1 //the sdk asks to set value with 1 when paytype is postpaid + if payType == COMMON_PAYTYPE_PREPAID { + payType = POSTGRESQL_PAYTYPE_PREPAID + } else { + payType = POSTGRESQL_PAYTYPE_POSTPAID + } + var instanceId string var outErr, inErr error @@ -220,6 +225,7 @@ func resourceTencentCloudPostgresqlInstanceCreate(d *schema.ResourceData, meta i if err != nil { return err } + d.SetId(instanceId) var ( password = d.Get("root_password").(string) @@ -258,24 +264,23 @@ func resourceTencentCloudPostgresqlInstanceCreate(d *schema.ResourceData, meta i } //set name - err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err := postgresqlService.ModifyPostgresqlInstanceName(ctx, instanceId, d.Get("name").(string)) - if err != nil { - return retryError(err) + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr := postgresqlService.ModifyPostgresqlInstanceName(ctx, instanceId, d.Get("name").(string)) + if inErr != nil { + return retryError(inErr) } return nil }) - if err != nil { - return err + if outErr != nil { + return outErr } //check creation done - err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + checkErr := postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if checkErr != nil { + return checkErr } - d.SetId(instanceId) return resourceTencentCloudPostgresqlInstanceRead(d, meta) } @@ -289,23 +294,24 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i instanceId := d.Id() d.Partial(true) + var outErr, inErr, checkErr error //update name if d.HasChange("name") { name := d.Get("name").(string) - err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err := postgresqlService.ModifyPostgresqlInstanceName(ctx, instanceId, name) - if err != nil { - return retryError(err) + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.ModifyPostgresqlInstanceName(ctx, instanceId, name) + if inErr != nil { + return retryError(inErr) } return nil }) - if err != nil { - return err + if outErr != nil { + return outErr } //check update public service done - err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if checkErr != nil { + return checkErr } d.SetPartial("name") } @@ -314,20 +320,20 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i if d.HasChange("memory") || d.HasChange("storage") { memory := d.Get("memory").(int) storage := d.Get("storage").(int) - err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err := postgresqlService.UpgradePostgresqlInstance(ctx, instanceId, memory, storage) - if err != nil { - return retryError(err) + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.UpgradePostgresqlInstance(ctx, instanceId, memory, storage) + if inErr != nil { + return retryError(inErr) } return nil }) - if err != nil { - return err + if outErr != nil { + return outErr } //check update public service done - err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if checkErr != nil { + return checkErr } d.SetPartial("memory") d.SetPartial("storage") @@ -336,21 +342,21 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i //update project id if d.HasChange("project_id") { projectId := d.Get("project_id").(int) - err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err := postgresqlService.ModifyPostgresqlInstanceProjectId(ctx, instanceId, projectId) - if err != nil { - return retryError(err) + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.ModifyPostgresqlInstanceProjectId(ctx, instanceId, projectId) + if inErr != nil { + return retryError(inErr) } return nil }) - if err != nil { - return err + if outErr != nil { + return outErr } //check update project id done - err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if checkErr != nil { + return checkErr } d.SetPartial("project_id") } @@ -361,20 +367,20 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i if v, ok := d.GetOkExists("public_access_switch"); ok { public_access_switch = v.(bool) } - err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err := postgresqlService.ModifyPublicService(ctx, public_access_switch, instanceId) - if err != nil { - return retryError(err) + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.ModifyPublicService(ctx, public_access_switch, instanceId) + if inErr != nil { + return retryError(inErr) } return nil }) - if err != nil { - return err + if outErr != nil { + return outErr } //check update public service done - err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if checkErr != nil { + return checkErr } d.SetPartial("public_access_switch") } @@ -382,20 +388,20 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i //update root password if d.HasChange("root_password") { //to avoid other updating process conflicts with updating password, set the password updating with the last step, there is no way to figure out whether changing password is done - err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err := postgresqlService.SetPostgresqlInstanceRootPassword(ctx, instanceId, d.Get("root_password").(string)) - if err != nil { - return retryError(err) + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.SetPostgresqlInstanceRootPassword(ctx, instanceId, d.Get("root_password").(string)) + if inErr != nil { + return retryError(inErr) } return nil }) - if err != nil { - return err + if outErr != nil { + return outErr } //check update password done - err = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + if checkErr != nil { + return checkErr } d.SetPartial("root_password") } @@ -410,19 +416,20 @@ func resourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta int logId := getLogId(contextNil) ctx := context.WithValue(context.TODO(), logIdKey, logId) + var outErr, inErr error postgresqlService := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} - instance, has, err := postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) - if err != nil { - err = resource.Retry(readRetryTimeout, func() *resource.RetryError { - instance, has, err = postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) - if err != nil { - return retryError(err) + instance, has, outErr := postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) + if outErr != nil { + outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError { + instance, has, inErr = postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) + if inErr != nil { + return retryError(inErr) } return nil }) } - if err != nil { - return err + if outErr != nil { + return outErr } if !has { d.SetId("") @@ -435,27 +442,33 @@ func resourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta int _ = d.Set("subnet_id", instance.SubnetId) _ = d.Set("engine_version", instance.DBVersion) _ = d.Set("name", instance.DBInstanceName) - _ = d.Set("charge_type", instance.PayType) _ = d.Set("charset", instance.DBCharset) + if *instance.PayType == POSTGRESQL_PAYTYPE_PREPAID { + _ = d.Set("charge_type", COMMON_PAYTYPE_PREPAID) + } else { + _ = d.Set("charge_type", COMMON_PAYTYPE_POSTPAID) + } //net status public_access_switch := false if len(instance.DBInstanceNetInfo) > 0 { for _, v := range instance.DBInstanceNetInfo { + if *v.NetType == "public" { - if *v.Status == "opened" { + //both 1 and opened used in SDK + if *v.Status == "opened" || *v.Status == "1" { public_access_switch = true } _ = d.Set("public_access_host", v.Address) _ = d.Set("public_access_port", v.Port) } - if *v.NetType == "inner" { - _ = d.Set("inner_access_ip", v.Ip) - _ = d.Set("inner_access_port", v.Port) + if *v.NetType == "private" { + _ = d.Set("private_access_ip", v.Ip) + _ = d.Set("private_access_port", v.Port) } } } - _ = d.Set("public_access_host", public_access_switch) + _ = d.Set("public_access_switch", public_access_switch) //computed _ = d.Set("create_time", instance.CreateTime) @@ -477,45 +490,46 @@ func resourceTencentCLoudPostgresqlInstanceDelete(d *schema.ResourceData, meta i instanceId := d.Id() postgresqlService := PostgresqlService{client: meta.(*TencentCloudClient).apiV3Conn} + var outErr, inErr, checkErr error //check status - err := postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) - if err != nil { - return err + if checkErr != nil { + return checkErr } - err = postgresqlService.DeletePostgresqlInstance(ctx, instanceId) + outErr = postgresqlService.DeletePostgresqlInstance(ctx, instanceId) - if err != nil { - err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { - err = postgresqlService.DeletePostgresqlInstance(ctx, instanceId) - if err != nil { - return retryError(err) + if outErr != nil { + outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + inErr = postgresqlService.DeletePostgresqlInstance(ctx, instanceId) + if inErr != nil { + return retryError(inErr) } return nil }) } - if err != nil { - return err + if outErr != nil { + return outErr } - _, has, err := postgresqlService.DescribePostgresqlInstanceById(ctx, instanceId) - if err != nil || has { - err = resource.Retry(readRetryTimeout, func() *resource.RetryError { - _, has, err = postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) - if err != nil { - return retryError(err) + _, has, outErr := postgresqlService.DescribePostgresqlInstanceById(ctx, instanceId) + if outErr != nil || has { + outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, has, inErr = postgresqlService.DescribePostgresqlInstanceById(ctx, d.Id()) + if inErr != nil { + return retryError(inErr) } if has { - err = fmt.Errorf("delete postgresql instance %s fail, instance still exists from SDK DescribePostgresqlInstanceById", instanceId) - return resource.RetryableError(err) + inErr = fmt.Errorf("delete postgresql instance %s fail, instance still exists from SDK DescribePostgresqlInstanceById", instanceId) + return resource.RetryableError(inErr) } return nil }) } - if err != nil { - return err + if outErr != nil { + return outErr } return nil } diff --git a/tencentcloud/resource_tc_postgresql_instance_test.go b/tencentcloud/resource_tc_postgresql_instance_test.go index af96d476a7..32f090c4ed 100644 --- a/tencentcloud/resource_tc_postgresql_instance_test.go +++ b/tencentcloud/resource_tc_postgresql_instance_test.go @@ -24,7 +24,7 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { testAccCheckPostgresqlInstanceExists(testPostgresqlInstanceResourceKey), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "id"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "name", "tf_postsql_instance"), - resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "postpaid"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "POSTPAID_BY_HOUR"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "vpc_id"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "subnet_id"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "memory", "2"), @@ -35,6 +35,8 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "false"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "root_password", "1qaA2k1wgvfa3ZZZ"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "availability_zone"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_ip"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_port"), ), }, { @@ -50,7 +52,7 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { testAccCheckPostgresqlInstanceExists(testPostgresqlInstanceResourceKey), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "id"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "name", "tf_postsql_instance_update"), - resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "postpaid"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "POSTPAID_BY_HOUR"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "vpc_id"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "subnet_id"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "memory", "4"), @@ -61,6 +63,10 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "true"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "root_password", "1qaA2k1wgvfa3ZZZZ"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "availability_zone"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_ip"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_port"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "public_access_host"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "public_access_port"), ), }, }, @@ -127,7 +133,7 @@ const testAccPostgresqlInstance string = testAccPostgresqlInstanceBasic + ` resource "tencentcloud_postgresql_instance" "test" { name = "tf_postsql_instance" availability_zone = var.availability_zone - charge_type = "postpaid" + charge_type = "POSTPAID_BY_HOUR" vpc_id = "` + defaultVpcId + `" subnet_id = "subnet-pyio7yog" engine_version = "9.3.5" @@ -144,7 +150,7 @@ const testAccPostgresqlInstanceUpdate string = testAccPostgresqlInstanceBasic + resource "tencentcloud_postgresql_instance" "test" { name = "tf_postsql_instance_update" availability_zone = var.availability_zone - charge_type = "postpaid" + charge_type = "POSTPAID_BY_HOUR" vpc_id = "` + defaultVpcId + `" subnet_id = "subnet-pyio7yog" engine_version = "9.3.5" diff --git a/tencentcloud/service_tencentcloud_postgresql.go b/tencentcloud/service_tencentcloud_postgresql.go index bf32df582c..1e7b09e91a 100644 --- a/tencentcloud/service_tencentcloud_postgresql.go +++ b/tencentcloud/service_tencentcloud_postgresql.go @@ -27,17 +27,17 @@ func (me *PostgresqlService) CreatePostgresqlInstance(ctx context.Context, name log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.Name = helper.String(name) - request.DBVersion = helper.String(dbVersion) - request.InstanceChargeType = helper.String(chargeType) - request.SpecCode = helper.String(specCode) + request.Name = &name + request.DBVersion = &dbVersion + request.InstanceChargeType = &chargeType + request.SpecCode = &specCode request.AutoRenewFlag = helper.IntInt64(autoRenewFlag) request.ProjectId = helper.Int64(int64(projectId)) request.Period = helper.Int64Uint64(int64(period)) - request.SubnetId = helper.String(subnetId) - request.VpcId = helper.String(vpcId) + request.SubnetId = &subnetId + request.VpcId = &vpcId request.Storage = helper.IntUint64(storage) - request.Zone = helper.String(zone) + request.Zone = &zone request.InstanceCount = helper.Int64Uint64(1) ratelimit.Check(request.GetAction()) @@ -68,9 +68,9 @@ func (me *PostgresqlService) InitPostgresqlInstance(ctx context.Context, instanc log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.Charset = helper.String(charset) + request.Charset = &charset request.AdminName = helper.String("root") - request.AdminPassword = helper.String(password) + request.AdminPassword = &password request.DBInstanceIdSet = []*string{&instanceId} ratelimit.Check(request.GetAction()) @@ -91,7 +91,7 @@ func (me *PostgresqlService) InitPostgresqlInstance(ctx context.Context, instanc return } -func (me *PostgresqlService) DescribeSpecCodes(ctx context.Context, zone string) (specCodeList []*postgresql.SpecItemInfo, errRet error) { +func (me *PostgresqlService) DescribeSpecinfos(ctx context.Context, zone string) (specCodeList []*postgresql.SpecItemInfo, errRet error) { logId := getLogId(ctx) request := postgresql.NewDescribeProductConfigRequest() defer func() { @@ -99,7 +99,7 @@ func (me *PostgresqlService) DescribeSpecCodes(ctx context.Context, zone string) log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.Zone = helper.String(zone) + request.Zone = &zone ratelimit.Check(request.GetAction()) response, err := me.client.UsePostgresqlClient().DescribeProductConfig(request) @@ -107,8 +107,9 @@ func (me *PostgresqlService) DescribeSpecCodes(ctx context.Context, zone string) errRet = err return } - if response == nil || response.Response == nil { + if response == nil || response.Response == nil || len(response.Response.SpecInfoList) == 0 { errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + return } specCodeList = response.Response.SpecInfoList[0].SpecItemInfoList @@ -125,7 +126,7 @@ func (me *PostgresqlService) ModifyPublicService(ctx context.Context, openIntern if openInternet { request := postgresql.NewOpenDBExtranetAccessRequest() - request.DBInstanceId = helper.String(instanceId) + request.DBInstanceId = &instanceId ratelimit.Check(request.GetAction()) response, err := me.client.UsePostgresqlClient().OpenDBExtranetAccess(request) @@ -137,82 +138,79 @@ func (me *PostgresqlService) ModifyPublicService(ctx context.Context, openIntern errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) } - /* - time.Sleep(10 * time.Second) - - //get instance internet status + //check open or not + err = resource.Retry(3*readRetryTimeout, func() *resource.RetryError { instance, has, err := me.DescribePostgresqlInstanceById(ctx, instanceId) if err != nil { - return err - } - if !has { - errRet = fmt.Errorf("describe postgresql instance error %s", instanceId) - return - } - for _, v := range instance.DBInstanceNetInfo { - if *v.NetType == "public" { - if *v.Status == "opening" { //const - - //sleep and retry - } else if *v.Status == "opened" { - return nil - } else { - err = fmt.Errorf("open public accress failed ,instance Id %s, status %s", instanceId, *v.Status) - return err + return retryError(err) + } else if has { + if len(instance.DBInstanceNetInfo) > 0 { + for _, v := range instance.DBInstanceNetInfo { + if *v.NetType == "public" { + if *v.Status == "opened" || *v.Status == "1" { + return nil + } else if *v.Status == "opening" || *v.Status == "initing" || *v.Status == "3" || *v.Status == "0" { + return resource.RetryableError(fmt.Errorf("status %s, postgresql instance %s waiting", *v.Status, instanceId)) + } else { + return resource.NonRetryableError(fmt.Errorf("status %s, postgresql instance %s open public service fail", *v.Status, instanceId)) + } + } } + //there is no public service yet + return resource.RetryableError(fmt.Errorf("cannot find public status, postgresql instance %s watiting", instanceId)) } else { - continue + return resource.NonRetryableError(fmt.Errorf("illegal net info of postgresql instance %s", instanceId)) } + } else { + return resource.NonRetryableError(fmt.Errorf("check postgresql instance %s fail, instance is not exist", instanceId)) } - //get no public access - err = fmt.Errorf("There is no public access with posgresql instance %s", instanceId) + }) + if err != nil { return err - */ + } } else { request := postgresql.NewCloseDBExtranetAccessRequest() - request.DBInstanceId = helper.String(instanceId) + request.DBInstanceId = &instanceId ratelimit.Check(request.GetAction()) response, err := me.client.UsePostgresqlClient().CloseDBExtranetAccess(request) if err != nil { - errRet = err - return + return err } if response == nil || response.Response == nil { errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) } - - /* - time.Sleep(10 * time.Second) - //get instance internet status + //check close or not + err = resource.Retry(3*readRetryTimeout, func() *resource.RetryError { instance, has, err := me.DescribePostgresqlInstanceById(ctx, instanceId) if err != nil { - return err - } - if !has { - errRet = fmt.Errorf("describe postgresql instance error %s", instanceId) - return - } - for _, v := range instance.DBInstanceNetInfo { - if *v.NetType == "public" { - if *v.Status == "closing" { //const - //sleep and retry - } else if *v.Status == "closed" { - return nil - } else { - err = fmt.Errorf("close public accress failed ,instance Id %s, status %s", instanceId, *v.Status) - return err + return retryError(err) + } else if has { + if len(instance.DBInstanceNetInfo) > 0 { + for _, v := range instance.DBInstanceNetInfo { + if *v.NetType == "public" { + if *v.Status == "closed" || *v.Status == "2" { + return nil + } else if *v.Status == "closing" || *v.Status == "4" { + return resource.RetryableError(fmt.Errorf("status %s, postgresql instance %s waiting", *v.Status, instanceId)) + } else { + return resource.NonRetryableError(fmt.Errorf("status %s, postgresql instance %s open public service fail", *v.Status, instanceId)) + } + } } + //there is no public service + return nil } else { - continue + return resource.NonRetryableError(fmt.Errorf("illegal net info of postgresql instance %s", instanceId)) } + } else { + return resource.NonRetryableError(fmt.Errorf("check postgresql instance %s fail, instance is not exist", instanceId)) } - //get no public access - err = fmt.Errorf("There is no public access with posgresql instance %s", instanceId) + }) + if err != nil { return err - - */ + } } return } @@ -225,7 +223,7 @@ func (me *PostgresqlService) DescribePostgresqlInstanceById(ctx context.Context, log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.DBInstanceId = helper.String(instanceId) + request.DBInstanceId = &instanceId ratelimit.Check(request.GetAction()) response, err := me.client.UsePostgresqlClient().DescribeDBInstanceAttribute(request) @@ -294,8 +292,8 @@ func (me *PostgresqlService) ModifyPostgresqlInstanceName(ctx context.Context, i log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.DBInstanceId = helper.String(instanceId) - request.InstanceName = helper.String(name) + request.DBInstanceId = &instanceId + request.InstanceName = &name ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().ModifyDBInstanceName(request) @@ -314,7 +312,7 @@ func (me *PostgresqlService) UpgradePostgresqlInstance(ctx context.Context, inst log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.DBInstanceId = helper.String(instanceId) + request.DBInstanceId = &instanceId request.Storage = helper.IntInt64(storage) request.Memory = helper.IntInt64(memory) @@ -373,7 +371,7 @@ func (me *PostgresqlService) DeletePostgresqlInstance(ctx context.Context, insta log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.DBInstanceId = helper.String(instanceId) + request.DBInstanceId = &instanceId ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().DestroyDBInstance(request) @@ -391,9 +389,9 @@ func (me *PostgresqlService) SetPostgresqlInstanceRootPassword(ctx context.Conte log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) } }() - request.DBInstanceId = helper.String(instanceId) + request.DBInstanceId = &instanceId request.UserName = helper.String("root") - request.Password = helper.String(password) + request.Password = &password ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().ResetAccountPassword(request) @@ -412,7 +410,7 @@ func (me *PostgresqlService) CheckDBInstanceStatus(ctx context.Context, instance } else if has && *instance.DBInstanceStatus == POSTGRESQL_STAUTS_RUNNING { return nil } else if !has { - return resource.NonRetryableError(fmt.Errorf("check postgresql instance fail")) + return resource.NonRetryableError(fmt.Errorf("check postgresql instance %s fail", instanceId)) } else { return resource.RetryableError(fmt.Errorf("checking postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) } diff --git a/website/docs/d/postgresql_instances.html.markdown b/website/docs/d/postgresql_instances.html.markdown index 74cac39214..49b76d139a 100644 --- a/website/docs/d/postgresql_instances.html.markdown +++ b/website/docs/d/postgresql_instances.html.markdown @@ -43,13 +43,17 @@ In addition to all arguments above, the following attributes are exported: * `auto_renew_flag` - Auto renew flag. * `availability_zone` - Availability zone. * `charge_type` - Pay type of the postgresql instance. + * `charset` - Charset of the postgresql instance. * `create_time` - Create time of the postgresql instance. * `engine_version` - Version of the postgresql db engine. * `id` - Id of the postgresql instance. - * `memory` - Memory size (in GB). + * `memory` - Memory size (in MB). * `name` - Name of the postgresql instance. + * `private_access_ip` - Ip address for private access. + * `private_access_port` - Port for private access. * `project_id` - Project ID, default value is 0. - * `public_access_host` - host for public access. + * `public_access_host` - Host for public access. + * `public_access_port` - Port for public access. * `public_access_switch` - Indicates whether to enable the access to an instance from public network or not. * `storage` - Disk size (in GB). * `subnet_id` - ID of subnet. diff --git a/website/docs/d/postgresql_specinfos.html.markdown b/website/docs/d/postgresql_specinfos.html.markdown new file mode 100644 index 0000000000..5087d72d29 --- /dev/null +++ b/website/docs/d/postgresql_specinfos.html.markdown @@ -0,0 +1,42 @@ +--- +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_postgresql_specinfos" +sidebar_current: "docs-tencentcloud-datasource-postgresql_specinfos" +description: |- + Use this data source to get the available product configs of the postgresql instance. +--- + +# tencentcloud_postgresql_specinfos + +Use this data source to get the available product configs of the postgresql instance. + +## Example Usage + +```hcl +data "tencentcloud_postgresql_specinfos" "foo" { + availability_zone = "ap-shanghai-2" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `availability_zone` - (Required) The zone of the postgresql instance to query. +* `result_output_file` - (Optional) Used to save results. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `list` - A list of zones will be exported and its every element contains the following attributes: + * `cpu_number` - The CPU number of the postgresql instance. + * `id` - Id of the speccode of the postgresql instance. This parameter is used as `spec_code` for the creation of postgresql instance. + * `memory` - Memory size(in MB). + * `qps` - The QPS of the postgresql instance. + * `storage_max` - The max volume size(in GB). + * `storage_min` - The minimum volume size(in GB). + * `version_name` - The version name of the postgresql instance. + * `version` - The version of the postgresql instance. + + diff --git a/website/docs/r/postgresql_instance.html.markdown b/website/docs/r/postgresql_instance.html.markdown index 6813743598..62f9f21256 100644 --- a/website/docs/r/postgresql_instance.html.markdown +++ b/website/docs/r/postgresql_instance.html.markdown @@ -20,10 +20,10 @@ The following arguments are supported: * `name` - (Required) Name of the postgresql instance. * `root_password` - (Required) Password of root account. This parameter can be specified when you purchase master instances, but it should be ignored when you purchase read-only instances or disaster recovery instances. -* `spec_code` - (Required, ForceNew) The id of specification of the postgresql instance, like `cdb.pg.z1.2g`, which can be queried with data source `tencentcloud_postgresql_speccodes`. +* `spec_code` - (Required, ForceNew) The id of specification of the postgresql instance, like `cdb.pg.z1.2g`, which can be queried with data source `tencentcloud_postgresql_specinfos`. * `storage` - (Required) Disk size (in GB). Allowed value is range from 10 to 1000, and the value must be a multiple of 10. * `availability_zone` - (Optional, ForceNew) Availability zone. -* `charge_type` - (Optional, ForceNew) Pay type of the postgresql instance. For now, only `POSTPAID` is valid. +* `charge_type` - (Optional, ForceNew) Pay type of the postgresql instance. For now, only `POSTPAID_BY_HOUR` is valid. * `charset` - (Optional, ForceNew) Charset of the root account. Valid values are `UTF8`,`LATIN1`. * `engine_version` - (Optional, ForceNew) Version of the postgresql engine. Allowed values are `9.3.5`, `9.5.4`, `10.4`. * `memory` - (Optional) Memory size (in MB). @@ -38,8 +38,8 @@ In addition to all arguments above, the following attributes are exported: * `id` - ID of the resource. * `create_time` - Create time of the postgresql instance. -* `inner_access_ip` - Ip for inner access. -* `inner_access_port` - Port for inner access. +* `private_access_ip` - Ip for private access. +* `private_access_port` - Port for private access. * `public_access_host` - Host for public access. * `public_access_port` - Port for public access. From 573305174a090e1e98b6ad7d2f5446156fe31445 Mon Sep 17 00:00:00 2001 From: gailwang Date: Tue, 16 Jun 2020 19:06:28 +0800 Subject: [PATCH 07/17] fix bugs that test cannot read public_access_host --- tencentcloud/resource_tc_postgresql_instance.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tencentcloud/resource_tc_postgresql_instance.go b/tencentcloud/resource_tc_postgresql_instance.go index 1291154acd..1083ec5fe1 100644 --- a/tencentcloud/resource_tc_postgresql_instance.go +++ b/tencentcloud/resource_tc_postgresql_instance.go @@ -406,6 +406,8 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i d.SetPartial("root_password") } + d.Partial(false) + return resourceTencentCloudPostgresqlInstanceRead(d, meta) } @@ -477,7 +479,6 @@ func resourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta int _ = d.Set("storage", instance.DBInstanceStorage) //ignore spec_code - return nil } From bd55a7b6233e4687480e04dea4c0143237ba9a47 Mon Sep 17 00:00:00 2001 From: gailwang Date: Tue, 16 Jun 2020 19:18:08 +0800 Subject: [PATCH 08/17] add erb --- tencentcloud/provider.go | 8 +++++ .../service_tencentcloud_postgresql.go | 35 ++++--------------- website/tencentcloud.erb | 24 +++++++++++++ 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index c19726625e..cc4428226a 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -284,6 +284,14 @@ Monitor tencentcloud_monitor_binding_object tencentcloud_monitor_binding_receiver +Postgresql + Data Source + tencentcloud_postgresql_instances + tencentcloud_postgresql_specinfos + + Resource + tencentcloud_postgresql_instance + Redis Data Source tencentcloud_redis_zone_config diff --git a/tencentcloud/service_tencentcloud_postgresql.go b/tencentcloud/service_tencentcloud_postgresql.go index 1e7b09e91a..05ee53c67e 100644 --- a/tencentcloud/service_tencentcloud_postgresql.go +++ b/tencentcloud/service_tencentcloud_postgresql.go @@ -76,8 +76,7 @@ func (me *PostgresqlService) InitPostgresqlInstance(ctx context.Context, instanc ratelimit.Check(request.GetAction()) response, err := me.client.UsePostgresqlClient().InitDBInstances(request) if err != nil { - errRet = err - return + return err } if response == nil || response.Response == nil { errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) @@ -297,11 +296,7 @@ func (me *PostgresqlService) ModifyPostgresqlInstanceName(ctx context.Context, i ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().ModifyDBInstanceName(request) - if err != nil { - errRet = err - } - - return + return err } func (me *PostgresqlService) UpgradePostgresqlInstance(ctx context.Context, instanceId string, memory int, storage int) (errRet error) { @@ -318,11 +313,7 @@ func (me *PostgresqlService) UpgradePostgresqlInstance(ctx context.Context, inst ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().UpgradeDBInstance(request) - if err != nil { - errRet = err - } - - return + return err } func (me *PostgresqlService) ModifyPostgresqlInstanceProjectId(ctx context.Context, instanceId string, projectId int) (errRet error) { @@ -338,10 +329,7 @@ func (me *PostgresqlService) ModifyPostgresqlInstanceProjectId(ctx context.Conte ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().ModifyDBInstancesProject(request) - if err != nil { - errRet = err - } - return + return err } func (me *PostgresqlService) SetPostgresqlInstanceAutoRenewFlag(ctx context.Context, instanceId string, autoRenewFlag int) (errRet error) { @@ -357,10 +345,7 @@ func (me *PostgresqlService) SetPostgresqlInstanceAutoRenewFlag(ctx context.Cont ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().SetAutoRenewFlag(request) - if err != nil { - errRet = err - } - return + return err } func (me *PostgresqlService) DeletePostgresqlInstance(ctx context.Context, instanceId string) (errRet error) { @@ -375,10 +360,7 @@ func (me *PostgresqlService) DeletePostgresqlInstance(ctx context.Context, insta ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().DestroyDBInstance(request) - if err != nil { - errRet = err - } - return + return err } func (me *PostgresqlService) SetPostgresqlInstanceRootPassword(ctx context.Context, instanceId string, password string) (errRet error) { @@ -395,10 +377,7 @@ func (me *PostgresqlService) SetPostgresqlInstanceRootPassword(ctx context.Conte ratelimit.Check(request.GetAction()) _, err := me.client.UsePostgresqlClient().ResetAccountPassword(request) - if err != nil { - errRet = err - } - return + return err } func (me *PostgresqlService) CheckDBInstanceStatus(ctx context.Context, instanceId string) error { diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index f7880fa149..1d74c445aa 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -767,6 +767,30 @@ +
  • + Postgresql + +
  • Redis
  • - Postgresql + PostgreSQL