strongdm 14.14.0__zip → 14.20.0__zip

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 (151) hide show
  1. {strongdm-14.14.0 → strongdm-14.20.0}/PKG-INFO +2 -2
  2. {strongdm-14.14.0 → strongdm-14.20.0}/setup.py +2 -2
  3. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/client.py +48 -31
  4. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/drivers_pb2.py +98 -92
  5. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/models.py +55 -0
  6. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/organization_history_pb2.py +8 -4
  7. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/plumbing.py +12 -0
  8. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/queries_pb2.py +10 -8
  9. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/svc.py +869 -483
  10. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm.egg-info/PKG-INFO +2 -2
  11. {strongdm-14.14.0 → strongdm-14.20.0}/LICENSE +0 -0
  12. {strongdm-14.14.0 → strongdm-14.20.0}/README.md +0 -0
  13. {strongdm-14.14.0 → strongdm-14.20.0}/setup.cfg +0 -0
  14. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/__init__.py +0 -0
  15. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/access_request_events_history_pb2.py +0 -0
  16. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/access_request_events_history_pb2_grpc.py +0 -0
  17. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/access_requests_history_pb2.py +0 -0
  18. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/access_requests_history_pb2_grpc.py +0 -0
  19. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/access_requests_pb2.py +0 -0
  20. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/access_requests_pb2_grpc.py +0 -0
  21. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_attachments_history_pb2.py +0 -0
  22. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_attachments_history_pb2_grpc.py +0 -0
  23. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_attachments_pb2.py +0 -0
  24. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_attachments_pb2_grpc.py +0 -0
  25. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_grants_history_pb2.py +0 -0
  26. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_grants_history_pb2_grpc.py +0 -0
  27. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_grants_pb2.py +0 -0
  28. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_grants_pb2_grpc.py +0 -0
  29. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_permissions_pb2.py +0 -0
  30. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_permissions_pb2_grpc.py +0 -0
  31. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_resources_history_pb2.py +0 -0
  32. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_resources_history_pb2_grpc.py +0 -0
  33. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_resources_pb2.py +0 -0
  34. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/account_resources_pb2_grpc.py +0 -0
  35. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/accounts_history_pb2.py +0 -0
  36. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/accounts_history_pb2_grpc.py +0 -0
  37. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/accounts_pb2.py +0 -0
  38. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/accounts_pb2_grpc.py +0 -0
  39. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/activities_pb2.py +0 -0
  40. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/activities_pb2_grpc.py +0 -0
  41. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_approvers_history_pb2.py +0 -0
  42. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_approvers_history_pb2_grpc.py +0 -0
  43. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_approvers_pb2.py +0 -0
  44. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_approvers_pb2_grpc.py +0 -0
  45. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_steps_history_pb2.py +0 -0
  46. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_steps_history_pb2_grpc.py +0 -0
  47. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_steps_pb2.py +0 -0
  48. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflow_steps_pb2_grpc.py +0 -0
  49. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflows_history_pb2.py +0 -0
  50. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflows_history_pb2_grpc.py +0 -0
  51. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflows_pb2.py +0 -0
  52. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/approval_workflows_pb2_grpc.py +0 -0
  53. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/constants.py +0 -0
  54. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/control_panel_pb2.py +0 -0
  55. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/control_panel_pb2_grpc.py +0 -0
  56. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/drivers_pb2_grpc.py +0 -0
  57. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/errors.py +0 -0
  58. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/health_checks_pb2.py +0 -0
  59. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/health_checks_pb2_grpc.py +0 -0
  60. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_aliases_history_pb2.py +0 -0
  61. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_aliases_history_pb2_grpc.py +0 -0
  62. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_aliases_pb2.py +0 -0
  63. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_aliases_pb2_grpc.py +0 -0
  64. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_sets_history_pb2.py +0 -0
  65. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_sets_history_pb2_grpc.py +0 -0
  66. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_sets_pb2.py +0 -0
  67. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/identity_sets_pb2_grpc.py +0 -0
  68. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/managed_secrets_pb2.py +0 -0
  69. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/managed_secrets_pb2_grpc.py +0 -0
  70. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/nodes_history_pb2.py +0 -0
  71. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/nodes_history_pb2_grpc.py +0 -0
  72. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/nodes_pb2.py +0 -0
  73. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/nodes_pb2_grpc.py +0 -0
  74. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/options_pb2.py +0 -0
  75. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/options_pb2_grpc.py +0 -0
  76. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/organization_history_pb2_grpc.py +0 -0
  77. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_group_nodes_pb2.py +0 -0
  78. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_group_nodes_pb2_grpc.py +0 -0
  79. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_group_peers_pb2.py +0 -0
  80. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_group_peers_pb2_grpc.py +0 -0
  81. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_group_resources_pb2.py +0 -0
  82. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_group_resources_pb2_grpc.py +0 -0
  83. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_groups_pb2.py +0 -0
  84. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/peering_groups_pb2_grpc.py +0 -0
  85. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/policies_history_pb2.py +0 -0
  86. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/policies_history_pb2_grpc.py +0 -0
  87. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/policies_pb2.py +0 -0
  88. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/policies_pb2_grpc.py +0 -0
  89. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/proxy_cluster_keys_pb2.py +0 -0
  90. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/proxy_cluster_keys_pb2_grpc.py +0 -0
  91. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/queries_pb2_grpc.py +0 -0
  92. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identities_history_pb2.py +0 -0
  93. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identities_history_pb2_grpc.py +0 -0
  94. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identities_pb2.py +0 -0
  95. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identities_pb2_grpc.py +0 -0
  96. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identity_groups_history_pb2.py +0 -0
  97. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identity_groups_history_pb2_grpc.py +0 -0
  98. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identity_groups_pb2.py +0 -0
  99. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/remote_identity_groups_pb2_grpc.py +0 -0
  100. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/replays_pb2.py +0 -0
  101. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/replays_pb2_grpc.py +0 -0
  102. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/resources_history_pb2.py +0 -0
  103. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/resources_history_pb2_grpc.py +0 -0
  104. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/resources_pb2.py +0 -0
  105. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/resources_pb2_grpc.py +0 -0
  106. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/role_resources_history_pb2.py +0 -0
  107. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/role_resources_history_pb2_grpc.py +0 -0
  108. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/role_resources_pb2.py +0 -0
  109. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/role_resources_pb2_grpc.py +0 -0
  110. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/roles_history_pb2.py +0 -0
  111. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/roles_history_pb2_grpc.py +0 -0
  112. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/roles_pb2.py +0 -0
  113. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/roles_pb2_grpc.py +0 -0
  114. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_engine_policy_pb2.py +0 -0
  115. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_engine_policy_pb2_grpc.py +0 -0
  116. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_engine_types_pb2.py +0 -0
  117. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_engine_types_pb2_grpc.py +0 -0
  118. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_engines_pb2.py +0 -0
  119. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_engines_pb2_grpc.py +0 -0
  120. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_store_healths_pb2.py +0 -0
  121. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_store_healths_pb2_grpc.py +0 -0
  122. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_store_types_pb2.py +0 -0
  123. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_store_types_pb2_grpc.py +0 -0
  124. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_stores_history_pb2.py +0 -0
  125. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_stores_history_pb2_grpc.py +0 -0
  126. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_stores_pb2.py +0 -0
  127. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/secret_stores_pb2_grpc.py +0 -0
  128. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/spec_pb2.py +0 -0
  129. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/spec_pb2_grpc.py +0 -0
  130. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/tags_pb2.py +0 -0
  131. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/tags_pb2_grpc.py +0 -0
  132. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_approvers_history_pb2.py +0 -0
  133. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_approvers_history_pb2_grpc.py +0 -0
  134. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_approvers_pb2.py +0 -0
  135. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_approvers_pb2_grpc.py +0 -0
  136. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_assignments_history_pb2.py +0 -0
  137. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_assignments_history_pb2_grpc.py +0 -0
  138. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_assignments_pb2.py +0 -0
  139. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_assignments_pb2_grpc.py +0 -0
  140. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_roles_history_pb2.py +0 -0
  141. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_roles_history_pb2_grpc.py +0 -0
  142. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_roles_pb2.py +0 -0
  143. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflow_roles_pb2_grpc.py +0 -0
  144. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflows_history_pb2.py +0 -0
  145. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflows_history_pb2_grpc.py +0 -0
  146. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflows_pb2.py +0 -0
  147. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm/workflows_pb2_grpc.py +0 -0
  148. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm.egg-info/SOURCES.txt +0 -0
  149. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm.egg-info/dependency_links.txt +0 -0
  150. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm.egg-info/requires.txt +0 -0
  151. {strongdm-14.14.0 → strongdm-14.20.0}/strongdm.egg-info/top_level.txt +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: strongdm
