strongdm 11.17.0__zip → 11.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 (145) hide show
  1. {strongdm-11.17.0 → strongdm-11.20.0}/PKG-INFO +2 -2
  2. {strongdm-11.17.0 → strongdm-11.20.0}/setup.py +2 -2
  3. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/access_requests_pb2.py +41 -16
  4. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/client.py +1 -1
  5. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/constants.py +1 -0
  6. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/drivers_pb2.py +270 -178
  7. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/models.py +363 -0
  8. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/plumbing.py +133 -0
  9. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/svc.py +2 -0
  10. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm.egg-info/PKG-INFO +2 -2
  11. {strongdm-11.17.0 → strongdm-11.20.0}/LICENSE +0 -0
  12. {strongdm-11.17.0 → strongdm-11.20.0}/README.md +0 -0
  13. {strongdm-11.17.0 → strongdm-11.20.0}/setup.cfg +0 -0
  14. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/__init__.py +0 -0
  15. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/access_request_events_history_pb2.py +0 -0
  16. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/access_request_events_history_pb2_grpc.py +0 -0
  17. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/access_requests_history_pb2.py +0 -0
  18. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/access_requests_history_pb2_grpc.py +0 -0
  19. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/access_requests_pb2_grpc.py +0 -0
  20. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_attachments_history_pb2.py +0 -0
  21. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_attachments_history_pb2_grpc.py +0 -0
  22. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_attachments_pb2.py +0 -0
  23. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_attachments_pb2_grpc.py +0 -0
  24. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_grants_history_pb2.py +0 -0
  25. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_grants_history_pb2_grpc.py +0 -0
  26. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_grants_pb2.py +0 -0
  27. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_grants_pb2_grpc.py +0 -0
  28. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_permissions_pb2.py +0 -0
  29. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_permissions_pb2_grpc.py +0 -0
  30. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_resources_history_pb2.py +0 -0
  31. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_resources_history_pb2_grpc.py +0 -0
  32. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_resources_pb2.py +0 -0
  33. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/account_resources_pb2_grpc.py +0 -0
  34. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/accounts_history_pb2.py +0 -0
  35. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/accounts_history_pb2_grpc.py +0 -0
  36. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/accounts_pb2.py +0 -0
  37. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/accounts_pb2_grpc.py +0 -0
  38. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/activities_pb2.py +0 -0
  39. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/activities_pb2_grpc.py +0 -0
  40. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_approvers_history_pb2.py +0 -0
  41. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_approvers_history_pb2_grpc.py +0 -0
  42. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_approvers_pb2.py +0 -0
  43. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_approvers_pb2_grpc.py +0 -0
  44. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_steps_history_pb2.py +0 -0
  45. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_steps_history_pb2_grpc.py +0 -0
  46. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_steps_pb2.py +0 -0
  47. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflow_steps_pb2_grpc.py +0 -0
  48. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflows_history_pb2.py +0 -0
  49. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflows_history_pb2_grpc.py +0 -0
  50. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflows_pb2.py +0 -0
  51. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/approval_workflows_pb2_grpc.py +0 -0
  52. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/control_panel_pb2.py +0 -0
  53. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/control_panel_pb2_grpc.py +0 -0
  54. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/drivers_pb2_grpc.py +0 -0
  55. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/errors.py +0 -0
  56. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/health_checks_pb2.py +0 -0
  57. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/health_checks_pb2_grpc.py +0 -0
  58. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_aliases_history_pb2.py +0 -0
  59. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_aliases_history_pb2_grpc.py +0 -0
  60. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_aliases_pb2.py +0 -0
  61. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_aliases_pb2_grpc.py +0 -0
  62. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_sets_history_pb2.py +0 -0
  63. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_sets_history_pb2_grpc.py +0 -0
  64. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_sets_pb2.py +0 -0
  65. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/identity_sets_pb2_grpc.py +0 -0
  66. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/nodes_history_pb2.py +0 -0
  67. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/nodes_history_pb2_grpc.py +0 -0
  68. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/nodes_pb2.py +0 -0
  69. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/nodes_pb2_grpc.py +0 -0
  70. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/options_pb2.py +0 -0
  71. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/options_pb2_grpc.py +0 -0
  72. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/organization_history_pb2.py +0 -0
  73. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/organization_history_pb2_grpc.py +0 -0
  74. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_group_nodes_pb2.py +0 -0
  75. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_group_nodes_pb2_grpc.py +0 -0
  76. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_group_peers_pb2.py +0 -0
  77. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_group_peers_pb2_grpc.py +0 -0
  78. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_group_resources_pb2.py +0 -0
  79. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_group_resources_pb2_grpc.py +0 -0
  80. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_groups_pb2.py +0 -0
  81. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/peering_groups_pb2_grpc.py +0 -0
  82. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/policies_history_pb2.py +0 -0
  83. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/policies_history_pb2_grpc.py +0 -0
  84. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/policies_pb2.py +0 -0
  85. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/policies_pb2_grpc.py +0 -0
  86. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/proxy_cluster_keys_pb2.py +0 -0
  87. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/proxy_cluster_keys_pb2_grpc.py +0 -0
  88. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/queries_pb2.py +0 -0
  89. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/queries_pb2_grpc.py +0 -0
  90. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identities_history_pb2.py +0 -0
  91. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identities_history_pb2_grpc.py +0 -0
  92. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identities_pb2.py +0 -0
  93. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identities_pb2_grpc.py +0 -0
  94. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identity_groups_history_pb2.py +0 -0
  95. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identity_groups_history_pb2_grpc.py +0 -0
  96. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identity_groups_pb2.py +0 -0
  97. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/remote_identity_groups_pb2_grpc.py +0 -0
  98. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/replays_pb2.py +0 -0
  99. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/replays_pb2_grpc.py +0 -0
  100. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/resources_history_pb2.py +0 -0
  101. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/resources_history_pb2_grpc.py +0 -0
  102. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/resources_pb2.py +0 -0
  103. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/resources_pb2_grpc.py +0 -0
  104. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/role_resources_history_pb2.py +0 -0
  105. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/role_resources_history_pb2_grpc.py +0 -0
  106. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/role_resources_pb2.py +0 -0
  107. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/role_resources_pb2_grpc.py +0 -0
  108. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/roles_history_pb2.py +0 -0
  109. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/roles_history_pb2_grpc.py +0 -0
  110. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/roles_pb2.py +0 -0
  111. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/roles_pb2_grpc.py +0 -0
  112. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_engine_policy_pb2_grpc.py +0 -0
  113. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_engine_types_pb2_grpc.py +0 -0
  114. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_store_healths_pb2.py +0 -0
  115. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_store_healths_pb2_grpc.py +0 -0
  116. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_store_types_pb2.py +0 -0
  117. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_store_types_pb2_grpc.py +0 -0
  118. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_stores_history_pb2.py +0 -0
  119. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_stores_history_pb2_grpc.py +0 -0
  120. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_stores_pb2.py +0 -0
  121. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/secret_stores_pb2_grpc.py +0 -0
  122. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/spec_pb2.py +0 -0
  123. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/spec_pb2_grpc.py +0 -0
  124. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/tags_pb2.py +0 -0
  125. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/tags_pb2_grpc.py +0 -0
  126. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_approvers_history_pb2.py +0 -0
  127. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_approvers_history_pb2_grpc.py +0 -0
  128. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_approvers_pb2.py +0 -0
  129. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_approvers_pb2_grpc.py +0 -0
  130. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_assignments_history_pb2.py +0 -0
  131. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_assignments_history_pb2_grpc.py +0 -0
  132. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_assignments_pb2.py +0 -0
  133. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_assignments_pb2_grpc.py +0 -0
  134. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_roles_history_pb2.py +0 -0
  135. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_roles_history_pb2_grpc.py +0 -0
  136. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_roles_pb2.py +0 -0
  137. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflow_roles_pb2_grpc.py +0 -0
  138. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflows_history_pb2.py +0 -0
  139. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflows_history_pb2_grpc.py +0 -0
  140. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflows_pb2.py +0 -0
  141. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm/workflows_pb2_grpc.py +0 -0
  142. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm.egg-info/SOURCES.txt +0 -0
  143. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm.egg-info/dependency_links.txt +0 -0
  144. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm.egg-info/requires.txt +0 -0
  145. {strongdm-11.17.0 → strongdm-11.20.0}/strongdm.egg-info/top_level.txt +0 -0
