codosdk 1.0.32__tar.gz → 1.0.33__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.
Files changed (52) hide show
  1. {codosdk-1.0.32 → codosdk-1.0.33}/PKG-INFO +3 -2
  2. {codosdk-1.0.32 → codosdk-1.0.33}/codosdk.egg-info/PKG-INFO +3 -2
  3. {codosdk-1.0.32 → codosdk-1.0.33}/setup.py +1 -1
  4. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/tools.py +88 -0
  5. {codosdk-1.0.32 → codosdk-1.0.33}/LICENSE +0 -0
  6. {codosdk-1.0.32 → codosdk-1.0.33}/README.md +0 -0
  7. {codosdk-1.0.32 → codosdk-1.0.33}/codosdk.egg-info/SOURCES.txt +0 -0
  8. {codosdk-1.0.32 → codosdk-1.0.33}/codosdk.egg-info/dependency_links.txt +0 -0
  9. {codosdk-1.0.32 → codosdk-1.0.33}/codosdk.egg-info/requires.txt +0 -0
  10. {codosdk-1.0.32 → codosdk-1.0.33}/codosdk.egg-info/top_level.txt +0 -0
  11. {codosdk-1.0.32 → codosdk-1.0.33}/opssdk/__init__.py +0 -0
  12. {codosdk-1.0.32 → codosdk-1.0.33}/opssdk/utils/__init__.py +0 -0
  13. {codosdk-1.0.32 → codosdk-1.0.33}/pyproject.toml +0 -0
  14. {codosdk-1.0.32 → codosdk-1.0.33}/setup.cfg +0 -0
  15. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/__init__.py +0 -0
  16. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/api_set.py +0 -0
  17. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/__init__.py +0 -0
  18. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/admin_apis.py +0 -0
  19. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/agent_apis.py +0 -0
  20. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/cmdb_apis.py +0 -0
  21. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/kerrigan_apis.py +0 -0
  22. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/mgv4_apis.py +0 -0
  23. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/notice_apis.py +0 -0
  24. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/apis/task_apis.py +0 -0
  25. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/application.py +0 -0
  26. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/base_handler.py +0 -0
  27. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/cache.py +0 -0
  28. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/cache_context.py +0 -0
  29. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/client.py +0 -0
  30. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/cloud/__init__.py +0 -0
  31. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/cloud/qcloud_api.py +0 -0
  32. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/cloud/ucloud_api.py +0 -0
  33. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/cloud_utils.py +0 -0
  34. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/configs.py +0 -0
  35. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/consts.py +0 -0
  36. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/crud_utils.py +0 -0
  37. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/db_context.py +0 -0
  38. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/error.py +0 -0
  39. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/fetch_coroutine.py +0 -0
  40. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/jwt_token.py +0 -0
  41. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/ldap.py +0 -0
  42. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/logger.py +0 -0
  43. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/model_utils.py +0 -0
  44. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/mqhelper.py +0 -0
  45. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/program.py +0 -0
  46. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/salt_api.py +0 -0
  47. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/sqlalchemy_pagination.py +0 -0
  48. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/utils/__init__.py +0 -0
  49. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/utils/cc_crypto.py +0 -0
  50. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/utils/date_format.py +0 -0
  51. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/utils/pydantic_utils.py +0 -0
  52. {codosdk-1.0.32 → codosdk-1.0.33}/websdk2/web_logs.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: codosdk
3
- Version: 1.0.32
3
+ Version: 1.0.33
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.2
1
+ Metadata-Version: 2.4
2
2
  Name: codosdk
3
- Version: 1.0.32
3
+ Version: 1.0.33
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.32'
12
+ VERSION = '1.0.33'
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 websdk2.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