zenlayercloud-sdk-python 2.0.62__py3-none-any.whl → 2.0.63__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.
zenlayercloud/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Zenlayer.com Inc.
2
2
  # Copyright (c) 2014-2023 All Rights Reserved.
3
3
 
4
- __version__ = "2.0.062"
4
+ __version__ = "2.0.063"
5
5
 
@@ -48,6 +48,26 @@ class AbstractClient(object):
48
48
  code=error_code.SDK_INVALID_REQUEST,
49
49
  message="Request must be AbstractModel"
50
50
  )
51
+
52
+ max_retries = max(self.config.rate_limit_max_retries or 0, 0)
53
+ duration_func = self.config.rate_limit_retry_duration
54
+
55
+ last_exception = None
56
+ for idx in range(max_retries + 1):
57
+ try:
58
+ return self._do_api_call(action, request, method, headers)
59
+ except ZenlayerCloudSdkException as e:
60
+ if idx < max_retries and e.code == error_code.REQUEST_LIMIT_EXCEEDED:
61
+ last_exception = e
62
+ duration = duration_func(idx)
63
+ _logger.warning("rate limit exceeded, retrying (%d/%d) in %s seconds: %s",
64
+ idx, max_retries, duration, e.message)
65
+ time.sleep(duration)
66
+ continue
67
+ raise
68
+ raise last_exception
69
+
70
+ def _do_api_call(self, action, request, method, headers) -> dict:
51
71
  uri = "/api/v2/%s" % self._service
52
72
  req = BaseRequest(host=self.config.domain, method=method, uri=uri, header=headers)
53
73
 
@@ -3,11 +3,19 @@
3
3
 
4
4
  DEFAULT_DOMAIN = "console.zenlayer.com"
5
5
 
6
+ DEFAULT_RATE_LIMIT_MAX_RETRIES = 3
7
+
8
+
9
+ def exponential_backoff(index):
10
+ """Default backoff: 1s, 2s, 4s, 8s, ..."""
11
+ return 2 ** index
12
+
6
13
 
7
14
  class Config(object):
8
15
 
9
16
  def __init__(self, scheme=None, domain=None, request_timeout=60, proxy=None, keep_alive=False, debug=False,
10
- certification=None):
17
+ certification=None, rate_limit_max_retries=DEFAULT_RATE_LIMIT_MAX_RETRIES,
18
+ rate_limit_retry_duration=None):
11
19
  """config.
12
20
 
13
21
  :param scheme: http or https, default is https.
@@ -20,6 +28,12 @@ class Config(object):
20
28
  :type keep_alive: bool
21
29
  :param debug: open or close debug mode.
22
30
  :type debug: bool
31
+ :param rate_limit_max_retries: Max retries when REQUEST_LIMIT_EXCEEDED (HTTP 429)
32
+ is returned. Defaults to 3. Set to 0 to disable.
33
+ :type rate_limit_max_retries: int
34
+ :param rate_limit_retry_duration: A callable ``f(index) -> seconds`` that returns
35
+ the wait time before the next retry. Defaults to exponential backoff.
36
+ :type rate_limit_retry_duration: callable
23
37
  """
24
38
 
25
39
  self.scheme = scheme or "https"
@@ -29,4 +43,6 @@ class Config(object):
29
43
  self.request_timeout = 60 if request_timeout is None else request_timeout
30
44
  self.debug = debug
31
45
  self.certification = certification
46
+ self.rate_limit_max_retries = rate_limit_max_retries
47
+ self.rate_limit_retry_duration = rate_limit_retry_duration or exponential_backoff
32
48
 
@@ -5,3 +5,5 @@
5
5
  CREDENTIAL_MISSING_ERROR = "CREDENTIAL_VALUE_MISSING"
6
6
 
7
7
  SDK_INVALID_REQUEST = "SDK_INVALID_REQUEST"
8
+
9
+ REQUEST_LIMIT_EXCEEDED = "REQUEST_LIMIT_EXCEEDED"
@@ -1083,9 +1083,11 @@ class ChangeNicNetworkTypeResponse(AbstractModel):
1083
1083
  class ReleaseInstancesRequest(AbstractModel):
1084
1084
  def __init__(self):
1085
1085
  self.instanceIds = None
1086
+ self.dependResource = None
1086
1087
 
1087
1088
  def _deserialize(self, params):
1088
1089
  self.instanceIds = params.get("instanceIds")
1090
+ self.dependResource = params.get("dependResource")
1089
1091
 
1090
1092
 
