Skip to content

[add zone config datasource for sqlserver] #450

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
## 1.37.0 (Unreleased)

FEATURES:

* **New Data Source**: `tencentcloud_sqlserver_zone_config`

## 1.36.1 (June 12, 2020)

ENHANCEMENTS:
Expand Down
2 changes: 2 additions & 0 deletions examples/tencentcloud-sqlserver/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
data "tencentcloud_sqlserver_zone_config" "mysqlserver" {
}
Empty file.
3 changes: 3 additions & 0 deletions examples/tencentcloud-sqlserver/version.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
terraform {
required_version = ">= 0.12"
}
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,8 @@ github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0K
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.191+incompatible h1:cycv0fIQDSo9sjWkupzKnKMc+ZT8cKAfoq2WX3b8ozk=
github.com/tencentcloud/tencentcloud-sdk-go v3.0.191+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=
Expand Down
61 changes: 38 additions & 23 deletions tencentcloud/connectivity/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
monitor "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor/v20180724"
redis "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412"
scf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf/v20180416"
sqlserver "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver/v20180328"
sts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sts/v20180813"
tag "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tag/v20180813"
tcaplusdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcaplusdb/v20190823"
Expand All @@ -41,29 +42,30 @@ type TencentCloudClient struct {
Protocol string
Domain string

cosConn *s3.S3
mysqlConn *cdb.Client
redisConn *redis.Client
asConn *as.Client
vpcConn *vpc.Client
cbsConn *cbs.Client
cvmConn *cvm.Client
clbConn *clb.Client
dayuConn *dayu.Client
dcConn *dc.Client
tagConn *tag.Client
mongodbConn *mongodb.Client
tkeConn *tke.Client
camConn *cam.Client
stsConn *sts.Client
gaapConn *gaap.Client
sslConn *ssl.Client
cfsConn *cfs.Client
scfConn *scf.Client
tcaplusConn *tcaplusdb.Client
cdnConn *cdn.Client
monitorConn *monitor.Client
esConn *es.Client
cosConn *s3.S3
mysqlConn *cdb.Client
redisConn *redis.Client
asConn *as.Client
vpcConn *vpc.Client
cbsConn *cbs.Client
cvmConn *cvm.Client
clbConn *clb.Client
dayuConn *dayu.Client
dcConn *dc.Client
tagConn *tag.Client
mongodbConn *mongodb.Client
tkeConn *tke.Client
camConn *cam.Client
stsConn *sts.Client
gaapConn *gaap.Client
sslConn *ssl.Client
cfsConn *cfs.Client
scfConn *scf.Client
tcaplusConn *tcaplusdb.Client
cdnConn *cdn.Client
monitorConn *monitor.Client
esConn *es.Client
sqlserverConn *sqlserver.Client
}

// NewClientProfile returns a new ClientProfile
Expand Down Expand Up @@ -398,3 +400,16 @@ func (me *TencentCloudClient) UseEsClient() *es.Client {

return me.esConn
}

// UseSqlserverClient returns sqlserver client for service
func (me *TencentCloudClient) UseSqlserverClient() *sqlserver.Client {
if me.sqlserverConn != nil {
return me.sqlserverConn
}

cpf := me.NewClientProfile(300)
me.sqlserverConn, _ = sqlserver.NewClient(me.Credential, me.Region, cpf)
me.sqlserverConn.WithHttpTransport(&LogRoundTripper{})

return me.sqlserverConn
}
178 changes: 178 additions & 0 deletions tencentcloud/data_source_tc_sqlserver_zone_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
/*
Use this data source to query purchasable specification configuration for each availability zone in this specific region.

Example Usage

```hcl
data "tencentcloud_sqlserver_zone_config" "mysqlserver" {
}
```
*/
package tencentcloud

import (
"context"
"fmt"
"log"

"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)

func dataSourceTencentSqlserverZoneConfig() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentSqlserverZoneConfigRead,
Schema: map[string]*schema.Schema{
"result_output_file": {
Type: schema.TypeString,
Optional: true,
Description: "Used to store results.",
},
"zone_list": {
Type: schema.TypeList,
Computed: true,
Description: "A list of availability zones. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"availability_zone": {
Type: schema.TypeString,
Computed: true,
Description: "Alphabet ID of availability zone.",
},
"zone_id": {
Type: schema.TypeInt,
Computed: true,
Description: "Number ID of availability zone.",
},
"specinfo_list": {
Type: schema.TypeList,
Computed: true,
Description: "A list of specinfo configurations for the specific availability zone. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"spec_id": {
Type: schema.TypeInt,
Computed: true,
Description: "Instance specification ID.",
},
"machine_type": {
Type: schema.TypeString,
Computed: true,
Description: "Model ID.",
},
"db_version": {
Type: schema.TypeString,
Computed: true,
Description: "Database version information. Valid values: `2008R2 (SQL Server 2008 Enterprise)`, `2012SP3 (SQL Server 2012 Enterprise)`, `2016SP1 (SQL Server 2016 Enterprise)`, `201602 (SQL Server 2016 Standard)`, `2017 (SQL Server 2017 Enterprise)`.",
},
"db_version_name": {
Type: schema.TypeString,
Computed: true,
Description: "Version name corresponding to the `db_version` field.",
},
"memory": {
Type: schema.TypeInt,
Computed: true,
Description: "Memory size in GB.",
},
"cpu": {
Type: schema.TypeInt,
Computed: true,
Description: "Number of CPU cores.",
},
"min_storage_size": {
Type: schema.TypeInt,
Computed: true,
Description: "Minimum disk size under this specification in GB.",
},
"max_storage_size": {
Type: schema.TypeInt,
Computed: true,
Description: "Maximum disk size under this specification in GB.",
},
"qps": {
Type: schema.TypeInt,
Computed: true,
Description: "QPS of this specification.",
},
"charge_type": {
Type: schema.TypeString,
Computed: true,
Description: "Billing mode under this specification. Valid values are `POSTPAID_BY_HOUR`, `PREPAID` and `ALL` which means both POSTPAID_BY_HOUR and PREPAID.",
},
},
},
},
},
},
},
},
}
}

