annet 0.14.4__py3-none-any.whl → 0.14.6__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.

@@ -1,4 +1,5 @@
1
1
  import os
2
+ from typing import Any
2
3
 
3
4
 
4
5
  class NetboxStorageOpts:
@@ -7,7 +8,7 @@ class NetboxStorageOpts:
7
8
  self.token = token
8
9
 
9
10
  @classmethod
10
- def from_cli_opts(cls, cli_opts):
11
+ def parse_params(cls, conf_params: dict[str, str] | None, cli_opts: Any):
11
12
  return cls(
12
13
  url=os.getenv("NETBOX_URL", "http://localhost"),
13
14
  token=os.getenv("NETBOX_TOKEN", "").strip(),
@@ -32,3 +32,6 @@ class NetboxProvider(StorageProvider):
32
32
 
33
33
  def query(self):
34
34
  return NetboxQuery
35
+
36
+ def name(self) -> str:
37
+ return "netbox"
@@ -4,7 +4,7 @@ from ipaddress import ip_interface
4
4
  from collections import defaultdict
5
5
 
6
6
  from adaptix import P
7
- from adaptix.conversion import impl_converter, link
7
+ from adaptix.conversion import impl_converter, link, link_constant
8
8
  from annetbox.v37 import models as api_models
9
9
  from annetbox.v37.client_sync import NetboxV37
10
10
 
@@ -24,13 +24,13 @@ 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),
27
28
  ])
28
29
  def extend_device_base(
29
30
  device: api_models.Device,
30
31
  interfaces: List[models.Interface],
31
32
  hw: Optional[HardwareView],
32
33
  breed: str,
33
- neighbours: Optional[List[models.NetboxDevice]],
34
34
  storage: Storage,
35
35
  ) -> models.NetboxDevice:
36
36
  ...
