codosdk 1.0.32__tar.gz → 1.0.34__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.32 → codosdk-1.0.34}/PKG-INFO +3 -2
- {codosdk-1.0.32 → codosdk-1.0.34}/codosdk.egg-info/PKG-INFO +3 -2
- {codosdk-1.0.32 → codosdk-1.0.34}/setup.py +1 -1
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/tools.py +88 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/LICENSE +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/README.md +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/codosdk.egg-info/SOURCES.txt +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/codosdk.egg-info/dependency_links.txt +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/codosdk.egg-info/requires.txt +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/codosdk.egg-info/top_level.txt +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/opssdk/__init__.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/opssdk/utils/__init__.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/pyproject.toml +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/setup.cfg +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/__init__.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/api_set.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/__init__.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/admin_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/agent_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/cmdb_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/kerrigan_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/mgv4_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/notice_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/apis/task_apis.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/application.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/base_handler.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/cache.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/cache_context.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/client.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/cloud/__init__.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/cloud/qcloud_api.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/cloud/ucloud_api.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/cloud_utils.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/configs.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/consts.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/crud_utils.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/db_context.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/error.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/fetch_coroutine.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/jwt_token.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/ldap.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/logger.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/model_utils.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/mqhelper.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/program.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/salt_api.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/sqlalchemy_pagination.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/utils/__init__.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/utils/cc_crypto.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/utils/date_format.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/utils/pydantic_utils.py +0 -0
- {codosdk-1.0.32 → codosdk-1.0.34}/websdk2/web_logs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: codosdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.34
|
|
4
4
|
Summary: CODO项目的Python SDK
|
|
5
5
|
Home-page: https://github.com/ss1917/codo_sdk/
|
|
6
6
|
Author: shenshuo
|
|
@@ -39,6 +39,7 @@ Dynamic: description
|
|
|
39
39
|
Dynamic: home-page
|
|
40
40
|
Dynamic: keywords
|
|
41
41
|
Dynamic: license
|
|
42
|
+
Dynamic: license-file
|
|
42
43
|
Dynamic: platform
|
|
43
44
|
Dynamic: requires-dist
|
|
44
45
|
Dynamic: requires-python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: codosdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.34
|
|
4
4
|
Summary: CODO项目的Python SDK
|
|
5
5
|
Home-page: https://github.com/ss1917/codo_sdk/
|
|
6
6
|
Author: shenshuo
|
|
@@ -39,6 +39,7 @@ Dynamic: description
|
|
|
39
39
|
Dynamic: home-page
|
|
40
40
|
Dynamic: keywords
|
|
41
41
|
Dynamic: license
|
|
42
|
+
Dynamic: license-file
|
|
42
43
|
Dynamic: platform
|
|
43
44
|
Dynamic: requires-dist
|
|
44
45
|
Dynamic: requires-python
|
|
@@ -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.34'
|
|
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.')
|
|
@@ -10,8 +10,12 @@ import sys
|
|
|
10
10
|
import re
|
|
11
11
|
import time
|
|
12
12
|
import redis
|
|
13
|
+
import logging
|
|
14
|
+
from shortuuid import uuid
|
|
13
15
|
import subprocess
|
|
14
16
|
from concurrent.futures import ThreadPoolExecutor
|
|
17
|
+
from abc import ABC, abstractmethod
|
|
18
|
+
from .cache_context import cache_conn
|
|
15
19
|
from .consts import const
|
|
16
20
|
|
|
17
21
|
|
|
@@ -197,3 +201,87 @@ def deco(cls, release=False):
|
|
|
197
201
|
|
|
198
202
|
def now_timestamp() -> int:
|
|
199
203
|
return int(round(time.time() * 1000))
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class LockClientV2(ABC):
|
|
207
|
+
@abstractmethod
|
|
208
|
+
def get_lock(self, key_timeout=59, func_timeout=5):
|
|
209
|
+
pass
|
|
210
|
+
|
|
211
|
+
@abstractmethod
|
|
212
|
+
def release(self):
|
|
213
|
+
pass
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class RedisLockV2(LockClientV2):
|
|
217
|
+
def __init__(self, key, **conf):
|
|
218
|
+
# 注意: configs.import_dict(**settings) 是必须的
|
|
219
|
+
self.redis_client: redis.Redis = cache_conn()
|
|
220
|
+
self._lock = 0
|
|
221
|
+
self.lock_key = f"{key}_dynamic"
|
|
222
|
+
self.uuid = str(uuid())
|
|
223
|
+
|
|
224
|
+
def get_lock(self, key_timeout=59, func_timeout=5):
|
|
225
|
+
# key过期时间为一分钟,30秒内key任务没有完成则返回失败
|
|
226
|
+
start_time = time.time()
|
|
227
|
+
redis_client: redis.Redis = self.redis_client
|
|
228
|
+
_uuid = self.uuid
|
|
229
|
+
_lock_key = self.lock_key
|
|
230
|
+
|
|
231
|
+
while time.time() - start_time < func_timeout:
|
|
232
|
+
ok = redis_client.set(_lock_key, _uuid, nx=True, ex=key_timeout)
|
|
233
|
+
got_uuid = convert(redis_client.get(_lock_key))
|
|
234
|
+
if got_uuid == _uuid and ok:
|
|
235
|
+
return True
|
|
236
|
+
time.sleep(1)
|
|
237
|
+
return False
|
|
238
|
+
|
|
239
|
+
def release(self):
|
|
240
|
+
# 释放lock
|
|
241
|
+
redis_client: redis.Redis = self.redis_client
|
|
242
|
+
_uuid = self.uuid
|
|
243
|
+
_lock_key = self.lock_key
|
|
244
|
+
got_uuid = convert(redis_client.get(_lock_key))
|
|
245
|
+
|
|
246
|
+
if got_uuid == _uuid:
|
|
247
|
+
redis_client.delete(_lock_key)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def deco_v2(cls: LockClientV2, release=False, key_timeout=59, func_timeout=5):
|
|
251
|
+
""" 示例
|
|
252
|
+
@deco_v2(RedisLockV2("codo:xxxx:v2:xxxx"), release=True, key_timeout=30)
|
|
253
|
+
def do_func():
|
|
254
|
+
print("the func called.")
|
|
255
|
+
time.sleep(50)
|
|
256
|
+
print("the func end")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
do_func()
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
:param
|
|
263
|
+
cls: RedisLockV2实例
|
|
264
|
+
release: 是否释放key,默认不释放
|
|
265
|
+
key_timeout: key过期时间
|
|
266
|
+
func_timeout: 函数争抢锁超时时间
|
|
267
|
+
"""
|
|
268
|
+
|
|
269
|
+
def _deco(func):
|
|
270
|
+
def __deco(*args, **kwargs):
|
|
271
|
+
try:
|
|
272
|
+
ok = cls.get_lock(key_timeout=key_timeout, func_timeout=func_timeout)
|
|
273
|
+
if not ok:
|
|
274
|
+
return False
|
|
275
|
+
except Exception as e:
|
|
276
|
+
logging.error(f"[deco_v2] get lock func={func.__name__} error={str(e)}")
|
|
277
|
+
return False
|
|
278
|
+
try:
|
|
279
|
+
return func(*args, **kwargs)
|
|
280
|
+
finally:
|
|
281
|
+
# 执行完就释放key,默认不释放
|
|
282
|
+
if release:
|
|
283
|
+
cls.release()
|
|
284
|
+
|
|
285
|
+
return __deco
|
|
286
|
+
|
|
287
|
+
return _deco
|
|
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
|
|
File without changes
|