acex-devkit 2.1.1__tar.gz → 2.2.1__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.
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/PKG-INFO +1 -1
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/pyproject.toml +1 -1
- acex_devkit-2.2.1/src/acex_devkit/models/credential.py +104 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/telemetry_agent.py +50 -0
- acex_devkit-2.1.1/src/acex_devkit/models/credential.py +0 -51
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/README.md +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/__init__.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/__init__.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/command.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/configdiffer.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/diff.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/old_configdiffer.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/configdiffer/old_diff.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/drivers/__init__.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/drivers/base.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/drivers/base_driver.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/exceptions/__init__.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/__init__.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/acl_model.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/agent_manifest.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/ai_ops.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/asset.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/assignment.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/attribute_value.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/augment.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/auth_config.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/base.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/capability.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/collection_agent.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/compliance.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/composed_configuration.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/config_components.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/config_snapshot.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/contact.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/container_entry.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/external_value.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/lldp_neighbor.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/lldp_topology.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/logging.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/logical_node.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/management_connection.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/ned.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/node_response.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/pagination.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/reference.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/region.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/site.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/models/spanning_tree.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/normalizer/__init__.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/normalizer/base.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/normalizer/engine.py +0 -0
- {acex_devkit-2.1.1 → acex_devkit-2.2.1}/src/acex_devkit/types/__init__.py +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, model_validator
|
|
4
|
+
|
|
5
|
+
from acex_devkit.models.base import PersistedResponse
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SnmpAuthProtocol(StrEnum):
|
|
9
|
+
"""SNMPv3 authentication protocols, in Telegraf's vocabulary."""
|
|
10
|
+
|
|
11
|
+
MD5 = "MD5"
|
|
12
|
+
SHA = "SHA"
|
|
13
|
+
SHA224 = "SHA224"
|
|
14
|
+
SHA256 = "SHA256"
|
|
15
|
+
SHA384 = "SHA384"
|
|
16
|
+
SHA512 = "SHA512"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SnmpPrivProtocol(StrEnum):
|
|
20
|
+
"""SNMPv3 privacy protocols, in Telegraf's vocabulary."""
|
|
21
|
+
|
|
22
|
+
DES = "DES"
|
|
23
|
+
AES = "AES"
|
|
24
|
+
AES192 = "AES192"
|
|
25
|
+
AES192C = "AES192C"
|
|
26
|
+
AES256 = "AES256"
|
|
27
|
+
AES256C = "AES256C"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Per-credential-type enum constraints on field values, keyed by field name.
|
|
31
|
+
CREDENTIAL_FIELD_ENUMS: dict[str, dict[str, type[StrEnum]]] = {
|
|
32
|
+
"snmpv3": {
|
|
33
|
+
"auth_protocol": SnmpAuthProtocol,
|
|
34
|
+
"priv_protocol": SnmpPrivProtocol,
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _validate_field_enums(credential_type: str, fields: dict[str, str]) -> None:
|
|
40
|
+
constraints = CREDENTIAL_FIELD_ENUMS.get(credential_type, {})
|
|
41
|
+
for field_name, enum_cls in constraints.items():
|
|
42
|
+
value = fields.get(field_name)
|
|
43
|
+
if value is None or value == "":
|
|
44
|
+
continue
|
|
45
|
+
try:
|
|
46
|
+
enum_cls(value)
|
|
47
|
+
except ValueError:
|
|
48
|
+
valid = ", ".join(e.value for e in enum_cls)
|
|
49
|
+
raise ValueError(
|
|
50
|
+
f"Invalid {field_name} '{value}' for credential type '{credential_type}'. Valid: {valid}"
|
|
51
|
+
) from None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class CredentialFieldBase(BaseModel):
|
|
55
|
+
field_name: str
|
|
56
|
+
sensitive: bool = True
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class CredentialBase(BaseModel):
|
|
60
|
+
name: str
|
|
61
|
+
credential_type: str
|
|
62
|
+
source: str = "local"
|
|
63
|
+
vault_path: str | None = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class CredentialFieldResponse(CredentialFieldBase):
|
|
67
|
+
field_value: str | None = None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class CredentialResponse(PersistedResponse, CredentialBase):
|
|
71
|
+
fields: list[CredentialFieldResponse] = []
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class CredentialCreate(CredentialBase):
|
|
75
|
+
fields: dict[str, str]
|
|
76
|
+
|
|
77
|
+
@model_validator(mode="after")
|
|
78
|
+
def _check_field_values(self):
|
|
79
|
+
_validate_field_enums(self.credential_type, self.fields)
|
|
80
|
+
return self
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class CredentialUpdate(BaseModel):
|
|
84
|
+
name: str | None = None
|
|
85
|
+
source: str | None = None
|
|
86
|
+
vault_path: str | None = None
|
|
87
|
+
fields: dict[str, str] | None = None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class CredentialSecret(BaseModel):
|
|
91
|
+
id: int
|
|
92
|
+
credential_type: str
|
|
93
|
+
fields: dict[str, str] = {}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class NodeCredentialCreate(BaseModel):
|
|
97
|
+
credential_id: int
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class NodeCredentialResponse(PersistedResponse):
|
|
101
|
+
node_id: int
|
|
102
|
+
credential_id: int
|
|
103
|
+
credential_name: str | None = None
|
|
104
|
+
credential_type: str | None = None
|
|
@@ -12,6 +12,18 @@ class InfluxDBVersion(StrEnum):
|
|
|
12
12
|
v3 = "v3"
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
class SnmpVersion(StrEnum):
|
|
16
|
+
v2c = "2c"
|
|
17
|
+
v3 = "3"
|
|
18
|
+
both = "both"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SnmpSecLevel(StrEnum):
|
|
22
|
+
no_auth_no_priv = "noAuthNoPriv"
|
|
23
|
+
auth_no_priv = "authNoPriv"
|
|
24
|
+
auth_priv = "authPriv"
|
|
25
|
+
|
|
26
|
+
|
|
15
27
|
class OutputDestinationBase(BaseModel):
|
|
16
28
|
influxdb_version: InfluxDBVersion = InfluxDBVersion.v2
|
|
17
29
|
url: str = "http://localhost:8086"
|
|
@@ -62,6 +74,18 @@ class TelemetryAgentMatchRuleCreate(TelemetryAgentMatchRuleBase):
|
|
|
62
74
|
class TelemetryAgentBase(BaseModel):
|
|
63
75
|
name: str
|
|
64
76
|
description: str | None = None
|
|
77
|
+
snmp_version: SnmpVersion = SnmpVersion.v2c
|
|
78
|
+
snmp_trap_port: int = 162
|
|
79
|
+
syslog_port: int = 514
|
|
80
|
+
snmpv3_sec_level: SnmpSecLevel | None = None
|
|
81
|
+
# Inline security name — only used with noAuthNoPriv (no credential needed).
|
|
82
|
+
# With authNoPriv/authPriv the username comes from the mapped credential.
|
|
83
|
+
snmpv3_sec_name: str | None = None
|
|
84
|
+
# References to Credentials holding trap receiver secrets.
|
|
85
|
+
# snmpv2c_credential_id → credential of type "snmp_community" (field: community)
|
|
86
|
+
# snmpv3_credential_id → credential of type "snmpv3" (fields: username/auth_*/priv_*)
|
|
87
|
+
snmpv2c_credential_id: int | None = None
|
|
88
|
+
snmpv3_credential_id: int | None = None
|
|
65
89
|
|
|
66
90
|
|
|
67
91
|
class TelemetryAgentCreate(TelemetryAgentBase):
|
|
@@ -72,6 +96,13 @@ class TelemetryAgentUpdate(BaseModel):
|
|
|
72
96
|
name: str | None = None
|
|
73
97
|
description: str | None = None
|
|
74
98
|
capabilities: list[TelemetryCapability] | None = None
|
|
99
|
+
snmp_version: SnmpVersion | None = None
|
|
100
|
+
snmp_trap_port: int | None = None
|
|
101
|
+
syslog_port: int | None = None
|
|
102
|
+
snmpv3_sec_level: SnmpSecLevel | None = None
|
|
103
|
+
snmpv3_sec_name: str | None = None
|
|
104
|
+
snmpv2c_credential_id: int | None = None
|
|
105
|
+
snmpv3_credential_id: int | None = None
|
|
75
106
|
|
|
76
107
|
|
|
77
108
|
class TelemetryAgentAck(BaseModel):
|
|
@@ -88,3 +119,22 @@ class TelemetryAgentResponse(PersistedResponse, TelemetryAgentBase):
|
|
|
88
119
|
rules: list[TelemetryAgentMatchRuleResponse] = []
|
|
89
120
|
resolved_nodes: list[int] = []
|
|
90
121
|
outputs: list[OutputDestinationResponse] = []
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
__all__ = [
|
|
125
|
+
"InfluxDBVersion",
|
|
126
|
+
"OutputDestinationBase",
|
|
127
|
+
"OutputDestinationCreate",
|
|
128
|
+
"OutputDestinationResponse",
|
|
129
|
+
"OutputDestinationUpdate",
|
|
130
|
+
"SnmpSecLevel",
|
|
131
|
+
"SnmpVersion",
|
|
132
|
+
"TelemetryAgentAck",
|
|
133
|
+
"TelemetryAgentBase",
|
|
134
|
+
"TelemetryAgentCreate",
|
|
135
|
+
"TelemetryAgentMatchRuleBase",
|
|
136
|
+
"TelemetryAgentMatchRuleCreate",
|
|
137
|
+
"TelemetryAgentMatchRuleResponse",
|
|
138
|
+
"TelemetryAgentResponse",
|
|
139
|
+
"TelemetryAgentUpdate",
|
|
140
|
+
]
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
from pydantic import BaseModel
|
|
2
|
-
|
|
3
|
-
from acex_devkit.models.base import PersistedResponse
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class CredentialFieldBase(BaseModel):
|
|
7
|
-
field_name: str
|
|
8
|
-
sensitive: bool = True
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class CredentialBase(BaseModel):
|
|
12
|
-
name: str
|
|
13
|
-
credential_type: str
|
|
14
|
-
source: str = "local"
|
|
15
|
-
vault_path: str | None = None
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class CredentialFieldResponse(CredentialFieldBase):
|
|
19
|
-
field_value: str | None = None
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class CredentialResponse(PersistedResponse, CredentialBase):
|
|
23
|
-
fields: list[CredentialFieldResponse] = []
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class CredentialCreate(CredentialBase):
|
|
27
|
-
fields: dict[str, str]
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class CredentialUpdate(BaseModel):
|
|
31
|
-
name: str | None = None
|
|
32
|
-
source: str | None = None
|
|
33
|
-
vault_path: str | None = None
|
|
34
|
-
fields: dict[str, str] | None = None
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class CredentialSecret(BaseModel):
|
|
38
|
-
id: int
|
|
39
|
-
credential_type: str
|
|
40
|
-
fields: dict[str, str] = {}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class NodeCredentialCreate(BaseModel):
|
|
44
|
-
credential_id: int
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class NodeCredentialResponse(PersistedResponse):
|
|
48
|
-
node_id: int
|
|
49
|
-
credential_id: int
|
|
50
|
-
credential_name: str | None = None
|
|
51
|
-
credential_type: str | None = None
|
|
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
|