strongdm 13.10.0__zip → 13.12.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-13.10.0 → strongdm-13.12.0}/PKG-INFO +2 -2
  2. {strongdm-13.10.0 → strongdm-13.12.0}/setup.py +2 -2
  3. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/client.py +15 -1
  4. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/drivers_pb2.py +25 -21
  5. strongdm-13.12.0/strongdm/managed_secrets_pb2.py +460 -0
  6. strongdm-13.12.0/strongdm/managed_secrets_pb2_grpc.py +398 -0
  7. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/models.py +7067 -4951
  8. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/plumbing.py +4510 -2892
  9. strongdm-13.12.0/strongdm/secret_engine_policy_pb2.py +78 -0
  10. strongdm-13.12.0/strongdm/secret_engine_types_pb2.py +147 -0
  11. strongdm-13.12.0/strongdm/secret_engines_pb2.py +325 -0
  12. strongdm-13.12.0/strongdm/secret_engines_pb2_grpc.py +355 -0
  13. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/svc.py +686 -0
  14. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm.egg-info/PKG-INFO +2 -2
  15. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm.egg-info/SOURCES.txt +6 -0
  16. {strongdm-13.10.0 → strongdm-13.12.0}/LICENSE +0 -0
  17. {strongdm-13.10.0 → strongdm-13.12.0}/README.md +0 -0
  18. {strongdm-13.10.0 → strongdm-13.12.0}/setup.cfg +0 -0
  19. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/__init__.py +0 -0
  20. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/access_request_events_history_pb2.py +0 -0
  21. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/access_request_events_history_pb2_grpc.py +0 -0
  22. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/access_requests_history_pb2.py +0 -0
  23. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/access_requests_history_pb2_grpc.py +0 -0
  24. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/access_requests_pb2.py +0 -0
  25. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/access_requests_pb2_grpc.py +0 -0
  26. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_attachments_history_pb2.py +0 -0
  27. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_attachments_history_pb2_grpc.py +0 -0
  28. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_attachments_pb2.py +0 -0
  29. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_attachments_pb2_grpc.py +0 -0
  30. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_grants_history_pb2.py +0 -0
  31. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_grants_history_pb2_grpc.py +0 -0
  32. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_grants_pb2.py +0 -0
  33. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_grants_pb2_grpc.py +0 -0
  34. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_permissions_pb2.py +0 -0
  35. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_permissions_pb2_grpc.py +0 -0
  36. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_resources_history_pb2.py +0 -0
  37. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_resources_history_pb2_grpc.py +0 -0
  38. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_resources_pb2.py +0 -0
  39. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/account_resources_pb2_grpc.py +0 -0
  40. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/accounts_history_pb2.py +0 -0
  41. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/accounts_history_pb2_grpc.py +0 -0
  42. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/accounts_pb2.py +0 -0
  43. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/accounts_pb2_grpc.py +0 -0
  44. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/activities_pb2.py +0 -0
  45. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/activities_pb2_grpc.py +0 -0
  46. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_approvers_history_pb2.py +0 -0
  47. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_approvers_history_pb2_grpc.py +0 -0
  48. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_approvers_pb2.py +0 -0
  49. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_approvers_pb2_grpc.py +0 -0
  50. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_steps_history_pb2.py +0 -0
  51. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_steps_history_pb2_grpc.py +0 -0
  52. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_steps_pb2.py +0 -0
  53. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflow_steps_pb2_grpc.py +0 -0
  54. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflows_history_pb2.py +0 -0
  55. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflows_history_pb2_grpc.py +0 -0
  56. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflows_pb2.py +0 -0
  57. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/approval_workflows_pb2_grpc.py +0 -0
  58. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/constants.py +0 -0
  59. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/control_panel_pb2.py +0 -0
  60. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/control_panel_pb2_grpc.py +0 -0
  61. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/drivers_pb2_grpc.py +0 -0
  62. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/errors.py +0 -0
  63. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/health_checks_pb2.py +0 -0
  64. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/health_checks_pb2_grpc.py +0 -0
  65. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_aliases_history_pb2.py +0 -0
  66. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_aliases_history_pb2_grpc.py +0 -0
  67. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_aliases_pb2.py +0 -0
  68. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_aliases_pb2_grpc.py +0 -0
  69. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_sets_history_pb2.py +0 -0
  70. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_sets_history_pb2_grpc.py +0 -0
  71. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_sets_pb2.py +0 -0
  72. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/identity_sets_pb2_grpc.py +0 -0
  73. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/nodes_history_pb2.py +0 -0
  74. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/nodes_history_pb2_grpc.py +0 -0
  75. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/nodes_pb2.py +0 -0
  76. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/nodes_pb2_grpc.py +0 -0
  77. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/options_pb2.py +0 -0
  78. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/options_pb2_grpc.py +0 -0
  79. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/organization_history_pb2.py +0 -0
  80. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/organization_history_pb2_grpc.py +0 -0
  81. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_group_nodes_pb2.py +0 -0
  82. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_group_nodes_pb2_grpc.py +0 -0
  83. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_group_peers_pb2.py +0 -0
  84. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_group_peers_pb2_grpc.py +0 -0
  85. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_group_resources_pb2.py +0 -0
  86. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_group_resources_pb2_grpc.py +0 -0
  87. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_groups_pb2.py +0 -0
  88. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/peering_groups_pb2_grpc.py +0 -0
  89. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/policies_history_pb2.py +0 -0
  90. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/policies_history_pb2_grpc.py +0 -0
  91. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/policies_pb2.py +0 -0
  92. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/policies_pb2_grpc.py +0 -0
  93. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/proxy_cluster_keys_pb2.py +0 -0
  94. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/proxy_cluster_keys_pb2_grpc.py +0 -0
  95. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/queries_pb2.py +0 -0
  96. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/queries_pb2_grpc.py +0 -0
  97. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identities_history_pb2.py +0 -0
  98. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identities_history_pb2_grpc.py +0 -0
  99. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identities_pb2.py +0 -0
  100. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identities_pb2_grpc.py +0 -0
  101. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identity_groups_history_pb2.py +0 -0
  102. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identity_groups_history_pb2_grpc.py +0 -0
  103. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identity_groups_pb2.py +0 -0
  104. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/remote_identity_groups_pb2_grpc.py +0 -0
  105. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/replays_pb2.py +0 -0
  106. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/replays_pb2_grpc.py +0 -0
  107. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/resources_history_pb2.py +0 -0
  108. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/resources_history_pb2_grpc.py +0 -0
  109. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/resources_pb2.py +0 -0
  110. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/resources_pb2_grpc.py +0 -0
  111. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/role_resources_history_pb2.py +0 -0
  112. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/role_resources_history_pb2_grpc.py +0 -0
  113. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/role_resources_pb2.py +0 -0
  114. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/role_resources_pb2_grpc.py +0 -0
  115. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/roles_history_pb2.py +0 -0
  116. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/roles_history_pb2_grpc.py +0 -0
  117. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/roles_pb2.py +0 -0
  118. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/roles_pb2_grpc.py +0 -0
  119. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_engine_policy_pb2_grpc.py +0 -0
  120. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_engine_types_pb2_grpc.py +0 -0
  121. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_store_healths_pb2.py +0 -0
  122. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_store_healths_pb2_grpc.py +0 -0
  123. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_store_types_pb2.py +0 -0
  124. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_store_types_pb2_grpc.py +0 -0
  125. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_stores_history_pb2.py +0 -0
  126. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_stores_history_pb2_grpc.py +0 -0
  127. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_stores_pb2.py +0 -0
  128. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/secret_stores_pb2_grpc.py +0 -0
  129. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/spec_pb2.py +0 -0
  130. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/spec_pb2_grpc.py +0 -0
  131. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/tags_pb2.py +0 -0
  132. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/tags_pb2_grpc.py +0 -0
  133. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_approvers_history_pb2.py +0 -0
  134. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_approvers_history_pb2_grpc.py +0 -0
  135. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_approvers_pb2.py +0 -0
  136. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_approvers_pb2_grpc.py +0 -0
  137. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_assignments_history_pb2.py +0 -0
  138. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_assignments_history_pb2_grpc.py +0 -0
  139. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_assignments_pb2.py +0 -0
  140. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_assignments_pb2_grpc.py +0 -0
  141. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_roles_history_pb2.py +0 -0
  142. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_roles_history_pb2_grpc.py +0 -0
  143. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_roles_pb2.py +0 -0
  144. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflow_roles_pb2_grpc.py +0 -0
  145. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflows_history_pb2.py +0 -0
  146. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflows_history_pb2_grpc.py +0 -0
  147. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflows_pb2.py +0 -0
  148. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm/workflows_pb2_grpc.py +0 -0
  149. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm.egg-info/dependency_links.txt +0 -0
  150. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm.egg-info/requires.txt +0 -0
  151. {strongdm-13.10.0 → strongdm-13.12.0}/strongdm.egg-info/top_level.txt +0 -0