1091
1093
  class ReleaseInstancesResponse(AbstractModel):
@@ -1181,16 +1183,72 @@ class InquiryPriceModifyInstanceTypeResponse(AbstractModel):
1181
1183
  def __init__(self):
1182
1184
  self.requestId = None
1183
1185
  self.specPrice = None
1186
+ self.gpuPrice = None
1184
1187
  self.systemDiskPrice = None
1185
1188
 
1186
1189
  def _deserialize(self, params):
1187
1190
  self.requestId = params.get("requestId")
1188
1191
  if params.get("specPrice") is not None:
1189
1192
  self.specPrice = PriceItem(params.get("specPrice"))
1193
+ if params.get("gpuPrice") is not None:
1194
+ self.gpuPrice = PriceItem(params.get("gpuPrice"))
1190
1195
  if params.get("systemDiskPrice") is not None:
1191
1196
  self.systemDiskPrice = PriceItem(params.get("systemDiskPrice"))
1192
1197
 
1193
1198
 
1199
+ class DescribeZoneGpuInstanceConfigInfosRequest(AbstractModel):
1200
+ def __init__(self):
1201
+ self.zoneId = None
1202
+ self.instanceType = None
1203
+
1204
+ def _deserialize(self, params):
1205
+ self.zoneId = params.get("zoneId")
1206
+ self.instanceType = params.get("instanceType")
1207
+
1208
+
1209
+ class DescribeZoneGpuInstanceConfigInfosResponse(AbstractModel):
1210
+ def __init__(self):
1211
+ self.requestId = None
1212
+ self.instanceTypeQuotaSet = None
1213
+
1214
+ def _deserialize(self, params):
1215
+ self.requestId = params.get("requestId")
1216
+ if params.get("instanceTypeQuotaSet") is not None:
1217
+ self.instanceTypeQuotaSet = []
1218
+ for item in params.get("instanceTypeQuotaSet"):
1219
+ obj = GpuInstanceTypeQuotaItem(item)
1220
+ self.instanceTypeQuotaSet.append(obj)
1221
+
1222
+
1223
+ class GpuInstanceTypeQuotaItem(AbstractModel):
1224
+ def __init__(self, params=None):
1225
+ if params is None:
1226
+ params = {}
1227
+ if len(params) > 0:
1228
+ self._deserialize(params)
1229
+ return
1230
+ self.zoneId = None
1231
+ self.instanceType = None
1232
+ self.cpuCount = None
1233
+ self.memory = None
1234
+ self.gpuAmount = None
1235
+ self.instanceTypeName = None
1236
+ self.bps = None
1237
+ self.pps = None
1238
+ self.inventoryCapacity = None
1239
+
1240
+ def _deserialize(self, params):
1241
+ self.zoneId = params.get("zoneId")
1242
+ self.instanceType = params.get("instanceType")
1243
+ self.cpuCount = params.get("cpuCount")
1244
+ self.memory = params.get("memory")
1245
+ self.gpuAmount = params.get("gpuAmount")
1246
+ self.instanceTypeName = params.get("instanceTypeName")
1247
+ self.bps = params.get("bps")
1248
+ self.pps = params.get("pps")
1249
+ self.inventoryCapacity = params.get("inventoryCapacity")
1250
+
1251
+
1194
1252
  class DescribeImagesRequest(AbstractModel):
1195
1253
  def __init__(self):
1196
1254
  self.zoneId = None
@@ -4356,6 +4414,24 @@ class InquiryPriceChangeEipInternetChargeTypeResponse(AbstractModel):
4356
4414
  self.remoteBandwidthPrice = PriceItem(params.get("remoteBandwidthPrice"))
4357
4415
 
4358
4416
 
4417
+ class ModifyEipTrafficPackageRequest(AbstractModel):
4418
+ def __init__(self):
4419
+ self.eipId = None
4420
+ self.trafficPackageSize = None
4421
+
4422
+ def _deserialize(self, params):
4423
+ self.eipId = params.get("eipId")
4424
+ self.trafficPackageSize = params.get("trafficPackageSize")
4425
+
4426
+
4427
+ class ModifyEipTrafficPackageResponse(AbstractModel):
4428
+ def __init__(self):
4429
+ self.requestId = None
4430
+
4431
+ def _deserialize(self, params):
4432
+ self.requestId = params.get("requestId")
4433
+
4434
+
4359
4435
  class DescribeRoutesRequest(AbstractModel):
4360
4436
  def __init__(self):
4361
4437
  self.routeIds = None
