codosdk 1.0.13__tar.gz → 1.0.15__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.
- {codosdk-1.0.13 → codosdk-1.0.15}/PKG-INFO +1 -1
- {codosdk-1.0.13 → codosdk-1.0.15}/codosdk.egg-info/PKG-INFO +1 -1
- {codosdk-1.0.13 → codosdk-1.0.15}/setup.py +1 -1
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/consts.py +6 -1
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/crud_utils.py +38 -21
- {codosdk-1.0.13 → codosdk-1.0.15}/LICENSE +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/README.md +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/codosdk.egg-info/SOURCES.txt +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/codosdk.egg-info/dependency_links.txt +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/codosdk.egg-info/requires.txt +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/codosdk.egg-info/top_level.txt +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/opssdk/__init__.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/opssdk/utils/__init__.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/pyproject.toml +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/setup.cfg +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/__init__.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/api_set.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/__init__.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/admin_apis.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/agent_apis.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/cmdb_apis.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/kerrigan_apis.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/mgv4_apis.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/apis/task_apis.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/application.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/base_handler.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/cache.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/cache_context.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/client.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/cloud/__init__.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/cloud/qcloud_api.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/cloud/ucloud_api.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/cloud_utils.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/configs.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/db_context.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/error.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/fetch_coroutine.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/jwt_token.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/ldap.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/logger.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/model_utils.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/mqhelper.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/program.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/salt_api.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/sqlalchemy_pagination.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/tools.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/utils/__init__.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/utils/cc_crypto.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/utils/date_format.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/utils/pydantic_utils.py +0 -0
- {codosdk-1.0.13 → codosdk-1.0.15}/websdk2/web_logs.py +0 -0
|
@@ -9,7 +9,7 @@ desc : CODO SDK
|
|
|
9
9
|
import sys
|
|
10
10
|
from setuptools import setup, find_packages
|
|
11
11
|
|
|
12
|
-
VERSION = '1.0.
|
|
12
|
+
VERSION = '1.0.15'
|
|
13
13
|
|
|
14
14
|
if sys.version_info < (2, 7) or (3, 0) <= sys.version_info < (3, 6):
|
|
15
15
|
print('This program requires at least Python 2.7 or 3.6 to run.')
|
|
@@ -214,7 +214,12 @@ const.ORDER_STATE_TERMINATED = '39' # 订单终止
|
|
|
214
214
|
const.ORDER_STATE_QUEUE = '11' # 订单排队中
|
|
215
215
|
const.EXEC_TIMEOUT = 1800
|
|
216
216
|
|
|
217
|
-
|
|
217
|
+
# 节点地址
|
|
218
218
|
const.NODE_ADDRESS = 'NODE_ADDRESS'
|
|
219
219
|
const.EXEC_NODE_MAP_KEY = 'EXEC_NODE_MAP_KEY'
|
|
220
220
|
const.AGENT_USED_KEY = "agent_is_used_map_mark_key"
|
|
221
|
+
|
|
222
|
+
# otel
|
|
223
|
+
const.JAEGER_EXPORTER_HOST = "jaeger_exporter_host"
|
|
224
|
+
const.JAEGER_EXPORTER_PORT = "jaeger_exporter_port"
|
|
225
|
+
const.OTEL_ENABLED = "otel_enabled"
|
|
@@ -6,6 +6,7 @@ Date : 2025年02月08日
|
|
|
6
6
|
Desc : 存储类
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
import time
|
|
9
10
|
import logging
|
|
10
11
|
from sqlalchemy import true
|
|
11
12
|
from sqlalchemy.exc import IntegrityError
|
|
@@ -14,6 +15,14 @@ from .utils.pydantic_utils import sqlalchemy_to_pydantic, ValidationError, Pydan
|
|
|
14
15
|
from .sqlalchemy_pagination import paginate
|
|
15
16
|
|
|
16
17
|
|
|
18
|
+
def get_millisecond_timestamp() -> int:
|
|
19
|
+
"""
|
|
20
|
+
获取当前时间的毫秒级时间戳。
|
|
21
|
+
:return: 毫秒级时间戳(int)
|
|
22
|
+
"""
|
|
23
|
+
return int(time.time() * 1000)
|
|
24
|
+
|
|
25
|
+
|
|
17
26
|
class ModelCRUDView:
|
|
18
27
|
def __init__(self, model, **kwargs):
|
|
19
28
|
self.model = model
|
|
@@ -33,19 +42,22 @@ class ModelCRUDView:
|
|
|
33
42
|
self.prepare()
|
|
34
43
|
data_id = data.get('id')
|
|
35
44
|
if not data_id:
|
|
36
|
-
return dict(code=1, msg="缺少必要的 'id' 参数", data=None)
|
|
45
|
+
return dict(code=1, msg="缺少必要的 'id' 参数", data=None, reason="", timestamp=get_millisecond_timestamp())
|
|
37
46
|
|
|
38
47
|
try:
|
|
39
48
|
with DBContext('r') as session:
|
|
40
49
|
_info = session.query(self.model).filter(self.model.id == data_id).first()
|
|
41
50
|
if not _info:
|
|
42
|
-
return dict(code=1, msg='数据未找到', data=None)
|
|
43
|
-
return dict(code=0,
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
return dict(code=1, msg='数据未找到', data=None, reason="", timestamp=get_millisecond_timestamp())
|
|
52
|
+
return dict(code=0,
|
|
53
|
+
msg='获取成功',
|
|
54
|
+
reason="",
|
|
55
|
+
timestamp=get_millisecond_timestamp(),
|
|
56
|
+
data={'item': _info.to_dict()}
|
|
57
|
+
)
|
|
46
58
|
except Exception as e:
|
|
47
59
|
logging.error(f"Database query failed: {e}")
|
|
48
|
-
return dict(code=2, msg='查询失败', data=None)
|
|
60
|
+
return dict(code=2, msg='查询失败', data=None, reason=str(e), timestamp=get_millisecond_timestamp())
|
|
49
61
|
|
|
50
62
|
def handle_list(self, params: dict, get_by_val_func=None) -> dict:
|
|
51
63
|
self.prepare()
|
|
@@ -74,13 +86,18 @@ class ModelCRUDView:
|
|
|
74
86
|
except Exception as e:
|
|
75
87
|
raise ValueError(f"Error while executing `get_by_val_func`: {e}")
|
|
76
88
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
try:
|
|
90
|
+
with DBContext('r') as session:
|
|
91
|
+
query = session.query(self.model).filter(filter_condition).filter_by(**filter_map)
|
|
92
|
+
page = paginate(query, **params)
|
|
93
|
+
except Exception as e:
|
|
94
|
+
return dict(code=2, msg='查询失败', data=None, reason=str(e), timestamp=get_millisecond_timestamp())
|
|
80
95
|
|
|
81
96
|
return dict(
|
|
82
97
|
code=0,
|
|
83
98
|
msg='获取成功',
|
|
99
|
+
reason="",
|
|
100
|
+
timestamp=get_millisecond_timestamp(),
|
|
84
101
|
data={
|
|
85
102
|
'items': page.items,
|
|
86
103
|
'current_page': page.page, # 当前页
|
|
@@ -95,18 +112,18 @@ class ModelCRUDView:
|
|
|
95
112
|
try:
|
|
96
113
|
self.pydantic_model(**data)
|
|
97
114
|
except ValidationError as e:
|
|
98
|
-
return dict(code=-1, msg=str(e))
|
|
115
|
+
return dict(code=-1, msg='数据格式出错', reason=str(e), timestamp=get_millisecond_timestamp())
|
|
99
116
|
|
|
100
117
|
try:
|
|
101
118
|
with DBContext('w', None, True) as db:
|
|
102
119
|
db.add(self.model(**data))
|
|
103
120
|
except IntegrityError as e:
|
|
104
|
-
return dict(code=-2, msg='不要重复添加')
|
|
121
|
+
return dict(code=-2, msg='不要重复添加', reason=str(e), timestamp=get_millisecond_timestamp())
|
|
105
122
|
|
|
106
123
|
except Exception as e:
|
|
107
|
-
return dict(code=-3, msg=
|
|
124
|
+
return dict(code=-3, msg='创建失败', reason=str(e), timestamp=get_millisecond_timestamp())
|
|
108
125
|
|
|
109
|
-
return dict(code=0, msg="创建成功")
|
|
126
|
+
return dict(code=0, msg="创建成功", reason="", timestamp=get_millisecond_timestamp())
|
|
110
127
|
|
|
111
128
|
def handle_update(self, data: dict) -> dict:
|
|
112
129
|
self.prepare()
|
|
@@ -114,19 +131,19 @@ class ModelCRUDView:
|
|
|
114
131
|
try:
|
|
115
132
|
valid_data = self.pydantic_model_base(**data)
|
|
116
133
|
except ValidationError as e:
|
|
117
|
-
return dict(code=-1, msg=str(e))
|
|
134
|
+
return dict(code=-1, msg="数据格式校验失败", reason=str(e), timestamp=get_millisecond_timestamp())
|
|
118
135
|
|
|
119
136
|
try:
|
|
120
137
|
with DBContext('w', None, True) as db:
|
|
121
138
|
db.query(self.model).filter(self.model.id == valid_data.id).update(data)
|
|
122
139
|
|
|
123
140
|
except IntegrityError as e:
|
|
124
|
-
return dict(code=-2, msg=f'修改失败,已存在')
|
|
141
|
+
return dict(code=-2, msg=f'修改失败,已存在', reason=str(e), timestamp=get_millisecond_timestamp())
|
|
125
142
|
|
|
126
|
-
except Exception as
|
|
127
|
-
return dict(code=-3, msg=f'修改失败, {
|
|
143
|
+
except Exception as e:
|
|
144
|
+
return dict(code=-3, msg=f'修改失败, {e}', reason=str(e), timestamp=get_millisecond_timestamp())
|
|
128
145
|
|
|
129
|
-
return dict(code=0, msg="修改成功")
|
|
146
|
+
return dict(code=0, msg="修改成功", reason='', timestamp=get_millisecond_timestamp())
|
|
130
147
|
|
|
131
148
|
def handle_update_no_validation(self, data: dict) -> dict:
|
|
132
149
|
"""不进行校验的更新方法"""
|
|
@@ -134,15 +151,15 @@ class ModelCRUDView:
|
|
|
134
151
|
data_id = data.get('id')
|
|
135
152
|
with DBContext('w', None, True) as db:
|
|
136
153
|
db.query(self.model).filter(self.model.id == data_id).update(data)
|
|
137
|
-
return dict(code=0, msg='更新成功')
|
|
154
|
+
return dict(code=0, msg='更新成功', reason='', timestamp=get_millisecond_timestamp())
|
|
138
155
|
|
|
139
156
|
def handle_delete(self, data: dict) -> dict:
|
|
140
157
|
self.prepare()
|
|
141
158
|
try:
|
|
142
159
|
valid_data = PydanticDelList(**data)
|
|
143
160
|
except ValidationError as e:
|
|
144
|
-
return dict(code=-1, msg=str(e))
|
|
161
|
+
return dict(code=-1, msg="数据格式校验失败", reason=str(e), timestamp=get_millisecond_timestamp())
|
|
145
162
|
|
|
146
163
|
with DBContext('w', None, True) as session:
|
|
147
164
|
session.query(self.model).filter(self.model.id.in_(valid_data.id_list)).delete(synchronize_session=False)
|
|
148
|
-
return dict(code=0, msg=f"删除成功")
|
|
165
|
+
return dict(code=0, msg=f"删除成功", reason='', timestamp=get_millisecond_timestamp())
|
|
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
|