如何在Terraform Provider中实现资源属性二选一必填的互斥校验?
解决方案
报错原因说明
ConflictsWith配置不允许和Required同时生效,两个属性同时标记为必填本身就和互斥逻辑冲突,因此会触发你遇到的报错。
方案1:使用SDK原生ExactlyOneOf配置(推荐,适用于Terraform Plugin SDK v2及以上版本)
SDK v2提供了原生的多选一必填校验规则,直接配置即可实现需求,改后Schema代码如下:
Schema: map[string]*schema.Schema{ "content": { Type: schema.TypeString, Optional: true, Sensitive: true, ExactlyOneOf: []string{"content", "file"}, }, "file": { Type: schema.TypeString, Sensitive: true, Optional: true, ExactlyOneOf: []string{"content", "file"}, }, }
该配置会自动实现以下校验逻辑:
- 必须且只能填写
content或file其中一个属性 - 两个属性同时填写时自动抛出配置冲突错误
- 两个属性都不填写时自动抛出必填提示
方案2:自定义校验逻辑(适用于旧版本SDK)
如果你使用的SDK版本不支持ExactlyOneOf字段,可以在资源的Create、Update生命周期方法的最前面添加手动校验逻辑,示例如下:
// 放在Create/Update方法开头,d为*schema.ResourceData实例 content := d.Get("content").(string) filePath := d.Get("file").(string) if (content == "" && filePath == "") || (content != "" && filePath != "") { return fmt.Errorf("exactly one of `content` or `file` must be configured") }
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