@@ -233,6 +233,15 @@ class ZecClient(AbstractClient):
233
233
  model._deserialize(response)
234
234
  return model
235
235
 
236
+ def DescribeZoneGpuInstanceConfigInfos(self, request):
237
+ """
238
+ 查询可用区售卖的 GPU 规格信息
239
+ """
240
+ response = self._api_call("DescribeZoneGpuInstanceConfigInfos", request)
241
+ model = models.DescribeZoneGpuInstanceConfigInfosResponse()
242
+ model._deserialize(response)
243
+ return model
244
+
236
245
  def DescribeImages(self, request):
237
246
  """
238
247
  查询某节点支持的镜像列表。
@@ -1052,6 +1061,15 @@ class ZecClient(AbstractClient):
1052
1061
  model._deserialize(response)
1053
1062
  return model
1054
1063
 
1064
+ def ModifyEipTrafficPackage(self, request):
1065
+ """
1066
+ 调整弹性公网IP流量包。
1067
+ """
1068
+ response = self._api_call("ModifyEipTrafficPackage", request)
1069
+ model = models.ModifyEipTrafficPackageResponse()
1070
+ model._deserialize(response)
1071
+ return model
1072
+
1055
1073
  def DescribeRoutes(self, request):
1056
1074
  """
1057
1075
  查询路由列表。用户可以根据ID、名称等信息来搜索Route信息。路由列表包括系统生成的以及用户创建的路由。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zenlayercloud-sdk-python
3
- Version: 2.0.62
3
+ Version: 2.0.63
4
4
  Summary: Zenlayer Cloud SDK for Python
5
5
  Home-page: https://github.com/zenlayer/zenlayercloud-sdk-python
6
6
  Author: Zenlayer Cloud
@@ -1,4 +1,4 @@
1
- zenlayercloud/__init__.py,sha256=_aGGcXnQCYkxpI0mYDpqLIABmhH3pOV93ZiXLgUlHck,95
1
+ zenlayercloud/__init__.py,sha256=lLZGVoM0hmmvF9hChCg7KN0UlpZ4J6-2CCMTNd5X400,95
2
2
  zenlayercloud/aigw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  zenlayercloud/aigw/v20260414/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  zenlayercloud/aigw/v20260414/aigw_client.py,sha256=inQDTflrPy3InIZMOvRTjJGz1vE04Jv89XhLOZYuPis,5990
@@ -19,15 +19,15 @@ zenlayercloud/ccs/v20250901/__init__.py,sha256=A82oWiV038jIXEbygeOeO1DzWKOqGkdQI
19
19
  zenlayercloud/ccs/v20250901/ccs_client.py,sha256=udKOGiGDxOCtiF7Wh5RdMObwYeE8akvc4S6n2yz1soY,1124
20
20
  zenlayercloud/ccs/v20250901/models.py,sha256=52DHoBqyr6KQtvxgHnK0Ux2Ukm3Cce_2mEz1IDKYZWg,3110
21
21
  zenlayercloud/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- zenlayercloud/common/abstract_client.py,sha256=dBkNPilsBbjnAbL2jK1KvhdRtPirW-DcWBrvdKNbMSY,5559
22
+ zenlayercloud/common/abstract_client.py,sha256=gWwrUXnh7H6kH_1g2CqyJvxJvVpx6QXgASXDAkZmGGc,6446
23
23
  zenlayercloud/common/abstract_model.py,sha256=4wPo9ZnW0HuKQ9_jDW7Hh9BeJLvzE1gM-eHJi_Ldg_0,1626
24
- zenlayercloud/common/config.py,sha256=eB7Qsvp0BR8IDGdwu3H4Qt-T2p23Vg-f4SAjQJQuZn4,1094
24
+ zenlayercloud/common/config.py,sha256=7Ycuaqh6gN6KWfqkDFWbXL-7XJ4kqWJadlp1xIpWPR0,1907
25
25
  zenlayercloud/common/credential.py,sha256=83uoJoomkud2AoxzAKCncFnO8YHhwFZhdco0I-ohT48,1723
26
26
  zenlayercloud/common/request.py,sha256=TYKa-cS2bCI7uZYX8p1C8rcyIqIE6ezlW63JzG7nSag,2925
27
27
  zenlayercloud/common/response.py,sha256=94XuYv189UaRjxCoS-wH7VBjjnNc26ydWCCfQnjlQxo,497
28
28
  zenlayercloud/common/utils.py,sha256=6HpSEU3AOwMdDiBMvR_LE3FXLQyrvnCneAqxjL_FMbc,354
