如何通过Python TTP解析器兼容解析单文件中Nokia SR VPLS混合配置
单TTP模板兼容两种诺基亚SR EVPN配置实现方案
完全可以通过单份TTP模板同时覆盖两种配置场景,无需拆分多套模板,核心利用TTP的可选匹配、默认值赋值、并行规则匹配能力即可实现兼容。
两种配置核心差异对齐
先明确两类配置的非对齐点,所有差异点全部做可选匹配处理即可:
- bgp配置段差异:场景1无嵌套子配置,场景2嵌套
route-distinguisher、route-target出入方向参数 - bgp-evpn下mpls配置段差异:
- 场景1:无mpls参考标识,
auto-bind-tunnel为单行格式auto-bind-tunnel resolution any,无control-word配置 - 场景2:携带mpls参考标识,
auto-bind-tunnel为嵌套块结构,包含resolution-filter隧道类型过滤列表、resolution参数,额外配置control-word
- 场景1:无mpls参考标识,
具体模板调整方法
1. bgp段配置可选嵌套匹配
不要将rd、rt参数设置为必匹配项,通过可选group+默认值配置,适配空bgp段场景,模板片段参考:
<group name="vpls_service"> service vpls {{ service_id }} {{ service_name }} <group name="bgp" set="rd=None, rt_import=[], rt_export=[]"> bgp route-distinguisher {{ rd }} route-target import {{ rt_import | joinmatches }} route-target export {{ rt_export | joinmatches }} exit </group>
上述配置中,当bgp段无任何子配置时,TTP会自动给rd、rt_import、rt_export字段赋预设的默认值,不会出现匹配失败的问题。
2. mpls段非通用参数设为可选
将mpls参考标识、control-word两个仅场景2存在的参数加可选标记?,同时配置和设备默认行为一致的默认值:
<group name="bgp_evpn"> bgp-evpn evi {{ evi_id }} <group name="mpls"> mpls {{ mpls_ref? | default(None) }} no shutdown {{ admin_status | set("up") }} control-word {{ cw_flag? | set("enabled") | default("disabled") }} <!-- 并行匹配两种格式的auto-bind-tunnel --> auto-bind-tunnel resolution {{ abt_res_simple? }} <group name="auto_bind_tunnel" set="resolution=None, res_filter=[]"> auto-bind-tunnel resolution {{ resolution }} resolution-filter {{ res_filter | joinmatches }} exit </group> exit </group> exit </group> exit </group>
3. auto-bind-tunnel双格式兼容处理
上述模板中对auto-bind-tunnel写了两个并行的匹配规则,TTP会根据实际配置结构自动命中对应规则:
- 遇到单行格式配置时,会将resolution的值存入
abt_res_simple字段 - 遇到嵌套块格式配置时,会进入
auto_bind_tunnel嵌套组,分别解析resolution和resolution-filter参数
可以通过TTP内置宏做解析后字段归一化,避免输出字段分裂,宏参考:
<macro> def normalize_abt(data): for svc in data: mpls_sec = svc.get("bgp_evpn", {}).get("mpls", {}) # 归一化单行格式的auto-bind-tunnel字段 if mpls_sec.get("abt_res_simple"): abt_sec = mpls_sec.setdefault("auto_bind_tunnel", {}) abt_sec["resolution"] = mpls_sec.pop("abt_res_simple") abt_sec["res_filter"] = [] return data </macro>
验证要点
- 测试时将两种格式的配置混放在同一份测试文件中执行解析,确认无匹配遗漏、无字段缺失
- 多值参数(route-target、resolution-filter)使用
joinmatches过滤器时,确认无值场景下输出空列表、多值场景下正确输出列表 - 所有可选参数的默认值需要和诺基亚SR设备的默认配置行为对齐,比如无control-word配置时默认值为disabled,避免解析结果和实际设备行为不一致
内容的提问来源于stack exchange,提问作者H.Sheng
相关产品推荐
相关产品推荐