@@ -1735,7 +1735,9 @@ class AccessRequest:
1735
1735
  'grant_id',
1736
1736
  'id',
1737
1737
  'reason',
1738
+ 'requestedduration',
1738
1739
  'resource_id',
1740
+ 'resultduration',
1739
1741
  'start_from',
1740
1742
  'status',
1741
1743
  'status_at',
@@ -1750,7 +1752,9 @@ class AccessRequest:
1750
1752
  grant_id=None,
1751
1753
  id=None,
1752
1754
  reason=None,
1755
+ requestedduration=None,
1753
1756
  resource_id=None,
1757
+ resultduration=None,
1754
1758
  start_from=None,
1755
1759
  status=None,
1756
1760
  status_at=None,
@@ -1764,6 +1768,7 @@ class AccessRequest:
1764
1768
  self.duration = duration if duration is not None else 0
1765
1769
  '''
1766
1770
  Duration of the access request.
1771
+ Deprecated: use requested/result duration instead
1767
1772
  '''
1768
1773
  self.grant_id = grant_id if grant_id is not None else ''
1769
1774
  '''
@@ -1777,10 +1782,18 @@ class AccessRequest:
1777
1782
  '''
1778
1783
  The reason the access was requested.
1779
1784
  '''
1785
+ self.requestedduration = requestedduration if requestedduration is not None else None
1786
+ '''
1787
+ The duration that access was requested for, if any.
1788
+ '''
1780
1789
  self.resource_id = resource_id if resource_id is not None else ''
1781
1790
  '''
1782
1791
  The resource id.