29
29
  zenlayercloud/common/excpetion/__init__.py,sha256=A82oWiV038jIXEbygeOeO1DzWKOqGkdQI2X9BX0HkvM,69
30
- zenlayercloud/common/excpetion/error_code.py,sha256=Z3NdJoP5EIGhHARUPWYzc_iC90KZg6SIceGFLJMEOFw,170
30
+ zenlayercloud/common/excpetion/error_code.py,sha256=LtY4AL-KFnAG3UcU2fxGsfn56_qO2eZIvS8C6D6334o,221
31
31
  zenlayercloud/common/excpetion/zenlayer_cloud_sdk_exception.py,sha256=IVKBhJKEKwbCgVk2K7bAZk8-rA4bBgbAaD2yciqaOBg,866
32
32
  zenlayercloud/ipt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  zenlayercloud/ipt/v20240901/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -77,8 +77,8 @@ zenlayercloud/zec/v20240401/__init__.py,sha256=A82oWiV038jIXEbygeOeO1DzWKOqGkdQI
77
77
  zenlayercloud/zec/v20240401/models.py,sha256=2y8NHcednqU-_TdxG6WMfdA1ySvDaTeS7SnnxPfOBNE,131319
78
78
  zenlayercloud/zec/v20240401/zec_client.py,sha256=KoDlhy0ufpQB8eHCr4WP1AY5TNvtWK_0XnyoUGA0TeA,29784
79
79
  zenlayercloud/zec/v20250901/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- zenlayercloud/zec/v20250901/models.py,sha256=397WoyAJXGQJvWpJmFNbAtbf4O6hnRiVoz4GU-XtmMg,243537
81
- zenlayercloud/zec/v20250901/zec_client.py,sha256=s0qu7sTPOPENXY2U7RY_qPdWhDdI47Q7mRhthPD-xMk,67497
80
+ zenlayercloud/zec/v20250901/models.py,sha256=L61TQsc-fU3BjkJIvOBy6XeiAZsWNs8FMH7RQ6FId3g,246023
81
+ zenlayercloud/zec/v20250901/zec_client.py,sha256=634ZSL7ypM9pCLvk_-OPeDtGxPYhNUw-8XbbhCTnczw,68137
82
82
  zenlayercloud/zga/__init__.py,sha256=A82oWiV038jIXEbygeOeO1DzWKOqGkdQI2X9BX0HkvM,69
83
83
  zenlayercloud/zga/v20241104/__init__.py,sha256=A82oWiV038jIXEbygeOeO1DzWKOqGkdQI2X9BX0HkvM,69
84
84
  zenlayercloud/zga/v20241104/models.py,sha256=92gBJss6q0Z5FGk2DfHBTvCdif6OY5cVU32gXOY3E2M,40155
@@ -99,8 +99,8 @@ zenlayercloud/zrm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
99
99
  zenlayercloud/zrm/v20251014/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
100
  zenlayercloud/zrm/v20251014/models.py,sha256=3As3PAdEKe_Cpb1QpGI2_mrMlM2uZ6QOa4isOi09q3I,7491
101
101
  zenlayercloud/zrm/v20251014/zrm_client.py,sha256=p3fKeOdhGdjx_MhFcMuu9wv4bkSiwn_GNrj_570fkMg,2504
102
- zenlayercloud_sdk_python-2.0.62.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
103
- zenlayercloud_sdk_python-2.0.62.dist-info/METADATA,sha256=YnTtLhQ3HAxzzg9_9-zq_278XSS4mGl1Skw7A4sQLpk,1653
104
- zenlayercloud_sdk_python-2.0.62.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
105
- zenlayercloud_sdk_python-2.0.62.dist-info/top_level.txt,sha256=ZU6L6c0yQDkyO8nG0oGpC6ptc0TNucEncz3xbFsoHmE,14
106
- zenlayercloud_sdk_python-2.0.62.dist-info/RECORD,,
102
+ zenlayercloud_sdk_python-2.0.63.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
103
+ zenlayercloud_sdk_python-2.0.63.dist-info/METADATA,sha256=VOfU6mBs7-rUD9N2oau7dyQkcHPer8kYN8zf5nE1kR4,1653
104
+ zenlayercloud_sdk_python-2.0.63.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
105
+ zenlayercloud_sdk_python-2.0.63.dist-info/top_level.txt,sha256=ZU6L6c0yQDkyO8nG0oGpC6ptc0TNucEncz3xbFsoHmE,14
106
+ zenlayercloud_sdk_python-2.0.63.dist-info/RECORD,,