Skip to content

Commit e8711df

Browse files
authored
Feat/ses support (#1360)
* feat: support ses * feat: support ses * feat: support ses template * feat: ses support * docs: update doc * feat: add changelog * fix: update region * fix: update region * fix: update region Co-authored-by: arunma <[email protected]>
1 parent da3edf9 commit e8711df

23 files changed

+5404
-9
lines changed

.changelog/1360.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:new-resource
2+
tencentcloud_ses_domain
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_ses_email_address
7+
```
8+
9+
```release-note:new-resource
10+
tencentcloud_ses_template
11+
```

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ require (
5353
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.290
5454
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis v1.0.490
5555
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.275
56+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.529
5657
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.486
5758
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver v1.0.406
5859
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.199

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,10 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis v1.0.490 h1:JEW8+
542542
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis v1.0.490/go.mod h1:1yBtZUeKla8GNnVnJ1JOgMVBi/YgjEuQgzO4uNmisdI=
543543
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.275 h1:hn5RrN/qkcObnyKfJ+raey/riVeRqHJFvY34l2YgELs=
544544
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.275/go.mod h1:Pew6DV5oBGrzHYWZ8ssiHeJS/Z39ggVv1y5ADGWdO4s=
545+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.526 h1:n8RVsww+jKkYxEVebB9VDNi/P1lOoOcpxa8qkg0BfMM=
546+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.526/go.mod h1:sQwqZ7D79UayMx/K6t9WDJBkEnwrJWAMtWp0wFnL4yY=
547+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.529 h1:NezuBQEG7ihXbwueREo4qavBAo6ZcHuWGZt1dR+VdKc=
548+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.529/go.mod h1:Xfmf4Rq4J2ukz6NoEwpADQS5ws3By3KDPemCQeeMF+M=
545549
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.486 h1:eHLaL+hl5X5f8Apuf2SGVclO3MRev/E3AfA/0aZQGUA=
546550
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.486/go.mod h1:MSsho0YlAsoPCOMqdBfwqGd/SMQ0FTGh0a6emBy2X+g=
547551
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver v1.0.406 h1:lGhXUN20TcPf/1cY/VAAGq0xf31/erGVoeDzKnxxyhM=

tencentcloud/basic_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,3 +760,10 @@ const (
760760
)
761761

762762
// End of TCM
763+
764+
// SES
765+
const (
766+
defaultRegionSes = "ap-hongkong"
767+
)
768+
769+
// End of SES

tencentcloud/connectivity/client.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"strconv"
99
"time"
1010

11+
ses "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses/v20201002"
12+
1113
tcm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcm/v20210413"
1214

1315
"github.com/tencentyun/cos-go-sdk-v5"
@@ -126,6 +128,7 @@ type TencentCloudClient struct {
126128
temConn *tem.Client
127129
teoConn *teo.Client
128130
tcmConn *tcm.Client
131+
sesConn *ses.Client
129132
dcdbConn *dcdb.Client
130133
smsConn *sms.Client
131134
}
@@ -768,7 +771,7 @@ func (me *TencentCloudClient) UseTeoClient() *teo.Client {
768771
return me.teoConn
769772
}
770773

771-
// UseTcmClient returns teo client for service
774+
// UseTcmClient returns Tcm client for service
772775
func (me *TencentCloudClient) UseTcmClient() *tcm.Client {
773776
if me.tcmConn != nil {
774777
return me.tcmConn
@@ -781,6 +784,19 @@ func (me *TencentCloudClient) UseTcmClient() *tcm.Client {
781784
return me.tcmConn
782785
}
783786

787+
// UseSesClient returns Ses client for service
788+
func (me *TencentCloudClient) UseSesClient() *ses.Client {
789+
if me.sesConn != nil {
790+
return me.sesConn
791+
}
792+
793+
cpf := me.NewClientProfile(300)
794+
me.sesConn, _ = ses.NewClient(me.Credential, me.Region, cpf)
795+
me.sesConn.WithHttpTransport(&LogRoundTripper{})
796+
797+
return me.sesConn
798+
}
799+
784800
// UseDcdbClient returns dcdb client for service
785801
func (me *TencentCloudClient) UseDcdbClient() *dcdb.Client {
786802
if me.dcdbConn != nil {
@@ -794,7 +810,7 @@ func (me *TencentCloudClient) UseDcdbClient() *dcdb.Client {
794810
return me.dcdbConn
795811
}
796812

797-
// UseSmsClient returns teo client for service
813+
// UseSmsClient returns Sms client for service
798814
func (me *TencentCloudClient) UseSmsClient() *sms.Client {
799815
if me.smsConn != nil {
800816
return me.smsConn

tencentcloud/provider.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,12 @@ TencentCloud ServiceMesh(TCM)
696696
tencentcloud_tcm_mesh
697697
tencentcloud_tcm_cluster_attachment
698698
699+
Simple Email Service(SES)
700+
Resource
701+
tencentcloud_ses_domain
702+
tencentcloud_ses_template
703+
tencentcloud_ses_email_address
704+
699705
Security Token Service(STS)
700706
Data Source
701707
tencentcloud_sts_caller_identity
@@ -1270,13 +1276,18 @@ func Provider() terraform.ResourceProvider {
12701276
"tencentcloud_teo_ddos_policy": resourceTencentCloudTeoDdosPolicy(),
12711277
"tencentcloud_teo_security_policy": resourceTencentCloudTeoSecurityPolicy(),
12721278
"tencentcloud_teo_custom_error_page": resourceTencentCloudTeoCustomErrorPage(),
1273-
"tencentcloud_tcm_mesh": resourceTencentCloudTcmMesh(),
1274-
"tencentcloud_tcm_cluster_attachment": resourceTencentCloudTcmClusterAttachment(),
1275-
"tencentcloud_sms_sign": resourceTencentCloudSmsSign(),
1276-
"tencentcloud_sms_template": resourceTencentCloudSmsTemplate(),
1277-
"tencentcloud_dcdb_account": resourceTencentCloudDcdbAccount(),
1278-
"tencentcloud_dcdb_hourdb_instance": resourceTencentCloudDcdbHourdbInstance(),
1279-
"tencentcloud_dcdb_security_group_attachment": resourceTencentCloudDcdbSecurityGroupAttachment(),
1279+
// "tencentcloud_teo_host_certificate": resourceTencentCloudTeoHostCertificate(),
1280+
// "tencentcloud_teo_default_certificate": resourceTencentCloudTeoDefaultCertificate(),
1281+
"tencentcloud_tcm_mesh": resourceTencentCloudTcmMesh(),
1282+
"tencentcloud_tcm_cluster_attachment": resourceTencentCloudTcmClusterAttachment(),
1283+
"tencentcloud_ses_domain": resourceTencentCloudSesDomain(),
1284+
"tencentcloud_ses_template": resourceTencentCloudSesTemplate(),
1285+
"tencentcloud_ses_email_address": resourceTencentCloudSesEmailAddress(),
1286+
"tencentcloud_sms_sign": resourceTencentCloudSmsSign(),
1287+
"tencentcloud_sms_template": resourceTencentCloudSmsTemplate(),
1288+
"tencentcloud_dcdb_account": resourceTencentCloudDcdbAccount(),
1289+
"tencentcloud_dcdb_hourdb_instance": resourceTencentCloudDcdbHourdbInstance(),
1290+
"tencentcloud_dcdb_security_group_attachment": resourceTencentCloudDcdbSecurityGroupAttachment(),
12801291
},
12811292

12821293
ConfigureFunc: providerConfigure,

tencentcloud/provider_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const (
2121
ACCOUNT_TYPE_PRIVATE = "PRIVATE"
2222
ACCOUNT_TYPE_SUB_ACCOUNT = "SUB_ACCOUNT"
2323
ACCOUNT_TYPE_SMS = "SMS"
24+
ACCOUNT_TYPE_SES = "SES"
2425
INTERNATIONAL_PROVIDER_SECRET_ID = "TENCENTCLOUD_SECRET_ID_INTERNATIONAL"
2526
INTERNATIONAL_PROVIDER_SECRET_KEY = "TENCENTCLOUD_SECRET_KEY_INTERNATIONAL"
2627
PREPAY_PROVIDER_SECRET_ID = "TENCENTCLOUD_SECRET_ID_PREPAY"
@@ -154,3 +155,19 @@ func testAccCheckTencentCloudDataSourceID(n string) resource.TestCheckFunc {
154155
return nil
155156
}
156157
}
158+
159+
func testAccPreCheckBusiness(t *testing.T, accountType string) {
160+
161+
switch accountType {
162+
case ACCOUNT_TYPE_SES:
163+
if v := os.Getenv(PROVIDER_SECRET_ID); v == "" {
164+
t.Fatalf("%v must be set for acceptance tests\n", PROVIDER_SECRET_ID)
165+
}
166+
if v := os.Getenv(PROVIDER_SECRET_KEY); v == "" {
167+
t.Fatalf("%v must be set for acceptance tests\n", PROVIDER_SECRET_KEY)
168+
}
169+
os.Setenv(PROVIDER_REGION, defaultRegionSes)
170+
default:
171+
testAccPreCheck(t)
172+
}
173+
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/*
2+
Provides a resource to create a ses domain
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_ses_domain" "domain" {
8+
email_identity = "iac.cloud"
9+
}
10+
11+
```
12+
Import
13+
14+
ses domain can be imported using the id, e.g.
15+
```
16+
$ terraform import tencentcloud_ses_domain.domain iac.cloud
17+
```
18+
*/
19+
package tencentcloud
20+
21+
import (
22+
"context"
23+
"fmt"
24+
"log"
25+
26+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
27+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
28+
ses "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses/v20201002"
29+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
30+
)
31+
32+
func resourceTencentCloudSesDomain() *schema.Resource {
33+
return &schema.Resource{
34+
Read: resourceTencentCloudSesDomainRead,
35+
Create: resourceTencentCloudSesDomainCreate,
36+
Delete: resourceTencentCloudSesDomainDelete,
37+
Importer: &schema.ResourceImporter{
38+
State: schema.ImportStatePassthrough,
39+
},
40+
Schema: map[string]*schema.Schema{
41+
"email_identity": {
42+
Type: schema.TypeString,
43+
Required: true,
44+
ForceNew: true,
45+
Description: "Your sender domain. You are advised to use a third-level domain, for example, mail.qcloud.com.",
46+
},
47+
},
48+
}
49+
}
50+
51+
func resourceTencentCloudSesDomainCreate(d *schema.ResourceData, meta interface{}) error {
52+
defer logElapsed("resource.tencentcloud_ses_domain.create")()
53+
defer inconsistentCheck(d, meta)()
54+
55+
logId := getLogId(contextNil)
56+
57+
var (
58+
request = ses.NewCreateEmailIdentityRequest()
59+
emailIdentity string
60+
)
61+
62+
if v, ok := d.GetOk("email_identity"); ok {
63+
emailIdentity = v.(string)
64+
request.EmailIdentity = helper.String(v.(string))
65+
}
66+
67+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
68+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseSesClient().CreateEmailIdentity(request)
69+
if e != nil {
70+
return retryError(e)
71+
} else {
72+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
73+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
74+
}
75+
return nil
76+
})
77+
78+
if err != nil {
79+
log.Printf("[CRITAL]%s create ses domain failed, reason:%+v", logId, err)
80+
return err
81+
}
82+
83+
d.SetId(emailIdentity)
84+
return resourceTencentCloudSesDomainRead(d, meta)
85+
}
86+
87+
func resourceTencentCloudSesDomainRead(d *schema.ResourceData, meta interface{}) error {
88+
defer logElapsed("resource.tencentcloud_ses_domain.read")()
89+
defer inconsistentCheck(d, meta)()
90+
91+
logId := getLogId(contextNil)
92+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
93+
94+
service := SesService{client: meta.(*TencentCloudClient).apiV3Conn}
95+
96+
emailIdentity := d.Id()
97+
98+
domain, err := service.DescribeSesDomain(ctx, emailIdentity)
99+
100+
if err != nil {
101+
return err
102+
}
103+
104+
if domain == nil {
105+
d.SetId("")
106+
return fmt.Errorf("resource `domain` %s does not exist", emailIdentity)
107+
}
108+
109+
_ = d.Set("email_identity", emailIdentity)
110+
111+
return nil
112+
}
113+
114+
func resourceTencentCloudSesDomainDelete(d *schema.ResourceData, meta interface{}) error {
115+
defer logElapsed("resource.tencentcloud_ses_domain.delete")()
116+
defer inconsistentCheck(d, meta)()
117+
118+
logId := getLogId(contextNil)
119+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
120+
121+
service := SesService{client: meta.(*TencentCloudClient).apiV3Conn}
122+
123+
emailIdentity := d.Id()
124+
125+
if err := service.DeleteSesDomainById(ctx, emailIdentity); err != nil {
126+
return err
127+
}
128+
129+
return nil
130+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
// go test -i; go test -test.run TestAccTencentCloudSesDomain_basic -v
10+
func TestAccTencentCloudSesDomain_basic(t *testing.T) {
11+
t.Parallel()
12+
13+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() { testAccPreCheckBusiness(t, ACCOUNT_TYPE_SES) },
15+
Providers: testAccProviders,
16+
Steps: []resource.TestStep{
17+
{
18+
Config: testAccSesDomain,
19+
Check: resource.ComposeTestCheckFunc(
20+
resource.TestCheckResourceAttrSet("tencentcloud_ses_domain.domain", "id"),
21+
resource.TestCheckResourceAttr("tencentcloud_ses_domain.domain", "email_identity", "iac.cloud"),
22+
),
23+
},
24+
{
25+
ResourceName: "tencentcloud_ses_domain.domain",
26+
ImportState: true,
27+
ImportStateVerify: true,
28+
},
29+
},
30+
})
31+
}
32+
33+
const testAccSesDomain = `
34+
35+
resource "tencentcloud_ses_domain" "domain" {
36+
email_identity = "iac.cloud"
37+
}
38+
39+
`

0 commit comments

Comments
 (0)