annet 0.0__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.

Files changed (137) hide show
  1. annet/__init__.py +61 -0
  2. annet/adapters/__init__.py +0 -0
  3. annet/adapters/netbox/__init__.py +0 -0
  4. annet/adapters/netbox/common/__init__.py +0 -0
  5. annet/adapters/netbox/common/client.py +87 -0
  6. annet/adapters/netbox/common/manufacturer.py +62 -0
  7. annet/adapters/netbox/common/models.py +105 -0
  8. annet/adapters/netbox/common/query.py +23 -0
  9. annet/adapters/netbox/common/status_client.py +25 -0
  10. annet/adapters/netbox/common/storage_opts.py +14 -0
  11. annet/adapters/netbox/provider.py +34 -0
  12. annet/adapters/netbox/v24/__init__.py +0 -0
  13. annet/adapters/netbox/v24/api_models.py +73 -0
  14. annet/adapters/netbox/v24/client.py +59 -0
  15. annet/adapters/netbox/v24/storage.py +196 -0
  16. annet/adapters/netbox/v37/__init__.py +0 -0
  17. annet/adapters/netbox/v37/api_models.py +38 -0
  18. annet/adapters/netbox/v37/client.py +62 -0
  19. annet/adapters/netbox/v37/storage.py +149 -0
  20. annet/annet.py +25 -0
  21. annet/annlib/__init__.py +7 -0
  22. annet/annlib/command.py +49 -0
  23. annet/annlib/diff.py +158 -0
  24. annet/annlib/errors.py +8 -0
  25. annet/annlib/filter_acl.py +196 -0
  26. annet/annlib/jsontools.py +116 -0
  27. annet/annlib/lib.py +495 -0
  28. annet/annlib/netdev/__init__.py +0 -0
  29. annet/annlib/netdev/db.py +62 -0
  30. annet/annlib/netdev/devdb/__init__.py +28 -0
  31. annet/annlib/netdev/devdb/data/devdb.json +137 -0
  32. annet/annlib/netdev/views/__init__.py +0 -0
  33. annet/annlib/netdev/views/dump.py +121 -0
  34. annet/annlib/netdev/views/hardware.py +112 -0
  35. annet/annlib/output.py +246 -0
  36. annet/annlib/patching.py +533 -0
  37. annet/annlib/rbparser/__init__.py +0 -0
  38. annet/annlib/rbparser/acl.py +120 -0
  39. annet/annlib/rbparser/deploying.py +55 -0
  40. annet/annlib/rbparser/ordering.py +52 -0
  41. annet/annlib/rbparser/platform.py +51 -0
  42. annet/annlib/rbparser/syntax.py +115 -0
  43. annet/annlib/rulebook/__init__.py +0 -0
  44. annet/annlib/rulebook/common.py +350 -0
  45. annet/annlib/tabparser.py +648 -0
  46. annet/annlib/types.py +35 -0
  47. annet/api/__init__.py +826 -0
  48. annet/argparse.py +415 -0
  49. annet/cli.py +237 -0
  50. annet/cli_args.py +503 -0
  51. annet/configs/context.yml +18 -0
  52. annet/configs/logging.yaml +39 -0
  53. annet/connectors.py +77 -0
  54. annet/deploy.py +536 -0
  55. annet/diff.py +84 -0
  56. annet/executor.py +551 -0
  57. annet/filtering.py +40 -0
  58. annet/gen.py +865 -0
  59. annet/generators/__init__.py +435 -0
  60. annet/generators/base.py +136 -0
  61. annet/generators/common/__init__.py +0 -0
  62. annet/generators/common/initial.py +33 -0
  63. annet/generators/entire.py +97 -0
  64. annet/generators/exceptions.py +10 -0
  65. annet/generators/jsonfragment.py +125 -0
  66. annet/generators/partial.py +119 -0
  67. annet/generators/perf.py +79 -0
  68. annet/generators/ref.py +15 -0
  69. annet/generators/result.py +127 -0
  70. annet/hardware.py +45 -0
  71. annet/implicit.py +139 -0
  72. annet/lib.py +128 -0
  73. annet/output.py +167 -0
  74. annet/parallel.py +448 -0
  75. annet/patching.py +25 -0
  76. annet/reference.py +148 -0
  77. annet/rulebook/__init__.py +114 -0
  78. annet/rulebook/arista/__init__.py +0 -0
  79. annet/rulebook/arista/iface.py +16 -0
  80. annet/rulebook/aruba/__init__.py +16 -0
  81. annet/rulebook/aruba/ap_env.py +146 -0
  82. annet/rulebook/aruba/misc.py +8 -0
  83. annet/rulebook/cisco/__init__.py +0 -0
  84. annet/rulebook/cisco/iface.py +68 -0
  85. annet/rulebook/cisco/misc.py +57 -0
  86. annet/rulebook/cisco/vlandb.py +90 -0
  87. annet/rulebook/common.py +19 -0
  88. annet/rulebook/deploying.py +87 -0
  89. annet/rulebook/huawei/__init__.py +0 -0
  90. annet/rulebook/huawei/aaa.py +75 -0
  91. annet/rulebook/huawei/bgp.py +97 -0
  92. annet/rulebook/huawei/iface.py +33 -0
  93. annet/rulebook/huawei/misc.py +337 -0
  94. annet/rulebook/huawei/vlandb.py +115 -0
  95. annet/rulebook/juniper/__init__.py +107 -0
  96. annet/rulebook/nexus/__init__.py +0 -0
  97. annet/rulebook/nexus/iface.py +92 -0
  98. annet/rulebook/patching.py +143 -0
  99. annet/rulebook/ribbon/__init__.py +12 -0
  100. annet/rulebook/texts/arista.deploy +20 -0
  101. annet/rulebook/texts/arista.order +125 -0
  102. annet/rulebook/texts/arista.rul +59 -0
  103. annet/rulebook/texts/aruba.deploy +20 -0
  104. annet/rulebook/texts/aruba.order +83 -0
  105. annet/rulebook/texts/aruba.rul +87 -0
  106. annet/rulebook/texts/cisco.deploy +27 -0
  107. annet/rulebook/texts/cisco.order +82 -0
  108. annet/rulebook/texts/cisco.rul +105 -0
  109. annet/rulebook/texts/huawei.deploy +188 -0
  110. annet/rulebook/texts/huawei.order +388 -0
  111. annet/rulebook/texts/huawei.rul +471 -0
  112. annet/rulebook/texts/juniper.rul +120 -0
  113. annet/rulebook/texts/nexus.deploy +24 -0
  114. annet/rulebook/texts/nexus.order +85 -0
  115. annet/rulebook/texts/nexus.rul +83 -0
  116. annet/rulebook/texts/nokia.rul +31 -0
  117. annet/rulebook/texts/pc.order +5 -0
  118. annet/rulebook/texts/pc.rul +9 -0
  119. annet/rulebook/texts/ribbon.deploy +22 -0
  120. annet/rulebook/texts/ribbon.rul +77 -0
  121. annet/rulebook/texts/routeros.order +38 -0
  122. annet/rulebook/texts/routeros.rul +45 -0
  123. annet/storage.py +125 -0
  124. annet/tabparser.py +36 -0
  125. annet/text_term_format.py +95 -0
  126. annet/tracing.py +170 -0
  127. annet/types.py +227 -0
  128. annet-0.0.dist-info/AUTHORS +21 -0
  129. annet-0.0.dist-info/LICENSE +21 -0
  130. annet-0.0.dist-info/METADATA +26 -0
  131. annet-0.0.dist-info/RECORD +137 -0
  132. annet-0.0.dist-info/WHEEL +5 -0
  133. annet-0.0.dist-info/entry_points.txt +5 -0
  134. annet-0.0.dist-info/top_level.txt +2 -0
  135. annet_generators/__init__.py +0 -0
  136. annet_generators/example/__init__.py +12 -0
  137. annet_generators/example/lldp.py +53 -0