1783
1792
  '''
1793
+ self.resultduration = resultduration if resultduration is not None else None
1794
+ '''
1795
+ The duration that results from an approved request.
1796
+ '''
1784
1797
  self.start_from = start_from if start_from is not None else None
1785
1798
  '''
1786
1799
  The timestamp when the requested access will be granted.
@@ -1810,7 +1823,9 @@ class AccessRequest:
1810
1823
  'grant_id: ' + repr(self.grant_id) + ' ' +\
1811
1824
  'id: ' + repr(self.id) + ' ' +\
1812
1825
  'reason: ' + repr(self.reason) + ' ' +\
1826
+ 'requestedduration: ' + repr(self.requestedduration) + ' ' +\
1813
1827
  'resource_id: ' + repr(self.resource_id) + ' ' +\
1828
+ 'resultduration: ' + repr(self.resultduration) + ' ' +\
1814
1829
  'start_from: ' + repr(self.start_from) + ' ' +\
1815
1830
  'status: ' + repr(self.status) + ' ' +\
1816
1831
  'status_at: ' + repr(self.status_at) + ' ' +\
@@ -1825,7 +1840,9 @@ class AccessRequest:
1825
1840
  'grant_id': self.grant_id,
1826
1841
  'id': self.id,
1827
1842
  'reason': self.reason,
1843
+ 'requestedduration': self.requestedduration,
1828
1844
  'resource_id': self.resource_id,
1845
+ 'resultduration': self.resultduration,
1829
1846
  'start_from': self.start_from,
1830
1847
  'status': self.status,
1831
1848
  'status_at': self.status_at,
@@ -1841,7 +1858,9 @@ class AccessRequest:
1841
1858
  grant_id=d.get('grant_id'),
1842
1859
  id=d.get('id'),
1843
1860
  reason=d.get('reason'),
1861
+ requestedduration=d.get('requestedduration'),
1844
1862
  resource_id=d.get('resource_id'),
1863
+ resultduration=d.get('resultduration'),
1845
1864
  start_from=d.get('start_from'),
1846
1865
  status=d.get('status'),
1847
1866
  status_at=d.get('status_at'),
@@ -10268,6 +10287,169 @@ class GCPCertX509Store:
10268
10287
  )
10269
10288
 
10270
10289
 
