Skip to content

Commit 35eca67

Browse files
author
brickzzhang
committed
[add tencentcloud_sqlserver_db resource]
1. add tencentcloud_sqlserver_db resource 2. example contents depend on sqlserver instance [commiter: brickzzhang]
1 parent fdea9b3 commit 35eca67

File tree

8 files changed

+712
-1
lines changed

8 files changed

+712
-1
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
data "tencentcloud_sqlserver_zone_config" "mysqlserver" {
22
}
3+
4+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
5+
instance_id = "mssql-3cdq7kx5"
6+
name = "db_brickzzhang_update"
7+
charset = "Chinese_PRC_BIN"
8+
remark = "test-remark-update"
9+
}

tencentcloud/extension_sqlserver.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,47 @@ var SQLSERVER_CHARGE_TYPE_NAME = map[string]string{
1010
"POST": SQLSERVER_CHARGE_TYPE_POSTPAID,
1111
"ALL": "ALL",
1212
}
13+
14+
const (
15+
SQLSERVER_TASK_SUCCESS = 0
16+
SQLSERVER_TASK_FAIL = 1
17+
SQLSERVER_TASK_RUNNING = 2
18+
)
19+
20+
var SQLSERVER_CHARSET_LIST = []string{
21+
"Chinese_PRC_CI_AS",
22+
"Chinese_PRC_CS_AS",
23+
"Chinese_PRC_BIN",
24+
"Chinese_Taiwan_Stroke_CI_AS",
25+
"SQL_Latin1_General_CP1_CI_AS",
26+
"SQL_Latin1_General_CP1_CS_AS",
27+
}
28+
29+
const (
30+
SQLSERVER_ACCOUNT_RW = "ReadWrite"
31+
SQLSERVER_ACCOUNT_RO = "ReadOnly"
32+
)
33+
34+
var SQLSERVER_ACCOUNT_PRIVILEGE = []string{
35+
SQLSERVER_ACCOUNT_RW,
36+
SQLSERVER_ACCOUNT_RO,
37+
}
38+
39+
const (
40+
SQLSERVER_DEFAULT_LIMIT = 20
41+
SQLSERVER_DEFAULT_OFFSET = 0
42+
)
43+
44+
const (
45+
SQLSERVER_DB_CREATING = 1
46+
SQLSERVER_DB_RUNNING = 2
47+
SQLSERVER_DB_MODIFYING = 3
48+
SQLSERVER_DB_DROPPING = -1
49+
)
50+
51+
var SQLSERVER_DB_STATUS = map[int64]string{
52+
SQLSERVER_DB_CREATING: "creating",
53+
SQLSERVER_DB_RUNNING: "running",
54+
SQLSERVER_DB_MODIFYING: "modifying",
55+
SQLSERVER_DB_DROPPING: "dropping",
56+
}

tencentcloud/provider.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,9 @@ SQLServer
307307
Data Source
308308
tencentcloud_sqlserver_zone_config
309309
310+
Resource
311+
tencentcloud_sqlserver_db
312+
310313
SSL Certificates
311314
Data Source
312315
tencentcloud_ssl_certificates
@@ -697,6 +700,7 @@ func Provider() terraform.ResourceProvider {
697700
"tencentcloud_monitor_binding_object": resourceTencentMonitorBindingObject(),
698701
"tencentcloud_monitor_binding_receiver": resourceTencentMonitorBindingAlarmReceiver(),
699702
"tencentcloud_elasticsearch_instance": resourceTencentCloudElasticsearchInstance(),
703+
"tencentcloud_sqlserver_db": resourceTencentCloudSqlserverDB(),
700704
},
701705