@@ -76,6 +76,8 @@ from .identity_sets_pb2 import *
76
76
  from .identity_sets_pb2_grpc import *
77
77
  from .identity_sets_history_pb2 import *
78
78
  from .identity_sets_history_pb2_grpc import *
79
+ from .managed_secrets_pb2 import *
80
+ from .managed_secrets_pb2_grpc import *
79
81
  from .nodes_pb2 import *
80
82
  from .nodes_pb2_grpc import *
81
83
  from .nodes_history_pb2 import *
@@ -120,10 +122,16 @@ from .roles_pb2 import *
120
122
  from .roles_pb2_grpc import *
121
123
  from .roles_history_pb2 import *
122
124
  from .roles_history_pb2_grpc import *
125
+ from .secret_engine_policy_pb2 import *
126
+ from .secret_engine_policy_pb2_grpc import *
127
+ from .secret_engine_types_pb2 import *
128
+ from .secret_engine_types_pb2_grpc import *
123
129
  from .secret_store_types_pb2 import *
124
130
  from .secret_store_types_pb2_grpc import *
125
131
  from .secret_stores_pb2 import *
126
132
  from .secret_stores_pb2_grpc import *
133
+ from .secret_engines_pb2 import *
134
+ from .secret_engines_pb2_grpc import *
127
135
  from .secret_store_healths_pb2 import *