10290
+ class GCPConsole:
10291
+ '''
10292
+ GCPConsole is currently unstable, and its API may change, or it may be removed,
10293
+ without a major version bump.
10294
+ '''
10295
+ __slots__ = [
10296
+ 'bind_interface',
10297
+ 'egress_filter',
10298
+ 'healthy',
10299
+ 'id',
10300
+ 'identity_alias_healthcheck_username',
10301
+ 'identity_set_id',
10302
+ 'name',
10303
+ 'port_override',
10304
+ 'proxy_cluster_id',
10305
+ 'secret_store_id',
10306
+ 'session_expiry',
10307
+ 'subdomain',
10308
+ 'tags',
10309
+ 'workforce_pool_id',
10310
+ 'workforce_provider_id',
10311
+ ]
10312
+
10313
+ def __init__(
10314
+ self,
10315
+ bind_interface=None,
10316
+ egress_filter=None,
10317
+ healthy=None,
10318
+ id=None,
10319
+ identity_alias_healthcheck_username=None,
10320
+ identity_set_id=None,
10321
+ name=None,
10322
+ port_override=None,
10323
+ proxy_cluster_id=None,
10324
+ secret_store_id=None,
10325
+ session_expiry=None,
10326
+ subdomain=None,
10327
+ tags=None,
10328
+ workforce_pool_id=None,
10329
+ workforce_provider_id=None,
10330
+ ):
10331
+ self.bind_interface = bind_interface if bind_interface is not None else ''
10332
+ '''
10333
+ The bind interface is the IP address to which the port override of a resource is bound (for example, 127.0.0.1). It is automatically generated if not provided.
10334
+ '''
10335
+ self.egress_filter = egress_filter if egress_filter is not None else ''
10336
+ '''
10337
+ A filter applied to the routing logic to pin datasource to nodes.
10338
+ '''
10339
+ self.healthy = healthy if healthy is not None else False
10340
+ '''
10341
+ True if the datasource is reachable and the credentials are valid.
10342
+ '''
10343
+ self.id = id if id is not None else ''
10344
+ '''
10345
+ Unique identifier of the Resource.
10346
+ '''
10347
+ self.identity_alias_healthcheck_username = identity_alias_healthcheck_username if identity_alias_healthcheck_username is not None else ''
10348
+ '''
10349
+ The username to use for healthchecks, when clients otherwise connect with their own identity alias username.
10350
+ '''
10351
+ self.identity_set_id = identity_set_id if identity_set_id is not None else ''
10352
+ '''
10353
+ The ID of the identity set to use for identity connections.
10354
+ '''
10355
+ self.name = name if name is not None else ''
10356
+ '''
10357
+ Unique human-readable name of the Resource.
10358
+ '''
10359
+ self.port_override = port_override if port_override is not None else 0
10360
+ '''
10361
+ The local port used by clients to connect to this resource.
10362
+ '''
10363
+ self.proxy_cluster_id = proxy_cluster_id if proxy_cluster_id is not None else ''
10364
+ '''
10365
+ ID of the proxy cluster for this resource, if any.
10366
+ '''
10367
+ self.secret_store_id = secret_store_id if secret_store_id is not None else ''
10368
+ '''
10369
+ ID of the secret store containing credentials for this resource, if any.
10370
+ '''
10371
+ self.session_expiry = session_expiry if session_expiry is not None else 0
10372
+ '''
10373
+ The length of time in seconds console sessions will live before needing to reauthenticate.
10374
+ '''
10375
+ self.subdomain = subdomain if subdomain is not None else ''
10376
+ '''
10377
+ Subdomain is the local DNS address. (e.g. app-prod1 turns into app-prod1.your-org-name.sdm.network)
10378
+ '''
10379
+ self.tags = tags if tags is not None else _porcelain_zero_value_tags()
10380
+ '''
10381
+ Tags is a map of key, value pairs.
10382
+ '''
10383
+ self.workforce_pool_id = workforce_pool_id if workforce_pool_id is not None else ''
10384
+ '''
10385
+ The ID of the Workforce Identity Pool in GCP to use for federated authentication.
10386
+ '''
10387
+ self.workforce_provider_id = workforce_provider_id if workforce_provider_id is not None else ''
10388
+ '''
10389
+ The ID of the Workforce Identity Provider in GCP to use for federated authentication.
10390
+ '''
10391
+
10392
+ def __repr__(self):
10393
+ return '<sdm.GCPConsole ' + \
10394
+ 'bind_interface: ' + repr(self.bind_interface) + ' ' +\
10395
+ 'egress_filter: ' + repr(self.egress_filter) + ' ' +\
10396
+ 'healthy: ' + repr(self.healthy) + ' ' +\
10397
+ 'id: ' + repr(self.id) + ' ' +\
10398
+ 'identity_alias_healthcheck_username: ' + repr(self.identity_alias_healthcheck_username) + ' ' +\
10399
+ 'identity_set_id: ' + repr(self.identity_set_id) + ' ' +\
10400
+ 'name: ' + repr(self.name) + ' ' +\
10401
+ 'port_override: ' + repr(self.port_override) + ' ' +\
10402
+ 'proxy_cluster_id: ' + repr(self.proxy_cluster_id) + ' ' +\
10403
+ 'secret_store_id: ' + repr(self.secret_store_id) + ' ' +\
10404
+ 'session_expiry: ' + repr(self.session_expiry) + ' ' +\
10405
+ 'subdomain: ' + repr(self.subdomain) + ' ' +\
10406
+ 'tags: ' + repr(self.tags) + ' ' +\
10407
+ 'workforce_pool_id: ' + repr(self.workforce_pool_id) + ' ' +\
10408
+ 'workforce_provider_id: ' + repr(self.workforce_provider_id) + ' ' +\
10409
+ '>'
10410
+
10411
+ def to_dict(self):
10412
+ return {
10413
+ 'bind_interface': self.bind_interface,
10414
+ 'egress_filter': self.egress_filter,
10415
+ 'healthy': self.healthy,
10416
+ 'id': self.id,
10417
+ 'identity_alias_healthcheck_username':
10418
+ self.identity_alias_healthcheck_username,
10419
+ 'identity_set_id': self.identity_set_id,
10420
+ 'name': self.name,
10421
+ 'port_override': self.port_override,
10422
+ 'proxy_cluster_id': self.proxy_cluster_id,
10423
+ 'secret_store_id': self.secret_store_id,
10424
+ 'session_expiry': self.session_expiry,
10425
+ 'subdomain': self.subdomain,
10426
+ 'tags': self.tags,
10427
+ 'workforce_pool_id': self.workforce_pool_id,
10428
+ 'workforce_provider_id': self.workforce_provider_id,
10429
+ }
10430
+
10431
+ @classmethod
10432
+ def from_dict(cls, d):
10433
+ return cls(
10434
+ bind_interface=d.get('bind_interface'),
10435
+ egress_filter=d.get('egress_filter'),
10436
+ healthy=d.get('healthy'),
10437
+ id=d.get('id'),
10438
+ identity_alias_healthcheck_username=d.get(
10439
+ 'identity_alias_healthcheck_username'),
10440
+ identity_set_id=d.get('identity_set_id'),
10441
+ name=d.get('name'),
10442
+ port_override=d.get('port_override'),
10443
+ proxy_cluster_id=d.get('proxy_cluster_id'),
10444
+ secret_store_id=d.get('secret_store_id'),
10445
+ session_expiry=d.get('session_expiry'),
10446
+ subdomain=d.get('subdomain'),
10447
+ tags=d.get('tags'),
10448
+ workforce_pool_id=d.get('workforce_pool_id'),
10449
+ workforce_provider_id=d.get('workforce_provider_id'),
10450
+ )
10451
+
10452
+
10271
10453
  class GCPStore:
10272
10454
  __slots__ = [
10273
10455
  'id',
@@ -10326,6 +10508,187 @@ class GCPStore:
10326
10508
  )
10327
10509
 
