Conflict Check Design Pattern
背景 在一个网络自动化项目中,防火墙策略由 NSO 缓存在 Redis 中,主要有两种数据结构: object:地址对象,key 是名称,value 是一个数组,数组元素是实际的 IP 地址或 CIDR 网段 group_object:地址组,有自己的 name 和 value,value 是一个数组,数组元素是 object 的 name 或另一个 group_object 的 name group 和 object 形成嵌套结构:一个 group 的 value 列表里,既可以直接引用 object,也可以引用其他 group,形成递归树。 问题 冲突检测模块的目标是判断用户提交的网络策略是否已在设备缓存中存在,并决定后续操作: 情况 结果 用户策略在缓存中不存在 在设备上新建策略 用户策略在缓存中部分存在 更新设备上的策略数据 用户策略是缓存中某条策略的超集 (superset) 更新设备上的策略数据 用户策略与缓存中某条策略完全匹配 不需要做任何操作 用户策略是缓存中某条策略的子集 (subset) 不需要做任何操作 设备上过期策略的删除由其它模块处理,不属于本模块的责任范围。 每条策略(用户输入或设备缓存)有以下几个关键属性: src:源地址数组,每个元素是 object_name 或 group_name(address_object) dst:目标地址数组,结构与 src 相同 service:协议和端口数组,每个元素是 service_object_name 或 service_group_name src 和 dst 属于 address_object,service 属于 service_object。两种类型都具备 group/object 嵌套结构,因此 PolicyObject 类可以同时表达这两种类型的对象。 ...