128
136
  from .secret_store_healths_pb2_grpc import *
129
137
  from .secret_stores_history_pb2 import *
@@ -2629,6 +2637,367 @@ class IdentitySetsHistory:
2629
2637
  return generator(self, req)
2630
2638
 
2631
2639
 
2640
+ class ManagedSecrets:
2641
+ '''
2642
+ ManagedSecret is a private vertical for creating, reading, updating,
2643
+ deleting, listing and rotating the managed secrets in the secrets engines as
2644
+ an authenticated user.
2645
+ See `strongdm.models.ManagedSecret`.
2646
+ '''
2647
+ def __init__(self, channel, client):
2648
+ self.parent = client
2649
+ self.stub = ManagedSecretsStub(channel)
2650
+
2651
+ def list(self, filter, *args, timeout=None):
2652
+ '''
2653
+ List returns Managed Secrets from a Secret Engine.
2654
+ '''
2655
+ req = ManagedSecretListRequest()
2656
+ req.meta.CopyFrom(ListRequestMetadata())
2657
+ if self.parent.page_limit > 0:
2658
+ req.meta.limit = self.parent.page_limit
2659
+ if self.parent.snapshot_datetime is not None:
2660
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
2661
+
2662
+ req.filter = plumbing.quote_filter_args(filter, *args)
2663
+
2664
+ def generator(svc, req):
2665
+ tries = 0
2666
+ while True:
2667
+ try:
2668
+ plumbing_response = svc.stub.List(
2669
+ req,
2670
+ metadata=svc.parent.get_metadata(
2671
+ 'ManagedSecrets.List', req),
2672
+ timeout=timeout)
2673
+ except Exception as e:
2674
+ if self.parent.shouldRetry(tries, e):
2675
+ tries += 1
2676
+ self.parent.jitterSleep(tries)
2677
+ continue
2678
+ raise plumbing.convert_error_to_porcelain(e) from e
2679
+ tries = 0
2680
+ for plumbing_item in plumbing_response.managed_secrets:
2681
+ yield plumbing.convert_managed_secret_to_porcelain(
2682
+ plumbing_item)
2683
+ if plumbing_response.meta.next_cursor == '':
2684
+ break
2685
+ req.meta.cursor = plumbing_response.meta.next_cursor
2686
+
2687
+ return generator(self, req)
2688
+
2689
+ def list_by_actor(self, filter, *args, timeout=None):
2690
+ '''
2691
+ List returns Managed Secrets for an Actor from a Secret Engine.
2692
+ '''
2693
+ req = ManagedSecretListRequest()
2694
+ req.meta.CopyFrom(ListRequestMetadata())
2695
+ if self.parent.page_limit > 0:
2696
+ req.meta.limit = self.parent.page_limit
2697
+ if self.parent.snapshot_datetime is not None:
2698
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
2699
+
2700
+ req.filter = plumbing.quote_filter_args(filter, *args)
2701
+
2702
+ def generator(svc, req):
2703
+ tries = 0
2704
+ while True:
2705
+ try:
2706
+ plumbing_response = svc.stub.ListByActor(
2707
+ req,
2708
+ metadata=svc.parent.get_metadata(
2709
+ 'ManagedSecrets.ListByActor', req),
2710
+ timeout=timeout)
2711
+ except Exception as e:
2712
+ if self.parent.shouldRetry(tries, e):
2713
+ tries += 1
2714
+ self.parent.jitterSleep(tries)
2715
+ continue
2716
+ raise plumbing.convert_error_to_porcelain(e) from e
2717
+ tries = 0
2718
+ for plumbing_item in plumbing_response.managed_secrets:
2719
+ yield plumbing.convert_managed_secret_to_porcelain(
2720
+ plumbing_item)
2721
+ if plumbing_response.meta.next_cursor == '':
2722
+ break
2723
+ req.meta.cursor = plumbing_response.meta.next_cursor
2724
+
2725
+ return generator(self, req)
2726
+
2727
+ def create(self, managed_secret, timeout=None):
2728
+ '''
2729
+ Create creates a Managed Secret
2730
+ '''
2731
+ req = ManagedSecretCreateRequest()
2732
+
2733
+ if managed_secret is not None:
2734
+ req.managed_secret.CopyFrom(
2735
+ plumbing.convert_managed_secret_to_plumbing(managed_secret))
2736
+ tries = 0
2737
+ plumbing_response = None
2738
+ while True:
2739
+ try:
2740
+ plumbing_response = self.stub.Create(
2741
+ req,
2742
+ metadata=self.parent.get_metadata('ManagedSecrets.Create',
2743
+ req),
2744
+ timeout=timeout)
2745
+ except Exception as e:
2746
+ if self.parent.shouldRetry(tries, e):
2747
+ tries += 1
2748
+ self.parent.jitterSleep(tries)
2749
+ continue
2750
+ raise plumbing.convert_error_to_porcelain(e) from e
2751
+ break
2752
+
2753
+ resp = models.ManagedSecretCreateResponse()
2754
+ resp.managed_secret = plumbing.convert_managed_secret_to_porcelain(
2755
+ plumbing_response.managed_secret)
2756
+ resp.meta = plumbing.convert_create_response_metadata_to_porcelain(
2757
+ plumbing_response.meta)
2758
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2759
+ plumbing_response.rate_limit)
2760
+ return resp
2761
+
2762
+ def update(self, managed_secret, timeout=None):
2763
+ '''
2764
+ Update updates a Managed Secret
2765
+ '''
2766
+ req = ManagedSecretUpdateRequest()
2767
+
2768
+ if managed_secret is not None:
2769
+ req.managed_secret.CopyFrom(
2770
+ plumbing.convert_managed_secret_to_plumbing(managed_secret))
2771
+ tries = 0
2772
+ plumbing_response = None
2773
+ while True:
2774
+ try:
2775
+ plumbing_response = self.stub.Update(
2776
+ req,
2777
+ metadata=self.parent.get_metadata('ManagedSecrets.Update',
2778
+ req),
2779
+ timeout=timeout)
2780
+ except Exception as e:
2781
+ if self.parent.shouldRetry(tries, e):
2782
+ tries += 1
2783
+ self.parent.jitterSleep(tries)
2784
+ continue
2785
+ raise plumbing.convert_error_to_porcelain(e) from e
2786
+ break
2787
+
2788
+ resp = models.ManagedSecretUpdateResponse()
2789
+ resp.managed_secret = plumbing.convert_managed_secret_to_porcelain(
2790
+ plumbing_response.managed_secret)
2791
+ resp.meta = plumbing.convert_update_response_metadata_to_porcelain(
2792
+ plumbing_response.meta)
2793
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2794
+ plumbing_response.rate_limit)
2795
+ return resp
2796
+
2797
+ def rotate(self, id, timeout=None):
2798
+ '''
2799
+ Rotate forces rotation of Managed Secret
2800
+ '''
2801
+ req = ManagedSecretRotateRequest()
2802
+
2803
+ req.id = (id)
2804
+ tries = 0
2805
+ plumbing_response = None
2806
+ while True:
2807
+ try:
2808
+ plumbing_response = self.stub.Rotate(
2809
+ req,
2810
+ metadata=self.parent.get_metadata('ManagedSecrets.Rotate',
2811
+ req),
2812
+ timeout=timeout)
2813
+ except Exception as e:
2814
+ if self.parent.shouldRetry(tries, e):
2815
+ tries += 1
2816
+ self.parent.jitterSleep(tries)
2817
+ continue
2818
+ raise plumbing.convert_error_to_porcelain(e) from e
2819
+ break
2820
+
2821
+ resp = models.ManagedSecretRotateResponse()
2822
+ resp.meta = plumbing.convert_generic_response_metadata_to_porcelain(
2823
+ plumbing_response.meta)
2824
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2825
+ plumbing_response.rate_limit)
2826
+ return resp
2827
+
2828
+ def delete(self, id, timeout=None):
2829
+ '''
2830
+ Delete deletes a Managed Secret
2831
+ '''
2832
+ req = ManagedSecretDeleteRequest()
2833
+
2834
+ req.id = (id)
2835
+ tries = 0
2836
+ plumbing_response = None
2837
+ while True:
2838
+ try:
2839
+ plumbing_response = self.stub.Delete(
2840
+ req,
2841
+ metadata=self.parent.get_metadata('ManagedSecrets.Delete',
2842
+ req),
2843
+ timeout=timeout)
2844
+ except Exception as e:
2845
+ if self.parent.shouldRetry(tries, e):
2846
+ tries += 1
2847
+ self.parent.jitterSleep(tries)
2848
+ continue
2849
+ raise plumbing.convert_error_to_porcelain(e) from e
2850
+ break
2851
+
2852
+ resp = models.ManagedSecretDeleteResponse()
2853
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2854
+ plumbing_response.rate_limit)
2855
+ return resp
2856
+
2857
+ def get(self, id, timeout=None):
2858
+ '''
2859
+ Get gets details of a Managed Secret without sensitive data
2860
+ '''
2861
+ req = ManagedSecretGetRequest()
2862
+ if self.parent.snapshot_datetime is not None:
2863
+ req.meta.CopyFrom(GetRequestMetadata())
2864
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
2865
+
2866
+ req.id = (id)
2867
+ tries = 0
2868
+ plumbing_response = None
2869
+ while True:
2870
+ try:
2871
+ plumbing_response = self.stub.Get(
2872
+ req,
2873
+ metadata=self.parent.get_metadata('ManagedSecrets.Get',
2874
+ req),
2875
+ timeout=timeout)
2876
+ except Exception as e:
2877
+ if self.parent.shouldRetry(tries, e):
2878
+ tries += 1
2879
+ self.parent.jitterSleep(tries)
2880
+ continue
2881
+ raise plumbing.convert_error_to_porcelain(e) from e
2882
+ break
2883
+
2884
+ resp = models.ManagedSecretGetResponse()
2885
+ resp.managed_secret = plumbing.convert_managed_secret_to_porcelain(
2886
+ plumbing_response.managed_secret)
2887
+ resp.meta = plumbing.convert_get_response_metadata_to_porcelain(
2888
+ plumbing_response.meta)
2889
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2890
+ plumbing_response.rate_limit)
2891
+ return resp
2892
+
2893
+ def retrieve(self, id, public_key, timeout=None):
2894
+ '''
2895
+ Retrieve returns Managed Secret with sensitive data
2896
+ '''
2897
+ req = ManagedSecretRetrieveRequest()
2898
+
2899
+ req.id = (id)
2900
+ req.public_key = (public_key)
2901
+ tries = 0
2902
+ plumbing_response = None
2903
+ while True:
2904
+ try:
2905
+ plumbing_response = self.stub.Retrieve(
2906
+ req,
2907
+ metadata=self.parent.get_metadata(
2908
+ 'ManagedSecrets.Retrieve', req),
2909
+ timeout=timeout)
2910
+ except Exception as e:
2911
+ if self.parent.shouldRetry(tries, e):
2912
+ tries += 1
2913
+ self.parent.jitterSleep(tries)
2914
+ continue
2915
+ raise plumbing.convert_error_to_porcelain(e) from e
2916
+ break
2917
+
2918
+ resp = models.ManagedSecretRetrieveResponse()
2919
+ resp.managed_secret = plumbing.convert_managed_secret_to_porcelain(
2920
+ plumbing_response.managed_secret)
2921
+ resp.meta = plumbing.convert_get_response_metadata_to_porcelain(
2922
+ plumbing_response.meta)
2923
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2924
+ plumbing_response.rate_limit)
2925
+ return resp
2926
+
2927
+ def validate(self, id, timeout=None):
2928
+ '''
2929
+ Validate returns the result of testing the stored credential against the
2930
+ secret engine.
2931
+ '''
2932
+ req = ManagedSecretValidateRequest()
2933
+
2934
+ req.id = (id)
2935
+ tries = 0
2936
+ plumbing_response = None
2937
+ while True:
2938
+ try:
2939
+ plumbing_response = self.stub.Validate(
2940
+ req,
2941
+ metadata=self.parent.get_metadata(
2942
+ 'ManagedSecrets.Validate', req),
2943
+ timeout=timeout)
2944
+ except Exception as e:
2945
+ if self.parent.shouldRetry(tries, e):
2946
+ tries += 1
2947
+ self.parent.jitterSleep(tries)
2948
+ continue
2949
+ raise plumbing.convert_error_to_porcelain(e) from e
2950
+ break
2951
+
2952
+ resp = models.ManagedSecretValidateResponse()
2953
+ resp.invalid_info = (plumbing_response.invalid_info)
2954
+ resp.meta = plumbing.convert_get_response_metadata_to_porcelain(
2955
+ plumbing_response.meta)
2956
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
2957
+ plumbing_response.rate_limit)
2958
+ resp.valid = (plumbing_response.valid)
2959
+ return resp
2960
+
2961
+ def logs(self, filter, *args, timeout=None):
2962
+ '''
2963
+ Logs returns the audit records for the managed secret. This may be replaced
2964
+ in the future.
2965
+ '''
2966
+ req = ManagedSecretLogsRequest()
2967
+ req.meta.CopyFrom(ListRequestMetadata())
2968
+ if self.parent.page_limit > 0:
2969
+ req.meta.limit = self.parent.page_limit
2970
+ if self.parent.snapshot_datetime is not None:
2971
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
2972
+
2973
+ req.filter = plumbing.quote_filter_args(filter, *args)
2974
+
2975
+ def generator(svc, req):
2976
+ tries = 0
2977
+ while True:
2978
+ try:
2979
+ plumbing_response = svc.stub.Logs(
2980
+ req,
2981
+ metadata=svc.parent.get_metadata(
2982
+ 'ManagedSecrets.Logs', req),
2983
+ timeout=timeout)
2984
+ except Exception as e:
2985
+ if self.parent.shouldRetry(tries, e):
2986
+ tries += 1
2987
+ self.parent.jitterSleep(tries)
2988
+ continue
2989
+ raise plumbing.convert_error_to_porcelain(e) from e
2990
+ tries = 0
2991
+ for plumbing_item in plumbing_response.managed_secret_logs:
2992
+ yield plumbing.convert_managed_secret_log_to_porcelain(
2993
+ plumbing_item)
2994
+ if plumbing_response.meta.next_cursor == '':
2995
+ break
2996
+ req.meta.cursor = plumbing_response.meta.next_cursor
2997
+
2998
+ return generator(self, req)
2999
+
3000
+
2632
3001
  class Nodes:
