Skip to content

Commit e369625

Browse files
authored
Merge pull request #607 from ChrisdeR/hotfix/ssl_certificate_delete
resource tencentcloud_ssl_certificate fix bug when destroy a certificate
2 parents dcd423e + d55bc49 commit e369625

8 files changed

+478
-129
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ FEATURES:
77
* **New Data Source**: `tencentcloud_ssm_secrets`
88
* **New Data Source**: `tencentcloud_ssm_secret_versions`
99

10+
ENHANCEMENTS:
11+
12+
* Resource: `tencentcloud_ssl_certificate` refactor logic with api3.0 .
13+
* Data Source: `tencentcloud_ssl_certificates` refactor logic with api3.0 .
14+
1015
## 1.54.1 (March 24, 2021)
1116

1217
ENHANCEMENTS:

tencentcloud/data_source_tc_ssl_certificates.go

Lines changed: 127 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import (
1717
"log"
1818
"strconv"
1919

20+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
2021
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
22+
ssl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
2123
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
2224
)
2325

@@ -144,46 +146,42 @@ func dataSourceTencentCloudSslCertificatesRead(d *schema.ResourceData, m interfa
144146
id = helper.String(raw.(string))
145147
}
146148

147-
service := SslService{client: m.(*TencentCloudClient).apiV3Conn}
148-
149-
respCertificates, err := service.DescribeCertificates(ctx, id, name, certType)
149+
sslService := SSLService{client: m.(*TencentCloudClient).apiV3Conn}
150+
certificateList, err := GetCertificateList(ctx, sslService, id, name, certType)
150151
if err != nil {
151152
return err
152153
}
153154

154-
certificates := make([]map[string]interface{}, 0, len(respCertificates))
155-
ids := make([]string, 0, len(respCertificates))
156-
157-
for _, certificate := range respCertificates {
155+
certificates := make([]map[string]interface{}, 0, len(certificateList))
156+
ids := make([]string, 0, len(certificateList))
157+
for _, certificate := range certificateList {
158158
if nilNames := CheckNil(certificate, map[string]string{
159-
"Id": "id",
160-
"Alias": "name",
161-
"CertType": "type",
162-
"ProjectId": "project id",
163-
"Cert": "cert",
164-
"ProductZhName": "product zh name",
165-
"Domain": "domain",
166-
"Status": "status",
167-
"CertBeginTime": "begin time",
168-
"CertEndTime": "end time",
169-
"InsertTime": "create time",
159+
"CertificateId": "id",
160+
"Alias": "name",
161+
"CertificateType": "type",
162+
"ProjectId": "project id",
163+
"ProductZhName": "product zh name",
164+
"Domain": "domain",
165+
"Status": "status",
166+
"CertBeginTime": "begin time",
167+
"CertEndTime": "end time",
168+
"InsertTime": "create time",
170169
}); len(nilNames) > 0 {
171170
return fmt.Errorf("certificate %v are nil", nilNames)
172171
}
173172

174-
ids = append(ids, *certificate.Id)
173+
ids = append(ids, *certificate.CertificateId)
175174

176175
projectId, err := strconv.Atoi(*certificate.ProjectId)
177176
if err != nil {
178177
return err
179178
}
180179

181180
m := map[string]interface{}{
182-
"id": *certificate.Id,
181+
"id": *certificate.CertificateId,
183182
"name": *certificate.Alias,
184-
"type": *certificate.CertType,
183+
"type": *certificate.CertificateType,
185184
"project_id": projectId,
186-
"cert": *certificate.Cert,
187185
"product_zh_name": *certificate.ProductZhName,
188186
"domain": *certificate.Domain,
189187
"status": *certificate.Status,
@@ -200,6 +198,26 @@ func dataSourceTencentCloudSslCertificatesRead(d *schema.ResourceData, m interfa
200198
m["subject_names"] = subjectAltNames
201199
}
202200

201+
describeRequest := ssl.NewDescribeCertificateDetailRequest()
202+
describeRequest.CertificateId = certificate.CertificateId
203+
var outErr, inErr error
204+
var describeResponse *ssl.DescribeCertificateDetailResponse
205+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
206+
describeResponse, inErr = sslService.DescribeCertificateDetail(ctx, describeRequest)
207+
if inErr != nil {
208+
return retryError(inErr)
209+
}
210+
return nil
211+
})
212+
if outErr != nil {
213+
log.Printf("[CRITAL]%s read certificate failed, reason: %v", logId, outErr)
214+
return outErr
215+
}
216+
217+
if describeResponse != nil && describeResponse.Response != nil {
218+
m["cert"] = *describeResponse.Response.CertificatePublicKey
219+
}
220+
203221
certificates = append(certificates, m)
204222
}
205223