@@ -45,7 +45,7 @@ def extend_device(
45
45
  platform_name: str = ""
46
46
  if device.platform:
47
47
  platform_name = device.platform.name
48
- return extend_device_base(
48
+ res = extend_device_base(
49
49
  device=device,
50
50
  interfaces=interfaces,
51
51
  breed=get_breed(
@@ -57,9 +57,10 @@ def extend_device(
57
57
  device.device_type.model,
58
58
  platform_name,
59
59
  ),
60
- neighbours=neighbours,
61
60
  storage=storage,
62
61
  )
62
+ res.neighbours = neighbours
63
+ return res
63
64
 
64
65
 
65
66
  @impl_converter
@@ -131,6 +131,10 @@
131
131
  "Aruba.AP.AP500": " AP-5\\d\\d",
132
132
  "Aruba.AP.AP500.AP514": " AP-514",
133
133
  "Aruba.AP.AP500.AP515": " AP-515",
134
+ "Aruba.AP.AP600": " AP-6\\d\\d",
135
+ "Aruba.AP.AP600.AP615": " AP-615",
136
+ "Aruba.AP.AP600.AP635": " AP-635",
137
+ "Aruba.AP.AP600.AP655": " AP-655",
134
138
  "Aruba.AP.IAP": " IAP-",
135
139
  "Aruba.AP.IAP.IAP300": " IAP-3\\d\\d",
136
140
  "Aruba.AP.IAP.IAP300.IAP304": " IAP-304",
annet/api/__init__.py CHANGED
@@ -45,7 +45,7 @@ from annet.output import (
45
45
  )
46
46
  from annet.parallel import Parallel, TaskResult
47
47
  from annet.reference import RefTracker
48
- from annet.storage import Device, storage_connector
48
+ from annet.storage import Device, get_storage
49
49
  from annet.types import Diff, ExitCode, OldNewResult, Op, PCDiff, PCDiffFile
50
50
 
51
51
 
@@ -218,8 +218,8 @@ def log_host_progress_cb(pool: Parallel, task_result: TaskResult):
218
218
  stacklevel=2,
219
219
  )
220
220
  args = cast(cli_args.QueryOptions, pool.args[0])
221
- connector = storage_connector.get()
222
- storage_opts = connector.opts().from_cli_opts(args)
221
+ connector, connector_opts = get_storage()
222
+ storage_opts = connector.opts().parse_params(connector_opts, args)
223
223
  with connector.storage()(storage_opts) as storage:
224
224
  fqdns = storage.resolve_fdnds_by_query(args.query)
225
225
  PoolProgressLogger(device_fqdns=fqdns)(pool, task_result)
annet/cli.py CHANGED
@@ -19,7 +19,7 @@ from annet.diff import gen_sort_diff
19
19
  from annet.gen import Loader, old_raw
20
20
  from annet.lib import get_context_path, repair_context_file
21
21
  from annet.output import output_driver_connector, OutputDriver
22
- from annet.storage import storage_connector
22
+ from annet.storage import get_storage
23
23
 
24
24
 
25
25
  def fill_base_args(parser: ArgParser, pkg_name: str, logging_config: str):
@@ -62,12 +62,11 @@ def _gen_current_items(
62
62
  @contextmanager
63
63
  def get_loader(gen_args: cli_args.GenOptions, args: cli_args.QueryOptions):
64
64
  exit_stack = ExitStack()
65
- connectors = storage_connector.get_all()
66
65
  storages = []
67
66
  with exit_stack:
68
- for connector in connectors:
69
- storage_opts = connector.opts().from_cli_opts(args)
70
- storages.append(exit_stack.enter_context(connector.storage()(storage_opts)))
67
+ connector, connector_opts = get_storage()
68
+ storage_opts = connector.opts().parse_params(connector_opts, args)
69
+ storages.append(exit_stack.enter_context(connector.storage()(storage_opts)))
71
70
  yield Loader(*storages, args=gen_args)
72
71
 
73
72
 
annet/cli_args.py CHANGED
@@ -10,7 +10,7 @@ from valkit.common import valid_string_list
10
10
 
11
11
  from annet.argparse import Arg, ArgGroup, DefaultFromEnv
12
12
  from annet.hardware import hardware_connector
13
- from annet.storage import Query, storage_connector
13
+ from annet.storage import Query, get_storage
14
14
 
15
15
 
16
16
  # ====
@@ -361,14 +361,9 @@ class QueryOptionsBase(CacheOptions):
361
361
  def __init__(self, *args, **kwargs):
362
362
  super().__init__(*args, **kwargs)
363
363
  if not isinstance(self.query, Query):
364
- connectors = storage_connector.get_all()
365
- if not connectors:
366
- pass
367
- elif len(connectors) == 1:
368
- query_type = connectors[0].query()
369
- self.query = query_type.new(self.query, hosts_range=self.hosts_range)
370
- else:
371
- logging.warning("Multiple connectors found, skip parsing query")
364
+ storage, _ = get_storage()
365
+ query_type = storage.query()
366
+ self.query = query_type.new(self.query, hosts_range=self.hosts_range)
372
367
 
373
368
 
374
369
  class QueryOptions(QueryOptionsBase):
annet/configs/context.yml CHANGED
@@ -10,9 +10,16 @@ generators:
10
10
  default:
11
11
  - annet_generators.example
12
12
 
13
+ storage:
14
+ default:
15
+ adapter: annet.adapters.file.provider
16
+ params:
17
+ path: /path/to/file
18
+
13
19
  context:
14
20
  default:
15
21
  connection: default
16
22
  generators: default
23
+ storage: default
17
24
 
18
25
  selected_context: default
annet/connectors.py CHANGED
@@ -3,6 +3,7 @@ from abc import ABC
3
3
  from functools import cached_property
4
4
  from importlib.metadata import entry_points
5
5
  from typing import Generic, Optional, Type, TypeVar, List
6
+ from annet.lib import get_context
6
7
 
7
8
  T = TypeVar("T")
8
9
 
@@ -33,7 +34,7 @@ class Connector(ABC, Generic[T]):
33
34
  res = self._classes[0]
34
35
  return res(*args, **kwargs)
35
36
 
36
- def get_all(self, *args, **kwargs) -> T:
37
+ def get_all(self, *args, **kwargs) -> List[T]:
37
38
  if self._classes is None:
38
39
  self._classes = self._entry_point or [self._get_default()]
39
40
 
annet/storage.py CHANGED
@@ -1,10 +1,6 @@
1
1
  import abc
2
2
  from typing import Any, Iterable, Optional, Type, Union, Protocol
3
-
4
- try:
5
- from annet.connectors import Connector
6
- except ImportError:
7
- from noc.annushka.annet.connectors import Connector # noqa: F401
3
+ from annet.connectors import Connector, get_context
8
4
 
9
5
 
10
6
  class _StorageConnector(Connector["StorageProvider"]):
@@ -28,6 +24,10 @@ class StorageProvider(abc.ABC):
28
24
  def query(self) -> Type["Query"]:
29
25
  pass
30
26
 
27
+ @abc.abstractmethod
28
+ def name(self) -> str:
29
+ pass
30
+
31
31
 
32
32
  class Storage(abc.ABC):
33
33
  @abc.abstractmethod
@@ -69,7 +69,7 @@ class Storage(abc.ABC):
69
69
  class StorageOpts(abc.ABC):
70
70
  @classmethod
71
71
  @abc.abstractmethod
72
- def from_cli_opts(cls, cli_opts) -> "StorageOpts":
72
+ def parse_params(cls, conf_params: dict[str, str] | None, cli_opts: Any):
73
73
  pass
74
74
 
75
75
 
@@ -123,3 +123,20 @@ class Device(Protocol):
123
123
  @abc.abstractmethod
124
124
  def breed(self):
125
125
  pass
126
+
127
+
128
+ def get_storage() -> (Storage, dict[str, Any]):
129
+ connectors = storage_connector.get_all()
130
+ seen: list[str] = []
131
+ if context_storage := get_context().get("storage"):
132
+ for connector in connectors:
133
+ con_name = connector.name()
134
+ seen.append(con_name)
135
+ if "adapter" not in context_storage:
136
+ raise Exception("adapter is not set in %s" % context_storage)
137
+ if context_storage["adapter"] == con_name:
138
+ return connector, context_storage.get("params", {})
139
+ else:
140
+ raise Exception("unknown storage %s: seen %s" % (context_storage["adapter"], seen))
141
+ else:
142
+ return connectors[0], {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.14.4
3
+ Version: 0.14.6
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -21,6 +21,6 @@ Requires-Dist: contextlog >=1.1
21
21
  Requires-Dist: valkit >=0.1.4
22
22
  Requires-Dist: aiohttp >=3.8.4
23
23
  Requires-Dist: yarl >=1.8.2
24
- Requires-Dist: adaptix ==3.0.0b5
24
+ Requires-Dist: adaptix ==3.0.0b7
25
25
  Requires-Dist: dataclass-rest ==0.4
26
26
 
@@ -1,9 +1,9 @@
1
1
  annet/__init__.py,sha256=oyElxAW97sHgQccGafhaWVBveBn1gSjjdP_xHROaRLg,2139
2
2
  annet/annet.py,sha256=TMdEuM7GJQ4TjRVmuK3bCTZN-21lxjQ9sXqEdILUuBk,725
3
3
  annet/argparse.py,sha256=MoBD0LPnHdA6HU7z1uQNArYlkD92znoeGIFTMnS4dRM,12608
4
- annet/cli.py,sha256=Nk956O3nOEVsOLyOqKDgjqJaB2uVlwYb9tPrWMbB4E4,9632
5
- annet/cli_args.py,sha256=5sCD20ls18NDASPOHT5MbAFB10gyayGcFosKaJTLDps,16047
6
- annet/connectors.py,sha256=FLFJlhb73g2c8e61zYnGn8dTkIiaaWYqeUCsZd48AWg,2471
4
+ annet/cli.py,sha256=MxdH5m4r2MfXYwCbgSDUqjSibxw7VzSg7_hsB47RWnw,9601
5
+ annet/cli_args.py,sha256=1RZ_Sy5oSiiUNzf4FIefvUa_s-JsR8IYd-SvN7apocw,15823
6
+ annet/connectors.py,sha256=Xgr7fNopRhFAYnkiDxhohBtjlFOLY8v0xLExHmVMr00,2511
7
7
  annet/deploy.py,sha256=B8E0P_VvCrS2URjFvgmUiIkHp95g7pAWfmT34igaDeo,18893
8
8
  annet/diff.py,sha256=zLcaCnb4lZRUb7frpH1CstQ3kacRcCblZs1uLG8J5lk,3391
9
9
  annet/executor.py,sha256=EaeQ_JeRFuUUHUoR2LXDcNvY7IVg0eA2d6zSmQVJt-M,19216
@@ -16,25 +16,25 @@ annet/output.py,sha256=hJNGzL4Z3KgvqaCBkkmuuiXPhb64F1QV8YHkwnfhaaI,6852
16
16
  annet/parallel.py,sha256=hLkzEht0KhzmzUWDdO4QFYQHzhxs3wPlTA8DxbB2ziw,17160
17
17
  annet/patching.py,sha256=nILbY5oJajN0b1j3f0HEJm05H3HVThnWvB7vDVh7UQw,559
18
18
  annet/reference.py,sha256=B8mH8VUMcecPnzULiTVb_kTQ7jQrCL7zp4pfIZQa5fk,4035
19
- annet/storage.py,sha256=B16iUJwxKd0RWnUaogWQs0WQtiH1YCzPypSHNpBYPDM,2395
19
+ annet/storage.py,sha256=DU-j-I2bQHva_ZQOT407TnGOHx1rd0AA_W7OcLXiPzM,3086
20
20
  annet/tabparser.py,sha256=ZjiI43ZVbrpMVR8qNbTbNh_U3oZ26VDc_2Y9wkkDkYA,874
21
21
  annet/text_term_format.py,sha256=CHb6viv45vmYl-SK1A1vyPHGhaEni6jVybBusaQnct8,2813
22
22
  annet/tracing.py,sha256=ndpM-au1c88uBBpOuH_z52qWZL773edYozNyys_wA68,4044
23
23
  annet/types.py,sha256=f2HwqoKa6AucwFwDMszoouB6m1B8n6VmdjHMktO30Kc,7175
24
24
  annet/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  annet/adapters/netbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- annet/adapters/netbox/provider.py,sha256=OM7Hq2vnMHNVBfubJvx2qJlMYm3VvKhomdLMNO8YnLQ,1024
26
+ annet/adapters/netbox/provider.py,sha256=Gymku2Ad7um4GR9MqzQzm2o2cBLHLhIYbF1Ytl0r0MA,1076
27
27
  annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  annet/adapters/netbox/common/client.py,sha256=-lWZmphD-OPuLIHNKhW_h2bnjrVaiyKYAD_MUPasEbo,2483
29
29
  annet/adapters/netbox/common/manufacturer.py,sha256=van_-9-3cnBadZkF3Srae_m8cUSjf8KQCCCHFcdeQyo,1758
30
30
  annet/adapters/netbox/common/models.py,sha256=bJP6lIWFB85AW5gLNyfd0VHeqEtYIdLJcNH9r8cb8RI,2859
31
31
  annet/adapters/netbox/common/query.py,sha256=OgUuF-bvshpoBUkrOs0tsMUAhjTsttzx3VV30ryFl0Y,577
32
32
  annet/adapters/netbox/common/status_client.py,sha256=W4nTb2yvBlJ2UkWUmUhKQ2PaSQb1shjhHj5ebb4s2s4,591
33
- annet/adapters/netbox/common/storage_opts.py,sha256=rl_0pr3VzmOy6PDZIUMkKSBfJh90gD9TFL3yBhK_8ME,337
33
+ annet/adapters/netbox/common/storage_opts.py,sha256=idOm1na_2Axdi4MdLN4tAsPvsp5zBtJYD9j7cUiI-W8,400
34
34
  annet/adapters/netbox/v24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  annet/adapters/netbox/v24/storage.py,sha256=ogCu5XXIpcpPtuz7dWfDFIbqtz8k5G96PL6mhAQWwBU,6026
36
36
  annet/adapters/netbox/v37/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- annet/adapters/netbox/v37/storage.py,sha256=3Xv4BoStxy80iev4B9WMxUxl_U0LdKG6ZoTykMpliLw,7485
37
+ annet/adapters/netbox/v37/storage.py,sha256=plqHzb_jH0Etagmg3K8lmNw5hOWUocoSZtAPBlnnOQY,7524
38
38
  annet/annlib/__init__.py,sha256=fT1l4xV5fqqg8HPw9HqmZVN2qwS8i6X1aIm2zGDjxKY,252
39
39
  annet/annlib/command.py,sha256=uuBddMQphtn8P5MO5kzIa8_QrtMns-k05VeKv1bcAuA,1043
40
40
  annet/annlib/diff.py,sha256=UPt3kYFQdQdVVy3ePYzNHPAxMVmHxCrCnZnMCV6ou2Q,4587
@@ -49,7 +49,7 @@ annet/annlib/types.py,sha256=VHU0CBADfYmO0xzB_c5f-mcuU3dUumuJczQnqGlib9M,852
49
49
  annet/annlib/netdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  annet/annlib/netdev/db.py,sha256=fI_u5aya4l61mbYSjj4JwlVfi3s7obt2jqERSuXGRUI,1634
51
51
  annet/annlib/netdev/devdb/__init__.py,sha256=aKYjjLbJebdKBjnGDpVLQdSqrV2JL24spGm58tmMWVU,892
52
- annet/annlib/netdev/devdb/data/devdb.json,sha256=5woLnW3NAent7LsINjqdbmux9gDXhBYWqjVdxq_-lFQ,5133
52
+ annet/annlib/netdev/devdb/data/devdb.json,sha256=8U-2p2yCE6jHdBehASiQoQdJ7c2_Hc9SFGefNLaGiBo,5287
53
53
  annet/annlib/netdev/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  annet/annlib/netdev/views/dump.py,sha256=XJ6UO6sYSO5pIoe5R4eTQmKwx0_JJ71_h8QSYAURtyk,4184
55
55
  annet/annlib/netdev/views/hardware.py,sha256=o-w-k1bOORWwEnSGsDq-9Q_oIeH3yQv9eiCJn_UgG-Y,3324
@@ -61,8 +61,8 @@ annet/annlib/rbparser/platform.py,sha256=iyqy4A-6vUKM4j6hrOA6tsgWBXk7LcvkFrS2QHg
61
61
  annet/annlib/rbparser/syntax.py,sha256=eEUmszwPjdw57aofUYNQVcaxHPNV9yx9JNapjYY-BGM,3572
62
62
  annet/annlib/rulebook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
63
  annet/annlib/rulebook/common.py,sha256=9kCZwZpsH5UliF2OzaN9nLs2eLlz_d__4L7_oZ3SrCw,16054
64
- annet/api/__init__.py,sha256=vwmyZK_iCdAjlJ0jS5CXSroDAZFzGe3JiXL-WoZiovU,33154
65
- annet/configs/context.yml,sha256=nt4QnzYzrG2hqmaWOUsab2wgFl-CXmFSzbto6rqqFt4,291
64
+ annet/api/__init__.py,sha256=-G9wlYePC3ZgNo1p8r17vmx0WLb3UNvCw3ZJ9UhYJ-I,33169
65
+ annet/configs/context.yml,sha256=jzAQX9WbjFw_nsju8FLCCGfRc4ZXD0Mhb5pvO9emegI,413
66
66
  annet/configs/logging.yaml,sha256=Hu42lRK248dssp9TgkbHCaZNl0E6f4IChGb0XaQnTVo,970
67
67
  annet/generators/__init__.py,sha256=ACMH9UQ4I3uq2b8nDzOn2dgYxreDq4_3ojOGwht0-No,15543
68
68
  annet/generators/base.py,sha256=rgQLcQBPZm4ecbKmRhVOpBR-GFJAiVfdb_y5f2-LUR8,3670
@@ -124,10 +124,10 @@ annet/rulebook/texts/routeros.rul,sha256=ipfxjj0mjFef6IsUlupqx4BY_Je_OUb8u_U1019
124
124
  annet_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  annet_generators/example/__init__.py,sha256=zVd8_DrXuOASrNzg2Ab94rPyvJff83L-_HppDFxnUjM,228
126
126
  annet_generators/example/lldp.py,sha256=68CLrK7vxTQQy9XIBxtywuEdBNlIlfXGYj8_wYWs5UI,1146
127
- annet-0.14.4.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
128
- annet-0.14.4.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
129
- annet-0.14.4.dist-info/METADATA,sha256=Nvwt5kk3umFjWMdtTyQXOKYwgyM0BRgShaHHyCUWjBw,694
130
- annet-0.14.4.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
131
- annet-0.14.4.dist-info/entry_points.txt,sha256=yHimujIzR2bwNIbb--MTs_GpXiAve89Egpu2LlgTEkg,119
132
- annet-0.14.4.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
133
- annet-0.14.4.dist-info/RECORD,,
127
+ annet-0.14.6.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
128
+ annet-0.14.6.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
129
+ annet-0.14.6.dist-info/METADATA,sha256=-uaaz8Oa0taZmZeE_2jKxWKWPArMrKdikSfUsvF4dCo,694
130
+ annet-0.14.6.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
131
+ annet-0.14.6.dist-info/entry_points.txt,sha256=yHimujIzR2bwNIbb--MTs_GpXiAve89Egpu2LlgTEkg,119
132
+ annet-0.14.6.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
133
+ annet-0.14.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (72.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5