如何用JSON Schema实现VRF属性在VLAN对象中全有或全无的校验?
解决方案
要实现所有VLAN对象统一包含或统一不包含vrf属性的校验规则,简单的allOf-if-then无法覆盖动态的VLAN键名,需用oneOf结合additionalProperties约束所有VLAN实例的一致性,具体Schema写法如下:
YAML 版本 Schema
type: object properties: vlans: type: object # 定义VLAN基础规则:必填id和subnet,声明vrf合法结构 $defs: vlanBase: type: object required: ["id", "subnet"] properties: id: type: integer subnet: type: string format: ipv4-cidr vrf: type: string # 所有VLAN需符合基础规则,且满足二选一的一致性要求 oneOf: - # 场景1:所有VLAN均不能包含vrf属性 additionalProperties: allOf: - $ref: "#/properties/vlans/$defs/vlanBase" - not: required: ["vrf"] - # 场景2:所有VLAN必须包含vrf属性 additionalProperties: allOf: - $ref: "#/properties/vlans/$defs/vlanBase" - required: ["vrf"]
规则说明
- 基础约束:通过
$defs.vlanBase统一规定每个VLAN必须包含id和subnet,同时明确vrf的合法数据结构。 - 一致性约束:
oneOf强制vlans下的所有VLAN只能符合两种场景之一:- 所有VLAN禁止出现
vrf属性(用not: {required: ["vrf"]}拦截该属性) - 所有VLAN必须存在
vrf属性(用required: ["vrf"]强制要求)
- 所有VLAN禁止出现
- 动态键兼容:用
additionalProperties替代具体键名(如vlan1、vlan2),能适配任意命名的VLAN对象。
原方案失效原因
if-then通常针对特定属性或固定实例做条件校验,但vlans下的VLAN键名是动态的,无法提前枚举所有可能的键名,导致规则只能覆盖部分情况,无法约束所有VLAN的一致性。
内容的提问来源于stack exchange,提问作者chrixm
相关产品推荐
相关产品推荐