@@ -216,3 +234,90 @@ func dataSourceTencentCloudSslCertificatesRead(d *schema.ResourceData, m interfa
216234

217235
return nil
218236
}
237+
238+
func GetCertificateList(ctx context.Context, sslService SSLService, id, name, certType *string) (certificateList []*ssl.Certificates, errRet error) {
239+
logId := getLogId(contextNil)
240+
241+
var (
242+
outErr, inErr error
243+
certificatesById, certificatesByName []*ssl.Certificates
244+
)
245+
246+
if id == nil && name == nil {
247+
describeRequest := ssl.NewDescribeCertificatesRequest()
248+
describeRequest.CertificateType = certType
249+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
250+
certificateList, inErr = sslService.DescribeCertificates(ctx, describeRequest)
251+
if inErr != nil {
252+
return retryError(inErr)
253+
}
254+
return nil
255+
})
256+
if outErr != nil {
257+
log.Printf("[CRITAL]%s read certificates failed, reason: %v", logId, outErr)
258+
errRet = outErr
259+
return
260+
}
261+
return
262+
}
263+
264+
if id != nil {
265+
describeRequest := ssl.NewDescribeCertificatesRequest()
266+
describeRequest.CertificateType = certType
267+
describeRequest.SearchKey = id
268+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
269+
certificatesById, inErr = sslService.DescribeCertificates(ctx, describeRequest)
270+
if inErr != nil {
271+
return retryError(inErr)
272+
}
273+
return nil
274+
})
275+
if outErr != nil {
276+
log.Printf("[CRITAL]%s read certificates failed, reason: %v", logId, outErr)
277+
errRet = outErr
278+
return
279+
}
280+
}
281+
if name != nil {
282+
describeRequest := ssl.NewDescribeCertificatesRequest()
283+
describeRequest.CertificateType = certType
284+
describeRequest.SearchKey = name
285+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
286+
certificatesByName, inErr = sslService.DescribeCertificates(ctx, describeRequest)
287+
if inErr != nil {
288+
return retryError(inErr)
289+
}
290+
return nil
291+
})
292+
if outErr != nil {
293+
log.Printf("[CRITAL]%s read certificates failed, reason: %v", logId, outErr)
294+
errRet = outErr
295+
return
296+
}
297+
}
298+
299+
certificateList = GetCommonCertificates(certificatesById, certificatesByName)
300+
return
301+
}
302+
303+
func GetCommonCertificates(certificatesById, certificatesByName []*ssl.Certificates) (result []*ssl.Certificates) {
304+
if len(certificatesById) == 0 {
305+
return certificatesByName
306+
} else if len(certificatesByName) == 0 {
307+
return certificatesById
308+
}
309+
certificateMap := make(map[string]bool)
310+
for _, certificate := range certificatesById {
311+
if _, ok := certificateMap[*certificate.CertificateId]; ok {
312+
continue
313+
}
314+
certificateMap[*certificate.CertificateId] = true
315+
}
316+
317+
for _, certificate := range certificatesByName {
318+
if _, ok := certificateMap[*certificate.CertificateId]; ok {
319+
result = append(result, certificate)
320+
}
321+
}
322+
return
323+
}

0 commit comments

Comments
 (0)