acex-devkit 1.2.1__tar.gz → 1.3.0__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.
Files changed (24) hide show
  1. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/PKG-INFO +1 -1
  2. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/pyproject.toml +1 -1
  3. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/composed_configuration.py +44 -32
  4. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/logging.py +1 -1
  5. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/README.md +0 -0
  6. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/__init__.py +0 -0
  7. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/configdiffer/__init__.py +0 -0
  8. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/configdiffer/command.py +0 -0
  9. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/configdiffer/configdiffer.py +0 -0
  10. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/configdiffer/diff.py +0 -0
  11. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/configdiffer/old_configdiffer.py +0 -0
  12. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/configdiffer/old_diff.py +0 -0
  13. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/drivers/__init__.py +0 -0
  14. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/drivers/base.py +0 -0
  15. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/drivers/base_driver.py +0 -0
  16. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/exceptions/__init__.py +0 -0
  17. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/__init__.py +0 -0
  18. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/acl_model.py +0 -0
  19. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/attribute_value.py +0 -0
  20. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/external_value.py +0 -0
  21. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/ned.py +0 -0
  22. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/node_response.py +0 -0
  23. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/models/spanning_tree.py +0 -0
  24. {acex_devkit-1.2.1 → acex_devkit-1.3.0}/src/acex_devkit/types/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acex-devkit
3
- Version: 1.2.1
3
+ Version: 1.3.0
4
4
  Summary: ACE-X DevKit - Development kit for building ACE-X drivers and plugins
5
5
  License: AGPL-3.0
6
6
  Keywords: automation,devkit,sdk,drivers,plugins
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "acex-devkit"
3
- version = "1.2.1"
3
+ version = "1.3.0"
4
4
  description = "ACE-X DevKit - Development kit for building ACE-X drivers and plugins"
5
5
  authors = ["Johan Lahti <johan.lahti@acebit.se>"]
6
6
  readme = "README.md"
@@ -52,13 +52,22 @@ class SystemConfig(BaseModel):
52
52
  #class TripleA(BaseModel): ...
53
53
 
54
54
  # Trying to avoid using "Logging" or "logging" as names for anything due to conflicts with standard lib.
55
- class LoggingComponents(BaseModel):
55
+ class RemoteServers(BaseModel):
56
+ servers: Dict[str, RemoteServer] = {}
57
+
58
+ class VtyLines(BaseModel):
59
+ lines: Dict[str, VtyLine] = {}
60
+
61
+ class LogFiles(BaseModel):
62
+ files: Dict[str, FileLogging] = {}
63
+
64
+ class LoggingComponents(BaseModel):
56
65
  config: LoggingConfig = LoggingConfig()
57
66
  console: Optional[Console] = None
58
- remote_servers: Optional[Dict[str, RemoteServer]] = None
67
+ remote_servers: Optional[RemoteServers] = RemoteServers()
59
68
  events: Optional[LoggingEvents] = None
60
- vty: Optional[Dict[str, VtyLine]] = None
61
- files: Optional[Dict[str, FileLogging]] = None
69
+ vty: Optional[VtyLines] = VtyLines()
70
+ files: Optional[LogFiles] = LogFiles()
62
71
 
63
72
  class NtpConfig(BaseModel):
64
73
  enabled: AttributeValue[bool] = AttributeValue(value=False)
@@ -73,7 +82,7 @@ class NtpServer(BaseModel):
73
82
 
74
83
  class Ntp(BaseModel):
75
84
  config: Optional[NtpConfig] = None
76
- servers: Optional[Dict[str, NtpServer]] = None
85
+ servers: Optional[Dict[str, NtpServer]] = {}
77
86
 
78
87
  class SshServer(BaseModel):
79
88
  enable: Optional[AttributeValue[bool]] = None
@@ -100,7 +109,7 @@ class AuthorizedKey(BaseModel):
100
109
 
101
110
  class Ssh(BaseModel):
102
111
  config: Optional[SshServer] = None
103
- host_keys: Optional[Dict[str, AuthorizedKey]] = None
112
+ host_keys: Optional[Dict[str, AuthorizedKey]] = {}
104
113
 
105
114
  class Lldp(BaseModel): ...
106
115
 
@@ -225,11 +234,11 @@ class StaticRouteNextHop(BaseModel):
225
234
  class StaticRoute(BaseModel):
