annet 0.16.14__tar.gz → 0.16.15__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of annet might be problematic. Click here for more details.
- {annet-0.16.14/annet.egg-info → annet-0.16.15}/PKG-INFO +1 -1
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/models.py +7 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/devdb/data/devdb.json +2 -0
- {annet-0.16.14 → annet-0.16.15}/annet/bgp_models.py +1 -0
- {annet-0.16.14 → annet-0.16.15}/annet/implicit.py +15 -12
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/models_converter.py +10 -6
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/peer_models.py +3 -2
- {annet-0.16.14 → annet-0.16.15/annet.egg-info}/PKG-INFO +1 -1
- {annet-0.16.14 → annet-0.16.15}/annet_generators/mesh_example/mesh_logic.py +5 -0
- {annet-0.16.14 → annet-0.16.15}/AUTHORS +0 -0
- {annet-0.16.14 → annet-0.16.15}/LICENSE +0 -0
- {annet-0.16.14 → annet-0.16.15}/MANIFEST.in +0 -0
- {annet-0.16.14 → annet-0.16.15}/README.md +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/fetchers/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/fetchers/stub/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/fetchers/stub/fetcher.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/file/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/file/provider.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/client.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/manufacturer.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/query.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/status_client.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/common/storage_opts.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/provider.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/v24/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/v24/storage.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/v37/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/adapters/netbox/v37/storage.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annet.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/command.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/diff.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/errors.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/filter_acl.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/jsontools.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/lib.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/db.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/devdb/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/views/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/views/dump.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/netdev/views/hardware.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/output.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/patching.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rbparser/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rbparser/acl.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rbparser/deploying.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rbparser/ordering.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rbparser/platform.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rbparser/syntax.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rulebook/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/rulebook/common.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/tabparser.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/annlib/types.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/api/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/argparse.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/cli.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/cli_args.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/configs/context.yml +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/configs/logging.yaml +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/connectors.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/deploy.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/diff.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/executor.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/filtering.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/gen.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/base.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/common/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/common/initial.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/entire.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/exceptions.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/jsonfragment.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/partial.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/perf.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/ref.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/generators/result.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/hardware.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/lib.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/basemodel.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/device_models.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/executor.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/match_args.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/mesh/registry.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/output.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/parallel.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/patching.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/reference.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/arista/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/arista/iface.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/aruba/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/aruba/ap_env.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/aruba/misc.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/b4com/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/b4com/file.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/cisco/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/cisco/iface.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/cisco/misc.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/cisco/vlandb.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/common.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/deploying.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/huawei/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/huawei/aaa.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/huawei/bgp.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/huawei/iface.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/huawei/misc.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/huawei/vlandb.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/juniper/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/nexus/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/nexus/iface.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/patching.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/ribbon/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/routeros/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/routeros/file.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/arista.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/arista.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/arista.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/aruba.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/aruba.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/aruba.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/b4com.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/b4com.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/b4com.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/cisco.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/cisco.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/cisco.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/huawei.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/huawei.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/huawei.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/juniper.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/nexus.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/nexus.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/nexus.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/nokia.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/optixtrans.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/optixtrans.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/optixtrans.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/pc.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/pc.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/pc.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/ribbon.deploy +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/ribbon.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/routeros.order +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/rulebook/texts/routeros.rul +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/storage.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/tabparser.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/text_term_format.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/tracing.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet/types.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet.egg-info/SOURCES.txt +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet.egg-info/dependency_links.txt +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet.egg-info/entry_points.txt +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet.egg-info/requires.txt +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet.egg-info/top_level.txt +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet_generators/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet_generators/example/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet_generators/example/lldp.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet_generators/mesh_example/__init__.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/annet_generators/mesh_example/bgp.py +0 -0
- {annet-0.16.14 → annet-0.16.15}/requirements.txt +0 -0
- {annet-0.16.14 → annet-0.16.15}/setup.cfg +0 -0
- {annet-0.16.14 → annet-0.16.15}/setup.py +0 -0
|
@@ -139,6 +139,13 @@ class Interface(Entity):
|
|
|
139
139
|
family = IpFamily(value=6, label="IPv6")
|
|
140
140
|
else:
|
|
141
141
|
family = IpFamily(value=4, label="IPv4")
|
|
142
|
+
|
|
143
|
+
for existing_addr in self.ip_addresses:
|
|
144
|
+
if existing_addr.address == address_mask and (
|
|
145
|
+
(existing_addr.vrf is None and vrf is None) or
|
|
146
|
+
(existing_addr.vrf is not None and existing_addr.vrf.name == vrf)
|
|
147
|
+
):
|
|
148
|
+
return
|
|
142
149
|
self.ip_addresses.append(IpAddress(
|
|
143
150
|
id=0,
|
|
144
151
|
display=address_mask,
|
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
"Huawei.CE.CE8800.CE8851": " CE8851",
|
|
55
55
|
"Huawei.CE.CE8800.CE8855": " CE8855",
|
|
56
56
|
"Huawei.CE.CE9800": " CE98\\d\\d",
|
|
57
|
+
"Huawei.CE.CE9800.CE9855": " CE9855",
|
|
58
|
+
"Huawei.CE.CE9800.CE9860": " CE9860",
|
|
57
59
|
"Huawei.Quidway": " (LS-)?S",
|
|
58
60
|
"Huawei.Quidway.S2x": "2\\d{3}",
|
|
59
61
|
"Huawei.Quidway.S2x.S2300": "23\\d\\d",
|
|
@@ -71,14 +71,14 @@ def _implicit_tree(device):
|
|
|
71
71
|
netconf
|
|
72
72
|
"""
|
|
73
73
|
elif device.hw.Arista:
|
|
74
|
-
#
|
|
74
|
+
# This part of configuration will not be visible in configuration
|
|
75
75
|
text = r"""
|
|
76
76
|
ip load-sharing trident fields ipv6 destination-port source-ip ingress-interface destination-ip source-port flow-label
|
|
77
77
|
ip load-sharing trident fields ip source-ip source-port destination-ip destination-port ingress-interface
|
|
78
78
|
"""
|
|
79
79
|
elif device.hw.Nexus:
|
|
80
80
|
text = r"""
|
|
81
|
-
#
|
|
81
|
+
# This part of configuration will not be visible in configuration if enabled
|
|
82
82
|
snmp-server enable traps link linkDown
|
|
83
83
|
snmp-server enable traps link linkUp
|
|
84
84
|
"""
|
|
@@ -107,25 +107,24 @@ def _implicit_tree(device):
|
|
|
107
107
|
"""
|
|
108
108
|
|
|
109
109
|
elif device.hw.Nexus.N3x:
|
|
110
|
-
#
|
|
111
|
-
#
|
|
112
|
-
# в данный момент поведение проверенно для Cisco Nexus 3132Q 6.0(2)U6(7)
|
|
110
|
+
# Cisco Nexus has some specific related to "shutdown" command
|
|
111
|
+
# Behavior is cheked on Cisco Nexus 3132Q 6.0(2)U6(7)
|
|
113
112
|
text += r"""
|
|
114
113
|
# SVI
|
|
115
114
|
!interface Vlan*
|
|
116
115
|
!shutdown
|
|
117
116
|
!interface mgmt[0-9]*
|
|
118
117
|
no shutdown
|
|
119
|
-
#
|
|
118
|
+
# Physical and NOT splitted interfaces and subifs
|
|
120
119
|
!interface */Ethernet1\/[0-9.]*/
|
|
121
120
|
no shutdown
|
|
122
|
-
#
|
|
121
|
+
# Physical and NOT splitted interfaces and subifs
|
|
123
122
|
!interface */Ethernet1\/[0-9]+\/[0-9.]+/
|
|
124
123
|
# только explicit
|
|
125
|
-
#
|
|
124
|
+
# Loopbacks
|
|
126
125
|
!interface */Loopback[0-9.]+/
|
|
127
126
|
no shutdown
|
|
128
|
-
#
|
|
127
|
+
# Port-Channels
|
|
129
128
|
!interface */port-channel[0-9.]+/
|
|
130
129
|
no shutdown
|
|
131
130
|
# BGP
|
|
@@ -135,11 +134,15 @@ def _implicit_tree(device):
|
|
|
135
134
|
"""
|
|
136
135
|
elif device.hw.Cisco:
|
|
137
136
|
text += r"""
|
|
138
|
-
!interface *Ethernet
|
|
137
|
+
!interface */\S*Ethernet\S+/
|
|
138
|
+
mtu 1500
|
|
139
|
+
no shutdown
|
|
140
|
+
!interface */Loopback[0-9.]+/
|
|
141
|
+
mtu 1500
|
|
142
|
+
no shutdown
|
|
143
|
+
!interface */port-channel[0-9.]+/
|
|
139
144
|
mtu 1500
|
|
140
145
|
no shutdown
|
|
141
|
-
|
|
142
|
-
|
|
143
146
|
"""
|
|
144
147
|
if device.hw.Cisco.Catalyst:
|
|
145
148
|
# this configuration is not visible in running-config when enabled
|
|
@@ -2,11 +2,13 @@ from dataclasses import dataclass
|
|
|
2
2
|
from ipaddress import ip_interface
|
|
3
3
|
from typing import Optional, Union
|
|
4
4
|
|
|
5
|
-
from adaptix import Retort, loader, Chain, name_mapping
|
|
5
|
+
from adaptix import Retort, loader, Chain, name_mapping, as_is_loader
|
|
6
6
|
|
|
7
7
|
from .peer_models import DirectPeerDTO, IndirectPeerDTO, VirtualPeerDTO, VirtualLocalDTO
|
|
8
|
-
from ..bgp_models import
|
|
9
|
-
|
|
8
|
+
from ..bgp_models import (
|
|
9
|
+
Aggregate, GlobalOptions, VrfOptions, FamilyOptions, Peer, PeerGroup, ASN, PeerOptions,
|
|
10
|
+
Redistribute, BFDTimers,
|
|
11
|
+
)
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
PeerDTO = Union[DirectPeerDTO, IndirectPeerDTO, VirtualPeerDTO]
|
|
@@ -52,6 +54,8 @@ retort = Retort(
|
|
|
52
54
|
loader(FamilyOptions, ObjMapping, Chain.FIRST),
|
|
53
55
|
loader(Aggregate, ObjMapping, Chain.FIRST),
|
|
54
56
|
loader(PeerOptions, ObjMapping, Chain.FIRST),
|
|
57
|
+
as_is_loader(Redistribute),
|
|
58
|
+
as_is_loader(BFDTimers),
|
|
55
59
|
name_mapping(PeerOptions, map={
|
|
56
60
|
"local_as": "asnum",
|
|
57
61
|
}),
|
|
@@ -82,7 +86,7 @@ def to_bgp_peer(local: LocalDTO, connected: PeerDTO, connected_hostname: str, in
|
|
|
82
86
|
result.description = getattr(connected, "description", result.description)
|
|
83
87
|
result.families = getattr(connected, "families", result.families)
|
|
84
88
|
# local
|
|
85
|
-
result.import_policy = getattr(
|
|
86
|
-
result.export_policy = getattr(
|
|
87
|
-
result.update_source = getattr(
|
|
89
|
+
result.import_policy = getattr(local, "import_policy", result.import_policy)
|
|
90
|
+
result.export_policy = getattr(local, "export_policy", result.export_policy)
|
|
91
|
+
result.update_source = getattr(local, "update_source", result.update_source)
|
|
88
92
|
return result
|
|
@@ -96,7 +96,7 @@ class IndirectPeerDTO(MeshSession, _OptionsDTO):
|
|
|
96
96
|
update_source: str
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
class VirtualLocalDTO(
|
|
99
|
+
class VirtualLocalDTO(_OptionsDTO):
|
|
100
100
|
asnum: int
|
|
101
101
|
pod: int
|
|
102
102
|
addr: str
|
|
@@ -109,13 +109,14 @@ class VirtualLocalDTO(BaseMeshModel):
|
|
|
109
109
|
svi: int
|
|
110
110
|
|
|
111
111
|
|
|
112
|
-
class VirtualPeerDTO(MeshSession
|
|
112
|
+
class VirtualPeerDTO(MeshSession):
|
|
113
113
|
addr: str
|
|
114
114
|
description: str
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
class MeshPeerGroup(_OptionsDTO):
|
|
118
118
|
name: str
|
|
119
|
+
families: Annotated[set[FamilyName], Concat()]
|
|
119
120
|
remote_as: Union[int, str]
|
|
120
121
|
internal_name: str
|
|
121
122
|
update_source: str
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from annet.bgp_models import Redistribute, BFDTimers
|
|
1
2
|
from annet.mesh import Right, MeshRulesRegistry, GlobalOptions, MeshSession, DirectPeer, VirtualLocal, VirtualPeer
|
|
2
3
|
|
|
3
4
|
registry = MeshRulesRegistry()
|
|
@@ -6,6 +7,9 @@ registry = MeshRulesRegistry()
|
|
|
6
7
|
@registry.device("{name:.*}")
|
|
7
8
|
def device_handler(global_opts: GlobalOptions):
|
|
8
9
|
global_opts.local_as = 12345
|
|
10
|
+
global_opts.ipv4_unicast.redistributes = (Redistribute(
|
|
11
|
+
protocol="ipv4", policy="sss",
|
|
12
|
+
),)
|
|
9
13
|
global_opts.groups["GROP_NAME"].remote_as = 11111
|
|
10
14
|
|
|
11
15
|
|
|
@@ -21,6 +25,7 @@ def virtual_handler(device: VirtualLocal, peer: VirtualPeer, session: MeshSessio
|
|
|
21
25
|
session.asnum = 12345
|
|
22
26
|
device.svi = 1
|
|
23
27
|
device.addr = "192.168.1.254"
|
|
28
|
+
device.listen_network = ["10.0.0.0/8"]
|
|
24
29
|
peer.addr = f"192.168.127.{peer.num}"
|
|
25
30
|
|
|
26
31
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|