Skip to content

Commit 8049178

Browse files
authored
Merge pull request #1 from brickzzhang/master
[add tencentcloud_sqlserver_db resource]
2 parents 9fc7dfc + 81063f0 commit 8049178

File tree

7 files changed

+573
-5
lines changed

7 files changed

+573
-5
lines changed

examples/tencentcloud-sqlserver/main.tf

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,10 @@ resource "tencentcloud_sqlserver_instance" "example" {
2424
project_id = 0
2525
memory = 2
2626
storage = 10
27-
}
27+
}
28+
29+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
30+
instance_id = tencentcloud_sqlserver_instance.example.id
31+
name = "db_brickzzhang_update"
32+
charset = "Chinese_PRC_BIN"
33+
remark = "test-remark-update"

tencentcloud/extension_sqlserver.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,42 @@ const (
1616
SQLSERVER_TASK_FAIL = 1
1717
SQLSERVER_TASK_RUNNING = 2
1818
)
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_DELETING = -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_DELETING: "deleting",
56+
}
57+

tencentcloud/provider.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ SQLServer
316316
tencentcloud_sqlserver_zone_config
317317
318318
Resource
319-
tencentcloud_sqlserver_instance
319+
tencentcloud_sqlserver_instance
320+
tencentcloud_sqlserver_db
321+
320322
321323
SSL Certificates
322324
Data Source
@@ -710,6 +712,7 @@ func Provider() terraform.ResourceProvider {
710712
"tencentcloud_monitor_binding_object": resourceTencentMonitorBindingObject(),
711713
"tencentcloud_monitor_binding_receiver": resourceTencentMonitorBindingAlarmReceiver(),
712714
"tencentcloud_elasticsearch_instance": resourceTencentCloudElasticsearchInstance(),
715+
"tencentcloud_sqlserver_db": resourceTencentCloudSqlserverDB(),
713716
"tencentcloud_postgresql_instance": resourceTencentCloudPostgresqlInstance(),
714717
"tencentcloud_sqlserver_instance": resourceTencentCloudSqlserverInstance(),
715718
},
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
/*
2+
Provides a SQLServer DB resource 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+
"strings"
21+
22+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
23+
)
24+
25+
func resourceTencentCloudSqlserverDB() *schema.Resource {
26+
return &schema.Resource{
27+
Create: resourceTencentCloudSqlserverDBCreate,
28+
Read: resourceTencentCloudSqlserverDBRead,
29+
Update: resourceTencentCloudSqlserverDBUpdate,
30+
Delete: resourceTencentCloudSqlserverDBDelete,
31+
Importer: &schema.ResourceImporter{
32+
State: schema.ImportStatePassthrough,
33+
},
34+
35+
Schema: map[string]*schema.Schema{
36+
"instance_id": {
37+
Type: schema.TypeString,
38+
Required: true,
39+
ForceNew: true,
40+
Description: "SQL server instance ID which DB belongs to.",
41+
},
42+
"name": {
43+
Type: schema.TypeString,
44+
Required: true,
45+
ForceNew: true,
46+
Description: "Name of SQLServer DB. The DataBase name must be unique and must be composed of numbers, letters and underlines, and the first one can not be underline.",
47+
},
48+
"charset": {
49+
Type: schema.TypeString,
50+
Optional: true,
51+
Default: "Chinese_PRC_CI_AS",
52+
ForceNew: true,
53+
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`.",
54+
ValidateFunc: validateAllowedStringValue(SQLSERVER_CHARSET_LIST),
55+
},
56+
"remark": {
57+
Type: schema.TypeString,
58+
Optional: true,
59+
Description: "Remark of the DB.",
60+
},
61+
// Computed
62+
"create_time": {
63+
Type: schema.TypeString,
64+
Computed: true,
65+
Description: "Database creation time.",
66+
},
67+
"status": {
68+
Type: schema.TypeString,
69+
Computed: true,
70+
Description: "Database status could be `creating`, `running`, `modifying` which means changing the remark, and `deleting`.",
71+
},
72+
},
73+
}
74+
}
75+
76+
func resourceTencentCloudSqlserverDBCreate(d *schema.ResourceData, meta interface{}) error {
77+
defer logElapsed("resource.tencentcloud_sqlserver_db.create")()
78+
79+
logId := getLogId(contextNil)
80+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
81+
82+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
83+
84+
instanceID := d.Get("instance_id").(string)
85+
_, has, err := sqlserverService.DescribeSqlserverInstanceById(ctx, instanceID)
86+
if err != nil {
87+
return fmt.Errorf("[CRITAL]%s DescribeSqlserverInstanceById fail, reason:%s\n", logId, err)
88+
}
89+
if !has {
90+
return fmt.Errorf("[CRITAL]%s Sqlserver instance %s dose not exist for DB creation", logId, instanceID)
91+
}
92+
93+
dbName := d.Get("name").(string)
94+
charset := d.Get("charset").(string)
95+
remark := d.Get("remark").(string)
96+
97+
if err := sqlserverService.CreateSqlserverDB(ctx, instanceID, dbName, charset, remark); err != nil {
98+
return err
99+
}
100+
101+
d.SetId(instanceID + FILED_SP + dbName)
102+
return resourceTencentCloudSqlserverDBRead(d, meta)
103+
}
104+
105+
func resourceTencentCloudSqlserverDBRead(d *schema.ResourceData, meta interface{}) error {
106+
defer logElapsed("resource.tencentcloud_sqlserver_db.read")()
107+
108+
logId := getLogId(contextNil)
109+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
110+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
111+
id := d.Id()
112+
dbInfo, has, err := sqlserverService.DescribeDBDetailsById(ctx, id)
113+
if err != nil {
114+
return err
115+
}
116+
if !has {
117+
d.SetId("")
118+
return nil
119+
}
120+
idItem := strings.Split(id, FILED_SP)
121+
if len(idItem) < 2 {
122+
return fmt.Errorf("broken ID of SQLServer DB")
123+
}
124+
instanceId := idItem[0]
125+
dbName := idItem[1]
126+
_ = d.Set("instance_id", instanceId)
127+
_ = d.Set("name", dbName)
128+
_ = d.Set("charset", dbInfo.Charset)
129+
_ = d.Set("remark", dbInfo.Remark)
130+
_ = d.Set("create_time", dbInfo.CreateTime)
131+
_ = d.Set("status", SQLSERVER_DB_STATUS[*dbInfo.Status])
132+
133+
return nil
134+
}
135+
136+
func resourceTencentCloudSqlserverDBUpdate(d *schema.ResourceData, meta interface{}) error {
137+
defer logElapsed("resource.tencentcloud_sqlserver_db.update")()
138+
139+
logId := getLogId(contextNil)
140+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
141+
142+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
143+
instanceId := d.Get("instance_id").(string)
144+
145+
if d.HasChange("remark") {
146+
if err := sqlserverService.ModifySqlserverDBRemark(ctx, instanceId, d.Get("name").(string), d.Get("remark").(string)); err != nil {
147+
return err
148+
}
149+
}
150+
151+
return nil
152+
}
153+
154+
func resourceTencentCloudSqlserverDBDelete(d *schema.ResourceData, meta interface{}) error {
155+
defer logElapsed("resource.tencentcloud_sqlserver_db.delete")()
156+
157+
logId := getLogId(contextNil)
158+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
159+
160+
sqlserverService := SqlserverService{client: meta.(*TencentCloudClient).apiV3Conn}
161+
instanceId := d.Get("instance_id").(string)
162+
name := d.Get("name").(string)
163+
164+
// precheck before delete
165+
_, has, err := sqlserverService.DescribeSqlserverInstanceById(ctx, instanceId)
166+
if err != nil {
167+
return fmt.Errorf("[CRITAL]%s DescribeSqlserverInstanceById when deleting SQLServer DB fail, reason:%s\n", logId, err)
168+
}
169+
if !has {
170+
return nil
171+
}
172+
id := d.Id()
173+
_, has, err = sqlserverService.DescribeDBDetailsById(ctx, id)
174+
if err != nil {
175+
return err
176+
}
177+
if !has {
178+
return nil
179+
}
180+
181+
return sqlserverService.DeleteSqlserverDB(ctx, instanceId, name)
182+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() { testAccPreCheck(t) },
15+
Providers: testAccProviders,
16+
CheckDestroy: testAccCheckSqlserverDBDestroy,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: testAccSqlserverDB_basic(),
20+
Check: resource.ComposeAggregateTestCheckFunc(
21+
testAccCheckSqlserverDBExists("tencentcloud_sqlserver_db.mysqlserver_db"),
22+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "instance_id", "mssql-3cdq7kx5"),
23+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "name", "testAccSqlserverDB"),
24+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "charset", "Chinese_PRC_BIN"),
25+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "remark", "testACC-remark"),
26+
resource.TestCheckResourceAttrSet("tencentcloud_sqlserver_db.mysqlserver_db", "create_time"),
27+
resource.TestCheckResourceAttrSet("tencentcloud_sqlserver_db.mysqlserver_db", "status"),
28+
),
29+
Destroy: false,
30+
},
31+
{
32+
ResourceName: "tencentcloud_sqlserver_db.mysqlserver_db",
33+
ImportState: true,
34+
ImportStateVerify: true,
35+
},
36+
{
37+
Config: testAccSqlserverDB_basic_update_remark(),
38+
Check: resource.ComposeAggregateTestCheckFunc(
39+
testAccCheckSqlserverDBExists("tencentcloud_sqlserver_db.mysqlserver_db"),
40+
resource.TestCheckResourceAttr("tencentcloud_sqlserver_db.mysqlserver_db", "remark", "testACC-remark_update"),
41+
),
42+
},
43+
},
44+
})
45+
}
46+
47+
func testAccCheckSqlserverDBDestroy(s *terraform.State) error {
48+
logId := getLogId(contextNil)
49+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
50+
sqlserverService := SqlserverService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn}
51+
for _, rs := range s.RootModule().Resources {
52+
if rs.Type != "tencentcloud_sqlserver_db" {
53+
continue
54+
}
55+
_, has, err := sqlserverService.DescribeDBDetailsById(ctx, rs.Primary.ID)
56+
if has {
57+
return fmt.Errorf("SQLServer DB still exists")
58+
}
59+
if err != nil {
60+
return err
61+
}
62+
}
63+
return nil
64+
}
65+
66+
func testAccCheckSqlserverDBExists(n string) resource.TestCheckFunc {
67+
return func(s *terraform.State) error {
68+
logId := getLogId(contextNil)
69+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
70+
71+
rs, ok := s.RootModule().Resources[n]
72+
if !ok {
73+
return fmt.Errorf("SQLServer DB %s is not found", n)
74+
}
75+
if rs.Primary.ID == "" {
76+
return fmt.Errorf("SQLServer DB id is not set")
77+
}
78+
79+
sqlserverService := SqlserverService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn}
80+
_, has, err := sqlserverService.DescribeDBDetailsById(ctx, rs.Primary.ID)
81+
if !has {
82+
return fmt.Errorf("SQLServer DB %s is not found", rs.Primary.ID)
83+
}
84+
if err != nil {
85+
return err
86+
}
87+
88+
return nil
89+
}
90+
}
91+
92+
func testAccSqlserverDB_basic() string {
93+
return `
94+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
95+
instance_id = "mssql-3cdq7kx5"
96+
name = "testAccSqlserverDB"
97+
charset = "Chinese_PRC_BIN"
98+
remark = "testACC-remark"
99+
}`
100+
}
101+
102+
func testAccSqlserverDB_basic_update_remark() string {
103+
return `
104+
resource "tencentcloud_sqlserver_db" "mysqlserver_db" {
105+
instance_id = "mssql-3cdq7kx5"
106+
name = "testAccSqlserverDB"
107+
charset = "Chinese_PRC_BIN"
108+
remark = "testACC-remark_update"
109+
}`
110+
}

0 commit comments

Comments
 (0)