226
235
  route_name: Optional[AttributeValue[str]] = None
227
236
  prefix: AttributeValue[str]
228
- next_hops: Optional[Dict[str, StaticRouteNextHop]] = None
237
+ next_hops: Optional[Dict[str, StaticRouteNextHop]] = {}
229
238
  network_instance: Optional[AttributeValue[str]] = None
230
239
 
231
240
  class Protocols(BaseModel):
232
- static_routes: Optional[Dict[str, StaticRoute]] = None
241
+ static_routes: Optional[Dict[str, StaticRoute]] = {}
233
242
  # OSPF, BGP, etc. can be added here as needed
234
243
 
235
244
  class RouteTarget(BaseModel):
@@ -245,9 +254,9 @@ class InterInstancePolicy(BaseModel):
245
254
  class NetworkInstance(BaseModel):
246
255
  name: AttributeValue[str]
247
256
  description: Optional[AttributeValue[str]] = None
248
- vlans: Optional[Dict[str, Vlan]] = None
257
+ vlans: Optional[Dict[str, Vlan]] = {}
249
258
  interfaces: Optional[Dict[str, Reference]] = {}
250
- inter_instance_policies: Optional[Dict[str, InterInstancePolicy]] = None
259
+ inter_instance_policies: Optional[Dict[str, InterInstancePolicy]] = {}
251
260
  protocols: Optional[Protocols] = Protocols()
252
261
 
253
262
  class LacpConfig(BaseModel):
@@ -257,7 +266,7 @@ class LacpConfig(BaseModel):
257
266
 
258
267
  class Lacp(BaseModel):
259
268
  config: Optional[LacpConfig] = LacpConfig()
260
- interfaces: Optional[Dict[str, Interface]] = None
269
+ interfaces: Optional[Dict[str, Interface]] = {}
261
270
 
262
271
  # SNMP
263
272
  class SnmpAccess(str, Enum):
@@ -455,12 +464,12 @@ class TrapEvent(BaseModel):
455
464
  #class SnmpTrap(BaseModel): ...
456
465
 
457
466
  class Snmp(BaseModel):
458
- config: Optional[Dict[str, SnmpConfig]] = None
459
- communities: Optional[Dict[str, SnmpCommunity]] = None
460
- users: Optional[Dict[str, SnmpUser]] = None
461
- trap_servers: Optional[Dict[str, SnmpServer]] = None
462
- trap_events: Optional[Dict[str, TrapEvent]] = None
463
- views: Optional[Dict[str, SnmpView]] = None
467
+ config: Optional[Dict[str, SnmpConfig]] = {}
468
+ communities: Optional[Dict[str, SnmpCommunity]] = {}
469
+ users: Optional[Dict[str, SnmpUser]] = {}
470
+ trap_servers: Optional[Dict[str, SnmpServer]] = {}
471
+ trap_events: Optional[Dict[str, TrapEvent]] = {}
472
+ views: Optional[Dict[str, SnmpView]] = {}
464
473
 
465
474
  # AAA
466
475
  class aaaBaseClass(BaseModel):