annet/tracing.py ADDED
@@ -0,0 +1,170 @@
1
+ import contextlib
2
+ import inspect
3
+ from abc import ABC, abstractmethod
4
+ from functools import wraps
5
+ from typing import Optional, Type, Union
6
+
7
+ from annet.connectors import CachedConnector
8
+
9
+
10
+ MinDurationT = Optional[Union[str, int]]
11
+
12
+
13
+ class _Nop:
14
+ def __getattr__(self, item):
15
+ return _Nop()
16
+
17
+ def __enter__(self):
18
+ return self
19
+
20
+ def __exit__(self, exc_type, exc_val, exc_tb):
21
+ pass
22
+
23
+ def __call__(self, *args, **kwargs):
24
+ return _Nop()
25
+
26
+ def __bool__(self):
27
+ return False
28
+
29
+
30
+ class Tracing(ABC):
31
+ enabled = False
32
+
33
+ @abstractmethod
34
+ def function(self, arg=None, /, **kwargs):
35
+ pass
36
+
37
+ @abstractmethod
38
+ def contextmanager(self, arg=None, /, **kwargs):
39
+ pass
40
+
41
+ @abstractmethod
42
+ def get_current_span(self, context_value=None):
43
+ pass
44
+
45
+ @abstractmethod
46
+ def set_device_attributes(self, span, device):
47
+ pass
48
+
49
+ @abstractmethod
50
+ def start_as_current_span(self, *args, **kwargs):
51
+ pass
52
+
53
+ @abstractmethod
54
+ def start_as_linked_span(self, *args, **kwargs):
55
+ pass
56
+
57
+ @abstractmethod
58
+ def attach_context(self, *args, **kwargs):
59
+ pass
60
+
61
+ @abstractmethod
62
+ def inject_context(self, *args, **kwargs):
63
+ pass
64
+
65
+ @abstractmethod
66
+ def extract_context(self, *args, **kwargs):
67
+ pass
68
+
69
+ @abstractmethod
70
+ def get_context(self, *args, **kwargs):
71
+ pass
72
+
73
+ @abstractmethod
74
+ def force_flush(self):
75
+ pass
76
+
77
+
78
+ class DummyTracing(Tracing):
79
+ def function(self, arg=None, /, **kwargs):
80
+ def decorator(func):
81
+ return func
82
+
83
+ return decorator if arg is None else decorator(arg)
84
+
85
+ def contextmanager(self, arg=None, /, **kwargs):
86
+ def decorator(cls_or_func):
87
+ return cls_or_func
88
+
89
+ return decorator if arg is None else decorator(arg)
90
+
91
+ def get_current_span(self, context_value=None):
92
+ return None
93
+
94
+ def set_device_attributes(self, span, device):
95
+ return None
96
+
97
+ def start_as_current_span(self, *args, **kwargs):
98
+ return _Nop()
99
+
100
+ def start_as_linked_span(self, *args, **kwargs):
101
+ return _Nop()
102
+
103
+ def attach_context(self, *args, **kwargs):
104
+ return
105
+
106
+ def inject_context(self, *args, **kwargs):
107
+ return
108
+
109
+ def extract_context(self, *args, **kwargs):
110
+ return
111
+
112
+ def get_context(self, *args, **kwargs):
113
+ return
114
+
115
+ def force_flush(self):
116
+ return
117
+
118
+
119
+ class _TracingConnector(CachedConnector[Tracing]):
120
+ name = "Tracing"
121
+ ep_name = "tracing"
122
+
123
+ def _get_default(self) -> Type[Tracing]:
124
+ return DummyTracing
125
+
126
+
127
+ tracing_connector = _TracingConnector()
128
+
129
+
130
+ def function(arg=None, /, **outer_kwargs):
131
+ def decorator(func):
132
+ cache = None
133
+
134
+ @wraps(func)
135
+ def wrapper(*args, **kwargs):
136
+ nonlocal cache
137
+ if cache is None:
138
+ cache = tracing_connector.get().function(func, **outer_kwargs)
139
+ return cache(*args, **kwargs)
140
+
141
+ return wrapper
142
+
143
+ return decorator if arg is None else decorator(arg)
144
+
145
+
146
+ def contextmanager(arg=None, /, **outer_kwargs):
147
+ def decorator(cls_or_func):
148
+ if inspect.isfunction(cls_or_func):
149
+ cache = None
150
+
151
+ @contextlib.contextmanager
152
+ @wraps(cls_or_func)
153
+ def wrapper(*args, **kwargs):
154
+ nonlocal cache
155
+ if cache is None:
156
+ cache = tracing_connector.get().contextmanager(cls_or_func, **outer_kwargs)
157
+ with cache(*args, **kwargs) as val:
158
+ yield val
159
+
160
+ return wrapper
161
+ else:
162
+ @wraps(cls_or_func.__enter__)
163
+ def enter(*args, **kwargs):
164
+ tracing_connector.get().contextmanager(cls_or_func, **outer_kwargs) # redefine __enter__ and __exit__
165
+ return cls_or_func.__enter__(*args, **kwargs) # pylint: disable=unnecessary-dunder-call
166
+
167
+ setattr(cls_or_func, "__enter__", enter)
168
+ return cls_or_func
169
+
170
+ return decorator if arg is None else decorator(arg)
annet/types.py ADDED
@@ -0,0 +1,227 @@
1
+ from collections import OrderedDict
2
+ from typing import Any, Dict, List, MutableMapping, NamedTuple, Optional, Tuple, Union
3
+
4
+ from annet.annlib.types import Op # pylint: disable=unused-import
5
+
6
+ from annet.storage import Device, Storage
7
+
8
+
9
+ class PCDiffFile(NamedTuple):
10
+ label: str
11
+ diff_lines: List[str]
12
+
13
+
14
+ class PCDiff(NamedTuple):
15
+ hostname: str
16
+ diff_files: List[PCDiffFile]
17
+
18
+
19
+ Diff = List[Tuple]
20
+ ExitCode = int
21
+
22
+
23
+ class GeneratorPerf:
24
+ """
25
+ Рантайм статистика времени выполнения генератора
26
+ """
27
+
28
+ def __init__(self, total: float, rt: float, meta: Optional[Dict[str, Any]] = None):
29
+ self.total = total
30
+ self.rt = rt
31
+ self._meta = meta
32
+
33
+ @property
34
+ def meta(self) -> Dict[str, Any]:
35
+ return self._meta or {}
36
+
37
+
38
+ class GeneratorPartialRunArgs:
39
+ """
40
+ Параметры и модификаторы для запуска run_partial_generators
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ device: Device,
46
+ use_acl: bool = False,
47
+ use_acl_safe: bool = False,
48
+ annotate: bool = False,
49
+ generators_context: Optional[str] = None,
50
+ no_new: bool = False,
51
+ ):
52
+ self.device = device
53
+ self.use_acl = use_acl # фильтруем по acl ввыод генератора (--no-acl для дебага)
54
+ self.use_acl_safe = use_acl_safe # [NOCDEV-6190] используем более строгий генераторный acl
55
+ self.annotate = annotate # добавляем в каждую строку вывода информацию откуда она была заyield'ена
56
+ self.generators_context = generators_context # строка с именем контекста генераторов
57
+ self.no_new = no_new # для опции --clear, не пытаемся запустить генераторы, выдаем только acl
58
+
59
+
60
+ class GeneratorPartialResult:
61
+ """
62
+ Результат запуска Partial-генератора
63
+ """
64
+
65
+ def __init__(
66
+ self,
67
+ name: str,
68
+ tags: List[str],
69
+ acl: str,
70
+ acl_rules: Dict[str, Any], # OrderedDict
71
+ acl_safe: str,
72
+ acl_safe_rules: Dict[str, Any], # OrderedDict
73
+ output: str,
74
+ config: Dict[str, Any], # OrderedDict
75
+ safe_config: Dict[str, Any], # OrderedDict
76
+ perf: GeneratorPerf,
77
+ ):
78
+ self.name = name
79
+ self.tags = tags
80
+ self.acl = acl
81
+ self.acl_rules = acl_rules
82
+ self.acl_safe = acl_safe
83
+ self.acl_safe_rules = acl_safe_rules
84
+ self.output = output
85
+ self.config = config
86
+ self.safe_config = safe_config
87
+ self.perf = perf
88
+
89
+
90
+ class GeneratorEntireResult:
91
+ """
92
+ Результат запуска Entire-генератора
93
+ """
94
+
95
+ def __init__(
96
+ self,
97
+ name: str,
98
+ tags: List[str],
99
+ path: Optional[str],
100
+ output: str,
101
+ reload: str,
102
+ prio: int,
103
+ perf: GeneratorPerf,
104
+ is_safe: bool,
105
+ ):
106
+ self.name = name
107
+ self.tags = tags
108
+ self.path = path
109
+ self.output = output
110
+ self.reload = reload
111
+ self.prio = prio
112
+ self.perf = perf
113
+ self.is_safe = is_safe
114
+
115
+
116
+ class GeneratorJSONFragmentResult:
117
+ """
118
+ Результат запуска JSONFragment-генератора
119
+ """
120
+
121
+ def __init__(
122
+ self,
123
+ name: str,
124
+ tags: List[str],
125
+ path: str,
126
+ acl: List[str],
127
+ acl_safe: List[str],
128
+ config: Dict[str, Any],
129
+ reload: str,
130
+ perf: GeneratorPerf,
131
+ reload_prio: int,
132
+ ):
133
+ self.name = name
134
+ self.tags = tags
135
+ self.path = path
136
+ self.acl = acl
137
+ self.acl_safe = acl_safe
138
+ self.config = config
139
+ self.reload = reload
140
+ self.perf = perf
141
+ self.reload_prio = reload_prio
142
+
143
+
144
+ GeneratorResult = Union[GeneratorEntireResult, GeneratorPartialResult, GeneratorJSONFragmentResult]
145
+
146
+
147
+ class OldNewResult:
148
+ """Результат запуска old_new
149
+ """
150
+
151
+ # pylint: disable=too-many-arguments
152
+ def __init__(
153
+ self,
154
+ device=None,
155
+ old=None,
156
+ new=None,
157
+ acl_rules=None,
158
+ new_files=None,
159
+ old_files=None,
160
+ err=None,
161
+ partial_result=None,
162
+ entire_result=None,
163
+ old_json_fragment_files=None,
164
+ new_json_fragment_files=None,
165
+ json_fragment_result=None,
166
+ implicit_rules=None,
167
+ perf=None,
168
+ acl_safe_rules=None,
169
+ safe_old=None,
170
+ safe_new=None,
171
+ safe_new_files=None,
172
+ safe_new_json_fragment_files=None,
173
+ filter_acl_rules=None
174
+ ):
175
+ self.device: Device = device
176
+ self.old: MutableMapping = old if old else OrderedDict()
177
+ self.new: MutableMapping = new if new else OrderedDict()
178
+ self.acl_rules: MutableMapping = acl_rules
179
+ self.new_files: MutableMapping = new_files if new_files else {}
180
+ self.old_files: MutableMapping = old_files if old_files else {}
181
+ self.err: Optional[Exception] = err
182
+ self.partial_results: Dict[str, GeneratorPartialResult] = partial_result or {}
183
+ self.entire_results: Dict[str, GeneratorEntireResult] = entire_result or {}
184
+ self.old_json_fragment_files: Dict[str, Any] = old_json_fragment_files or {}
185
+ self.new_json_fragment_files: Dict[str, Tuple[Any, Optional[str]]] = new_json_fragment_files or {}
186
+ self.json_fragment_results: Dict[str, GeneratorJSONFragmentResult] = json_fragment_result or {}
187
+ self.implicit_rules: Dict[str, Any] = implicit_rules or OrderedDict()
188
+ self.perf: Dict[str, Dict[str, float]] = perf or {}
189
+
190
+ # safe acl and configs with it applied
191
+ self.acl_safe_rules: MutableMapping = acl_safe_rules or {}
192
+ self.safe_old: MutableMapping = safe_old if safe_old else OrderedDict()
193
+ self.safe_new: MutableMapping = safe_new if safe_new else OrderedDict()
194
+ self.safe_new_files: MutableMapping = safe_new_files if safe_new_files else {}
195
+ self.safe_new_json_fragment_files: MutableMapping = safe_new_json_fragment_files or {}
196
+
197
+ self.filter_acl_rules: Optional[MutableMapping] = filter_acl_rules
198
+
199
+ def get_old(self, safe: bool = False) -> MutableMapping:
200
+ if safe:
201
+ return self.safe_old
202
+
203
+ return self.old
204
+
205
+ def get_new(self, safe: bool = False) -> MutableMapping:
206
+ if safe:
207
+ return self.safe_new
208
+
209
+ return self.new
210
+
211
+ def get_acl_rules(self, safe: bool = False) -> MutableMapping:
212
+ if safe:
213
+ return self.acl_safe_rules
214
+
215
+ return self.acl_rules
216
+
217
+ def get_new_files(self, safe: bool = False) -> MutableMapping:
218
+ if safe:
219
+ return self.safe_new_files
220
+
221
+ return self.new_files
222
+
223
+ def get_new_file_fragments(self, safe: bool = False) -> Dict[str, Tuple[Any, Optional[str]]]: # pylint: disable=unused-argument
224
+ if safe:
225
+ return self.safe_new_json_fragment_files
226
+
227
+ return self.new_json_fragment_files
@@ -0,0 +1,21 @@
1
+ The following authors have created the source code of "annet" published and distributed by YANDEX LLC as the owner:
2
+
3
+ Aleksandr Balezin <gescheit@yandex-team.ru>
4
+ Aleksandr Klimenko <v0lk@yandex-team.ru>
5
+ Aleksei Lymar <alymar@nebius.com>
6
+ Alexey Andriyanov <alan@yandex-team.ru>
7
+ Alexey Esin <adess@yandex-team.ru>
8
+ Anton Egorov <eg0rov@yandex-team.ru>
9
+ Artem Denisov <artemdenisov@yandex-team.ru>
10
+ Azat Kurbanov <azatkurbanov@yandex-team.ru>
11
+ Devaev Maxim <mdevaev@yandex-team.ru>
12
+ Fedor Zhukov <azryve@nebius.com>
13
+ Grigorii Ozhegov <ozhegov@yandex-team.ru>
14
+ Grigorii Solovev <gslv@yandex-team.ru>
15
+ Konstantin Sazonov <moonug@yandex-team.ru>
16
+ Roman Glebov <kitaro@yandex-team.ru>
17
+ Roman Karaulanov <anteron92@yandex-team.ru>
18
+ Sergey Mishchenko <smishche@yandex-team.ru>
19
+ Vlad Starostin <vladstar@yandex-team.ru>
20
+ Vladimir Sukhonosov <xornet@yandex-team.ru>
21
+ Vladislav Daniliuk <jayt@nebius.com>
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) [2023] YANDEX LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,26 @@
1
+ Metadata-Version: 2.1
2
+ Name: annet
3
+ Version: 0.0
4
+ Summary: annet
5
+ Home-page: https://github.com/annetutil/annet
6
+ License: MIT
7
+ Requires-Python: >=3.8
8
+ License-File: LICENSE
9
+ License-File: AUTHORS
10
+ Requires-Dist: colorama >=0.4.6
11
+ Requires-Dist: tabulate >=0.9.0
12
+ Requires-Dist: jsonpatch >=1.33
13
+ Requires-Dist: jsonpointer >=2.4
14
+ Requires-Dist: PyYAML >=6.0.1
15
+ Requires-Dist: Pygments >=2.14.0
16
+ Requires-Dist: Mako >=1.2.4
17
+ Requires-Dist: Jinja2 >=3.1.2
18
+ Requires-Dist: psutil >=5.8.0
19
+ Requires-Dist: packaging >=23.2
20
+ Requires-Dist: contextlog >=1.1
21
+ Requires-Dist: valkit >=0.1.4
22
+ Requires-Dist: aiohttp >=3.8.4
23
+ Requires-Dist: yarl >=1.8.2
24
+ Requires-Dist: adaptix ==3.0.0b2
25
+ Requires-Dist: dataclass-rest ==0.4
26
+
@@ -0,0 +1,137 @@
1
+ annet/__init__.py,sha256=oyElxAW97sHgQccGafhaWVBveBn1gSjjdP_xHROaRLg,2139
2
+ annet/annet.py,sha256=TMdEuM7GJQ4TjRVmuK3bCTZN-21lxjQ9sXqEdILUuBk,725
3
+ annet/argparse.py,sha256=MoBD0LPnHdA6HU7z1uQNArYlkD92znoeGIFTMnS4dRM,12608
4
+ annet/cli.py,sha256=Nk956O3nOEVsOLyOqKDgjqJaB2uVlwYb9tPrWMbB4E4,9632
5
+ annet/cli_args.py,sha256=Wv2X2wk6trTsGpKpcaZacGqVbDxMzEJvN8uYIJOq4D0,16071
6
+ annet/connectors.py,sha256=FLFJlhb73g2c8e61zYnGn8dTkIiaaWYqeUCsZd48AWg,2471
7
+ annet/deploy.py,sha256=B8E0P_VvCrS2URjFvgmUiIkHp95g7pAWfmT34igaDeo,18893
8
+ annet/diff.py,sha256=zLcaCnb4lZRUb7frpH1CstQ3kacRcCblZs1uLG8J5lk,3391
9
+ annet/executor.py,sha256=bw7COJNtssuxIqbQehlHYJnkdUeYvvL8WO5B-c67XE0,19040
10
+ annet/filtering.py,sha256=F4ZKUCU3Yb1RlL2zKdyHtVUaWPzjWF4vWyMcdygKNYk,852
11
+ annet/gen.py,sha256=jrtGQwGjD3Rf4U8CNXcsijuPN6RM2ryZj7S0fv4XxdU,32492
12
+ annet/hardware.py,sha256=HYPDfji_GdRn5S0_0fl4rvM7byOY9aHxG6VMAtsLaxE,1090
13
+ annet/implicit.py,sha256=QigK4uoxvrFho2h9yFjOq1d9rLsC5xFlAU4bKkCuMWk,5139
14
+ annet/lib.py,sha256=zQIfNBg7fAAk2BHbHAqy_McAiXhz0RqpBAcfdU-6pAA,3742
15
+ annet/output.py,sha256=hJNGzL4Z3KgvqaCBkkmuuiXPhb64F1QV8YHkwnfhaaI,6852
16
+ annet/parallel.py,sha256=hLkzEht0KhzmzUWDdO4QFYQHzhxs3wPlTA8DxbB2ziw,17160
17
+ annet/patching.py,sha256=nILbY5oJajN0b1j3f0HEJm05H3HVThnWvB7vDVh7UQw,559
18
+ annet/reference.py,sha256=B8mH8VUMcecPnzULiTVb_kTQ7jQrCL7zp4pfIZQa5fk,4035
19
+ annet/storage.py,sha256=B16iUJwxKd0RWnUaogWQs0WQtiH1YCzPypSHNpBYPDM,2395
20
+ annet/tabparser.py,sha256=ZjiI43ZVbrpMVR8qNbTbNh_U3oZ26VDc_2Y9wkkDkYA,874
21
+ annet/text_term_format.py,sha256=CHb6viv45vmYl-SK1A1vyPHGhaEni6jVybBusaQnct8,2813
22
+ annet/tracing.py,sha256=ndpM-au1c88uBBpOuH_z52qWZL773edYozNyys_wA68,4044
23
+ annet/types.py,sha256=uHfRL3Bh6B3TyS9WfdukWKyF0fpYNdIzFB6Dgjo_Pqk,7101
24
+ annet/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ annet/adapters/netbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ annet/adapters/netbox/provider.py,sha256=OM7Hq2vnMHNVBfubJvx2qJlMYm3VvKhomdLMNO8YnLQ,1024
27
+ annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ annet/adapters/netbox/common/client.py,sha256=-lWZmphD-OPuLIHNKhW_h2bnjrVaiyKYAD_MUPasEbo,2483
29
+ annet/adapters/netbox/common/manufacturer.py,sha256=UH_tEKT3GXC8WSm15q0xxXRE7aj0b0icgwmR--PRWBs,1771
30
+ annet/adapters/netbox/common/models.py,sha256=yHppe8UIc4Ww8UUqXChlfkmqgr96uhsOlvT8NrxvYGA,1917
31
+ annet/adapters/netbox/common/query.py,sha256=OgUuF-bvshpoBUkrOs0tsMUAhjTsttzx3VV30ryFl0Y,577
32
+ annet/adapters/netbox/common/status_client.py,sha256=W4nTb2yvBlJ2UkWUmUhKQ2PaSQb1shjhHj5ebb4s2s4,591
33
+ annet/adapters/netbox/common/storage_opts.py,sha256=rl_0pr3VzmOy6PDZIUMkKSBfJh90gD9TFL3yBhK_8ME,337
34
+ annet/adapters/netbox/v24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ annet/adapters/netbox/v24/api_models.py,sha256=D6CWsqRQz91LEFUdrC53GkO0EWL4SWK305wJlEe21k0,1333
36
+ annet/adapters/netbox/v24/client.py,sha256=-r91zVTThn12mN1zBj3XNyqlP6BGOrAPm_GbBT2bXpI,1497
37
+ annet/adapters/netbox/v24/storage.py,sha256=ZidFYibx8TSVuTPqMg8JhVTW9ZnfWCvFFaCLcQwYXmY,5864
38
+ annet/adapters/netbox/v37/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ annet/adapters/netbox/v37/api_models.py,sha256=W9l1pXaatBY0zuGwku4Smzw3d7tJoXwqpJDvrfDEm4U,905
40
+ annet/adapters/netbox/v37/client.py,sha256=GgFIV5IGlyEplvwOLLd1BxtsbPWkeHEtL22kWV_X0b0,1668
41
+ annet/adapters/netbox/v37/storage.py,sha256=moFUulyf64zDId1WXOvlPvTB5BqBXDTgRri1YViORo0,4462
42
+ annet/annlib/__init__.py,sha256=fT1l4xV5fqqg8HPw9HqmZVN2qwS8i6X1aIm2zGDjxKY,252
43
+ annet/annlib/command.py,sha256=uuBddMQphtn8P5MO5kzIa8_QrtMns-k05VeKv1bcAuA,1043
44
+ annet/annlib/diff.py,sha256=UPt3kYFQdQdVVy3ePYzNHPAxMVmHxCrCnZnMCV6ou2Q,4587
45
+ annet/annlib/errors.py,sha256=jBcSFzY6Vj-FxR__vqjFm-87AwYQ0xHuAopTirii5AU,287
46
+ annet/annlib/filter_acl.py,sha256=0w1VF6WcONiTYTQh0yWi6_j9rCTc_kMLAUMr0hbdkNU,7203
47
+ annet/annlib/jsontools.py,sha256=UXZrO6RZ4LIcJkQ6xUcef6WuHMgpMTipolcIBZTEhuc,3461
48
+ annet/annlib/lib.py,sha256=eJ4hcVuQ6pdYBzLs4YKCHFtq45idOfZCYp92XfF7_QI,15317
49
+ annet/annlib/output.py,sha256=_SjJ6G6bejvnTKqNHw6xeio0FT9oO3OIkLaOC3cEga4,7569
50
+ annet/annlib/patching.py,sha256=Gh8uUjFyYND9TJBBQH-DH6-AwFiiR-dXVXOisMS7elg,19784
51
+ annet/annlib/tabparser.py,sha256=bhYbuGJIg6VP5CLiq09UZjgrenP9DegKvw_kYy-Hus0,22910
52
+ annet/annlib/types.py,sha256=VHU0CBADfYmO0xzB_c5f-mcuU3dUumuJczQnqGlib9M,852
53
+ annet/annlib/netdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ annet/annlib/netdev/db.py,sha256=fI_u5aya4l61mbYSjj4JwlVfi3s7obt2jqERSuXGRUI,1634
55
+ annet/annlib/netdev/devdb/__init__.py,sha256=aKYjjLbJebdKBjnGDpVLQdSqrV2JL24spGm58tmMWVU,892
56
+ annet/annlib/netdev/devdb/data/devdb.json,sha256=DJ0IsXqEvnuf27nL3qaQ6VseX_deSfROkOPijQjF86U,4733
57
+ annet/annlib/netdev/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ annet/annlib/netdev/views/dump.py,sha256=XJ6UO6sYSO5pIoe5R4eTQmKwx0_JJ71_h8QSYAURtyk,4184
59
+ annet/annlib/netdev/views/hardware.py,sha256=_ZgaZgT6l4UEf94QaLtKIV31rRNJH4MPXh0-3xbesOc,3192
60
+ annet/annlib/rbparser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
+ annet/annlib/rbparser/acl.py,sha256=RR8yPt6t96_IiyuKVbeZ-3x32cyhBAT2wC1y99oWBO8,3931
62
+ annet/annlib/rbparser/deploying.py,sha256=ACT8QNhDAhJx3ZKuGh2nYBOrpdka2qEKuLDxvQAGKLk,1649
63
+ annet/annlib/rbparser/ordering.py,sha256=DiKqyY8Khz-5MTxNF1GSNtZgtyKwT3YYCXpahIPB6Ps,1779
64
+ annet/annlib/rbparser/platform.py,sha256=iyqy4A-6vUKM4j6hrOA6tsgWBXk7LcvkFrS2QHgkqho,1231
65
+ annet/annlib/rbparser/syntax.py,sha256=eEUmszwPjdw57aofUYNQVcaxHPNV9yx9JNapjYY-BGM,3572
66
+ annet/annlib/rulebook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ annet/annlib/rulebook/common.py,sha256=9kCZwZpsH5UliF2OzaN9nLs2eLlz_d__4L7_oZ3SrCw,16054
68
+ annet/api/__init__.py,sha256=LDl_JB_azU3v-sI5EwsJkiMDm_zZ7zYFBx8FHDW3Eag,33180
69
+ annet/configs/context.yml,sha256=nt4QnzYzrG2hqmaWOUsab2wgFl-CXmFSzbto6rqqFt4,291
70
+ annet/configs/logging.yaml,sha256=Hu42lRK248dssp9TgkbHCaZNl0E6f4IChGb0XaQnTVo,970
71
+ annet/generators/__init__.py,sha256=ZWKdxy6XbANW8vO6Tz7TMP_5rkHHKPBiBhPK2g-NOvI,15609
72
+ annet/generators/base.py,sha256=rgQLcQBPZm4ecbKmRhVOpBR-GFJAiVfdb_y5f2-LUR8,3670
73
+ annet/generators/entire.py,sha256=7WySkVaXNT3ZAiHcQ0JUKdlhGJAN8cNUxF6c7ilYnO8,2928
74
+ annet/generators/exceptions.py,sha256=GPXTBgn2xZ3Ev_bdOPlfCLGRC1kQHe_dEq88S-uyi5s,151
75
+ annet/generators/jsonfragment.py,sha256=itHDq46B50o2-zxnEtCAPb8XKyc0-ozTe-E_MjpkfHw,4020
76
+ annet/generators/partial.py,sha256=XI01KDA--XwjSEU33SOQCCJZRXFq5boRz1uJA8lVA1g,3502
77
+ annet/generators/perf.py,sha256=M6qVosLxuvKBkcvVUR6be1Ak2wHMooUT_qgwBjfi558,2329
78
+ annet/generators/ref.py,sha256=QVdeL8po1D0kBsVLOpCjFR81D8yNTk-kaQj5WUM4hng,438
79
+ annet/generators/result.py,sha256=boMG4mwvitBLlHdPM8rPOqlKPrrNAqdV6NAM9wwIZHc,4765
80
+ annet/generators/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ annet/generators/common/initial.py,sha256=TDkY-ZNaL3yMxGGATVD76uR-nsNTmZrXs2_56MyndxM,1232
82
+ annet/rulebook/__init__.py,sha256=14IpOfTbeJtre7JKrfXVYiH0qAXsUSOL7AatUFmSQs0,3847
83
+ annet/rulebook/common.py,sha256=zK1s2c5lc5HQbIlMUQ4HARQudXSgOYiZ_Sxc2I_tHqg,721
84
+ annet/rulebook/deploying.py,sha256=XV0XQvc3YvwM8SOgOQlc-fCW4bnjQg_1CTZkTwMp14A,2972
85
+ annet/rulebook/patching.py,sha256=ve_D-9lnWs6Qb_NwqOLUWX-b_tI_L3pwQ7cgUPnqndY,4970
86
+ annet/rulebook/arista/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
+ annet/rulebook/arista/iface.py,sha256=bgj6a3r__-OE6VyYbSfnD6ps2QJKyX028W7IFJww-UY,720
88
+ annet/rulebook/aruba/__init__.py,sha256=ILggeID6kNWcDBGzhXm_mebcfkuLSq5prBFU5DyPFs4,500
89
+ annet/rulebook/aruba/ap_env.py,sha256=GO97lbMju82MqUUBf76OWiFBjnnF3OOVqsGcJ5jn-0c,4788
90
+ annet/rulebook/aruba/misc.py,sha256=O0p_wsR07gtB8rm1eJvJ7VYnGm5T8Uau_SVKR9FVInI,234
91
+ annet/rulebook/cisco/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ annet/rulebook/cisco/iface.py,sha256=WISkzjp_G7WKPpg098FCIm4b7ipOxtRLOQbu-7gMUL0,1792
93
+ annet/rulebook/cisco/misc.py,sha256=l9NTR6cAsrfFyeC_yoOeQ0fOFoPiJfFwnRva5W9vyL0,2259
94
+ annet/rulebook/cisco/vlandb.py,sha256=pdQ0Ca976_5_cNBbTI6ADN1SP8aAngVBs1AZWltmpsw,3319
95
+ annet/rulebook/huawei/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
+ annet/rulebook/huawei/aaa.py,sha256=Xi8nWyBFaUz4SgoN1NQeOcXzBGCfINQDNiC-crq08uA,3445
97
+ annet/rulebook/huawei/bgp.py,sha256=dN8T3-44ggGEapt4u4sT3bTn_dsoCbS5qdNeSQ8LSTs,4015
98
+ annet/rulebook/huawei/iface.py,sha256=DvLtQ7tfbDQWFmIYV4lxfih13Tdrt24L4-ZS29mCkuc,1126
99
+ annet/rulebook/huawei/misc.py,sha256=Rpwhtm42IgcueDq4K6VOzN2qORoIDYh42Jb7iWL8AII,14424
100
+ annet/rulebook/huawei/vlandb.py,sha256=B4BEUhZetjsNNhIJOp9cXtJSAYKMOgQucO8oAxSkRI0,4658
101
+ annet/rulebook/juniper/__init__.py,sha256=WByFrqKCdr-ORCme2AURQGnYbN66t3omB3-9dWktT9o,3887
102
+ annet/rulebook/nexus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
+ annet/rulebook/nexus/iface.py,sha256=aeog9iSGT2zZ78tsGlrRcfgfOv7yW3jLwryXqdeplRw,2923
104
+ annet/rulebook/ribbon/__init__.py,sha256=TRbkQVvk0-HxkUQW9-LmiG6XIfTZ-8t3SiaDemNCzK4,347
105
+ annet/rulebook/texts/arista.deploy,sha256=OS9eFyJpEPztcOHkBwajw_RTJfTT7ivaMHfx4_HXaUg,792
106
+ annet/rulebook/texts/arista.order,sha256=TKy3S56tIypwfVaw0akK1sXGatCpLVwpB4Jvq-dIu90,1457
107
+ annet/rulebook/texts/arista.rul,sha256=HUYiN55s8Y6Wrd5q1Awe7-o5BYBh7gIxthUC5NvrfJI,786
108
+ annet/rulebook/texts/aruba.deploy,sha256=hI432Bq-of_LMXuUflCu7eNSEFpx6qmj0KItEw6sgHI,841
109
+ annet/rulebook/texts/aruba.order,sha256=ZMakkn0EJ9zomgY6VssoptJImrHrUmYnCqivzLBFTRo,1158
110
+ annet/rulebook/texts/aruba.rul,sha256=zvGVpoYyJvMoL0fb1NQ8we_GCLZXno8nwWpZIOScLQQ,2584
111
+ annet/rulebook/texts/cisco.deploy,sha256=XvXWeOMahE8Uc9RF0xkJj8jGknD4vit8H_f24ubPX7w,1226
112
+ annet/rulebook/texts/cisco.order,sha256=eE9ddPQr8ZumjffQsMvl-BBymOwV6juETZU3r7kpRvk,1709
113
+ annet/rulebook/texts/cisco.rul,sha256=HGg62zXCn8UVXu9x_Ja5QivPcY5Yo5BYi1CaOXCaDHA,2869
114
+ annet/rulebook/texts/huawei.deploy,sha256=azEC6_jQRzwnTSrNgag0hHh6L7hezS_eMk6ZDZfWyXI,10444
115
+ annet/rulebook/texts/huawei.order,sha256=ENllPX4kO6xNw2mUQcx11yhxo3tKStZ5mUyc0C6s3d0,10657
116
+ annet/rulebook/texts/huawei.rul,sha256=02Fi1RG4YYea2clHCluBuJDKNbT0hS9jtsk6_h6GK8k,12958
117
+ annet/rulebook/texts/juniper.rul,sha256=EmtrEJZesnmc2nXjURRD2G0WOq4zLluI_PNupKhSOJs,2654
118
+ annet/rulebook/texts/nexus.deploy,sha256=9YNAQEw7aQxtYZJbE-dMD6qJrTzs_G92Ifrx3Ft4Wn4,1120
119
+ annet/rulebook/texts/nexus.order,sha256=AZMKCD5Zf_mBOlE36aMDvO4w5rdbepTz1Dsyv7xP9Qs,1834
120
+ annet/rulebook/texts/nexus.rul,sha256=veixbi_ztbX6OMV_WjdkgpEXa47yDxOkPE0YQ6r4wqs,2558
121
+ annet/rulebook/texts/nokia.rul,sha256=gxK7FCRdjGUs7tDHTUebVOgkzWINAGibMPtz8tzvwg4,1077
122
+ annet/rulebook/texts/pc.order,sha256=WTSosHmIA5LyHO_DNAH1VDeuXHEgZ9e_aDFyAtIW6rE,275
123
+ annet/rulebook/texts/pc.rul,sha256=zwIkSdOsJ6gmIj1sfy0xa4_yQRRBRjSQEqopsqFE2u8,302
124
+ annet/rulebook/texts/ribbon.deploy,sha256=hCq2XeAcwaYanyQ8lTdnez6Pgq-gRqpNuR8dAleIn3U,864
125
+ annet/rulebook/texts/ribbon.rul,sha256=609LyLTDCtXPVQNAzqS-VEyCpW3byHP8TCMJLFMn5cc,2108
126
+ annet/rulebook/texts/routeros.order,sha256=M71uy_hf0KAjLNS3zZY3uih4m2xLUcu26FEoVVjC6k0,905
127
+ annet/rulebook/texts/routeros.rul,sha256=ipfxjj0mjFef6IsUlupqx4BY_Je_OUb8u_U1019O1DE,1203
128
+ annet_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
+ annet_generators/example/__init__.py,sha256=zVd8_DrXuOASrNzg2Ab94rPyvJff83L-_HppDFxnUjM,228
130
+ annet_generators/example/lldp.py,sha256=68CLrK7vxTQQy9XIBxtywuEdBNlIlfXGYj8_wYWs5UI,1146
131
+ annet-0.0.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
132
+ annet-0.0.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
133
+ annet-0.0.dist-info/METADATA,sha256=90hpW_n7_K_p7LsffIWZzVefHdSlh7k74z_tal6ANSI,691
134
+ annet-0.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
135
+ annet-0.0.dist-info/entry_points.txt,sha256=yHimujIzR2bwNIbb--MTs_GpXiAve89Egpu2LlgTEkg,119
136
+ annet-0.0.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
137
+ annet-0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.43.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,5 @@
1
+ [annet.connectors]
2
+ storage = annet.adapters.netbox.provider:NetboxProvider
3
+
4
+ [console_scripts]
5
+ annet = annet.annet:main
@@ -0,0 +1,2 @@
1
+ annet
2
+ annet_generators
File without changes
@@ -0,0 +1,12 @@
1
+ from typing import List
2
+
3
+ from annet.generators import BaseGenerator
4
+ from annet.storage import Storage
5
+
6
+ from . import lldp
7
+
8
+
9
+ def get_generators(store: Storage) -> List[BaseGenerator]:
10
+ return [
11
+ lldp.Lldp(store),
12
+ ]