702706
ConfigureFunc: providerConfigure,
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/*
2+
Provides a SQLServer DB resource to database belongs to SQLServer instance.
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
8+
instance_id = "mssql-XXXXXX"
9+
name = "sqlserver_db_terraform"
10+
charset = "Chinese_PRC_BIN"
11+
remark = "test-remark"
12+
}
13+
```
14+
*/
15+
package tencentcloud
16+
17+
import (
18+
"context"
19+
"fmt"
20+
21+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
22+
)
23+
24+
func resourceTencentCloudSqlserverDB() *schema.Resource {
25+
return &schema.Resource{
26+
Create: resourceTencentCloudSqlserverDBCreate,
27+
Read: resourceTencentCloudSqlserverDBRead,
28+
Update: resourceTencentCloudSqlserverDBUpdate,
29+
Delete: resourceTencentCloudSqlserverDBDelete,
30+
31+
Schema: map[string]*schema.Schema{
32+
"instance_id": {
33+
Type: schema.TypeString,
34+
Required: true,
35+
Description: "SQL server instance ID which DB belongs to.",
36+
},
37+
"name": {
38+
Type: schema.TypeString,
39+
Required: true,
40+
Description: "Name of DB. The DataBase name must be unique and must be composed of numbers, letters and underlines, and the first one can not be underline.",
41+
},
42+
"charset": {
43+
Type: schema.TypeString,
44+
Optional: true,
45+
Default: "Chinese_PRC_CI_AS",
46+
ForceNew: true,
47+
Description: "Character set DB uses. Valid values: `Chinese_PRC_CI_AS`, `Chinese_PRC_CS_AS`, `Chinese_PRC_BIN`, `Chinese_Taiwan_Stroke_CI_AS`, `SQL_Latin1_General_CP1_CI_AS`, and `SQL_Latin1_General_CP1_CS_AS`. Default value is `Chinese_PRC_CI_AS`.",
48+
ValidateFunc: validateAllowedStringValue(SQLSERVER_CHARSET_LIST),
49+
},
50+
"remark": {
51+
Type: schema.TypeString,
52+
Optional: true,
53+
Description: "Remark of the DB.",
54+
},
55+
// Computed
56+
"create_time": {
57+
Type: schema.TypeString,
58+
Computed: true,
59+
Description: "Database creation time.",
60+
},
61+
"status": {
62+
Type: schema.TypeString,
63+
Computed: true,
64+
Description: "Database status. Valid values are `creating`, `running`, `modifying`, `dropping`.",
65+
},
66+
},
67+
}
68+
}
69+
70+
func resourceTencentCloudSqlserverDBCreate(d *schema.ResourceData, meta interface{}) error {
71+
defer logElapsed("resource.tencentcloud_sqlserver_db.create")()
72+
73+
logId := getLogId(contextNil)
74+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
75+
76+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
77+
78+
instanceID := d.Get("instance_id").(string)
79+
_, has, err := sqlserverService.DescribeSqlserverInstanceById(ctx, instanceID)
80+
if err != nil {
81+
return fmt.Errorf("[CRITAL]%s DescribeSqlserverInstanceById fail, reason:%s\n", logId, err)
82+
}
83+
if !has {
84+
return fmt.Errorf("[CRITAL]%s Sqlserver instance %s dose not exist for DB creation", logId, instanceID)
85+
}
86+
87+
dbName := d.Get("name").(string)
88+
charset := d.Get("charset").(string)
89+
remark := d.Get("remark").(string)
90+
91+
if err := sqlserverService.CreateSqlserverDB(ctx, instanceID, dbName, charset, remark); err != nil {
92+
return err
93+
}
94+
95+
return resourceTencentCloudSqlserverDBRead(d, meta)
96+
}
97+
98+
func resourceTencentCloudSqlserverDBRead(d *schema.ResourceData, meta interface{}) error {
99+
defer logElapsed("resource.tencentcloud_sqlserver_db.read")()
100+
101+
logId := getLogId(contextNil)
102+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
103+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
104+
instanceId := d.Get("instance_id").(string)
105+
name := d.Get("name").(string)
106+
dbInfo, has, err := sqlserverService.DescribeDBDetailsByName(ctx, instanceId, name)
107+
if err != nil {
108+
return err
109+
}
110+
if !has {
111+
d.SetId("")
112+
return nil
113+
}
114+
_ = d.Set("charset", *dbInfo.Charset)
115+
_ = d.Set("remark", *dbInfo.Remark)
116+
_ = d.Set("create_time", *dbInfo.CreateTime)
117+
_ = d.Set("status", SQLSERVER_DB_STATUS[*dbInfo.Status])
118+
119+
d.SetId(name)
120+
return nil
121+
}
122+
123+
func resourceTencentCloudSqlserverDBUpdate(d *schema.ResourceData, meta interface{}) error {
124+
defer logElapsed("resource.tencentcloud_sqlserver_db.update")()
125+
126+
logId := getLogId(contextNil)
127+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
128+
129+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
130+
instanceId := d.Get("instance_id").(string)
131+
132+
if d.HasChange("name") {
133+
oldValue, newValue := d.GetChange("name")
134+
if err := sqlserverService.ModifySqlserverDBName(ctx, instanceId, oldValue.(string), newValue.(string)); err != nil {
135+
return err
136+
}
137+
d.SetPartial("name")
138+
}
139+
140+
if d.HasChange("remark") {
141+
if err := sqlserverService.ModifySqlserverDBRemark(ctx, instanceId, d.Get("name").(string), d.Get("remark").(string)); err != nil {
142+
return err
143+
}
144+
d.SetPartial("remark")
145+
}
146+
147+
return nil
148+
}
149+
150+
func resourceTencentCloudSqlserverDBDelete(d *schema.ResourceData, meta interface{}) error {
151+
defer logElapsed("resource.tencentcloud_sqlserver_db.delete")()
152+
153+
logId := getLogId(contextNil)
154+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
155+
156+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
157+
instanceId := d.Get("instance_id").(string)
158+
name := d.Get("name").(string)
159+
160+
// precheck before delete
161+
_, has, err := sqlserverService.DescribeDBDetailsByName(ctx, instanceId, name)
162+
if err != nil {
163+
return err
164+
}
165+
if !has {
166+
return nil
167+
}
168+
169+
return sqlserverService.DeleteSqlserverDB(ctx, instanceId, name)
170+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
10+
)
11+
12+
func TestAccTencentCloudSqlserverDB_basic_and_update(t *testing.T) {
13+
var instanceId string
14+
var dbName string
15+
16+
resource.Test(t, resource.TestCase{
17+
PreCheck: func() { testAccPreCheck(t) },
18+
Providers: testAccProviders,
19+
CheckDestroy: testAccCheckSqlserverDBDestroy(&instanceId, &dbName),
20+
Steps: []resource.TestStep{
21+
{
22+
Config: testAccSqlserverDB_basic(),
23+
Check: resource.ComposeAggregateTestCheckFunc(
24+
testAccCheckSqlserverDBExists("tencentcloud_sqlserver_db.mysqlserver_db", &instanceId, &dbName),
25+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "instance_id", "mssql-3cdq7kx5"),
26+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "name", "testAccSqlserverDB"),
27+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "charset", "Chinese_PRC_BIN"),
28+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "remark", "testACC-remark"),
29+
resource.TestCheckResourceAttrSet("tencentcloud_sqlserver_db.mysqlserver_db", "create_time"),
30+
resource.TestCheckResourceAttrSet("tencentcloud_sqlserver_db.mysqlserver_db", "status"),
31+
),
32+
},
33+
{
34+
Config: testAccSqlserverDB_basic_update_name(),
35+
Check: resource.ComposeAggregateTestCheckFunc(
36+
testAccCheckSqlserverDBExists("tencentcloud_sqlserver_db.mysqlserver_db", &instanceId, &dbName),
37+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "name", "testAccSqlserverDB_update"),
38+
),
39+
},
40+
{
41+
Config: testAccSqlserverDB_basic_update_remark(),
42+
Check: resource.ComposeAggregateTestCheckFunc(
43+
testAccCheckSqlserverDBExists("tencentcloud_sqlserver_db.mysqlserver_db", &instanceId, &dbName),
44+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "remark", "testACC-remark_update"),
45+
),
46+
},
47+
},
48+
})
49+
}
50+
51+
func testAccCheckSqlserverDBDestroy(instanceId *string, dbName *string) resource.TestCheckFunc {
52+
return func(s *terraform.State) error {
53+
logId := getLogId(contextNil)
54+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
55+
sqlserverService := SqlserverService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn}
56+
for _, rs := range s.RootModule().Resources {
57+
if rs.Type != "tencentcloud_sqlserver_db" {
58+
continue
59+
}
60+
_, has, err := sqlserverService.DescribeDBDetailsByName(ctx, *instanceId, *dbName)
61+
if has {
62+
return fmt.Errorf("SQLServer DB still exists")
63+
}
64+
if err != nil {
65+
return err
66+
}
67+
}
68+
return nil
69+
}
70+
}
71+
72+
func testAccCheckSqlserverDBExists(n string, instanceId *string, dbName *string) resource.TestCheckFunc {
73+
return func(s *terraform.State) error {
74+
logId := getLogId(contextNil)
75+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
76+
77+
rs, ok := s.RootModule().Resources[n]
78+
if !ok {
79+
return fmt.Errorf("SQLServer DB %s is not found", n)
80+
}
81+
if rs.Primary.ID == "" {
82+
return fmt.Errorf("SQLServer DB id is not set")
83+
}
84+
85+
sqlserverService := SqlserverService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn}
86+
_, has, err := sqlserverService.DescribeDBDetailsByName(ctx, rs.Primary.Attributes["instance_id"], rs.Primary.Attributes["name"])
87+
if !has {
88+
return fmt.Errorf("SQLServer DB %s is not found", rs.Primary.Attributes["name"])
89+
}
90+
if err != nil {
91+
return err
92+
}
93+
94+
*instanceId = rs.Primary.Attributes["instance_id"]
95+
*dbName = rs.Primary.Attributes["name"]
96+
return nil
97+
}
98+
}
99+
100+
func testAccSqlserverDB_basic() string {
101+
return `
102+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
103+
instance_id = "mssql-3cdq7kx5"
104+
name = "testAccSqlserverDB"
105+
charset = "Chinese_PRC_BIN"
106+
remark = "testACC-remark"
107+
}`
108+
}
109+
110+
func testAccSqlserverDB_basic_update_name() string {
111+
return `
112+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
113+
instance_id = "mssql-3cdq7kx5"
114+
name = "testAccSqlserverDB_update"
115+
charset = "Chinese_PRC_BIN"
116+
remark = "testACC-remark"
117+
}`
118+
}
119+
120+
func testAccSqlserverDB_basic_update_remark() string {
121+
return `
122+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
123+
instance_id = "mssql-3cdq7kx5"
124+
name = "testAccSqlserverDB_update"
125+
charset = "Chinese_PRC_BIN"
126+
remark = "testACC-remark_update"
127+
}`
128+
}

0 commit comments

Comments
 (0)