@@ -509,8 +518,8 @@ class aaaServerGroupAttributes(BaseModel):
509
518
  """
510
519
  enable: Optional[AttributeValue[bool]] = None
511
520
  type: Optional[AttributeValue[Literal['tacacs','radius']]] = None
512
- tacacs: Optional[Dict[str, aaaTacacsAttributes]] = None
513
- radius: Optional[Dict[str, aaaRadiusAttributes]] = None
521
+ tacacs: Optional[Dict[str, aaaTacacsAttributes]] = {}
522
+ radius: Optional[Dict[str, aaaRadiusAttributes]] = {}
514
523
 
515
524
  # Authentication Models
516
525
  class aaaAuthenticationMethods(aaaBaseClass):
@@ -540,19 +549,19 @@ class authenticationUser(aaaBaseClass):
540
549
  role: Optional[AttributeValue[str]] = None
541
550
 
542
551
  class aaaAuthenticationUsers(aaaBaseClass):
543
- username: Optional[Dict[str, authenticationUser]] = None
552
+ username: Optional[Dict[str, authenticationUser]] = {}
544
553
 
545
554
  class adminUser(aaaBaseClass):
546
555
  admin_password: Optional[AttributeValue[str]] = None
547
556
  admin_password_hashed: Optional[AttributeValue[str]] = None
548
557
 
549
558
  class aaaAuthenticationAdminUsers(BaseModel):
550
- config: Optional[Dict[str, adminUser]] = None
559
+ config: Optional[Dict[str, adminUser]] = {}
551
560
 
552
561
  class aaaAuthentication(BaseModel):
553
- config: Optional[Dict[str, aaaAuthenticationMethods]] = None
554
- admin_user: Optional[Dict[str, aaaAuthenticationAdminUsers]] = None
555
- users: Optional[Dict[str, aaaAuthenticationUsers]] = None
562
+ config: Optional[Dict[str, aaaAuthenticationMethods]] = {}
563
+ admin_user: Optional[Dict[str, aaaAuthenticationAdminUsers]] = {}
564
+ users: Optional[Dict[str, aaaAuthenticationUsers]] = {}
556
565
 
557
566
  # Authorization Models
558
567
  class aaaAuthorizationMethods(aaaBaseClass):
@@ -582,8 +591,8 @@ class aaaAuthorizationEvents(aaaBaseClass):
582
591
  event: Optional[AttributeValue[str]] = None
583
592
 
584
593
  class aaaAuthorization(BaseModel):
585
- config: Optional[Dict[str, aaaAuthorizationMethods]] = None
586
- events: Optional[Dict[str, aaaAuthorizationEvents]] = None
594
+ config: Optional[Dict[str, aaaAuthorizationMethods]] = {}
595
+ events: Optional[Dict[str, aaaAuthorizationEvents]] = {}
587
596
 
588
597
  # Accounting Models
589
598
  class aaaAccountingMethods(BaseModel):
@@ -611,15 +620,15 @@ class aaaAccountingEvents(BaseModel):
611
620
  event: Optional[AttributeValue[str]] = None
612
621
 
613
622
  class aaaAccounting(BaseModel):
614
- config: Optional[Dict[str, aaaAccountingMethods]] = None
615
- events: Optional[Dict[str, aaaAccountingEvents]] = None
623
+ config: Optional[Dict[str, aaaAccountingMethods]] = {}
624
+ events: Optional[Dict[str, aaaAccountingEvents]] = {}
616
625
 
617
626
  class aaaGlobalAttributes(BaseModel):
618
627
  enabled: Optional[AttributeValue[bool]] = False # default False
619
628
 
620
629
  class TripleA(BaseModel):
621
630
  config: aaaGlobalAttributes = aaaGlobalAttributes()
622
- server_groups: Optional[Dict[str, aaaServerGroupAttributes]] = None
631
+ server_groups: Optional[Dict[str, aaaServerGroupAttributes]] = {}
623
632
  authentication: aaaAuthentication = aaaAuthentication()
624
633
  authorization: aaaAuthorization = aaaAuthorization()
625
634
  accounting: aaaAccounting = aaaAccounting()
@@ -652,11 +661,14 @@ class ComposedConfiguration(BaseModel):
652
661
  stp: Optional[SpanningTree] = SpanningTree()
653
662
 
654
663
 
655
- """
664
+ """
656
665
  GUIDELINES FOR COMPOSED CONFIGURATION:
657
666
 
658
667
  1. All values must always be typed as AttributeValue.
659
668
  2. Containers must always be defined as hierarchical pydantic types, no dicts as placeholders.
660
- 3. Component collections are always Dict[str, BaseModel] the key identifies the component
661
- 4. Default values for Optional is always None.
669
+ 3. Component collections must use a typed container class (e.g. RemoteServers, VtyLines) with an inner
670
+ Dict[str, BaseModel] field — the key identifies the component. Raw Dict fields are not allowed at
671
+ the container level.
672
+ 4. Default values for Optional containers are always an empty instance of the container class, e.g.
673
+ Optional[RemoteServers] = RemoteServers(). Never default to None or a raw empty dict for collections.
662
674
  """
@@ -50,7 +50,7 @@ class RemoteServer(BaseModel):
50
50
  name: Optional[AttributeValue[str]] = None
51
51
  host: Optional[AttributeValue[str]] = None
52
52
  port: Optional[AttributeValue[int]] = None
53
- transfer: Optional[AttributeValue[str]] = None
53
+ transport: Optional[AttributeValue[str]] = None
54
54
  source_address: Optional[AttributeValue[str]] = None # Can be an IP address or an interface reference
55
55
 
56
56
  class VtyLine(BaseModel):
File without changes