2633
3002
  '''
2634
3003
  Nodes make up the strongDM network, and allow your users to connect securely to your resources. There are two types of nodes:
@@ -5454,6 +5823,323 @@ class SnapshotSecretStores:
5454
5823
  return self.secret_stores.list(filter, *args, timeout=timeout)
5455
5824
 
5456
5825
 
5826
+ class SecretEngines:
5827
+ '''
5828
+
5829
+ See:
5830
+ `strongdm.models.ActiveDirectoryEngine`
5831
+ `strongdm.models.KeyValueEngine`
5832
+ '''
5833
+ def __init__(self, channel, client):
5834
+ self.parent = client
5835
+ self.stub = SecretEnginesStub(channel)
5836
+
5837
+ def list(self, filter, *args, timeout=None):
5838
+ '''
5839
+ List returns a list of Secret Engines
5840
+ '''
5841
+ req = SecretEngineListRequest()
5842
+ req.meta.CopyFrom(ListRequestMetadata())
5843
+ if self.parent.page_limit > 0:
5844
+ req.meta.limit = self.parent.page_limit
5845
+ if self.parent.snapshot_datetime is not None:
5846
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
5847
+
5848
+ req.filter = plumbing.quote_filter_args(filter, *args)
5849
+
5850
+ def generator(svc, req):
5851
+ tries = 0
5852
+ while True:
5853
+ try:
5854
+ plumbing_response = svc.stub.List(
5855
+ req,
5856
+ metadata=svc.parent.get_metadata(
5857
+ 'SecretEngines.List', req),
5858
+ timeout=timeout)
5859
+ except Exception as e:
5860
+ if self.parent.shouldRetry(tries, e):
5861
+ tries += 1
5862
+ self.parent.jitterSleep(tries)
5863
+ continue
5864
+ raise plumbing.convert_error_to_porcelain(e) from e
5865
+ tries = 0
5866
+ for plumbing_item in plumbing_response.secret_engines:
5867
+ yield plumbing.convert_secret_engine_to_porcelain(
5868
+ plumbing_item)
5869
+ if plumbing_response.meta.next_cursor == '':
5870
+ break
5871
+ req.meta.cursor = plumbing_response.meta.next_cursor
5872
+
5873
+ return generator(self, req)
5874
+
5875
+ def get(self, id, timeout=None):
5876
+ '''
5877
+ Get returns a secret engine details
5878
+ '''
5879
+ req = SecretEngineGetRequest()
5880
+ if self.parent.snapshot_datetime is not None:
5881
+ req.meta.CopyFrom(GetRequestMetadata())
5882
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
5883
+
5884
+ req.id = (id)
5885
+ tries = 0
5886
+ plumbing_response = None
5887
+ while True:
5888
+ try:
5889
+ plumbing_response = self.stub.Get(
5890
+ req,
5891
+ metadata=self.parent.get_metadata('SecretEngines.Get',
5892
+ req),
5893
+ timeout=timeout)
5894
+ except Exception as e:
5895
+ if self.parent.shouldRetry(tries, e):
5896
+ tries += 1
5897
+ self.parent.jitterSleep(tries)
5898
+ continue
5899
+ raise plumbing.convert_error_to_porcelain(e) from e
5900
+ break
5901
+
5902
+ resp = models.SecretEngineGetResponse()
5903
+ resp.meta = plumbing.convert_get_response_metadata_to_porcelain(
5904
+ plumbing_response.meta)
5905
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
5906
+ plumbing_response.rate_limit)
5907
+ resp.secret_engine = plumbing.convert_secret_engine_to_porcelain(
5908
+ plumbing_response.secret_engine)
5909
+ return resp
5910
+
5911
+ def create(self, secret_engine, timeout=None):
5912
+ '''
5913
+ Create creates a secret engine
5914
+ '''
5915
+ req = SecretEngineCreateRequest()
5916
+
5917
+ if secret_engine is not None:
5918
+ req.secret_engine.CopyFrom(
5919
+ plumbing.convert_secret_engine_to_plumbing(secret_engine))
5920
+ tries = 0
5921
+ plumbing_response = None
5922
+ while True:
5923
+ try:
5924
+ plumbing_response = self.stub.Create(
5925
+ req,
5926
+ metadata=self.parent.get_metadata('SecretEngines.Create',
5927
+ req),
5928
+ timeout=timeout)
5929
+ except Exception as e:
5930
+ if self.parent.shouldRetry(tries, e):
5931
+ tries += 1
5932
+ self.parent.jitterSleep(tries)
5933
+ continue
5934
+ raise plumbing.convert_error_to_porcelain(e) from e
5935
+ break
5936
+
5937
+ resp = models.SecretEngineCreateResponse()
5938
+ resp.meta = plumbing.convert_create_response_metadata_to_porcelain(
5939
+ plumbing_response.meta)
5940
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
5941
+ plumbing_response.rate_limit)
5942
+ resp.secret_engine = plumbing.convert_secret_engine_to_porcelain(
5943
+ plumbing_response.secret_engine)
5944
+ return resp
5945
+
5946
+ def update(self, secret_engine, timeout=None):
5947
+ '''
5948
+ Update updates a secret engine
5949
+ '''
5950
+ req = SecretEngineUpdateRequest()
5951
+
5952
+ if secret_engine is not None:
5953
+ req.secret_engine.CopyFrom(
5954
+ plumbing.convert_secret_engine_to_plumbing(secret_engine))
5955
+ tries = 0
5956
+ plumbing_response = None
5957
+ while True:
5958
+ try:
5959
+ plumbing_response = self.stub.Update(
5960
+ req,
5961
+ metadata=self.parent.get_metadata('SecretEngines.Update',
5962
+ req),
5963
+ timeout=timeout)
5964
+ except Exception as e:
5965
+ if self.parent.shouldRetry(tries, e):
5966
+ tries += 1
5967
+ self.parent.jitterSleep(tries)
5968
+ continue
5969
+ raise plumbing.convert_error_to_porcelain(e) from e
5970
+ break
5971
+
5972
+ resp = models.SecretEngineUpdateResponse()
5973
+ resp.meta = plumbing.convert_update_response_metadata_to_porcelain(
5974
+ plumbing_response.meta)
5975
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
5976
+ plumbing_response.rate_limit)
5977
+ resp.secret_engine = plumbing.convert_secret_engine_to_porcelain(
5978
+ plumbing_response.secret_engine)
5979
+ return resp
5980
+
5981
+ def delete(self, id, timeout=None):
5982
+ '''
5983
+ Delete deletes a secret engine
5984
+ '''
5985
+ req = SecretEngineDeleteRequest()
5986
+
5987
+ req.id = (id)
5988
+ tries = 0
5989
+ plumbing_response = None
5990
+ while True:
5991
+ try:
5992
+ plumbing_response = self.stub.Delete(
5993
+ req,
5994
+ metadata=self.parent.get_metadata('SecretEngines.Delete',
5995
+ req),
5996
+ timeout=timeout)
5997
+ except Exception as e:
5998
+ if self.parent.shouldRetry(tries, e):
5999
+ tries += 1
6000
+ self.parent.jitterSleep(tries)
6001
+ continue
6002
+ raise plumbing.convert_error_to_porcelain(e) from e
6003
+ break
6004
+
6005
+ resp = models.SecretEngineDeleteResponse()
6006
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
6007
+ plumbing_response.rate_limit)
6008
+ return resp
6009
+
6010
+ def list_secret_stores(self, filter, *args, timeout=None):
6011
+ '''
6012
+ ListSecretStores returns a list of Secret Stores that can be used as a backing store
6013
+ for Secret Engine
6014
+ '''
6015
+ req = SecretStoreListRequest()
6016
+ req.meta.CopyFrom(ListRequestMetadata())
6017
+ if self.parent.page_limit > 0:
6018
+ req.meta.limit = self.parent.page_limit
6019
+ if self.parent.snapshot_datetime is not None:
6020
+ req.meta.snapshot_at.FromDatetime(self.parent.snapshot_datetime)
6021
+
6022
+ req.filter = plumbing.quote_filter_args(filter, *args)
6023
+
6024
+ def generator(svc, req):
6025
+ tries = 0
6026
+ while True:
6027
+ try:
6028
+ plumbing_response = svc.stub.ListSecretStores(
6029
+ req,
6030
+ metadata=svc.parent.get_metadata(
6031
+ 'SecretEngines.ListSecretStores', req),
6032
+ timeout=timeout)
6033
+ except Exception as e:
6034
+ if self.parent.shouldRetry(tries, e):
6035
+ tries += 1
6036
+ self.parent.jitterSleep(tries)
6037
+ continue
6038
+ raise plumbing.convert_error_to_porcelain(e) from e
6039
+ tries = 0
6040
+ for plumbing_item in plumbing_response.secret_stores:
6041
+ yield plumbing.convert_secret_store_to_porcelain(
6042
+ plumbing_item)
6043
+ if plumbing_response.meta.next_cursor == '':
6044
+ break
6045
+ req.meta.cursor = plumbing_response.meta.next_cursor
6046
+
6047
+ return generator(self, req)
6048
+
6049
+ def generate_keys(self, secret_engine_id, timeout=None):
6050
+ '''
6051
+ GenerateKeys generates a private key, stores it in a secret store and stores a public key in a secret engine
6052
+ '''
6053
+ req = GenerateKeysRequest()
6054
+
6055
+ req.secret_engine_id = (secret_engine_id)
6056
+ tries = 0
6057
+ plumbing_response = None
6058
+ while True:
6059
+ try:
6060
+ plumbing_response = self.stub.GenerateKeys(
6061
+ req,
6062
+ metadata=self.parent.get_metadata(
6063
+ 'SecretEngines.GenerateKeys', req),
6064
+ timeout=timeout)
6065
+ except Exception as e:
6066
+ if self.parent.shouldRetry(tries, e):
6067
+ tries += 1
6068
+ self.parent.jitterSleep(tries)
6069
+ continue
6070
+ raise plumbing.convert_error_to_porcelain(e) from e
6071
+ break
6072
+
6073
+ resp = models.GenerateKeysResponse()
6074
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
6075
+ plumbing_response.rate_limit)
6076
+ return resp
6077
+
6078
+ def healthcheck(self, secret_engine_id, timeout=None):
6079
+ '''
6080
+ Healthcheck triggers a healthcheck for all nodes serving a secret engine
6081
+ '''
6082
+ req = HealthcheckRequest()
6083
+
6084
+ req.secret_engine_id = (secret_engine_id)
6085
+ tries = 0
6086
+ plumbing_response = None
6087
+ while True:
6088
+ try:
6089
+ plumbing_response = self.stub.Healthcheck(
6090
+ req,
6091
+ metadata=self.parent.get_metadata(
6092
+ 'SecretEngines.Healthcheck', req),
6093
+ timeout=timeout)
6094
+ except Exception as e:
6095
+ if self.parent.shouldRetry(tries, e):
6096
+ tries += 1
6097
+ self.parent.jitterSleep(tries)
6098
+ continue
6099
+ raise plumbing.convert_error_to_porcelain(e) from e
6100
+ break
6101
+
6102
+ resp = models.HealthcheckResponse()
6103
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
6104
+ plumbing_response.rate_limit)
6105
+ resp.status = plumbing.convert_repeated_healthcheck_status_to_porcelain(
6106
+ plumbing_response.status)
6107
+ return resp
6108
+
6109
+ def rotate(self, id, password_policy, timeout=None):
6110
+ '''
6111
+ Rotate rotates secret engine's credentials
6112
+ '''
6113
+ req = SecretEngineRotateRequest()
6114
+
6115
+ req.id = (id)
6116
+ if password_policy is not None:
6117
+ req.password_policy.CopyFrom(
6118
+ plumbing.convert_secret_engine_password_policy_to_plumbing(
6119
+ password_policy))
6120
+ tries = 0
6121
+ plumbing_response = None
6122
+ while True:
6123
+ try:
6124
+ plumbing_response = self.stub.Rotate(
6125
+ req,
6126
+ metadata=self.parent.get_metadata('SecretEngines.Rotate',
6127
+ req),
6128
+ timeout=timeout)
6129
+ except Exception as e:
6130
+ if self.parent.shouldRetry(tries, e):
6131
+ tries += 1
6132
+ self.parent.jitterSleep(tries)
6133
+ continue
6134
+ raise plumbing.convert_error_to_porcelain(e) from e
6135
+ break
6136
+
6137
+ resp = models.SecretEngineRotateResponse()
6138
+ resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
6139
+ plumbing_response.rate_limit)
6140
+ return resp
6141
+
6142
+
5457
6143
  class SecretStoreHealths:
5458
6144
  '''
5459
6145
  SecretStoreHealths exposes health states for secret stores.