10328
10510
 
10511
+ class GCPWIF:
10512
+ '''
10513
+ GCPWIF is currently unstable, and its API may change, or it may be removed,
10514
+ without a major version bump.
10515
+ '''
10516
+ __slots__ = [
10517
+ 'bind_interface',
10518
+ 'egress_filter',
10519
+ 'healthy',
10520
+ 'id',
10521
+ 'identity_alias_healthcheck_username',
10522
+ 'identity_set_id',
10523
+ 'name',
10524
+ 'port_override',
10525
+ 'project_id',
10526
+ 'proxy_cluster_id',
10527
+ 'scopes',
10528
+ 'secret_store_id',
10529
+ 'session_expiry',
10530
+ 'subdomain',
10531
+ 'tags',
10532
+ 'workforce_pool_id',
10533
+ 'workforce_provider_id',
10534
+ ]
10535
+
10536
+ def __init__(
10537
+ self,
10538
+ bind_interface=None,
10539
+ egress_filter=None,
10540
+ healthy=None,
10541
+ id=None,
10542
+ identity_alias_healthcheck_username=None,
10543
+ identity_set_id=None,
10544
+ name=None,
10545
+ port_override=None,
10546
+ project_id=None,
10547
+ proxy_cluster_id=None,
10548
+ scopes=None,
10549
+ secret_store_id=None,
10550
+ session_expiry=None,
10551
+ subdomain=None,
10552
+ tags=None,
10553
+ workforce_pool_id=None,
10554
+ workforce_provider_id=None,
10555
+ ):
10556
+ self.bind_interface = bind_interface if bind_interface is not None else ''
10557
+ '''
10558
+ The bind interface is the IP address to which the port override of a resource is bound (for example, 127.0.0.1). It is automatically generated if not provided.
10559
+ '''
10560
+ self.egress_filter = egress_filter if egress_filter is not None else ''
10561
+ '''
10562
+ A filter applied to the routing logic to pin datasource to nodes.
10563
+ '''
10564
+ self.healthy = healthy if healthy is not None else False
10565
+ '''
10566
+ True if the datasource is reachable and the credentials are valid.
10567
+ '''
10568
+ self.id = id if id is not None else ''
10569
+ '''
10570
+ Unique identifier of the Resource.
10571
+ '''
10572
+ self.identity_alias_healthcheck_username = identity_alias_healthcheck_username if identity_alias_healthcheck_username is not None else ''
10573
+ '''
10574
+ The username to use for healthchecks, when clients otherwise connect with their own identity alias username.
10575
+ '''
10576
+ self.identity_set_id = identity_set_id if identity_set_id is not None else ''
10577
+ '''
10578
+ The ID of the identity set to use for identity connections.
10579
+ '''
10580
+ self.name = name if name is not None else ''
10581
+ '''
10582
+ Unique human-readable name of the Resource.
10583
+ '''
10584
+ self.port_override = port_override if port_override is not None else 0
10585
+ '''
10586
+ The local port used by clients to connect to this resource.
10587
+ '''
10588
+ self.project_id = project_id if project_id is not None else ''
10589
+ '''
10590
+ When specified, all project scoped requests will use this Project ID, overriding the project ID specified by clients
10591
+ '''
10592
+ self.proxy_cluster_id = proxy_cluster_id if proxy_cluster_id is not None else ''
10593
+ '''
10594
+ ID of the proxy cluster for this resource, if any.
10595
+ '''
10596
+ self.scopes = scopes if scopes is not None else ''
10597
+ '''
10598
+ Space separated scopes that this login should assume into when authenticating.
10599
+ '''
10600
+ self.secret_store_id = secret_store_id if secret_store_id is not None else ''
10601
+ '''
10602
+ ID of the secret store containing credentials for this resource, if any.
10603
+ '''
10604
+ self.session_expiry = session_expiry if session_expiry is not None else 0
10605
+ '''
10606
+ The length of time in seconds console sessions will live before needing to reauthenticate.
10607
+ '''
10608
+ self.subdomain = subdomain if subdomain is not None else ''
10609
+ '''
10610
+ Subdomain is the local DNS address. (e.g. app-prod1 turns into app-prod1.your-org-name.sdm.network)
10611
+ '''
10612
+ self.tags = tags if tags is not None else _porcelain_zero_value_tags()
10613
+ '''
10614
+ Tags is a map of key, value pairs.
10615
+ '''
10616
+ self.workforce_pool_id = workforce_pool_id if workforce_pool_id is not None else ''
10617
+ '''
10618
+ The ID of the Workforce Identity Pool in GCP to use for federated authentication.
10619
+ '''
10620
+ self.workforce_provider_id = workforce_provider_id if workforce_provider_id is not None else ''
10621
+ '''
10622
+ The ID of the Workforce Identity Provider in GCP to use for federated authentication.
10623
+ '''
10624
+
10625
+ def __repr__(self):
10626
+ return '<sdm.GCPWIF ' + \
10627
+ 'bind_interface: ' + repr(self.bind_interface) + ' ' +\
10628
+ 'egress_filter: ' + repr(self.egress_filter) + ' ' +\
10629
+ 'healthy: ' + repr(self.healthy) + ' ' +\
10630
+ 'id: ' + repr(self.id) + ' ' +\
10631
+ 'identity_alias_healthcheck_username: ' + repr(self.identity_alias_healthcheck_username) + ' ' +\
10632
+ 'identity_set_id: ' + repr(self.identity_set_id) + ' ' +\
10633
+ 'name: ' + repr(self.name) + ' ' +\
10634
+ 'port_override: ' + repr(self.port_override) + ' ' +\
10635
+ 'project_id: ' + repr(self.project_id) + ' ' +\
10636
+ 'proxy_cluster_id: ' + repr(self.proxy_cluster_id) + ' ' +\
10637
+ 'scopes: ' + repr(self.scopes) + ' ' +\
10638
+ 'secret_store_id: ' + repr(self.secret_store_id) + ' ' +\
10639
+ 'session_expiry: ' + repr(self.session_expiry) + ' ' +\
10640
+ 'subdomain: ' + repr(self.subdomain) + ' ' +\
10641
+ 'tags: ' + repr(self.tags) + ' ' +\
10642
+ 'workforce_pool_id: ' + repr(self.workforce_pool_id) + ' ' +\
10643
+ 'workforce_provider_id: ' + repr(self.workforce_provider_id) + ' ' +\
10644
+ '>'
10645
+
10646
+ def to_dict(self):
10647
+ return {
10648
+ 'bind_interface': self.bind_interface,
10649
+ 'egress_filter': self.egress_filter,
10650
+ 'healthy': self.healthy,
10651
+ 'id': self.id,
10652
+ 'identity_alias_healthcheck_username':
10653
+ self.identity_alias_healthcheck_username,
10654
+ 'identity_set_id': self.identity_set_id,
10655
+ 'name': self.name,
10656
+ 'port_override': self.port_override,
10657
+ 'project_id': self.project_id,
10658
+ 'proxy_cluster_id': self.proxy_cluster_id,
10659
+ 'scopes': self.scopes,
10660
+ 'secret_store_id': self.secret_store_id,
10661
+ 'session_expiry': self.session_expiry,
10662
+ 'subdomain': self.subdomain,
10663
+ 'tags': self.tags,
10664
+ 'workforce_pool_id': self.workforce_pool_id,
10665
+ 'workforce_provider_id': self.workforce_provider_id,
10666
+ }
10667
+
10668
+ @classmethod
10669
+ def from_dict(cls, d):
10670
+ return cls(
10671
+ bind_interface=d.get('bind_interface'),
10672
+ egress_filter=d.get('egress_filter'),
10673
+ healthy=d.get('healthy'),
10674
+ id=d.get('id'),
10675
+ identity_alias_healthcheck_username=d.get(
10676
+ 'identity_alias_healthcheck_username'),
10677
+ identity_set_id=d.get('identity_set_id'),
10678
+ name=d.get('name'),
10679
+ port_override=d.get('port_override'),
10680
+ project_id=d.get('project_id'),
10681
+ proxy_cluster_id=d.get('proxy_cluster_id'),
10682
+ scopes=d.get('scopes'),
10683
+ secret_store_id=d.get('secret_store_id'),
10684
+ session_expiry=d.get('session_expiry'),
10685
+ subdomain=d.get('subdomain'),
10686
+ tags=d.get('tags'),
10687
+ workforce_pool_id=d.get('workforce_pool_id'),
10688
+ workforce_provider_id=d.get('workforce_provider_id'),
10689
+ )
10690
+
10691
+
10329
10692
  class Gateway:
10330
10693
  '''
10331
10694
  Gateway represents a StrongDM CLI installation running in gateway mode.
@@ -794,7 +794,11 @@ def convert_access_request_to_porcelain(plumbing):
794
794
  porcelain.grant_id = (plumbing.grant_id)
795
795
  porcelain.id = (plumbing.id)
796
796
  porcelain.reason = (plumbing.reason)
797
+ porcelain.requestedduration = convert_duration_to_porcelain(
798
+ plumbing.requestedDuration)
797
799
  porcelain.resource_id = (plumbing.resource_id)
800
+ porcelain.resultduration = convert_duration_to_porcelain(
801
+ plumbing.resultDuration)
798
802
  porcelain.start_from = convert_timestamp_to_porcelain(plumbing.start_from)
799
803
  porcelain.status = (plumbing.status)
800
804
  porcelain.status_at = convert_timestamp_to_porcelain(plumbing.status_at)
@@ -813,7 +817,11 @@ def convert_access_request_to_plumbing(porcelain):
813
817
  plumbing.grant_id = (porcelain.grant_id)
814
818
  plumbing.id = (porcelain.id)
815
819
  plumbing.reason = (porcelain.reason)
820
+ plumbing.requestedDuration.CopyFrom(
821
+ convert_duration_to_plumbing(porcelain.requestedduration))
816
822
  plumbing.resource_id = (porcelain.resource_id)
823
+ plumbing.resultDuration.CopyFrom(
824
+ convert_duration_to_plumbing(porcelain.resultduration))
817
825
  plumbing.start_from.CopyFrom(
818
826
  convert_timestamp_to_plumbing(porcelain.start_from))
819
827
  plumbing.status = (porcelain.status)
@@ -4894,6 +4902,64 @@ def convert_repeated_gcp_cert_x_509_store_to_porcelain(plumbings):
4894
4902
  ]
4895
4903
 
4896
4904
 
4905
+ def convert_gcp_console_to_porcelain(plumbing):
4906
+ if plumbing is None:
4907
+ return None
4908
+ porcelain = models.GCPConsole()
4909
+ porcelain.bind_interface = (plumbing.bind_interface)
4910
+ porcelain.egress_filter = (plumbing.egress_filter)
4911
+ porcelain.healthy = (plumbing.healthy)
4912
+ porcelain.id = (plumbing.id)
4913
+ porcelain.identity_alias_healthcheck_username = (
4914
+ plumbing.identity_alias_healthcheck_username)
4915
+ porcelain.identity_set_id = (plumbing.identity_set_id)
4916
+ porcelain.name = (plumbing.name)
4917
+ porcelain.port_override = (plumbing.port_override)
4918
+ porcelain.proxy_cluster_id = (plumbing.proxy_cluster_id)
4919
+ porcelain.secret_store_id = (plumbing.secret_store_id)
4920
+ porcelain.session_expiry = (plumbing.session_expiry)
4921
+ porcelain.subdomain = (plumbing.subdomain)
4922
+ porcelain.tags = convert_tags_to_porcelain(plumbing.tags)
4923
+ porcelain.workforce_pool_id = (plumbing.workforce_pool_id)
4924
+ porcelain.workforce_provider_id = (plumbing.workforce_provider_id)
4925
+ return porcelain
4926
+
4927
+
4928
+ def convert_gcp_console_to_plumbing(porcelain):
4929
+ plumbing = GCPConsole()
4930
+ if porcelain is None:
4931
+ return plumbing
4932
+ plumbing.bind_interface = (porcelain.bind_interface)
4933
+ plumbing.egress_filter = (porcelain.egress_filter)
4934
+ plumbing.healthy = (porcelain.healthy)
4935
+ plumbing.id = (porcelain.id)
4936
+ plumbing.identity_alias_healthcheck_username = (
4937
+ porcelain.identity_alias_healthcheck_username)
4938
+ plumbing.identity_set_id = (porcelain.identity_set_id)
4939
+ plumbing.name = (porcelain.name)
4940
+ plumbing.port_override = (porcelain.port_override)
4941
+ plumbing.proxy_cluster_id = (porcelain.proxy_cluster_id)
4942
+ plumbing.secret_store_id = (porcelain.secret_store_id)
4943
+ plumbing.session_expiry = (porcelain.session_expiry)
4944
+ plumbing.subdomain = (porcelain.subdomain)
4945
+ plumbing.tags.CopyFrom(convert_tags_to_plumbing(porcelain.tags))
4946
+ plumbing.workforce_pool_id = (porcelain.workforce_pool_id)
4947
+ plumbing.workforce_provider_id = (porcelain.workforce_provider_id)
4948
+ return plumbing
4949
+
4950
+
4951
+ def convert_repeated_gcp_console_to_plumbing(porcelains):
4952
+ return [
4953
+ convert_gcp_console_to_plumbing(porcelain) for porcelain in porcelains
4954
+ ]
4955
+
4956
+
4957
+ def convert_repeated_gcp_console_to_porcelain(plumbings):
4958
+ return [
4959
+ convert_gcp_console_to_porcelain(plumbing) for plumbing in plumbings
4960
+ ]
4961
+
4962
+
4897
4963
  def convert_gcp_store_to_porcelain(plumbing):
4898
4964
  if plumbing is None:
4899
4965
  return None
@@ -4926,6 +4992,64 @@ def convert_repeated_gcp_store_to_porcelain(plumbings):
4926
4992
  return [convert_gcp_store_to_porcelain(plumbing) for plumbing in plumbings]
4927
4993
 
4928
4994
 
4995
+ def convert_gcpwif_to_porcelain(plumbing):
4996
+ if plumbing is None:
4997
+ return None
4998
+ porcelain = models.GCPWIF()
4999
+ porcelain.bind_interface = (plumbing.bind_interface)
5000
+ porcelain.egress_filter = (plumbing.egress_filter)
5001
+ porcelain.healthy = (plumbing.healthy)
5002
+ porcelain.id = (plumbing.id)
5003
+ porcelain.identity_alias_healthcheck_username = (
5004
+ plumbing.identity_alias_healthcheck_username)
5005
+ porcelain.identity_set_id = (plumbing.identity_set_id)
5006
+ porcelain.name = (plumbing.name)
5007
+ porcelain.port_override = (plumbing.port_override)
5008
+ porcelain.project_id = (plumbing.project_id)
5009
+ porcelain.proxy_cluster_id = (plumbing.proxy_cluster_id)
5010
+ porcelain.scopes = (plumbing.scopes)
5011
+ porcelain.secret_store_id = (plumbing.secret_store_id)
5012
+ porcelain.session_expiry = (plumbing.session_expiry)
5013
+ porcelain.subdomain = (plumbing.subdomain)
5014
+ porcelain.tags = convert_tags_to_porcelain(plumbing.tags)
5015
+ porcelain.workforce_pool_id = (plumbing.workforce_pool_id)
5016
+ porcelain.workforce_provider_id = (plumbing.workforce_provider_id)
5017
+ return porcelain
5018
+
5019
+
5020
+ def convert_gcpwif_to_plumbing(porcelain):
5021
+ plumbing = GCPWIF()
5022
+ if porcelain is None:
5023
+ return plumbing
5024
+ plumbing.bind_interface = (porcelain.bind_interface)
5025
+ plumbing.egress_filter = (porcelain.egress_filter)
5026
+ plumbing.healthy = (porcelain.healthy)
5027
+ plumbing.id = (porcelain.id)
5028
+ plumbing.identity_alias_healthcheck_username = (
5029
+ porcelain.identity_alias_healthcheck_username)
5030
+ plumbing.identity_set_id = (porcelain.identity_set_id)
5031
+ plumbing.name = (porcelain.name)
5032
+ plumbing.port_override = (porcelain.port_override)
5033
+ plumbing.project_id = (porcelain.project_id)
5034
+ plumbing.proxy_cluster_id = (porcelain.proxy_cluster_id)
5035
+ plumbing.scopes = (porcelain.scopes)
5036
+ plumbing.secret_store_id = (porcelain.secret_store_id)
5037
+ plumbing.session_expiry = (porcelain.session_expiry)
5038
+ plumbing.subdomain = (porcelain.subdomain)
5039
+ plumbing.tags.CopyFrom(convert_tags_to_plumbing(porcelain.tags))
5040
+ plumbing.workforce_pool_id = (porcelain.workforce_pool_id)
5041
+ plumbing.workforce_provider_id = (porcelain.workforce_provider_id)
5042
+ return plumbing
5043
+
5044
+
5045
+ def convert_repeated_gcpwif_to_plumbing(porcelains):
5046
+ return [convert_gcpwif_to_plumbing(porcelain) for porcelain in porcelains]
5047
+
5048
+
5049
+ def convert_repeated_gcpwif_to_porcelain(plumbings):
5050
+ return [convert_gcpwif_to_porcelain(plumbing) for plumbing in plumbings]
5051
+
5052
+
4929
5053
  def convert_gateway_to_porcelain(plumbing):
4930
5054
  if plumbing is None:
4931
5055
  return None
@@ -9878,6 +10002,11 @@ def convert_resource_to_plumbing(porcelain):
9878
10002
  convert_elasticache_redis_to_plumbing(porcelain))
9879
10003
  if isinstance(porcelain, models.GCP):
9880
10004
  plumbing.gcp.CopyFrom(convert_gcp_to_plumbing(porcelain))
10005
+ if isinstance(porcelain, models.GCPConsole):
10006
+ plumbing.gcp_console.CopyFrom(
10007
+ convert_gcp_console_to_plumbing(porcelain))
10008
+ if isinstance(porcelain, models.GCPWIF):
10009
+ plumbing.gcpwif.CopyFrom(convert_gcpwif_to_plumbing(porcelain))
9881
10010
  if isinstance(porcelain, models.GoogleGKE):
9882
10011
  plumbing.google_gke.CopyFrom(convert_google_gke_to_plumbing(porcelain))
9883
10012
  if isinstance(porcelain, models.GoogleGKEUserImpersonation):
@@ -10096,6 +10225,10 @@ def convert_resource_to_porcelain(plumbing):
10096
10225
  plumbing.elasticache_redis)
10097
10226
  if plumbing.HasField('gcp'):
10098
10227
  return convert_gcp_to_porcelain(plumbing.gcp)
10228
+ if plumbing.HasField('gcp_console'):
10229
+ return convert_gcp_console_to_porcelain(plumbing.gcp_console)
10230
+ if plumbing.HasField('gcpwif'):
10231
+ return convert_gcpwif_to_porcelain(plumbing.gcpwif)
10099
10232
  if plumbing.HasField('google_gke'):
10100
10233
  return convert_google_gke_to_porcelain(plumbing.google_gke)
10101
10234
  if plumbing.HasField('google_gke_user_impersonation'):
@@ -4494,6 +4494,8 @@ class Resources:
4494
4494
  `strongdm.models.Elastic`
4495
4495
  `strongdm.models.ElasticacheRedis`
4496
4496
  `strongdm.models.GCP`
4497
+ `strongdm.models.GCPConsole`
4498
+ `strongdm.models.GCPWIF`
4497
4499
  `strongdm.models.GoogleGKE`
4498
4500
  `strongdm.models.GoogleGKEUserImpersonation`
4499
4501
  `strongdm.models.Greenplum`
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: strongdm
3
- Version: 11.17.0
3
+ Version: 11.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/v11.17.0.tar.gz
9
+ Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v11.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
File without changes
File without changes
File without changes