func dataSourceTencentSqlserverZoneConfigRead(d *schema.ResourceData, meta interface{}) error {
defer logElapsed("data_source.tencent_sqlserver_zone_config.read")()

logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), logIdKey, logId)

sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}

// get zoneinfo
zoneInfoList, err := sqlserverService.DescribeZones(ctx)
if err != nil {
return fmt.Errorf("api[DescribeZones]fail, return %s", err.Error())
}
zoneSet := make(map[string]map[string]interface{})
for _, zoneInfo := range zoneInfoList {
zoneSetInfo := make(map[string]interface{}, 1)
zoneSetInfo["id"] = zoneInfo.ZoneId
zoneSet[*zoneInfo.Zone] = zoneSetInfo
}

var zoneList []interface{}
for k, v := range zoneSet {
var zoneListItem = make(map[string]interface{})
zoneListItem["availability_zone"] = k
zoneListItem["zone_id"] = v["id"]

// get specinfo for each zone
specinfoList, err := sqlserverService.DescribeProductConfig(ctx, k)
if err != nil {
return fmt.Errorf("api[DescribeProductConfig]fail, return %s", err.Error())
}
var specinfoConfigs []interface{}
for _, specinfoItem := range specinfoList {
var specinfoConfig = make(map[string]interface{})
specinfoConfig["spec_id"] = specinfoItem.SpecId
specinfoConfig["machine_type"] = specinfoItem.MachineType
specinfoConfig["db_version"] = specinfoItem.Version
specinfoConfig["db_version_name"] = specinfoItem.VersionName
specinfoConfig["memory"] = specinfoItem.Memory
specinfoConfig["cpu"] = specinfoItem.CPU
specinfoConfig["min_storage_size"] = specinfoItem.MinStorage
specinfoConfig["max_storage_size"] = specinfoItem.MaxStorage
specinfoConfig["qps"] = specinfoItem.QPS
specinfoConfig["charge_type"] = SQLSERVER_CHARGE_TYPE_NAME[*specinfoItem.PayModeStatus]

specinfoConfigs = append(specinfoConfigs, specinfoConfig)
}
zoneListItem["specinfo_list"] = specinfoConfigs
zoneList = append(zoneList, zoneListItem)
}

// set zone_list
if err := d.Set("zone_list", zoneList); err != nil {
return fmt.Errorf("[CRITAL]%s provider set zone_list fail, reason:%s\n ", logId, err.Error())
}

d.SetId("zone_config")

if output, ok := d.GetOk("result_output_file"); ok && output.(string) != "" {
if err := writeToFile(output.(string), zoneList); err != nil {
log.Printf("[CRITAL]%s output file[%s] fail, reason[%s]\n",
logId, output.(string), err.Error())
}

}
return nil
}
39 changes: 39 additions & 0 deletions tencentcloud/data_source_tc_sqlserver_zone_config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package tencentcloud

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
)

func TestAccDataSourceTencentCloudSqlserverZoneConfig_basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: TestAccDataSourceTencentCloudSqlserverZoneConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckTencentCloudDataSourceID("data.tencentcloud_sqlserver_zone_config.foo"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.availability_zone"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.zone_id"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.spec_id"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.machine_type"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.db_version"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.db_version_name"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.memory"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.cpu"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.min_storage_size"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.max_storage_size"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.qps"),
resource.TestCheckResourceAttrSet("data.tencentcloud_sqlserver_zone_config.foo", "zone_list.0.specinfo_list.0.charge_type"),
),
},
},
})
}

const TestAccDataSourceTencentCloudSqlserverZoneConfig = `
data "tencentcloud_sqlserver_zone_config" "foo" {
}
`
12 changes: 12 additions & 0 deletions tencentcloud/extension_sqlserver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package tencentcloud

const (
SQLSERVER_CHARGE_TYPE_PREPAID = "PREPAID"
SQLSERVER_CHARGE_TYPE_POSTPAID = "POSTPAID_BY_HOUR"
)

var SQLSERVER_CHARGE_TYPE_NAME = map[string]string{
"PRE": SQLSERVER_CHARGE_TYPE_PREPAID,
"POST": SQLSERVER_CHARGE_TYPE_POSTPAID,
"ALL": "ALL",
}
5 changes: 5 additions & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,10 @@ Serverless Cloud Function(SCF)
tencentcloud_scf_function
tencentcloud_scf_namespace

SQLServer
Data Source
tencentcloud_sqlserver_zone_config

SSL Certificates
Data Source
tencentcloud_ssl_certificates
Expand Down Expand Up @@ -582,6 +586,7 @@ func Provider() terraform.ResourceProvider {
"tencentcloud_monitor_policy_groups": dataSourceTencentMonitorPolicyGroups(),
"tencentcloud_monitor_product_namespace": dataSourceTencentMonitorProductNamespace(),
"tencentcloud_elasticsearch_instances": dataSourceTencentCloudElasticsearchInstances(),
"tencentcloud_sqlserver_zone_config": dataSourceTencentSqlserverZoneConfig(),
},

ResourcesMap: map[string]*schema.Resource{
Expand Down
Loading