dataops-sdk 0.3.1__tar.gz → 0.3.3__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.
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/PKG-INFO +2 -2
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/pyproject.toml +1 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/__init__.py +11 -2
- dataops_sdk-0.3.3/src/dataops_sdk/constants.py +15 -0
- dataops_sdk-0.3.3/src/dataops_sdk/exceptions.py +45 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/__init__.py +5 -7
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/datasource_factory.py +4 -3
- dataops_sdk-0.3.3/src/dataops_sdk/runner/schemas/nacos/__init__.py +11 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/config.py +12 -10
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/constants.py +9 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/instance.py +33 -9
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +6 -1
- dataops_sdk-0.3.3/src/dataops_sdk/runner/schemas/nacos/naming_param.py +140 -0
- dataops_sdk-0.3.3/src/dataops_sdk/runner/schemas/nacos/naming_request.py +148 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +34 -3
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +7 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/service.py +41 -10
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/__init__.py +10 -10
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/common.py +68 -17
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/dbConn_base.py +52 -61
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/dbConn_sync.py +188 -108
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/duckdb_manager.py +101 -31
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/file_transfer_base.py +65 -80
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +2 -3
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/nacos.py +20 -21
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/neo4j_sync.py +72 -49
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/queue_base.py +40 -48
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/queue_kafka.py +24 -24
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +31 -34
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/__init__.py +6 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/alarm.py +46 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/api.py +24 -2
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/data_table.py +249 -31
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/datasource.py +30 -1
- dataops_sdk-0.3.3/src/dataops_sdk/schemas/dict_.py +32 -0
- dataops_sdk-0.3.3/src/dataops_sdk/schemas/enums.py +211 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/group.py +14 -8
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/hazard.py +39 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/meta.py +116 -1
- dataops_sdk-0.3.3/src/dataops_sdk/schemas/query.py +479 -0
- dataops_sdk-0.3.3/src/dataops_sdk/schemas/report.py +42 -0
- dataops_sdk-0.3.3/src/dataops_sdk/schemas/skill.py +119 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/table.py +73 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/user.py +51 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/widget.py +469 -57
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/schemas/workflow.py +44 -6
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/__init__.py +7 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/alarm.py +116 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/api.py +16 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/auth.py +22 -2
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/data_table.py +34 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/dataset.py +37 -2
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/datasource.py +54 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/dict_.py +5 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/meta.py +71 -26
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/metrics.py +12 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/ref.py +28 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/report.py +13 -0
- dataops_sdk-0.3.3/src/dataops_sdk/services/skill.py +536 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/table.py +69 -5
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/workflow.py +41 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/session.py +150 -46
- dataops_sdk-0.3.3/src/dataops_sdk/tiptap/constants.py +248 -0
- dataops_sdk-0.3.3/src/dataops_sdk/tiptap/markdown_parser.py +913 -0
- dataops_sdk-0.3.3/src/dataops_sdk/tiptap/models.py +74 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/tiptap/parse_utils.py +159 -78
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/tiptap/render_utils.py +55 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/tiptap/renderers.py +16 -8
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/tiptap/tool.py +22 -1
- dataops_sdk-0.3.3/src/dataops_sdk/utils/__init__.py +37 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/utils/common.py +1 -1
- {dataops_sdk-0.3.1/src/dataops_sdk/runner → dataops_sdk-0.3.3/src/dataops_sdk}/utils/log.py +22 -6
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/utils/utils.py +68 -16
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk.egg-info/PKG-INFO +2 -2
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk.egg-info/SOURCES.txt +1 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk.egg-info/requires.txt +1 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/tests/test_constants.py +1 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/tests/test_exceptions.py +1 -1
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/tests/test_session.py +81 -60
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/tests/test_utils.py +7 -0
- dataops_sdk-0.3.1/src/dataops_sdk/constants.py +0 -6
- dataops_sdk-0.3.1/src/dataops_sdk/exceptions.py +0 -31
- dataops_sdk-0.3.1/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -5
- dataops_sdk-0.3.1/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -62
- dataops_sdk-0.3.1/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -84
- dataops_sdk-0.3.1/src/dataops_sdk/schemas/dict_.py +0 -13
- dataops_sdk-0.3.1/src/dataops_sdk/schemas/enums.py +0 -120
- dataops_sdk-0.3.1/src/dataops_sdk/schemas/query.py +0 -175
- dataops_sdk-0.3.1/src/dataops_sdk/schemas/report.py +0 -22
- dataops_sdk-0.3.1/src/dataops_sdk/schemas/skill.py +0 -70
- dataops_sdk-0.3.1/src/dataops_sdk/services/skill.py +0 -282
- dataops_sdk-0.3.1/src/dataops_sdk/tiptap/constants.py +0 -133
- dataops_sdk-0.3.1/src/dataops_sdk/tiptap/markdown_parser.py +0 -298
- dataops_sdk-0.3.1/src/dataops_sdk/tiptap/models.py +0 -43
- dataops_sdk-0.3.1/src/dataops_sdk/utils/__init__.py +0 -15
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/setup.cfg +0 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/hazard.py +0 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/services/widget.py +0 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/tiptap/__init__.py +0 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/tiptap/builder.py +0 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
- {dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataops-sdk
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Python SDK for the DataOps platform.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Requires-Dist: pydantic<3,>=2
|
|
@@ -8,7 +8,7 @@ Requires-Dist: pydantic-core
|
|
|
8
8
|
Requires-Dist: pydantic-settings>=2.14.2
|
|
9
9
|
Requires-Dist: httpx2>=2.5.0
|
|
10
10
|
Requires-Dist: jinja2>=3.1.6
|
|
11
|
-
Requires-Dist: markdown-it-py
|
|
11
|
+
Requires-Dist: markdown-it-py[plugins]
|
|
12
12
|
Requires-Dist: cryptography>=49.0.0
|
|
13
13
|
Provides-Extra: runner
|
|
14
14
|
Requires-Dist: paramiko>4; extra == "runner"
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
"""DataOps 平台 SDK.
|
|
2
|
+
|
|
3
|
+
对外暴露子模块 ``runner``、``schemas``、``utils`` 以及 ``services`` 中的全部平台操作函数,
|
|
4
|
+
供 ``data-ops-cli`` 命令行工具及外部调用方复用。可选的 ``runner`` extra 提供数据库与
|
|
5
|
+
Nacos 集成能力,未安装时仍可独立导入本包核心功能。
|
|
6
|
+
"""
|
|
7
|
+
|
|
1
8
|
from . import runner, schemas, utils
|
|
9
|
+
from .runner import service_get_datasource_instent
|
|
2
10
|
from .services import ( # noqa: F401
|
|
3
11
|
release_list_create,
|
|
4
12
|
release_list_get_by_code,
|
|
@@ -76,11 +84,12 @@ from .services import ( # noqa: F401
|
|
|
76
84
|
service_list_workflows,
|
|
77
85
|
service_login,
|
|
78
86
|
service_logout,
|
|
87
|
+
service_pack_skill_zip,
|
|
79
88
|
service_ref_backward,
|
|
80
89
|
service_ref_forward,
|
|
81
90
|
service_set_application,
|
|
82
91
|
service_skill_call_by_code,
|
|
83
|
-
|
|
92
|
+
service_skill_upload,
|
|
84
93
|
service_skill_upload_sub_file,
|
|
85
94
|
service_start_workflow,
|
|
86
95
|
service_start_workflow_async,
|
|
@@ -89,4 +98,4 @@ from .services import ( # noqa: F401
|
|
|
89
98
|
service_update_data_table_record_by_id_list,
|
|
90
99
|
)
|
|
91
100
|
|
|
92
|
-
__version__ = "0.3.
|
|
101
|
+
__version__ = "0.3.3"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""dataops_sdk 的全局常量定义.
|
|
2
|
+
|
|
3
|
+
集中维护 SDK 内部使用的固定文件名、默认值等常量,便于在多个模块间共享:
|
|
4
|
+
|
|
5
|
+
- ``USER_INFO_FILE``:本地缓存用户信息(含 access_token / refresh_token)的文件名。
|
|
6
|
+
- ``APPLICATION_FILE``:本地缓存当前应用上下文(应用编码、版本等)的文件名。
|
|
7
|
+
- ``DEFAULT_SECRET_KEY``:未显式配置时用于本地凭据加密的内置密钥(仅用于本地持久化场景)。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Final
|
|
11
|
+
|
|
12
|
+
USER_INFO_FILE: Final[str] = "user_info.json"
|
|
13
|
+
APPLICATION_FILE: Final[str] = "application.json"
|
|
14
|
+
|
|
15
|
+
DEFAULT_SECRET_KEY: Final[str] = "e0XxEhkWSJcA6Aps"
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""dataops_sdk 自定义异常层级.
|
|
2
|
+
|
|
3
|
+
定义 SDK 与后端交互过程中可能抛出的异常类型。``DataOpsError`` 作为基类,聚合消息
|
|
4
|
+
与可选的 HTTP 状态码;下层异常类用于在 SDK 与 CLI 中区分典型错误场景(资源缺失、
|
|
5
|
+
认证失败、写入失败等),便于调用方按类型进行捕获与分支处理。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DataOpsError(Exception):
|
|
10
|
+
"""DataOps API 错误基类。"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, message: str, status_code: int | None = None):
|
|
13
|
+
"""初始化 DataOps 错误。
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
message: 人类可读的错误描述,会同时用于 ``args`` 与 ``str(exc)`` 输出。
|
|
17
|
+
status_code: 可选的 HTTP 状态码,便于上层根据响应码分类处理。
|
|
18
|
+
"""
|
|
19
|
+
self.message = message
|
|
20
|
+
self.status_code = status_code
|
|
21
|
+
super().__init__(message)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class NotFoundError(DataOpsError):
|
|
25
|
+
"""资源未找到。"""
|
|
26
|
+
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class AuthenticationError(DataOpsError):
|
|
31
|
+
"""认证失败异常。"""
|
|
32
|
+
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class FailedToCreateError(DataOpsError):
|
|
37
|
+
"""创建失败异常。"""
|
|
38
|
+
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class FailedToUpdateError(DataOpsError):
|
|
43
|
+
"""更新失败异常。"""
|
|
44
|
+
|
|
45
|
+
pass
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
可作为独立模块被导入使用。
|
|
5
5
|
|
|
6
6
|
Modules:
|
|
7
|
-
schemas: Nacos
|
|
8
|
-
utils:
|
|
7
|
+
schemas: Nacos 配置数据模型.
|
|
8
|
+
utils: 通用工具(数据库连接、加密、日志等).
|
|
9
9
|
|
|
10
10
|
Example:
|
|
11
|
-
>>> from runner
|
|
11
|
+
>>> from dataops_sdk.runner import DatabaseConn, getLogger
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
|
-
from .datasource_factory import
|
|
14
|
+
from .datasource_factory import service_get_datasource_instent
|
|
15
15
|
from .schemas.nacos import NacosSettings
|
|
16
16
|
from .utils import (
|
|
17
17
|
DatabaseConn,
|
|
@@ -23,7 +23,6 @@ from .utils import (
|
|
|
23
23
|
encrypt_body,
|
|
24
24
|
generate_uuid,
|
|
25
25
|
get_service_instance,
|
|
26
|
-
getLogger,
|
|
27
26
|
parse_args,
|
|
28
27
|
print_json,
|
|
29
28
|
)
|
|
@@ -36,11 +35,10 @@ __all__ = [
|
|
|
36
35
|
"Neo4jConn",
|
|
37
36
|
"decrypt_body",
|
|
38
37
|
"encrypt_body",
|
|
39
|
-
"getLogger",
|
|
40
38
|
"print_json",
|
|
41
39
|
"generate_uuid",
|
|
42
40
|
"parse_args",
|
|
43
41
|
"NacosSettings",
|
|
44
42
|
"get_service_instance",
|
|
45
|
-
"
|
|
43
|
+
"service_get_datasource_instent",
|
|
46
44
|
]
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
数据源实例工厂模块。
|
|
1
|
+
"""数据源实例工厂模块。
|
|
3
2
|
|
|
4
3
|
根据数据源元数据动态创建对应的连接实例(数据库或消息队列)。
|
|
5
4
|
"""
|
|
@@ -7,7 +6,7 @@
|
|
|
7
6
|
from dataops_sdk.services.datasource import service_get_datasource_by_name
|
|
8
7
|
|
|
9
8
|
|
|
10
|
-
def
|
|
9
|
+
def service_get_datasource_instent(datasource: str, log_sql: bool | None = None, **kwargs):
|
|
11
10
|
"""
|
|
12
11
|
根据数据源名称获取对应的连接实例。
|
|
13
12
|
|
|
@@ -81,3 +80,5 @@ def get_datasource_instent(datasource: str, log_sql: bool | None = None):
|
|
|
81
80
|
log_sql=log_sql,
|
|
82
81
|
name=meta.title,
|
|
83
82
|
)
|
|
83
|
+
else:
|
|
84
|
+
raise NotImplementedError(f"Category {meta.data.category} is not supported")
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Nacos 配置中心 schema 集合。
|
|
2
|
+
|
|
3
|
+
聚合 Nacos 配置、服务发现与命名空间相关的数据模型,对外暴露
|
|
4
|
+
``NacosSettings``、``Service`` 与 ``Instance`` 等常用模型。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .config import NacosSettings
|
|
8
|
+
from .instance import Instance
|
|
9
|
+
from .service import Service
|
|
10
|
+
|
|
11
|
+
__all__ = ["Service", "Instance", "NacosSettings"]
|
|
@@ -24,17 +24,19 @@ class NacosSettings(BaseSettings):
|
|
|
24
24
|
子系统连接和 Nacos 服务发现参数。
|
|
25
25
|
|
|
26
26
|
Attributes:
|
|
27
|
-
nacos_addrs:
|
|
28
|
-
nacos_user:
|
|
29
|
-
nacos_password:
|
|
30
|
-
nacos_discovery_namespace:
|
|
31
|
-
nacos_group_name:
|
|
27
|
+
nacos_addrs: Nacos 服务地址(IP:PORT 形式,多个地址以英文逗号分隔)。
|
|
28
|
+
nacos_user: Nacos 鉴权用户名。
|
|
29
|
+
nacos_password: Nacos 鉴权密码。
|
|
30
|
+
nacos_discovery_namespace: Nacos 服务发现使用的命名空间 ID。
|
|
31
|
+
nacos_group_name: Nacos 服务发现使用的默认分组名,缺省 ``DEFAULT_GROUP``。
|
|
32
32
|
"""
|
|
33
33
|
|
|
34
|
-
nacos_addrs: Annotated[str, Field(description="
|
|
35
|
-
nacos_user: Annotated[str, Field(description="
|
|
36
|
-
nacos_password: Annotated[str, Field(description="
|
|
37
|
-
nacos_discovery_namespace: Annotated[str, Field(description="
|
|
38
|
-
nacos_group_name: Annotated[str, Field(description="
|
|
34
|
+
nacos_addrs: Annotated[str, Field(description="Nacos 服务地址")]
|
|
35
|
+
nacos_user: Annotated[str, Field(description="Nacos 用户名")]
|
|
36
|
+
nacos_password: Annotated[str, Field(description="Nacos 密码")]
|
|
37
|
+
nacos_discovery_namespace: Annotated[str, Field(description="Nacos 服务发现命名空间 ID")]
|
|
38
|
+
nacos_group_name: Annotated[str, Field(description="Nacos 服务发现默认分组名")] = (
|
|
39
|
+
"DEFAULT_GROUP"
|
|
40
|
+
)
|
|
39
41
|
|
|
40
42
|
model_config = SettingsConfigDict(extra="ignore")
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
"""Nacos 服务实例模型。
|
|
2
|
+
|
|
3
|
+
定义 Nacos 服务发现场景下的注册实例数据结构,并提供与官方 Java
|
|
4
|
+
客户端行为对齐的合法性校验与元数据辅助方法。
|
|
5
|
+
"""
|
|
6
|
+
|
|
1
7
|
from __future__ import annotations
|
|
2
8
|
|
|
3
9
|
import re
|
|
@@ -11,16 +17,34 @@ from .preserved_metadata_key import PreservedMetadataKeys
|
|
|
11
17
|
|
|
12
18
|
|
|
13
19
|
class Instance(BaseModel):
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
"""Nacos 服务注册实例。
|
|
21
|
+
|
|
22
|
+
用于描述一个注册到 Nacos 服务发现体系中的服务实例,包含网络
|
|
23
|
+
信息、健康状态、所属集群以及自定义元数据。
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
instanceId: 实例唯一标识,缺省时由客户端按 IP、端口、集群等规则生成。
|
|
27
|
+
ip: 实例对外提供服务的 IP 地址。
|
|
28
|
+
port: 实例对外提供服务的端口号,范围 ``0``-``65535``。
|
|
29
|
+
weight: 实例权重,默认为 ``1.0``,用于负载均衡。
|
|
30
|
+
healthy: 实例是否处于健康状态,默认为 ``True``。
|
|
31
|
+
enabled: 实例是否启用,禁用后不会出现在订阅结果中。
|
|
32
|
+
ephemeral: 是否为临时实例,临时实例通过心跳维持注册状态。
|
|
33
|
+
clusterName: 实例所属集群名称,缺省为 ``DEFAULT``。
|
|
34
|
+
serviceName: 实例所属服务名称。
|
|
35
|
+
metadata: 实例自定义元数据键值对。
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
instanceId: Annotated[str, Field(description="实例唯一标识")] = ""
|
|
39
|
+
ip: Annotated[str, Field(description="实例对外提供服务的 IP 地址")]
|
|
40
|
+
port: Annotated[int, Field(description="实例对外提供服务的端口号")]
|
|
41
|
+
weight: Annotated[float, Field(description="实例权重,负载均衡时使用")] = 1.0
|
|
42
|
+
healthy: Annotated[bool, Field(description="实例是否处于健康状态")] = True
|
|
19
43
|
enabled: Annotated[bool, Field(description="实例是否启用")] = True
|
|
20
|
-
ephemeral: Annotated[bool, Field(description="
|
|
21
|
-
clusterName: Annotated[str, Field(description="
|
|
22
|
-
serviceName: Annotated[str, Field(description="
|
|
23
|
-
metadata: Annotated[dict, Field(description="
|
|
44
|
+
ephemeral: Annotated[bool, Field(description="是否为临时实例")] = True
|
|
45
|
+
clusterName: Annotated[str, Field(description="实例所属集群名称")] = ""
|
|
46
|
+
serviceName: Annotated[str, Field(description="实例所属服务名称")] = ""
|
|
47
|
+
metadata: Annotated[dict, Field(description="实例自定义元数据")] = {}
|
|
24
48
|
|
|
25
49
|
def __str__(self):
|
|
26
50
|
return f"Instance({', '.join(f'{key}={value!r}' for key, value in self.__dict__.items())})"
|
{dataops_sdk-0.3.1 → dataops_sdk-0.3.3}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py
RENAMED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
"""Nacos 客户端异常与错误码定义。
|
|
2
|
+
|
|
3
|
+
集中声明 Nacos 客户端在调用过程中使用的错误码常量及统一异常类。
|
|
4
|
+
"""
|
|
5
|
+
|
|
1
6
|
CLIENT_INVALID_PARAM = -400
|
|
2
7
|
|
|
3
8
|
CLIENT_DISCONNECT = -401
|
|
@@ -36,7 +41,7 @@ HTTP_CLIENT_ERROR_CODE = -500
|
|
|
36
41
|
|
|
37
42
|
|
|
38
43
|
class NacosException(Exception):
|
|
39
|
-
"""
|
|
44
|
+
"""Nacos 客户端统一异常,携带错误码与可读消息。"""
|
|
40
45
|
|
|
41
46
|
def __init__(self, error_code, message="An error occurred"):
|
|
42
47
|
self.error_code = error_code
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""Nacos 命名空间 API 调用参数模型。
|
|
2
|
+
|
|
3
|
+
定义调用 Nacos OpenAPI 命名空间相关接口时使用的请求参数模型,
|
|
4
|
+
覆盖实例注册、注销、查询、订阅与服务列表等常见场景。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, Field
|
|
11
|
+
|
|
12
|
+
from .constants import Constants
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RegisterInstanceParam(BaseModel):
|
|
16
|
+
"""注册单个实例到 Nacos 服务时的入参。
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
ip: 待注册实例的 IP 地址。
|
|
20
|
+
port: 待注册实例的端口号。
|
|
21
|
+
weight: 实例权重,默认 ``1.0``。
|
|
22
|
+
enabled: 是否启用实例,默认 ``True``。
|
|
23
|
+
healthy: 实例初始健康状态,默认 ``True``。
|
|
24
|
+
metadata: 实例自定义元数据键值对。
|
|
25
|
+
cluster_name: 所属集群名称,缺省为空(实际生效为默认集群)。
|
|
26
|
+
service_name: 目标服务名称。
|
|
27
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
28
|
+
ephemeral: 是否注册为临时实例,默认 ``True``。
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
ip: Annotated[str, Field(description="待注册实例的 IP 地址")]
|
|
32
|
+
port: Annotated[int, Field(description="待注册实例的端口号")]
|
|
33
|
+
weight: Annotated[float, Field(description="实例权重,负载均衡时使用")] = 1.0
|
|
34
|
+
enabled: Annotated[bool, Field(description="是否启用实例")] = True
|
|
35
|
+
healthy: Annotated[bool, Field(description="实例初始健康状态")] = True
|
|
36
|
+
metadata: Annotated[dict[str, str], Field(description="实例自定义元数据")] = {}
|
|
37
|
+
cluster_name: Annotated[str, Field(description="所属集群名称")] = ""
|
|
38
|
+
service_name: Annotated[str, Field(description="目标服务名称")]
|
|
39
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
40
|
+
ephemeral: Annotated[bool, Field(description="是否注册为临时实例")] = True
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class BatchRegisterInstanceParam(BaseModel):
|
|
44
|
+
"""批量注册实例的入参。
|
|
45
|
+
|
|
46
|
+
Attributes:
|
|
47
|
+
service_name: 目标服务名称。
|
|
48
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
49
|
+
instances: 待注册的实例参数列表。
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
service_name: Annotated[str, Field(description="目标服务名称")]
|
|
53
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
54
|
+
instances: Annotated[
|
|
55
|
+
list[RegisterInstanceParam], Field(description="待注册的实例参数列表")
|
|
56
|
+
] = []
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class DeregisterInstanceParam(BaseModel):
|
|
60
|
+
"""注销实例的入参。
|
|
61
|
+
|
|
62
|
+
Attributes:
|
|
63
|
+
ip: 待注销实例的 IP 地址。
|
|
64
|
+
port: 待注销实例的端口号。
|
|
65
|
+
cluster_name: 所属集群名称,缺省为空(实际生效为默认集群)。
|
|
66
|
+
service_name: 目标服务名称。
|
|
67
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
68
|
+
ephemeral: 待注销实例是否为临时实例,默认 ``True``。
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
ip: Annotated[str, Field(description="待注销实例的 IP 地址")]
|
|
72
|
+
port: Annotated[int, Field(description="待注销实例的端口号")]
|
|
73
|
+
cluster_name: Annotated[str, Field(description="所属集群名称")] = ""
|
|
74
|
+
service_name: Annotated[str, Field(description="目标服务名称")]
|
|
75
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
76
|
+
ephemeral: Annotated[bool, Field(description="待注销实例是否为临时实例")] = True
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ListInstanceParam(BaseModel):
|
|
80
|
+
"""查询服务实例列表的入参。
|
|
81
|
+
|
|
82
|
+
Attributes:
|
|
83
|
+
service_name: 目标服务名称。
|
|
84
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
85
|
+
clusters: 仅查询指定集群的实例列表。
|
|
86
|
+
subscribe: 是否同时订阅该服务的变更,默认 ``True``。
|
|
87
|
+
healthy_only: 是否仅返回健康实例,``None`` 表示不过滤。
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
service_name: Annotated[str, Field(description="目标服务名称")]
|
|
91
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
92
|
+
clusters: Annotated[list[str], Field(description="仅查询指定集群的实例列表")] = []
|
|
93
|
+
subscribe: Annotated[bool, Field(description="是否同时订阅该服务的变更")] = True
|
|
94
|
+
healthy_only: Annotated[bool | None, Field(description="是否仅返回健康实例")] = None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class SubscribeServiceParam(BaseModel):
|
|
98
|
+
"""订阅服务变更的入参。
|
|
99
|
+
|
|
100
|
+
Attributes:
|
|
101
|
+
service_name: 目标服务名称。
|
|
102
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
103
|
+
clusters: 仅订阅指定集群的实例变更。
|
|
104
|
+
subscribe_callback: 服务变更回调函数,``None`` 表示无回调。
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
service_name: Annotated[str, Field(description="目标服务名称")]
|
|
108
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
109
|
+
clusters: Annotated[list[str], Field(description="仅订阅指定集群的实例变更")] = []
|
|
110
|
+
subscribe_callback: Annotated[Callable | None, Field(description="服务变更回调函数")] = None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class GetServiceParam(BaseModel):
|
|
114
|
+
"""获取单个服务信息的入参。
|
|
115
|
+
|
|
116
|
+
Attributes:
|
|
117
|
+
service_name: 目标服务名称。
|
|
118
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
119
|
+
clusters: 仅查询指定集群的实例。
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
service_name: Annotated[str, Field(description="目标服务名称")]
|
|
123
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
124
|
+
clusters: Annotated[list[str], Field(description="仅查询指定集群的实例")] = []
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class ListServiceParam(BaseModel):
|
|
128
|
+
"""分页查询服务列表的入参。
|
|
129
|
+
|
|
130
|
+
Attributes:
|
|
131
|
+
namespace_id: 命名空间 ID,缺省为 ``Constants.DEFAULT_NAMESPACE_ID``。
|
|
132
|
+
group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
|
|
133
|
+
page_no: 查询页码,从 ``1`` 开始,默认 ``1``。
|
|
134
|
+
page_size: 每页返回数量,默认 ``10``。
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
namespace_id: Annotated[str, Field(description="命名空间 ID")] = Constants.DEFAULT_NAMESPACE_ID
|
|
138
|
+
group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
|
|
139
|
+
page_no: Annotated[int, Field(description="查询页码,从 1 开始")] = 1
|
|
140
|
+
page_size: Annotated[int, Field(description="每页返回数量")] = 10
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Nacos 命名空间 gRPC 请求模型。
|
|
2
|
+
|
|
3
|
+
定义通过 gRPC 通道向 Nacos 服务器发起命名空间相关操作时的请求结构,
|
|
4
|
+
包含抽象基类及若干具体操作类型的请求模型。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from abc import ABC
|
|
10
|
+
from typing import Annotated
|
|
11
|
+
|
|
12
|
+
from pydantic import Field
|
|
13
|
+
from v2.nacos.naming.model.instance import Instance
|
|
14
|
+
from v2.nacos.transport.model.rpc_request import Request
|
|
15
|
+
|
|
16
|
+
from .service import Service
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AbstractNamingRequest(Request, ABC):
|
|
20
|
+
"""命名空间相关 gRPC 请求的抽象基类。
|
|
21
|
+
|
|
22
|
+
统一携带命名空间、服务名和分组等公共字段,子类需实现
|
|
23
|
+
:meth:`get_request_type` 标识具体请求类型。
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
namespace: 命名空间 ID,缺省为空字符串。
|
|
27
|
+
serviceName: 目标服务名称,缺省为空字符串。
|
|
28
|
+
groupName: 服务所在分组名称,缺省为空字符串。
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
namespace: Annotated[str | None, Field(description="命名空间 ID")] = ""
|
|
32
|
+
serviceName: Annotated[str | None, Field(description="目标服务名称")] = ""
|
|
33
|
+
groupName: Annotated[str | None, Field(description="服务所在分组名称")] = ""
|
|
34
|
+
|
|
35
|
+
def get_module(self):
|
|
36
|
+
return "naming"
|
|
37
|
+
|
|
38
|
+
def get_request_type(self) -> str:
|
|
39
|
+
"""返回请求类型标识,子类必须重写。"""
|
|
40
|
+
raise NotImplementedError("Subclasses should implement this method.")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
NOTIFY_SUBSCRIBER_REQUEST_TYPE = "NotifySubscriberRequest"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ServiceQueryRequest(AbstractNamingRequest):
|
|
47
|
+
"""服务信息查询请求。
|
|
48
|
+
|
|
49
|
+
Attributes:
|
|
50
|
+
cluster: 目标集群名称。
|
|
51
|
+
healthOnly: 是否仅返回健康实例。
|
|
52
|
+
udpPort: 客户端 UDP 推送端口,默认 ``None``。
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
cluster: Annotated[str | None, Field(description="目标集群名称")]
|
|
56
|
+
healthOnly: Annotated[bool | None, Field(description="是否仅返回健康实例")]
|
|
57
|
+
udpPort: Annotated[int | None, Field(description="客户端 UDP 推送端口")] = None
|
|
58
|
+
|
|
59
|
+
def get_request_type(self) -> str:
|
|
60
|
+
return "ServiceQueryRequest"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class InstanceRequest(AbstractNamingRequest):
|
|
64
|
+
"""单个实例的注册、注销或更新请求。
|
|
65
|
+
|
|
66
|
+
Attributes:
|
|
67
|
+
type: 操作类型,例如 ``registerInstance``、``deregisterInstance`` 等。
|
|
68
|
+
instance: 待操作的实例对象。
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
type: Annotated[str | None, Field(description="实例操作类型")]
|
|
72
|
+
instance: Annotated[Instance | None, Field(description="待操作的实例对象")]
|
|
73
|
+
|
|
74
|
+
def get_request_type(self) -> str:
|
|
75
|
+
return "InstanceRequest"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class PersistentInstanceRequest(AbstractNamingRequest):
|
|
79
|
+
"""持久化实例请求。
|
|
80
|
+
|
|
81
|
+
Attributes:
|
|
82
|
+
type: 操作类型,例如注册、注销等。
|
|
83
|
+
instance: 待操作的实例对象。
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
type: Annotated[str | None, Field(description="持久化实例操作类型")]
|
|
87
|
+
instance: Annotated[Instance | None, Field(description="待操作的实例对象")]
|
|
88
|
+
|
|
89
|
+
def get_request_type(self) -> str:
|
|
90
|
+
return "PersistentInstanceRequest"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class BatchInstanceRequest(AbstractNamingRequest):
|
|
94
|
+
"""批量实例请求。
|
|
95
|
+
|
|
96
|
+
Attributes:
|
|
97
|
+
type: 批量操作类型。
|
|
98
|
+
instances: 待操作的实例对象列表。
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
type: Annotated[str | None, Field(description="批量实例操作类型")]
|
|
102
|
+
instances: Annotated[list[Instance] | None, Field(description="待操作的实例对象列表")]
|
|
103
|
+
|
|
104
|
+
def get_request_type(self) -> str:
|
|
105
|
+
return "BatchInstanceRequest"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class NotifySubscriberRequest(AbstractNamingRequest):
|
|
109
|
+
"""订阅变更通知请求。
|
|
110
|
+
|
|
111
|
+
Attributes:
|
|
112
|
+
serviceInfo: 推送的服务信息。
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
serviceInfo: Annotated[Service | None, Field(description="推送的服务信息")]
|
|
116
|
+
|
|
117
|
+
def get_request_type(self) -> str:
|
|
118
|
+
return "NotifySubscriberRequest"
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class ServiceListRequest(AbstractNamingRequest):
|
|
122
|
+
"""服务列表查询请求。
|
|
123
|
+
|
|
124
|
+
Attributes:
|
|
125
|
+
pageNo: 查询页码,从 ``1`` 开始。
|
|
126
|
+
pageSize: 每页返回数量。
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
pageNo: Annotated[int | None, Field(description="查询页码")]
|
|
130
|
+
pageSize: Annotated[int | None, Field(description="每页返回数量")]
|
|
131
|
+
|
|
132
|
+
def get_request_type(self) -> str:
|
|
133
|
+
return "ServiceListRequest"
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class SubscribeServiceRequest(AbstractNamingRequest):
|
|
137
|
+
"""服务订阅请求。
|
|
138
|
+
|
|
139
|
+
Attributes:
|
|
140
|
+
subscribe: 是否开启订阅。
|
|
141
|
+
clusters: 关注的集群名称列表。
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
subscribe: Annotated[bool | None, Field(description="是否开启订阅")]
|
|
145
|
+
clusters: Annotated[str | None, Field(description="关注的集群名称列表")]
|
|
146
|
+
|
|
147
|
+
def get_request_type(self) -> str:
|
|
148
|
+
return "SubscribeServiceRequest"
|