annet 0.16.35__py3-none-any.whl → 0.16.37__py3-none-any.whl

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.

@@ -54,7 +54,7 @@ def get_breed(manufacturer: str, model: str):
54
54
  return "bcom-os"
55
55
  elif manufacturer == "MikroTik":
56
56
  return "routeros"
57
- elif manufacturer == "Moxa":
57
+ elif manufacturer in ("Moxa", "Nebius"):
58
58
  return "moxa"
59
59
  elif manufacturer == "PC":
60
60
  return "pc"
@@ -192,20 +192,25 @@ class NetboxDevice(Entity):
192
192
  breed: str
193
193
 
194
194
  interfaces: List[Interface]
195
- neighbours: Optional[List["NetboxDevice"]]
195
+
196
+ @property
197
+ def neighbors(self) -> List["Entity"]:
198
+ return [
199
+ endpoint.device
200
+ for iface in self.interfaces
201
+ if iface.connected_endpoints
202
+ for endpoint in iface.connected_endpoints
203
+ if endpoint.device
204
+ ]
196
205
 
197
206
  # compat
198
207
  @property
199
208
  def neighbours_fqdns(self) -> list[str]:
200
- if not self.neighbours:
201
- return []
202
- return [dev.fqdn for dev in self.neighbours]
209
+ return [dev.name for dev in self.neighbors]
203
210
 
204
211
  @property
205
212
  def neighbours_ids(self):
206
- if not self.neighbours:
207
- return []
208
- return [dev.id for dev in self.neighbours]
213
+ return [dev.id for dev in self.neighbors]
209
214
 
210
215
  def __hash__(self):
211
216
  return hash((self.id, type(self)))
@@ -214,7 +219,8 @@ class NetboxDevice(Entity):
214
219
  return type(self) is type(other) and self.url == other.url
215
220
 
216
221
  def is_pc(self) -> bool:
217
- return self.device_type.manufacturer.name in ("Mellanox", "NVIDIA", "Moxa") or self.breed == "pc"
222
+ custom_breed_pc = ("Mellanox", "NVIDIA", "Moxa", "Nebius")
223
+ return self.device_type.manufacturer.name in custom_breed_pc or self.breed == "pc"
218
224
 
219
225
  def _make_interface(self, name: str, type: InterfaceType) -> Interface:
220
226
  return Interface(
@@ -5,16 +5,25 @@ DEFAULT_URL = "http://localhost"
5
5
 
6
6
 
7
7
  class NetboxStorageOpts:
8
- def __init__(self, url: str, token: str, insecure: bool = False, exact_host_filter: bool = False):
8
+ def __init__(
9
+ self,
10
+ url: str,
11
+ token: str,
12
+ insecure: bool = False,
13
+ exact_host_filter: bool = False,
14
+ threads: int = 1,
15
+ ):
9
16
  self.url = url
10
17
  self.token = token
11
18
  self.insecure = insecure
12
19
  self.exact_host_filter = exact_host_filter
20
+ self.threads = threads
13
21
 
14
22
  @classmethod
15
23
  def parse_params(cls, conf_params: Optional[dict[str, str]], cli_opts: Any):
16
24
  url = os.getenv("NETBOX_URL") or conf_params.get("url") or DEFAULT_URL
17
25
  token = os.getenv("NETBOX_TOKEN", "").strip() or conf_params.get("token") or ""
26
+ threads = os.getenv("NETBOX_CLIENT_THREADS", "").strip() or conf_params.get("threads") or "1"
18
27
  insecure = False
19
28
  if insecure_env := os.getenv("NETBOX_INSECURE", "").lower():
20
29
  insecure = insecure_env in ("true", "1", "t")
@@ -24,4 +33,10 @@ class NetboxStorageOpts:
24
33
  exact_host_filter = exact_host_filter_env in ("true", "1", "t")
25
34
  else:
26
35
  exact_host_filter = bool(conf_params.get("exact_host_filter") or False)
27
- return cls(url=url, token=token, insecure=insecure, exact_host_filter=exact_host_filter)
36
+ return cls(
37
+ url=url,
38
+ token=token,
39
+ insecure=insecure,
40
+ exact_host_filter=exact_host_filter,
41
+ threads=int(threads),
42
+ )
@@ -24,7 +24,6 @@ logger = getLogger(__name__)
24
24
  @impl_converter(recipe=[
25
25
  link(P[api_models.Device].name, P[models.NetboxDevice].hostname),
26
26
  link(P[api_models.Device].name, P[models.NetboxDevice].fqdn),
27
- link_constant(P[models.NetboxDevice].neighbours, value=None),
28
27
  ])
29
28
  def extend_device_base(
30
29
  device: api_models.Device,
@@ -39,7 +38,6 @@ def extend_device_base(
39
38
  def extend_device(
40
39
  device: api_models.Device,
41
40
  interfaces: List[models.Interface],
42
- neighbours: Optional[List[models.NetboxDevice]],
43
41
  storage: Storage,
44
42
  ) -> models.NetboxDevice:
45
43
  platform_name: str = ""
@@ -64,7 +62,6 @@ def extend_device(
64
62
  hw=hw,
65
63
  storage=storage,
66
64
  )
67
- res.neighbours = neighbours
68
65
  return res
69
66
 
70
67
 
@@ -91,6 +88,7 @@ class NetboxStorageV37(Storage):
91
88
  url = ""
92
89
  token = ""
93
90
  self.exact_host_filter = False
91
+ threads = 1
94
92
  if opts:
95
93
  if opts.insecure:
96
94
  ctx = ssl.create_default_context()
@@ -98,8 +96,10 @@ class NetboxStorageV37(Storage):
98
96
  ctx.verify_mode = ssl.CERT_NONE
99
97
  url = opts.url
100
98
  token = opts.token
99
+ threads = opts.threads
101
100
  self.exact_host_filter = opts.exact_host_filter
102
- self.netbox = NetboxV37(url=url, token=token, ssl_context=ctx)
101
+
102
+ self.netbox = NetboxV37(url=url, token=token, ssl_context=ctx, threads=threads)
103
103
  self._all_fqdns: Optional[list[str]] = None
104
104
  self._id_devices: dict[int, models.NetboxDevice] = {}
105
105
  self._name_devices: dict[str, models.NetboxDevice] = {}
@@ -174,7 +174,6 @@ class NetboxStorageV37(Storage):
174
174
  device.id: extend_device(
175
175
  device=device,
176
176
  interfaces=[],
177
- neighbours=[],
178
177
  storage=self,
179
178
  )
180
179
  for device in self._load_devices(query)
@@ -186,16 +185,8 @@ class NetboxStorageV37(Storage):
186
185
  self._record_device(device)
187
186
 
188
187
  interfaces = self._load_interfaces(list(device_ids))
189
- neighbours = {x.id: x for x in self._load_neighbours(interfaces)}
190
- neighbours_seen: dict[str, set] = defaultdict(set)
191
-
192
188
  for interface in interfaces:
193
189
  device_ids[interface.device.id].interfaces.append(interface)
194
- for e in interface.connected_endpoints or []:
195
- neighbour = neighbours[e.device.id]
196
- if neighbour.id not in neighbours_seen[interface.device.id]:
197
- neighbours_seen[interface.device.id].add(neighbour.id)
198
- device_ids[interface.device.id].neighbours.append(neighbour)
199
190
 
200
191
  return list(device_ids.values())
201
192
 
@@ -233,8 +224,7 @@ class NetboxStorageV37(Storage):
233
224
  extended_ifaces[ip.assigned_object_id].ip_addresses.append(ip)
234
225
  return list(extended_ifaces.values())
235
226
 
236
- def _load_interfaces(self, device_ids: List[int]) -> List[
237
- models.Interface]:
227
+ def _load_interfaces(self, device_ids: List[int]) -> List[models.Interface]:
238
228
  interfaces = self.netbox.dcim_all_interfaces(device_id=device_ids)
239
229
  return self._extend_interfaces(interfaces.results)
240
230
 
@@ -242,25 +232,6 @@ class NetboxStorageV37(Storage):
242
232
  interfaces = self.netbox.dcim_all_interfaces_by_id(id=ids)
243
233
  return self._extend_interfaces(interfaces.results)
244
234
 
245
- def _load_neighbours(self, interfaces: List[models.Interface]) -> List[models.NetboxDevice]:
246
- endpoints = [e for i in interfaces for e in i.connected_endpoints or []]
247
- remote_interfaces_ids = [e.id for e in endpoints]
248
- neighbours_ids = [e.device.id for e in endpoints]
249
- neighbours_ifaces_dics = defaultdict(list)
250
- # load only the connected interface to speed things up
251
- for iface in self._load_interfaces_by_id(remote_interfaces_ids):
252
- neighbours_ifaces_dics[iface.device.id].append(iface)
253
- neighbours = []
254
- for neighbour in self.netbox.dcim_all_devices_by_id(id=neighbours_ids).results:
255
- extended_neighbour = extend_device(
256
- device=neighbour,
257
- storage=self,
258
- interfaces=neighbours_ifaces_dics[neighbour.id],
259
- neighbours=None, # do not load recursively
260
- )
261
- neighbours.append(extended_neighbour)
262
- return neighbours
263
-
264
235
  def get_device(
265
236
  self, obj_id, preload_neighbors=False, use_mesh=None,
266
237
  **kwargs,
@@ -270,13 +241,11 @@ class NetboxStorageV37(Storage):
270
241
 
271
242
  device = self.netbox.dcim_device(obj_id)
272
243
  interfaces = self._load_interfaces([device.id])
273
- neighbours = self._load_neighbours(interfaces)
274
244
 
275
245
  res = extend_device(
276
246
  device=device,
277
247
  storage=self,
278
248
  interfaces=interfaces,
279
- neighbours=neighbours,
280
249
  )
281
250
  self._record_device(res)
282
251
  return res
@@ -312,8 +281,10 @@ def _match_query(exact_host_filter: bool, query: NetboxQuery, device_data: api_m
312
281
  hostnames = [subquery.strip() for subquery in query.globs if FIELD_VALUE_SEPARATOR not in subquery]
313
282
  if not hostnames:
314
283
  return True # no hostnames to check
284
+
315
285
  short_name = device_data.name.split(".")[0]
316
286
  for hostname in hostnames:
287
+ hostname = hostname.strip().rstrip(".")
317
288
  if short_name == hostname or device_data.name == hostname:
318
289
  return True
319
290
  return False
@@ -104,7 +104,7 @@
104
104
  "Nokia.NS7750": " 7750",
105
105
  "Nokia.SR_1s": "SR-1s",
106
106
 
107
- "PC": "^(PC|pc|[Mm]ellanox SN|[Ee]dge-?[Cc]ore|[Mm]oxa|NVIDIA|[Aa]sterfusion CX|[Uu]fi[Ss]pace)",
107
+ "PC": "^(PC|pc|[Mm]ellanox SN|[Ee]dge-?[Cc]ore|[Mm]oxa|NVIDIA|Nebius|[Aa]sterfusion CX|[Uu]fi[Ss]pace)",
108
108
 
109
109
  "PC.Whitebox": "([Mm]ellanox SN|[Ee]dge-?[Cc]ore|NVIDIA|[Aa]sterfusion CX|[Uu]fi[Ss]pace)",
110
110
  "PC.Whitebox.Mellanox": "[Mm]ellanox",
@@ -132,6 +132,8 @@
132
132
  "PC.Whitebox.Ufispace.S": " S",
133
133
  "PC.Whitebox.Ufispace.S.S9100": " S91\\d\\d",
134
134
  "PC.Whitebox.Ufispace.S.S9100.S9110_32X": " S9110-32X",
135
+ "PC.Nebius": "^Nebius",
136
+ "PC.Nebius.NB-E-BR-DCU-AST2600": "^Nebius NB-E-BR-DCU-AST2600",
135
137
 
136
138
  "RouterOS": "^([Rr]outer[Oo][Ss]|[Mm]ikro[Tt]ik)",
137
139
 
annet/bgp_models.py CHANGED
@@ -182,6 +182,7 @@ class PeerGroup:
182
182
  internal_name: str = ""
183
183
  description: str = ""
184
184
  update_source: str = ""
185
+ peer_filter: str = ""
185
186
  import_policy: str = ""
186
187
  export_policy: str = ""
187
188
 
@@ -245,8 +246,10 @@ class VrfOptions:
245
246
  l2vpn_evpn: FamilyOptions
246
247
 
247
248
  vrf_name_global: Optional[str] = None
248
- l3vni: Optional[int] = None
249
+ import_policy: str = ""
250
+ export_policy: str = ""
249
251
  as_path_relax: bool = False
252
+ l3vni: Optional[int] = None
250
253
  rt_import: list[str] = field(default_factory=list)
251
254
  rt_export: list[str] = field(default_factory=list)
252
255
  rt_import_v4: list[str] = field(default_factory=list)
@@ -281,7 +284,7 @@ class BgpConfig:
281
284
  peers: list[Peer]
282
285
 
283
286
 
284
- def _used_policies(peer: Union[Peer, PeerGroup]) -> Iterable[str]:
287
+ def _used_policies(peer: Union[Peer, PeerGroup, VrfOptions]) -> Iterable[str]:
285
288
  if peer.import_policy:
286
289
  yield peer.import_policy
287
290
  if peer.export_policy:
@@ -309,6 +312,7 @@ def extract_policies(config: BgpConfig) -> Sequence[str]:
309
312
  for group in vrf.groups:
310
313
  result.extend(_used_policies(group))
311
314
  result.extend(_used_redistribute_policies(vrf))
315
+ result.extend(_used_policies(vrf))
312
316
  for group in config.global_options.groups:
313
317
  result.extend(_used_policies(group))
314
318
  for peer in config.peers:
annet/mesh/executor.py CHANGED
@@ -132,30 +132,30 @@ class MeshExecutor:
132
132
  # we can have multiple rules for the same pair
133
133
  # we merge them according to remote fqdn
134
134
  neighbor_peers: dict[PeerKey, Pair] = {}
135
- # TODO batch resolve
136
135
  rules = self._registry.lookup_direct(device.fqdn, device.neighbours_fqdns)
137
136
  fqdns = {
138
137
  rule.name_right if rule.direct_order else rule.name_left
139
138
  for rule in rules
140
139
  }
141
- neigbors = {
140
+ logger.debug("Loading neighbor devices: %s", fqdns)
141
+ neighbors = {
142
142
  d.fqdn: d for d in self._storage.make_devices(list(fqdns))
143
143
  }
144
144
  for rule in rules:
145
145
  handler_name = self._handler_name(rule.handler)
146
146
  if rule.direct_order:
147
- if rule.name_right not in neigbors:
148
- print(list(neigbors), flush=True)
147
+ if rule.name_right not in neighbors:
149
148
  raise ValueError(
150
- f"Device `{device.fqdn}` has no neighbor `{rule.name_right}` required for `{handler_name}`. {list(neigbors)}",
149
+ f"Device `{device.fqdn}` has no neighbor `{rule.name_right}` "
150
+ f"required for `{handler_name}`. {list(neighbors)}",
151
151
  )
152
- neighbor_device = neigbors[rule.name_right]
152
+ neighbor_device = neighbors[rule.name_right]
153
153
  else:
154
- if rule.name_left not in neigbors:
154
+ if rule.name_left not in neighbors:
155
155
  raise ValueError(
156
156
  f"Device `{device.fqdn}` has no neighbor `{rule.name_left}` required for `{handler_name}`",
157
157
  )
158
- neighbor_device = neigbors[rule.name_left]
158
+ neighbor_device = neighbors[rule.name_left]
159
159
  all_connected_ports = [
160
160
  (p1.name, p2.name)
161
161
  for p1, p2 in self._storage.search_connections(device, neighbor_device)
@@ -238,6 +238,7 @@ class MeshExecutor:
238
238
  rule.name_right if rule.direct_order else rule.name_left
239
239
  for rule in rules
240
240
  }
241
+ logger.debug("Loading indirect connected devices: %s", fqdns)
241
242
  connected_devices = {
242
243
  d.fqdn: d for d in self._storage.make_devices(list(fqdns))
243
244
  }
annet/mesh/peer_models.py CHANGED
@@ -126,6 +126,7 @@ class MeshPeerGroup(_OptionsDTO):
126
126
  internal_name: str
127
127
  update_source: str
128
128
  description: str
129
+ peer_filter: str
129
130
 
130
131
  import_policy: str
131
132
  export_policy: str
@@ -110,7 +110,9 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
110
110
  def acl_arista(self, _):
111
111
  return r"""
112
112
  ip prefix-list
113
+ seq
113
114
  ipv6 prefix-list
115
+ seq
114
116
  """
115
117
 
116
118
  def _arista_prefix_list(
@@ -120,21 +122,18 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
120
122
  match: PrefixMatchValue,
121
123
  plist: IpPrefixList,
122
124
  ) -> Iterable[Sequence[str]]:
123
- for i, prefix in enumerate(plist.members):
124
- addr_mask = ip_interface(prefix)
125
- yield (
126
- prefix_type,
127
- "prefix-list",
128
- name,
129
- f"seq {i * 5 + 5}",
130
- "permit",
131
- str(addr_mask.ip).upper(),
132
- str(addr_mask.network.prefixlen),
133
- ) + (
134
- ("ge", str(match.greater_equal)) if match.greater_equal is not None else ()
135
- ) + (
136
- ("le", str(match.less_equal)) if match.less_equal is not None else ()
137
- )
125
+ with self.block(prefix_type, "prefix-list", name):
126
+ for i, prefix in enumerate(plist.members):
127
+ addr_mask = ip_interface(prefix)
128
+ yield (
129
+ f"seq {i * 10 + 10}",
130
+ "permit",
131
+ addr_mask.with_prefixlen,
132
+ ) + (
133
+ ("ge", str(match.greater_equal)) if match.greater_equal is not None else ()
134
+ ) + (
135
+ ("le", str(match.less_equal)) if match.less_equal is not None else ()
136
+ )
138
137
 
139
138
  def run_arista(self, device: Any):
140
139
  policies = self.get_policies(device)
@@ -88,6 +88,7 @@ interface
88
88
 
89
89
  (?:ip|ipv6) routing
90
90
 
91
+ ip prefix-list
91
92
 
92
93
  ip community-list
93
94
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: annet
3
- Version: 0.16.35
3
+ Version: 0.16.37
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -23,7 +23,7 @@ Requires-Dist: yarl>=1.8.2
23
23
  Requires-Dist: adaptix==3.0.0b7
24
24
  Requires-Dist: dataclass-rest==0.4
25
25
  Provides-Extra: netbox
26
- Requires-Dist: annetbox[sync]>=0.1.12; extra == "netbox"
26
+ Requires-Dist: annetbox[sync]>=0.2.0; extra == "netbox"
27
27
  Dynamic: home-page
28
28
  Dynamic: license
29
29
  Dynamic: provides-extra
@@ -1,7 +1,7 @@
1
1
  annet/__init__.py,sha256=W8kkZ3Axu-6VJwgQ0cn4UeOVNy6jab0cqgHKLQny1D0,2141
2
2
  annet/annet.py,sha256=TMdEuM7GJQ4TjRVmuK3bCTZN-21lxjQ9sXqEdILUuBk,725
3
3
  annet/argparse.py,sha256=v1MfhjR0B8qahza0WinmXClpR8UiDFhmwDDWtNroJPA,12855
4
- annet/bgp_models.py,sha256=M2gtOJMsua8SlUySc57VtG71-TmydxP1bthQEcUVpNo,9528
4
+ annet/bgp_models.py,sha256=NBPbMWwzo4uWFslrpE4blQO1k4CxJqeleRBDhDg9Rd0,9665
5
5
  annet/cli.py,sha256=hDpjIr3w47lgQ_CvCQS1SXFDK-SJrf5slbT__5u6GIA,12342
6
6
  annet/cli_args.py,sha256=KQlihxSl-Phhq1-9oJDdNSbIllEX55LlPfH6viEKOuw,13483
7
7
  annet/connectors.py,sha256=-Lghz3PtWCBU8Ohrp0KKQcmm1AUZtN0EnOaZ6IQgCQI,5105
@@ -32,15 +32,15 @@ annet/adapters/netbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
32
32
  annet/adapters/netbox/provider.py,sha256=3IrfZ6CfCxf-lTnJlIC2TQ8M_rDxOB_B7HGXZ92vAgA,1643
33
33
  annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  annet/adapters/netbox/common/client.py,sha256=PaxHG4W9H8_uunIwMBNYkLq4eQJYoO6p6gY-ciQs7Nc,2563
35
- annet/adapters/netbox/common/manufacturer.py,sha256=LAPT6OlV_ew96GhtwNrCpeiT0IGrg2_9__MMdZk431U,1733
36
- annet/adapters/netbox/common/models.py,sha256=Xq6Dc3kY9_QyvS9DiKEq1AxjTxiF4qEKhs1EMtBw-k4,7384
35
+ annet/adapters/netbox/common/manufacturer.py,sha256=Y9kqU13q6fwYu0_HiotUKAy7OHFZngkC2s3s4IDAbDg,1745
36
+ annet/adapters/netbox/common/models.py,sha256=cnNf2oB_BDRz4ZYkHpib1qPxwY1iREJMiWlg8T0lORY,7559
37
37
  annet/adapters/netbox/common/query.py,sha256=mv5WlU6gGge8gUYwloXDXEABmfP5teYyq8DyBtGdFkw,1761
38
38
  annet/adapters/netbox/common/status_client.py,sha256=XXx0glomaBaglmkUEy6YtFOxQQkHb59CDA0h1I-IhxM,592
39
- annet/adapters/netbox/common/storage_opts.py,sha256=5tt6wxUUJTIzNbOVXMnYBwZedNAIqYlve3YWl6GdbZM,1197
39
+ annet/adapters/netbox/common/storage_opts.py,sha256=wfv1spElomwgVYMCgGth3SWVF0RsRgtUgq9GpFL9hJs,1520
40
40
  annet/adapters/netbox/v24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  annet/adapters/netbox/v24/storage.py,sha256=THI592VLx3ehixsPZQ1Ko3mYIAZQbnDY-toIziqBbL8,6005
42
42
  annet/adapters/netbox/v37/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- annet/adapters/netbox/v37/storage.py,sha256=noG-Lt1ZRiXm_uJE8xTRBsEvnEWcB1p2Uszuz6zECiI,12721
43
+ annet/adapters/netbox/v37/storage.py,sha256=PYT2qffMVVkeIlBYg_Msj6u-68rVv1UlA9-5plioRUM,11094
44
44
  annet/annlib/__init__.py,sha256=fT1l4xV5fqqg8HPw9HqmZVN2qwS8i6X1aIm2zGDjxKY,252
45
45
  annet/annlib/command.py,sha256=uuBddMQphtn8P5MO5kzIa8_QrtMns-k05VeKv1bcAuA,1043
46
46
  annet/annlib/diff.py,sha256=MZ6eQAU3cadQp8KaSE6uAYFtcfMDCIe_eNuVROnYkCk,4496
@@ -55,7 +55,7 @@ annet/annlib/types.py,sha256=VHU0CBADfYmO0xzB_c5f-mcuU3dUumuJczQnqGlib9M,852
55
55
  annet/annlib/netdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  annet/annlib/netdev/db.py,sha256=fI_u5aya4l61mbYSjj4JwlVfi3s7obt2jqERSuXGRUI,1634
57
57
  annet/annlib/netdev/devdb/__init__.py,sha256=aKYjjLbJebdKBjnGDpVLQdSqrV2JL24spGm58tmMWVU,892
58
- annet/annlib/netdev/devdb/data/devdb.json,sha256=DBl8iU2K_tydteB_a8mXUlgrv_Na3UXSJschuhyjsqs,6284
58
+ annet/annlib/netdev/devdb/data/devdb.json,sha256=4zTtgZw0SagYZuyItYiwoFxUAsQ1NTXfn2MjRSh-b4U,6387
59
59
  annet/annlib/netdev/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  annet/annlib/netdev/views/dump.py,sha256=rIlyvnA3uM8bB_7oq1nS2KDxTp6dQh2hz-FbNhYIpOU,4630
61
61
  annet/annlib/netdev/views/hardware.py,sha256=3JCZLH7deIHhCguwPJTUX-WDvWjG_xt6BdSEZSO6zkQ,4226
@@ -84,10 +84,10 @@ annet/generators/common/initial.py,sha256=qYBxXFhyOPy34cxc6hsIXseod-lYCmmbuNHpM0
84
84
  annet/mesh/__init__.py,sha256=lcgdnBIxc2MAN7Er1bcErEKPqrjWO4uIp_1FldMXTYg,557
85
85
  annet/mesh/basemodel.py,sha256=E6NTOneiMDwB1NCpjDRECoaeQ0f3n_fmTLnKTrSHTU4,4917
86
86
  annet/mesh/device_models.py,sha256=aFbwVWNSDBcph_Kvv6qZT-uUz0Tbg3z45EvP4i1z2ao,3600
87
- annet/mesh/executor.py,sha256=6NBi7KBZzKf_92TgxypkoBN0WhZt1egXx0qALzo9Cq8,17497
87
+ annet/mesh/executor.py,sha256=z_3e2neRR4GoEQfJlvfbalelKzOz5yb78zm9lIcLYw4,17578
88
88
  annet/mesh/match_args.py,sha256=CR3kdIV9NGtyk9E2JbcOQ3TRuYEryTWP3m2yCo2VCWg,5751
89
89
  annet/mesh/models_converter.py,sha256=3q2zs7K8S3pfYSUKKRdtl5CJGbeg4TtYxofAVs_MBsk,3085
90
- annet/mesh/peer_models.py,sha256=9vn5ENiEZqOZFRFSOJReT8E3E2GzBte628mkmS3cplI,2770
90
+ annet/mesh/peer_models.py,sha256=Div4o1t6Z0TWvy-8WKg4-n9WOd2PKCmIpfbkILDlDtk,2791
91
91
  annet/mesh/port_processor.py,sha256=RHiMS5W8qoDkTKiarQ748bcr8bNx4g_R4Y4vZg2k4TU,478
92
92
  annet/mesh/registry.py,sha256=xmWF7yxWXmwqX2_jyMAKrbGd2G9sjb4rYDx4Xk61QKc,9607
93
93
  annet/rpl/__init__.py,sha256=0kcIktE3AmS0rlm9xzVDf53xk08OeZXgD-6ZLCt_KCs,731
@@ -105,7 +105,7 @@ annet/rpl_generators/cumulus_frr.py,sha256=F-LRT-UPnztUqinp3KYKqh796L9dqkzPKBUxM
105
105
  annet/rpl_generators/entities.py,sha256=DIpgAQ8Tslo2hq6iFBaYkJX12BFBiccN8GOaRVxR1Uk,1985
106
106
  annet/rpl_generators/execute.py,sha256=wS6e6fwcPWywsHB0gBMqZ17eF0s4YOBgDgwPB_cr5Rw,431
107
107
  annet/rpl_generators/policy.py,sha256=NeqB0reRN_KuY8LYkeGT3dRPe2HFDT9RfmVy5fcA3zw,32570
108
- annet/rpl_generators/prefix_lists.py,sha256=GyNbqXvRVGiuetLSXG2kQidRUXPMEAhR74AJJFSDQZc,7244
108
+ annet/rpl_generators/prefix_lists.py,sha256=D4WXeISevf62EmDu1GYdldjz2gmONFFlmgMyGAOa_m8,7248
109
109
  annet/rpl_generators/rd.py,sha256=YGXgx1D2D0-pixgspXJzA6NvW8lx3AmHMxIY2l5rraI,1457
110
110
  annet/rulebook/__init__.py,sha256=oafL5HC8QHdkO9CH2q_fxohPMxOgjn-dNQa5kPjuqsA,3942
111
111
  annet/rulebook/common.py,sha256=zK1s2c5lc5HQbIlMUQ4HARQudXSgOYiZ_Sxc2I_tHqg,721
@@ -136,7 +136,7 @@ annet/rulebook/ribbon/__init__.py,sha256=TRbkQVvk0-HxkUQW9-LmiG6XIfTZ-8t3SiaDemN
136
136
  annet/rulebook/routeros/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  annet/rulebook/routeros/file.py,sha256=zK7RwBk1YaVoDSFSg1u7Pt8u0Fk3nhhu27aJRngemwc,137
138
138
  annet/rulebook/texts/arista.deploy,sha256=OS9eFyJpEPztcOHkBwajw_RTJfTT7ivaMHfx4_HXaUg,792
139
- annet/rulebook/texts/arista.order,sha256=TKy3S56tIypwfVaw0akK1sXGatCpLVwpB4Jvq-dIu90,1457
139
+ annet/rulebook/texts/arista.order,sha256=e7e5pnzMZAfmXJ0sUaaWmep6JMeErNnd7DkouUVIZsU,1472
140
140
  annet/rulebook/texts/arista.rul,sha256=QQbro8eFlc7DCHk0-CTHX_rnj5rqumRzXlY60ga72jo,815
141
141
  annet/rulebook/texts/aruba.deploy,sha256=hI432Bq-of_LMXuUflCu7eNSEFpx6qmj0KItEw6sgHI,841
142
142
  annet/rulebook/texts/aruba.order,sha256=ZMakkn0EJ9zomgY6VssoptJImrHrUmYnCqivzLBFTRo,1158
@@ -176,10 +176,10 @@ annet_generators/rpl_example/generator.py,sha256=zndIGfV4ZlTxPgAGYs7bMQvTc_tYScO
176
176
  annet_generators/rpl_example/items.py,sha256=Ez1RF5YhcXNCusBmeApIjRL3rBlMazNZd29Gpw1_IsA,766
177
177
  annet_generators/rpl_example/mesh.py,sha256=z_WgfDZZ4xnyh3cSf75igyH09hGvtexEVwy1gCD_DzA,288
178
178
  annet_generators/rpl_example/route_policy.py,sha256=z6nPb0VDeQtKD1NIg9sFvmUxBD5tVs2frfNIuKdM-5c,2318
179
- annet-0.16.35.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
180
- annet-0.16.35.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
181
- annet-0.16.35.dist-info/METADATA,sha256=XiL8MGmXK4eW_mXEUkn6P6AoDJYlKpqdzAeom1JFr8Q,854
182
- annet-0.16.35.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
183
- annet-0.16.35.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
184
- annet-0.16.35.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
185
- annet-0.16.35.dist-info/RECORD,,
179
+ annet-0.16.37.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
180
+ annet-0.16.37.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
181
+ annet-0.16.37.dist-info/METADATA,sha256=-esXnAU-CbKx5Cp3QA41GqBb4w5eWxFUasMwdiljmVo,853
182
+ annet-0.16.37.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
183
+ annet-0.16.37.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
184
+ annet-0.16.37.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
185
+ annet-0.16.37.dist-info/RECORD,,