atlan-application-sdk-api 3.51.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.
- application_sdk/__init__.py +7 -0
- application_sdk/_build_info.py +62 -0
- application_sdk/_context_errors.py +65 -0
- application_sdk/_install.py +130 -0
- application_sdk/_logging.py +171 -0
- application_sdk/_runtime/__init__.py +29 -0
- application_sdk/_runtime/offload.py +1020 -0
- application_sdk/_runtime/progress.py +757 -0
- application_sdk/clients/__init__.py +63 -0
- application_sdk/clients/_interface.py +58 -0
- application_sdk/clients/_sql_failure_classifier.py +112 -0
- application_sdk/clients/base.py +565 -0
- application_sdk/clients/http_errors.py +28 -0
- application_sdk/clients/models.py +49 -0
- application_sdk/clients/sql.py +1218 -0
- application_sdk/clients/sql_errors.py +192 -0
- application_sdk/clients/sql_typecasters.py +431 -0
- application_sdk/clients/ssl_utils.py +247 -0
- application_sdk/common/__init__.py +53 -0
- application_sdk/common/_generated_tree.py +321 -0
- application_sdk/common/_listing.py +192 -0
- application_sdk/common/aws_utils.py +522 -0
- application_sdk/common/aws_utils_errors.py +88 -0
- application_sdk/common/build_identity.py +120 -0
- application_sdk/common/concurrency.py +45 -0
- application_sdk/common/errors.py +99 -0
- application_sdk/common/filter_matching.py +261 -0
- application_sdk/common/logger.py +11 -0
- application_sdk/common/models.py +31 -0
- application_sdk/common/sql_filters.py +719 -0
- application_sdk/common/sql_filters_errors.py +17 -0
- application_sdk/common/task_queue.py +431 -0
- application_sdk/common/types.py +51 -0
- application_sdk/common/utils.py +87 -0
- application_sdk/constants.py +1120 -0
- application_sdk/contracts/__init__.py +158 -0
- application_sdk/contracts/base.py +1178 -0
- application_sdk/contracts/events.py +251 -0
- application_sdk/contracts/types.py +801 -0
- application_sdk/contracts/types_errors.py +17 -0
- application_sdk/credentials/__init__.py +326 -0
- application_sdk/credentials/errors.py +226 -0
- application_sdk/credentials/extra.py +114 -0
- application_sdk/credentials/ingress.py +283 -0
- application_sdk/credentials/ref.py +376 -0
- application_sdk/credentials/spec.py +182 -0
- application_sdk/credentials/types.py +339 -0
- application_sdk/credentials/utils.py +257 -0
- application_sdk/errors/__init__.py +224 -0
- application_sdk/errors/base.py +504 -0
- application_sdk/errors/categories.py +118 -0
- application_sdk/errors/http.py +81 -0
- application_sdk/errors/leaves.py +526 -0
- application_sdk/errors/wire.py +124 -0
- application_sdk/handler/__init__.py +97 -0
- application_sdk/handler/_warmup.py +198 -0
- application_sdk/handler/asgi.py +252 -0
- application_sdk/handler/base.py +281 -0
- application_sdk/handler/context.py +212 -0
- application_sdk/handler/contracts.py +1166 -0
- application_sdk/handler/manifest.py +81 -0
- application_sdk/handler/metadata_routes.py +699 -0
- application_sdk/handler/object_routes.py +418 -0
- application_sdk/handler/request_contract.py +91 -0
- application_sdk/handler/routes.py +1118 -0
- application_sdk/handler/service_errors.py +37 -0
- application_sdk/server/__init__.py +15 -0
- application_sdk/server/fastapi/models.py +338 -0
- application_sdk/templates/__init__.py +52 -0
- application_sdk/templates/contracts/__init__.py +111 -0
- application_sdk/templates/contracts/base_metadata_extraction.py +32 -0
- application_sdk/templates/contracts/incremental_sql.py +563 -0
- application_sdk/templates/contracts/sql_metadata.py +824 -0
- application_sdk/templates/contracts/sql_query.py +105 -0
- application_sdk/version.py +40 -0
- atlan_application_sdk_api-3.51.0.dist-info/METADATA +230 -0
- atlan_application_sdk_api-3.51.0.dist-info/RECORD +78 -0
- atlan_application_sdk_api-3.51.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"""Credential parsing utilities."""
|
|
2
|
+
|
|
3
|
+
import base64
|
|
4
|
+
import os
|
|
5
|
+
import warnings
|
|
6
|
+
from typing import Literal, overload
|
|
7
|
+
|
|
8
|
+
import orjson
|
|
9
|
+
|
|
10
|
+
from application_sdk._context_errors import ObjectStoreNotConfiguredError
|
|
11
|
+
from application_sdk._install import worker_only_missing
|
|
12
|
+
from application_sdk._logging import get_logger
|
|
13
|
+
from application_sdk.common.utils import download_file_from_upload_response
|
|
14
|
+
from application_sdk.constants import DEPLOYMENT_OBJECT_STORE_NAME, TEMPORARY_PATH
|
|
15
|
+
from application_sdk.credentials.extra import ( # noqa: F401 — re-exported; ships in the api distribution
|
|
16
|
+
parse_credentials_extra,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
#: Prefix on credential field values that indicates the referenced file lives
|
|
22
|
+
#: in the customer's DEPLOYMENT Dapr object store binding (configured during
|
|
23
|
+
#: SDR setup). Intended for **non-secret companion files** that just happen
|
|
24
|
+
#: to be bundled into the same credential payload — see ``resolve_credential_file``.
|
|
25
|
+
OBJECT_STORE_PREFIX = "objectstore://"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_DEFAULT_CREDENTIAL_FILE_DIR = os.path.join(TEMPORARY_PATH, "credential_files")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@overload
|
|
32
|
+
async def resolve_credential_file(
|
|
33
|
+
value: str | None,
|
|
34
|
+
filename: str,
|
|
35
|
+
dest_dir: str = ...,
|
|
36
|
+
*,
|
|
37
|
+
raise_on_error: Literal[True],
|
|
38
|
+
) -> str: ...
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@overload
|
|
42
|
+
async def resolve_credential_file(
|
|
43
|
+
value: str | None,
|
|
44
|
+
filename: str,
|
|
45
|
+
dest_dir: str = ...,
|
|
46
|
+
*,
|
|
47
|
+
raise_on_error: bool | None = ...,
|
|
48
|
+
) -> str | None: ...
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def resolve_credential_file(
|
|
52
|
+
value: str | None,
|
|
53
|
+
filename: str,
|
|
54
|
+
dest_dir: str = _DEFAULT_CREDENTIAL_FILE_DIR,
|
|
55
|
+
*,
|
|
56
|
+
raise_on_error: bool | None = None,
|
|
57
|
+
) -> str | None:
|
|
58
|
+
"""Resolve a credential-payload file field to a local file path.
|
|
59
|
+
|
|
60
|
+
A "credential payload" in Atlan can carry both true secrets (passwords,
|
|
61
|
+
keytabs, private keys) and non-secret companion files (krb5.conf, public
|
|
62
|
+
CA certificates, kerberos realm configuration) that the connector also
|
|
63
|
+
needs at runtime. This helper picks the right delivery mechanism for each
|
|
64
|
+
file based on the format of ``value``.
|
|
65
|
+
|
|
66
|
+
Three input formats are accepted, in priority order:
|
|
67
|
+
|
|
68
|
+
1. **Atlan object-store reference** (file uploaded via the UI file picker):
|
|
69
|
+
``{"key": "workflow_file_upload/...", "rawName": "...", "extension": "..."}``
|
|
70
|
+
The file was uploaded through the Atlan UI to Atlan's Dapr-backed
|
|
71
|
+
upload object store. Used for both secrets (small keytabs) and
|
|
72
|
+
non-secret companion files when the customer is happy to push the
|
|
73
|
+
file through Atlan's hosted upload pipe.
|
|
74
|
+
|
|
75
|
+
2. **Customer object-store path** (``objectstore://<key>``):
|
|
76
|
+
e.g. ``"objectstore://kerberos/krb5.conf"``. The file already lives
|
|
77
|
+
in the customer's own bucket — the same one wired up as their
|
|
78
|
+
``DEPLOYMENT_OBJECT_STORE_NAME`` Dapr binding during SDR setup. The
|
|
79
|
+
SDK streams it down via that existing binding at activity runtime.
|
|
80
|
+
|
|
81
|
+
This branch is intended for **non-secret companion files** that
|
|
82
|
+
ride alongside a true credential — e.g. a Kerberos krb5.conf or a
|
|
83
|
+
publicly-signed CA certificate. These files don't need
|
|
84
|
+
secret-manager-grade controls, but they also don't need to be
|
|
85
|
+
transferred through Atlan's infrastructure when the customer
|
|
86
|
+
already has a perfectly good object store in their environment.
|
|
87
|
+
|
|
88
|
+
Concrete benefits: no file-size ceiling (obstore streams chunks to
|
|
89
|
+
disk), no new credentials to manage (binding auth is already
|
|
90
|
+
configured), and the file content never traverses Atlan — only the
|
|
91
|
+
path string does.
|
|
92
|
+
|
|
93
|
+
**Not** intended for true secrets. Anything sensitive (passwords,
|
|
94
|
+
keytabs, private keys) belongs in the secret-store branch (#3
|
|
95
|
+
below) so it benefits from secret-manager controls (audit, rotation,
|
|
96
|
+
break-glass). Use this branch only for the non-secret companion
|
|
97
|
+
files that ship alongside a credential.
|
|
98
|
+
|
|
99
|
+
3. **Base64-encoded file content** (raw string, no prefix):
|
|
100
|
+
``"BQIAAAABAAoASElWRS5MT0NBTA..."``. Used for **true secrets** — the
|
|
101
|
+
customer base64-encodes the file, stores it as a value in their
|
|
102
|
+
secret manager (AWS Secrets Manager / Azure Key Vault / GCP Secret
|
|
103
|
+
Manager / K8s Secret), and the credential vault resolves the
|
|
104
|
+
reference via ``SecretStore.get_credentials()`` + Dapr at activity
|
|
105
|
+
runtime. The SDK sees the resolved base64 content here and decodes
|
|
106
|
+
it to disk. Bounded by the customer secret manager's value-size cap
|
|
107
|
+
(typically 1–64 KB depending on provider).
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
value: Raw credential field value — JSON object-store reference,
|
|
111
|
+
an ``objectstore://`` prefixed key, or a raw base64-encoded
|
|
112
|
+
string. Empty or whitespace-only means the field was
|
|
113
|
+
not supplied.
|
|
114
|
+
filename: Destination filename used for the base64 and ``objectstore://``
|
|
115
|
+
branches (e.g. ``"keytab.keytab"``, ``"krb5.conf"``,
|
|
116
|
+
``"ca_cert.pem"``). Ignored for the Atlan upload branch —
|
|
117
|
+
the filename there is derived from the upload key.
|
|
118
|
+
dest_dir: Directory to write or download the file into. Defaults to
|
|
119
|
+
``<TEMPORARY_PATH>/credential_files``.
|
|
120
|
+
|
|
121
|
+
raise_on_error: ``True`` to raise on failure, ``False`` to return
|
|
122
|
+
``None``. ``None`` (the default) behaves as ``False`` and
|
|
123
|
+
emits a ``DeprecationWarning``; the default flips to
|
|
124
|
+
``True`` in v4.0. A ``None`` for "resolution failed" is
|
|
125
|
+
indistinguishable from "no file configured", which is how
|
|
126
|
+
a failed CA-cert download became a connection with no
|
|
127
|
+
truststore.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Absolute path to the resolved file on disk. ``None`` if ``value`` is
|
|
131
|
+
empty or resolution fails, unless ``raise_on_error`` is ``True``.
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
CredentialNotFoundError: ``raise_on_error`` and ``value`` is empty or
|
|
135
|
+
whitespace only.
|
|
136
|
+
CredentialParseError: ``raise_on_error`` and ``value`` is an invalid
|
|
137
|
+
``objectstore://`` key or not valid base64.
|
|
138
|
+
Exception: Failures downloading an Atlan upload reference propagate
|
|
139
|
+
in either mode, as they always have; with ``raise_on_error``,
|
|
140
|
+
failures downloading from the customer object store or writing
|
|
141
|
+
the file propagate too, with their own types.
|
|
142
|
+
"""
|
|
143
|
+
if raise_on_error is None:
|
|
144
|
+
warnings.warn(
|
|
145
|
+
"resolve_credential_file() without raise_on_error is deprecated: "
|
|
146
|
+
"it returns None for a failed resolution as well as an empty "
|
|
147
|
+
"value. Pass raise_on_error=True for a typed error, or "
|
|
148
|
+
"raise_on_error=False to keep None — the default flips to True "
|
|
149
|
+
"in v4.0.",
|
|
150
|
+
DeprecationWarning,
|
|
151
|
+
stacklevel=2,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
if not value or not value.strip():
|
|
155
|
+
if raise_on_error:
|
|
156
|
+
from application_sdk.credentials.errors import ( # noqa: PLC0415 — circular: credentials/__init__.py loads sibling modules
|
|
157
|
+
CredentialNotFoundError,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
raise CredentialNotFoundError(filename)
|
|
161
|
+
return None
|
|
162
|
+
|
|
163
|
+
# 1. Atlan upload object store — JSON reference from the UI file picker.
|
|
164
|
+
# Download failures here have always propagated, in both modes.
|
|
165
|
+
if _is_upload_reference(value):
|
|
166
|
+
return await download_file_from_upload_response(value)
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
return await _resolve_credential_file_content(value.strip(), filename, dest_dir)
|
|
170
|
+
# conformance: ignore[E004] re-raised unchanged under raise_on_error; otherwise the legacy None contract, logged with the cause
|
|
171
|
+
except Exception:
|
|
172
|
+
if raise_on_error:
|
|
173
|
+
raise
|
|
174
|
+
logger.error(
|
|
175
|
+
"Failed to resolve credential file: filename=%s", filename, exc_info=True
|
|
176
|
+
)
|
|
177
|
+
return None
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _is_upload_reference(value: str) -> bool:
|
|
181
|
+
"""Whether *value* is an Atlan upload-store reference (JSON with a file key)."""
|
|
182
|
+
try:
|
|
183
|
+
parsed = orjson.loads(value)
|
|
184
|
+
# conformance: ignore[E002] value isn't a JSON file-reference; the caller falls through to the objectstore:// check
|
|
185
|
+
except (orjson.JSONDecodeError, TypeError):
|
|
186
|
+
return False
|
|
187
|
+
return isinstance(parsed, dict) and ("key" in parsed or "fileKey" in parsed)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
async def _resolve_credential_file_content(
|
|
191
|
+
stripped: str, filename: str, dest_dir: str
|
|
192
|
+
) -> str:
|
|
193
|
+
"""Resolve an ``objectstore://`` key or base64 content to a local path.
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
CredentialParseError: An invalid ``objectstore://`` key, or content
|
|
197
|
+
that is not valid base64.
|
|
198
|
+
"""
|
|
199
|
+
from application_sdk.credentials.errors import ( # noqa: PLC0415 — circular: credentials/__init__.py loads sibling modules
|
|
200
|
+
CredentialParseError,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# 2. Customer's DEPLOYMENT object store — explicit objectstore:// prefix.
|
|
204
|
+
# Intended for non-secret companion files (krb5.conf, public CA certs)
|
|
205
|
+
# bundled with the credential. See resolve_credential_file's docstring.
|
|
206
|
+
if stripped.startswith(OBJECT_STORE_PREFIX):
|
|
207
|
+
key = stripped[len(OBJECT_STORE_PREFIX) :]
|
|
208
|
+
# Reject empty keys, absolute paths, and path-traversal segments
|
|
209
|
+
if not key or key.startswith("/") or ".." in key.split("/"):
|
|
210
|
+
raise CredentialParseError(
|
|
211
|
+
"Invalid object store key for credential file (empty, "
|
|
212
|
+
"absolute, or contains '..')",
|
|
213
|
+
credential_name=filename,
|
|
214
|
+
)
|
|
215
|
+
os.makedirs(dest_dir, exist_ok=True)
|
|
216
|
+
file_path = os.path.join(dest_dir, filename)
|
|
217
|
+
try:
|
|
218
|
+
from application_sdk.storage.binding import ( # noqa: PLC0415 — lazy: storage imports obstore (heavy Rust ext) at module load, and this module sits on the workflow-sandbox import chain (credentials package init); pinned by the preflight gate's import-hygiene test
|
|
219
|
+
create_store_from_binding,
|
|
220
|
+
)
|
|
221
|
+
from application_sdk.storage.ops import ( # noqa: PLC0415 — lazy: same reason as the binding import above
|
|
222
|
+
download_file,
|
|
223
|
+
)
|
|
224
|
+
except ModuleNotFoundError as exc:
|
|
225
|
+
if not worker_only_missing(exc):
|
|
226
|
+
raise
|
|
227
|
+
# api-only install (the API host): no object store to resolve from.
|
|
228
|
+
raise ObjectStoreNotConfiguredError() from exc
|
|
229
|
+
|
|
230
|
+
store = create_store_from_binding(DEPLOYMENT_OBJECT_STORE_NAME)
|
|
231
|
+
await download_file(key, file_path, store=store)
|
|
232
|
+
logger.info(
|
|
233
|
+
"Resolved credential file from customer object store: key=%s path=%s",
|
|
234
|
+
key,
|
|
235
|
+
file_path,
|
|
236
|
+
)
|
|
237
|
+
return file_path
|
|
238
|
+
|
|
239
|
+
# 3. Base64-encoded file content — decode and write to disk
|
|
240
|
+
try:
|
|
241
|
+
decoded_bytes = base64.b64decode(stripped, validate=True)
|
|
242
|
+
except ValueError as exc:
|
|
243
|
+
raise CredentialParseError(
|
|
244
|
+
"Credential file content is not valid base64",
|
|
245
|
+
credential_name=filename,
|
|
246
|
+
cause=exc,
|
|
247
|
+
) from exc
|
|
248
|
+
os.makedirs(dest_dir, exist_ok=True)
|
|
249
|
+
file_path = os.path.join(dest_dir, filename)
|
|
250
|
+
with open(file_path, "wb") as f:
|
|
251
|
+
f.write(decoded_bytes)
|
|
252
|
+
logger.info(
|
|
253
|
+
"Resolved credential file from base64 content: path=%s filename=%s",
|
|
254
|
+
file_path,
|
|
255
|
+
filename,
|
|
256
|
+
)
|
|
257
|
+
return file_path
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"""Structured error codes and error hierarchy for Application SDK.
|
|
2
|
+
|
|
3
|
+
Canonical API (v3.x+)::
|
|
4
|
+
|
|
5
|
+
from application_sdk.errors import (
|
|
6
|
+
AppError,
|
|
7
|
+
FailureCategory,
|
|
8
|
+
Audience,
|
|
9
|
+
FailureDetails,
|
|
10
|
+
AuthError,
|
|
11
|
+
AppPermissionDeniedError, AppTimeoutError,
|
|
12
|
+
NotFoundError, AlreadyExistsError,
|
|
13
|
+
InvalidInputError, PreconditionError,
|
|
14
|
+
RateLimitedError, UnimplementedError,
|
|
15
|
+
DependencyUnavailableError, SourceUnavailableError,
|
|
16
|
+
ObjectStoreReadError, ObjectStoreDownloadError,
|
|
17
|
+
ResourceExhaustedError, DiskFullError,
|
|
18
|
+
DataIntegrityError, CancelledError, InternalError,
|
|
19
|
+
classify_http_status, classify_http_exception,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
Legacy constants (v3.x — deprecated, removed in v4.0)::
|
|
23
|
+
|
|
24
|
+
from application_sdk.errors import ErrorCode, APP_ERROR, CREDENTIAL_NOT_FOUND, ...
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from dataclasses import dataclass
|
|
28
|
+
|
|
29
|
+
# ── New canonical hierarchy ──────────────────────────────────────────────────
|
|
30
|
+
from application_sdk.errors.base import (
|
|
31
|
+
AppError,
|
|
32
|
+
redact_secrets,
|
|
33
|
+
redact_wire_value,
|
|
34
|
+
safe_traceback,
|
|
35
|
+
sanitize_cause_repr,
|
|
36
|
+
)
|
|
37
|
+
from application_sdk.errors.categories import Audience, FailureCategory
|
|
38
|
+
from application_sdk.errors.http import classify_http_exception, classify_http_status
|
|
39
|
+
from application_sdk.errors.leaves import (
|
|
40
|
+
WORKER_EVICTED_TYPE,
|
|
41
|
+
AlreadyExistsError,
|
|
42
|
+
AppPermissionDeniedError,
|
|
43
|
+
AppTimeoutError,
|
|
44
|
+
AuthError,
|
|
45
|
+
CancelledError,
|
|
46
|
+
ColdStartRaceError,
|
|
47
|
+
DaprSidecarUnreachableError,
|
|
48
|
+
DataIntegrityError,
|
|
49
|
+
DependencyUnavailableError,
|
|
50
|
+
DiskFullError,
|
|
51
|
+
InternalError,
|
|
52
|
+
InvalidInputError,
|
|
53
|
+
InvalidInputValueError,
|
|
54
|
+
LocalVolumeUnwritableError,
|
|
55
|
+
NotFoundError,
|
|
56
|
+
ObjectStoreDownloadError,
|
|
57
|
+
ObjectStoreReadError,
|
|
58
|
+
PreconditionError,
|
|
59
|
+
RateLimitedError,
|
|
60
|
+
ResourceExhaustedError,
|
|
61
|
+
SourceUnavailableError,
|
|
62
|
+
SourceWarmupExhaustedError,
|
|
63
|
+
TaskStalledError,
|
|
64
|
+
UnimplementedError,
|
|
65
|
+
)
|
|
66
|
+
from application_sdk.errors.wire import FailureDetails
|
|
67
|
+
|
|
68
|
+
# ── Legacy ErrorCode dataclass + AAF-* constants (deprecated — removed v4.0) ─
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True)
|
|
72
|
+
class ErrorCode:
|
|
73
|
+
"""Structured error code for monitoring and alerting.
|
|
74
|
+
|
|
75
|
+
Deprecated: use ``FailureCategory`` + typed ``AppError`` subclasses.
|
|
76
|
+
Will be removed in v4.0.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
component: str
|
|
80
|
+
id: int
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def code(self) -> str:
|
|
84
|
+
"""Format as AAF-{COMP}-{ID:03d}."""
|
|
85
|
+
return f"AAF-{self.component}-{self.id:03d}"
|
|
86
|
+
|
|
87
|
+
def __str__(self) -> str:
|
|
88
|
+
return self.code
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# APP - Core App errors
|
|
92
|
+
APP_ERROR = ErrorCode("APP", 1)
|
|
93
|
+
APP_NON_RETRYABLE = ErrorCode("APP", 2)
|
|
94
|
+
APP_CONTEXT_ERROR = ErrorCode("APP", 3)
|
|
95
|
+
APP_NOT_FOUND = ErrorCode("APP", 4)
|
|
96
|
+
APP_ALREADY_REGISTERED = ErrorCode("APP", 5)
|
|
97
|
+
TASK_NOT_FOUND = ErrorCode("APP", 6)
|
|
98
|
+
|
|
99
|
+
# STR - Storage errors
|
|
100
|
+
STORAGE_NOT_FOUND = ErrorCode("STR", 1)
|
|
101
|
+
STORAGE_PERMISSION = ErrorCode("STR", 2)
|
|
102
|
+
STORAGE_CONFIG = ErrorCode("STR", 3)
|
|
103
|
+
STORAGE_OPERATION = ErrorCode("STR", 4)
|
|
104
|
+
STORAGE_EMPTY_UPLOAD = ErrorCode("STR", 5)
|
|
105
|
+
STORAGE_PREFLIGHT = ErrorCode("STR", 6)
|
|
106
|
+
STORAGE_INTEGRITY = ErrorCode("STR", 7)
|
|
107
|
+
STORAGE_RELOCATION = ErrorCode("STR", 8)
|
|
108
|
+
STORAGE_HANDOFF_INCOMPLETE = ErrorCode("STR", 9)
|
|
109
|
+
STORAGE_GATEWAY_AUTH = ErrorCode("STR", 10)
|
|
110
|
+
STORAGE_DISK_FULL = ErrorCode("STR", 11)
|
|
111
|
+
STORAGE_GATEWAY_NO_ROUTE = ErrorCode("STR", 12)
|
|
112
|
+
|
|
113
|
+
# CTR - Contract errors
|
|
114
|
+
CONTRACT_VALIDATION = ErrorCode("CTR", 1)
|
|
115
|
+
PAYLOAD_SAFETY = ErrorCode("CTR", 2)
|
|
116
|
+
|
|
117
|
+
# HDL - Handler errors
|
|
118
|
+
HANDLER_ERROR = ErrorCode("HDL", 1)
|
|
119
|
+
|
|
120
|
+
# EXE - Execution errors
|
|
121
|
+
EXECUTION_ERROR = ErrorCode("EXE", 1)
|
|
122
|
+
EXECUTION_WORKER_ERROR = ErrorCode("EXE", 2)
|
|
123
|
+
EXECUTION_ACTIVITY_ERROR = ErrorCode("EXE", 3)
|
|
124
|
+
|
|
125
|
+
# INF - Infrastructure errors
|
|
126
|
+
STATE_STORE_ERROR = ErrorCode("INF", 1)
|
|
127
|
+
PUBSUB_ERROR = ErrorCode("INF", 2)
|
|
128
|
+
BINDING_ERROR = ErrorCode("INF", 3)
|
|
129
|
+
SECRET_STORE_ERROR = ErrorCode("INF", 4)
|
|
130
|
+
SECRET_NOT_FOUND = ErrorCode("INF", 5)
|
|
131
|
+
|
|
132
|
+
# CRD - Credential errors
|
|
133
|
+
CREDENTIAL_ERROR = ErrorCode("CRD", 1)
|
|
134
|
+
CREDENTIAL_NOT_FOUND = ErrorCode("CRD", 2)
|
|
135
|
+
CREDENTIAL_PARSE_ERROR = ErrorCode("CRD", 3)
|
|
136
|
+
CREDENTIAL_VALIDATION_ERROR = ErrorCode("CRD", 4)
|
|
137
|
+
CREDENTIAL_VAULT_ERROR = ErrorCode("CRD", 5)
|
|
138
|
+
|
|
139
|
+
# DSC - Discovery errors
|
|
140
|
+
DISCOVERY_ERROR = ErrorCode("DSC", 1)
|
|
141
|
+
|
|
142
|
+
# EVT - Event/Analytics errors
|
|
143
|
+
EVENT_PUBLISH = ErrorCode("EVT", 1)
|
|
144
|
+
EVENT_BUS = ErrorCode("EVT", 2)
|
|
145
|
+
SEGMENT_ERROR = ErrorCode("EVT", 3)
|
|
146
|
+
|
|
147
|
+
__all__ = [
|
|
148
|
+
# New canonical
|
|
149
|
+
"AppError",
|
|
150
|
+
"Audience",
|
|
151
|
+
"FailureCategory",
|
|
152
|
+
"FailureDetails",
|
|
153
|
+
"AlreadyExistsError",
|
|
154
|
+
"AppPermissionDeniedError",
|
|
155
|
+
"AppTimeoutError",
|
|
156
|
+
"AuthError",
|
|
157
|
+
"CancelledError",
|
|
158
|
+
"ColdStartRaceError",
|
|
159
|
+
"DaprSidecarUnreachableError",
|
|
160
|
+
"DataIntegrityError",
|
|
161
|
+
"DependencyUnavailableError",
|
|
162
|
+
"DiskFullError",
|
|
163
|
+
"LocalVolumeUnwritableError",
|
|
164
|
+
"SourceUnavailableError",
|
|
165
|
+
"SourceWarmupExhaustedError",
|
|
166
|
+
"InternalError",
|
|
167
|
+
"InvalidInputError",
|
|
168
|
+
"InvalidInputValueError",
|
|
169
|
+
"NotFoundError",
|
|
170
|
+
"ObjectStoreDownloadError",
|
|
171
|
+
"ObjectStoreReadError",
|
|
172
|
+
"PreconditionError",
|
|
173
|
+
"RateLimitedError",
|
|
174
|
+
"ResourceExhaustedError",
|
|
175
|
+
"TaskStalledError",
|
|
176
|
+
"UnimplementedError",
|
|
177
|
+
"WORKER_EVICTED_TYPE",
|
|
178
|
+
"classify_http_exception",
|
|
179
|
+
"classify_http_status",
|
|
180
|
+
# Legacy (deprecated — removed in v4.0)
|
|
181
|
+
"ErrorCode",
|
|
182
|
+
"APP_ERROR",
|
|
183
|
+
"APP_NON_RETRYABLE",
|
|
184
|
+
"APP_CONTEXT_ERROR",
|
|
185
|
+
"APP_NOT_FOUND",
|
|
186
|
+
"APP_ALREADY_REGISTERED",
|
|
187
|
+
"TASK_NOT_FOUND",
|
|
188
|
+
"STORAGE_NOT_FOUND",
|
|
189
|
+
"STORAGE_PERMISSION",
|
|
190
|
+
"STORAGE_CONFIG",
|
|
191
|
+
"STORAGE_OPERATION",
|
|
192
|
+
"STORAGE_EMPTY_UPLOAD",
|
|
193
|
+
"STORAGE_PREFLIGHT",
|
|
194
|
+
"STORAGE_RELOCATION",
|
|
195
|
+
"STORAGE_INTEGRITY",
|
|
196
|
+
"STORAGE_HANDOFF_INCOMPLETE",
|
|
197
|
+
"STORAGE_GATEWAY_AUTH",
|
|
198
|
+
"STORAGE_DISK_FULL",
|
|
199
|
+
"STORAGE_GATEWAY_NO_ROUTE",
|
|
200
|
+
"CONTRACT_VALIDATION",
|
|
201
|
+
"PAYLOAD_SAFETY",
|
|
202
|
+
"HANDLER_ERROR",
|
|
203
|
+
"EXECUTION_ERROR",
|
|
204
|
+
"EXECUTION_WORKER_ERROR",
|
|
205
|
+
"EXECUTION_ACTIVITY_ERROR",
|
|
206
|
+
"STATE_STORE_ERROR",
|
|
207
|
+
"PUBSUB_ERROR",
|
|
208
|
+
"BINDING_ERROR",
|
|
209
|
+
"SECRET_STORE_ERROR",
|
|
210
|
+
"SECRET_NOT_FOUND",
|
|
211
|
+
"CREDENTIAL_ERROR",
|
|
212
|
+
"CREDENTIAL_NOT_FOUND",
|
|
213
|
+
"CREDENTIAL_PARSE_ERROR",
|
|
214
|
+
"CREDENTIAL_VALIDATION_ERROR",
|
|
215
|
+
"CREDENTIAL_VAULT_ERROR",
|
|
216
|
+
"DISCOVERY_ERROR",
|
|
217
|
+
"EVENT_PUBLISH",
|
|
218
|
+
"EVENT_BUS",
|
|
219
|
+
"SEGMENT_ERROR",
|
|
220
|
+
"redact_secrets",
|
|
221
|
+
"redact_wire_value",
|
|
222
|
+
"safe_traceback",
|
|
223
|
+
"sanitize_cause_repr",
|
|
224
|
+
]
|