3
- Version: 14.14.0
3
+ Version: 14.20.0
4
4
  Summary: strongDM SDK for the Python programming language.
5
5
  Home-page: https://github.com/strongdm/strongdm-sdk-python
6
6
  Author: strongDM Team
7
7
  Author-email: sdk-feedback@strongdm.com
8
8
  License: apache-2.0
9
- Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v14.14.0.tar.gz
9
+ Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v14.20.0.tar.gz
10
10
  Keywords: strongDM,sdm,api,automation,security,audit,database,server,ssh,rdp
11
11
  Platform: UNKNOWN
12
12
  Classifier: Development Status :: 4 - Beta
@@ -23,7 +23,7 @@ from setuptools import setup
23
23
  setup(
24
24
  name='strongdm',
25
25
  packages=['strongdm'],
26
- version='14.14.0',
26
+ version='14.20.0',
27
27
  license='apache-2.0',
28
28
  description='strongDM SDK for the Python programming language.',
29
29
  long_description=long_description,
@@ -32,7 +32,7 @@ setup(
32
32
  author_email='sdk-feedback@strongdm.com',
33
33
  url='https://github.com/strongdm/strongdm-sdk-python',
34
34
  download_url=
35
- 'https://github.com/strongdm/strongdm-sdk-python/archive/v14.14.0.tar.gz',
35
+ 'https://github.com/strongdm/strongdm-sdk-python/archive/v14.20.0.tar.gz',
36
36
  keywords=[
37
37
  'strongDM', 'sdm', 'api', 'automation', 'security', 'audit',
38
38
  'database', 'server', 'ssh', 'rdp'
@@ -29,11 +29,12 @@ from . import svc
29
29
 
30
30
  # These defaults are taken from AWS. Customization of these values
31
31
  # is a future step in the API.
32
- DEFAULT_MAX_RETRIES = 3
33
- DEFAULT_BASE_RETRY_DELAY = 0.0030 # 30 ms
34
- DEFAULT_MAX_RETRY_DELAY = 300 # 300 seconds
32
+ DEFAULT_BASE_RETRY_DELAY = 1 # 1 second
33
+ DEFAULT_MAX_RETRY_DELAY = 120 # 120 seconds
34
+ DEFAULT_RETRY_FACTOR = 1.6
35
+ DEFAULT_RETRY_JITTER = 0.2
35
36
  API_VERSION = '2025-04-14'
36
- USER_AGENT = 'strongdm-sdk-python/14.14.0'
37
+ USER_AGENT = 'strongdm-sdk-python/14.20.0'
37
38
 
38
39
 
39
40
  class Client:
@@ -44,7 +45,7 @@ class Client:
44
45
  host='app.strongdm.com:443',
45
46
  insecure=False,
46
47
  retry_rate_limit_errors=True,
47
- page_limit=50):
48
+ page_limit=0):
48
49
  '''
49
50
  Create a new Client.
50
51
 
@@ -53,10 +54,11 @@ class Client:
53
54
  '''
54
55
  self.api_access_key = api_access_key.strip()
55
56
  self.api_secret = base64.b64decode(api_secret.strip())
56
- self.max_retries = DEFAULT_MAX_RETRIES
57
57
  self.base_retry_delay = DEFAULT_BASE_RETRY_DELAY
58
58
  self.max_retry_delay = DEFAULT_MAX_RETRY_DELAY
59
- self.expose_rate_limit_errors = (not retry_rate_limit_errors)
59
+ self.retry_factor = DEFAULT_RETRY_FACTOR
60
+ self.retry_jitter = DEFAULT_RETRY_JITTER
61
+ self.retry_rate_limit_errors = retry_rate_limit_errors
60
62
  self.snapshot_datetime = None
61
63
  self.page_limit = page_limit
62
64
 
@@ -509,33 +511,48 @@ class Client:
509
511
 
510
512
  return base64.b64encode(hmac_digest(signing_key, hash.digest()))
511
513
 
512
- def jitterSleep(self, iter):
513
- dur_max = self.base_retry_delay * 2**iter
514
- if (dur_max > self.max_retry_delay):
515
- dur_max = self.max_retry_delay
516
- # get a value between 0 and max
517
- dur = random.random() * dur_max
518
- time.sleep(dur)
519
-
520
- def shouldRetry(self, iter, err):
521
- if (iter >= self.max_retries - 1):
514
+ def exponentialBackoff(self, retries, deadline=None):
515
+ def applyDeadline(delay, deadline):
516
+ if deadline is None:
517
+ return delay
518
+ remaining = deadline - time.time()
519
+ if remaining < 0:
520
+ return 0
521
+ return min(delay, remaining)
522
+
523
+ if retries == 0:
524
+ return applyDeadline(self.base_retry_delay, deadline)
525
+
526
+ backoff, max_delay = self.base_retry_delay, self.max_retry_delay
527
+ while backoff < max_delay and retries > 0:
528
+ backoff *= self.retry_factor
529
+ retries -= 1
530
+
531
+ if backoff > max_delay:
532
+ backoff = max_delay
533
+
534
+ # Randomize backoff delays so that if a cluster of requests start at
535
+ # the same time, they won't operate in lockstep.
536
+ backoff *= 1 + self.retry_jitter * (random.random() * 2 - 1)
537
+ if backoff < 0:
538
+ return 0
539
+
540
+ return applyDeadline(backoff, deadline)
541
+
542
+ def shouldRetry(self, retries, err, deadline=None):
543
+ # Check if we've passed the deadline
544
+ if deadline is not None and time.time() >= deadline:
522
545
  return False
546
+
523
547
  if not isinstance(err, grpc.RpcError):
548
+ return False
549
+
550
+ if self.retry_rate_limit_errors and err.code(
551
+ ) == grpc.StatusCode.RESOURCE_EXHAUSTED:
524
552
  return True
525
- porcelain_err = plumbing.convert_error_to_porcelain(err)
526
- if (not self.expose_rate_limit_errors) and isinstance(
527
- porcelain_err, errors.RateLimitError):
528
- wait_until = porcelain_err.rate_limit.reset_at
529
- now = datetime.datetime.now(datetime.timezone.utc)
530
- sleep_for = (wait_until - now).total_seconds()
531
- # If timezones or clock drift causes this calculation to fail,
532
- # wait at most one minute.
533
- if sleep_for < 0 or sleep_for > 60:
534
- sleep_for = 60
535
- time.sleep(sleep_for)
536
- return True
537
- return err.code() == grpc.StatusCode.INTERNAL or err.code(
538
- ) == grpc.StatusCode.UNAVAILABLE
553
+
554
+ return retries <= 3 and (err.code() == grpc.StatusCode.INTERNAL
555
+ or err.code() == grpc.StatusCode.UNAVAILABLE)
539
556
 
540
557
  def snapshot_at(self, snapshot_datetime):
541
558
  '''