Skip to content
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
6 changes: 6 additions & 0 deletions .changelog/3625.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
```release-note:new-resource
tencentcloud_mongodb_instance_ssl
```

```release-note:enhancement
resource/tencentcloud_mongodb_instance: remove the validation of `password`
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.4
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1206
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.1.52
Expand All @@ -66,7 +66,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.729
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.777
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.672
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.1096
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.3.4
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.1149
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.853
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.49
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -907,7 +907,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1033/go.mod
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1034/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1056/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1073/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1096/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1107/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1115/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1126/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
Expand Down Expand Up @@ -937,8 +936,9 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.48/go.mod h
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.49/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.50/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.52/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3 h1:r05ohLc0LVEpiEQeOJ5QwCiKk6XM9kjTca6+UAbNR/8=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.4 h1:k8QEWznn11evs+N5ZGQMCCPnzAHxnul2mRIZJB8Lwbo=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.4/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
Expand Down Expand Up @@ -988,8 +988,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.777 h1:8nSy6G
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.777/go.mod h1:Nsd3yEpXQqXrWbN3mJbrk+A2KcdxHVW5xIRFAyIvlAE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.672 h1:sR3MyM9RBw1PNRdWoBrtK+2M9Qbb0i6DfQSrvZ4/4os=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.672/go.mod h1:o3rBKhtfIJfw4BG22M0CQVLQAc0WqIsbyRI/EW52Ka0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.1096 h1:cX2oVX7xaavobw7Qo5RNfyil4wLT9OMRikzyvCpnqzU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.1096/go.mod h1:YhKow73Lzn/iRvvDT0/XBnXsSypr29QZCDU6c4reVRg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.3.4 h1:78Pt+MeLavW0e8v8yTUPJ49e/JvzedockvD8V+A00bc=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.3.4/go.mod h1:G+8Fj2pgv7M/s+D3MBexggPDeHep/03fh9G9Kjf6VMY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.1149 h1:E9riu3snI31isF2lmzRe8CJ3giBbmeFFCXRcajtpjF0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.1149/go.mod h1:+LRDn2y0FXXf1qkivSnRNCUhJ0JDx7OA8YPjNEQtimE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.853 h1:abGpWsAtEuF2QIYKm2m9/hv9OqyHwWNLsd5+67z86BE=
Expand Down
86 changes: 86 additions & 0 deletions openspec/changes/add-mongodb-ssl-config/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Change: 添加 MongoDB 实例 SSL 配置资源

## Why

目前 Terraform Provider 已经支持 MongoDB 实例、参数、透明数据加密等配置管理,但缺少 SSL 访问配置功能。用户无法通过 Terraform 配置 MongoDB 实例的 SSL 访问状态,这限制了安全配置的自动化能力。

腾讯云提供了两个 API 接口来管理 MongoDB SSL 配置:
- `DescribeInstanceSSL` - 查询实例 SSL 开启状态
- `InstanceEnableSSL` - 设置实例 SSL 状态(开启/关闭)

通过实现 `tencentcloud_mongodb_instance_ssl` 资源,用户可以:
- 以声明式方式管理 MongoDB 实例的 SSL 访问配置
- 自动开启或关闭 SSL 加密传输
- 获取 SSL 证书下载链接和过期时间
- 实现安全合规要求的自动化配置
- 提高数据传输安全性

## What Changes

新增 Terraform 配置型资源 `tencentcloud_mongodb_instance_ssl`,支持完整的 CRUD 操作:

### 新增文件
- `tencentcloud/services/mongodb/resource_tc_mongodb_instance_ssl.go` - 资源实现
- `tencentcloud/services/mongodb/resource_tc_mongodb_instance_ssl_test.go` - 验收测试
- `tencentcloud/services/mongodb/resource_tc_mongodb_instance_ssl.md` - 资源文档
- `website/docs/r/mongodb_instance_ssl.html.markdown` - 网站文档

### 修改文件
- `tencentcloud/provider.go` - 注册新资源
- `tencentcloud/services/mongodb/service_tencentcloud_mongodb.go` - 添加 SSL 相关服务方法

### 资源 Schema
```hcl
resource "tencentcloud_mongodb_instance_ssl" "example" {
instance_id = "cmgo-xxxxxxxx"
enable = true
}
```

### 字段说明
- `instance_id` (必填, ForceNew) - MongoDB 实例 ID
- `enable` (必填) - 是否开启 SSL,`true` 为开启,`false` 为关闭

### 输出属性
- `status` (只读) - SSL 开启状态,0 表示关闭,1 表示开启
- `expired_time` (只读) - 证书过期时间(格式:2023-05-01 12:00:00)
- `cert_url` (只读) - 证书下载链接(仅开启 SSL 时有值)

### 资源 ID 格式
使用实例 ID 作为资源 ID:`{instanceId}`

例如:`cmgo-p8vnipr5`

## Impact

### 受影响的规范
- 新增规范:`mongodb-ssl-config` - MongoDB SSL 配置管理

### 受影响的代码
- `tencentcloud/services/mongodb/` - 新增 SSL 配置资源实现
- `tencentcloud/services/mongodb/service_tencentcloud_mongodb.go` - 新增服务方法
- `tencentcloud/provider.go` - 资源注册

### 向后兼容性
- ✅ 完全向后兼容,不影响现有资源
- ✅ 新增资源,不修改现有 API
- ✅ 符合配置型资源模式(Config Resource)

### 依赖关系
- 依赖 `tencentcloud_mongodb_instance` 或其他 MongoDB 实例资源 - 需要已存在的 MongoDB 实例

### 测试影响
- 需要验收测试环境中的 MongoDB 实例
- SSL 配置可能需要一定时间生效

### 类似资源参考
本资源参考以下配置型资源的实现模式:
- `tencentcloud_mongodb_instance_params` - MongoDB 参数配置
- `tencentcloud_mongodb_instance_transparent_data_encryption` - MongoDB 透明数据加密
- `tencentcloud_tdmq_rabbitmq_user_permission` - TDMQ RabbitMQ 权限配置

### 资源特性
- **配置型资源**:管理实例的某个配置项,而非独立的云资源
- **使用实例 ID 作为资源 ID**:遵循配置型资源的 ID 模式
- **无 Delete 真实操作**:删除资源时关闭 SSL(或仅从状态移除)
- **支持 Import**:可导入已存在的 SSL 配置
68 changes: 68 additions & 0 deletions openspec/changes/add-mongodb-ssl-config/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# 实现任务清单

## 1. 服务层实现
- [x] 1.1 在 `service_mongodb_ssl.go` 中添加 `DescribeMongodbInstanceSSLById` 方法
- [x] 1.2 在 `service_mongodb_ssl.go` 中添加 `ModifyMongodbInstanceSSL` 方法
- [x] 1.3 为 `DescribeMongodbInstanceSSLById` 添加重试逻辑 (使用 `resource.Retry` 和 `ReadRetryTimeout`)
- [x] 1.4 为 `ModifyMongodbInstanceSSL` 添加重试逻辑 (使用 `resource.Retry` 和 `WriteRetryTimeout`)

## 2. 资源实现
- [x] 2.1 创建 `resource_tc_mongodb_instance_ssl.go`
- [x] 2.2 实现资源 Schema 定义(2个输入字段:instance_id, enable;3个输出字段:status, expired_time, cert_url)
- [x] 2.3 实现 `resourceTencentCloudMongodbInstanceSslCreate` - 调用 InstanceEnableSSL API
- [x] 2.4 实现 `resourceTencentCloudMongodbInstanceSslRead` - 调用 DescribeInstanceSSL API
- [x] 2.5 实现 `resourceTencentCloudMongodbInstanceSslUpdate` - 调用 InstanceEnableSSL API
- [x] 2.6 实现 `resourceTencentCloudMongodbInstanceSslDelete` - 关闭 SSL
- [x] 2.7 添加 Import 支持(使用实例 ID)
- [x] 2.8 `instance_id` 字段添加 `ForceNew: true` 标记

## 3. Provider 注册
- [x] 3.1 在 `provider.go` 中导入 mongodb 包(已存在,确认导入)
- [x] 3.2 在 ResourcesMap 中注册 `tencentcloud_mongodb_instance_ssl`

## 4. 测试实现
- [x] 4.1 创建 `resource_tc_mongodb_instance_ssl_test.go`
- [x] 4.2 实现 `TestAccTencentCloudMongodbInstanceSsl_basic` 测试用例(开启 SSL)
- [x] 4.3 实现测试用例包含更新场景(开启→关闭→开启)
- [x] 4.4 添加测试辅助函数(testAccCheckMongodbInstanceSslExists, testAccCheckMongodbInstanceSslDestroy)
- [x] 4.5 编写测试配置模板(包含依赖资源:MongoDB 实例)
- [ ] 4.6 运行验收测试并确保通过

## 5. 文档编写
- [x] 5.1 创建 `resource_tc_mongodb_instance_ssl.md` 资源文档
- [x] 5.2 创建 `website/docs/r/mongodb_instance_ssl.html.markdown` 网站文档(自动生成)
- [x] 5.3 添加完整的使用示例(包括依赖的 MongoDB 实例)
- [x] 5.4 文档包含所有字段说明和导入示例
- [x] 5.5 运行 `make doc` 生成文档
- [x] 5.6 在 `provider.md` 中添加资源声明

## 6. 代码质量检查
- [x] 6.1 运行 `make fmt` 格式化代码
- [x] 6.2 编译成功(无编译错误)
- [x] 6.3 检查错误处理和日志记录
- [x] 6.4 确保所有字段都有正确的 Description

## 7. 最终验证
- [x] 7.1 代码实现完成并编译成功
- [x] 7.2 Import 功能已实现
- [x] 7.3 错误处理完善
- [x] 7.4 文档完整
- [x] 7.5 与现有 MongoDB 资源集成正常
- [x] 7.6 SSL 状态、证书 URL 和过期时间字段已实现

## 注意事项

### Delete 操作行为
✅ 已实现 **选项 A**:删除资源时调用 API 关闭 SSL(`enable=false`),保持资源声明式管理的一致性。

### SSL 生效时间
✅ 已实现异步等待逻辑,在 Update 操作中使用 `resource.Retry` 等待 SSL 状态变更生效。

### 证书信息
✅ `cert_url` 和 `expired_time` 字段已正确实现为 Computed 属性,仅在 SSL 开启时有值。

### 实现说明
- 服务层方法创建在单独的文件 `service_mongodb_ssl.go` 中,保持代码组织清晰
- 资源实现遵循项目中配置型资源的最佳实践
- Delete 操作主动关闭 SSL,而不是仅移除状态
- Update 操作包含等待逻辑,确保状态变更生效
1 change: 1 addition & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -1582,6 +1582,7 @@ func Provider() *schema.Provider {
"tencentcloud_mongodb_instance_transparent_data_encryption": mongodb.ResourceTencentCloudMongodbInstanceTransparentDataEncryption(),
"tencentcloud_mongodb_instance_backup_rule": mongodb.ResourceTencentCloudMongodbInstanceBackupRule(),
"tencentcloud_mongodb_instance_params": mongodb.ResourceTencentCloudMongodbInstanceParams(),
"tencentcloud_mongodb_instance_ssl": mongodb.ResourceTencentCloudMongodbInstanceSsl(),
"tencentcloud_mongodb_standby_instance": mongodb.ResourceTencentCloudMongodbStandbyInstance(),
"tencentcloud_mongodb_readonly_instance": mongodb.ResourceTencentCloudMongodbReadOnlyInstance(),
"tencentcloud_dayu_cc_http_policy": dayu.ResourceTencentCloudDayuCCHttpPolicy(),
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.md
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,7 @@ tencentcloud_mongodb_instance_backup
tencentcloud_mongodb_instance_transparent_data_encryption
tencentcloud_mongodb_instance_backup_rule
tencentcloud_mongodb_instance_params
tencentcloud_mongodb_instance_ssl
tencentcloud_mongodb_readonly_instance

TencentDB for MySQL(cdb)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,8 @@ func mongodbAllInstanceReqSet(requestInter interface{}, d *schema.ResourceData)
nodeNum = v.(int)
}

if v, ok := d.GetOk("password"); ok && v.(string) != "" {
if v, ok := d.GetOk("password"); ok {
password = v.(string)
} else {
return fmt.Errorf("`password` cannot be empty when creating")
}

getType := reflect.TypeOf(requestInter)
Expand Down
Loading
Loading