Skip to content

Commit 57c0a24

Browse files
committed
14.8.0
1 parent da7f4f2 commit 57c0a24

File tree

8 files changed

+469
-217
lines changed

8 files changed

+469
-217
lines changed

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
setup(
2424
name='strongdm',
2525
packages=['strongdm'],
26-
version='14.7.0',
26+
version='14.8.0',
2727
license='apache-2.0',
2828
description='strongDM SDK for the Python programming language.',
2929
long_description=long_description,
@@ -32,7 +32,7 @@
3232
author_email='[email protected]',
3333
url='https://github.com/strongdm/strongdm-sdk-python',
3434
download_url=
35-
'https://github.com/strongdm/strongdm-sdk-python/archive/v14.7.0.tar.gz',
35+
'https://github.com/strongdm/strongdm-sdk-python/archive/v14.8.0.tar.gz',
3636
keywords=[
3737
'strongDM', 'sdm', 'api', 'automation', 'security', 'audit',
3838
'database', 'server', 'ssh', 'rdp'

strongdm.egg-info/PKG-INFO

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
Metadata-Version: 2.1
22
Name: strongdm
3-
Version: 14.7.0
3+
Version: 14.8.0
44
Summary: strongDM SDK for the Python programming language.
55
Home-page: https://github.com/strongdm/strongdm-sdk-python
66
Author: strongDM Team
77
Author-email: [email protected]
88
License: apache-2.0
9-
Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v14.7.0.tar.gz
9+
Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v14.8.0.tar.gz
1010
Keywords: strongDM,sdm,api,automation,security,audit,database,server,ssh,rdp
1111
Platform: UNKNOWN
1212
Classifier: Development Status :: 4 - Beta

strongdm/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
DEFAULT_BASE_RETRY_DELAY = 0.0030 # 30 ms
3434
DEFAULT_MAX_RETRY_DELAY = 300 # 300 seconds
3535
API_VERSION = '2025-04-14'
36-
USER_AGENT = 'strongdm-sdk-python/14.7.0'
36+
USER_AGENT = 'strongdm-sdk-python/14.8.0'
3737

3838

3939
class Client:

strongdm/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ class MFAProvider:
9595
DUO = "duo"
9696
TOTP = "totp"
9797
OKTA = "okta"
98+
RSA = "rsa"
9899

99100

100101
# Activity Entities, all entity types that can be part of an activity.

strongdm/drivers_pb2.py

Lines changed: 254 additions & 212 deletions
Large diffs are not rendered by default.

strongdm/models.py

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3846,6 +3846,158 @@ def from_dict(cls, d):
38463846
)
38473847

38483848

3849+
class Aerospike:
3850+
'''
3851+
Aerospike is currently unstable, and its API may change, or it may be removed,
3852+
without a major version bump.
3853+
'''
3854+
__slots__ = [
3855+
'bind_interface',
3856+
'egress_filter',
3857+
'healthy',
3858+
'hostname',
3859+
'id',
3860+
'name',
3861+
'password',
3862+
'port',
3863+
'port_override',
3864+
'proxy_cluster_id',
3865+
'secret_store_id',
3866+
'subdomain',
3867+
'tags',
3868+
'username',
3869+
]
3870+
3871+
def __init__(
3872+
self,
3873+
bind_interface=None,
3874+
egress_filter=None,
3875+
healthy=None,
3876+
hostname=None,
3877+
id=None,
3878+
name=None,
3879+
password=None,
3880+
port=None,
3881+
port_override=None,
3882+
proxy_cluster_id=None,
3883+
secret_store_id=None,
3884+
subdomain=None,
3885+
tags=None,
3886+
username=None,
3887+
):
3888+
self.bind_interface = bind_interface if bind_interface is not None else ''
3889+
'''
3890+
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.
3891+
'''
3892+
self.egress_filter = egress_filter if egress_filter is not None else ''
3893+
'''
3894+
A filter applied to the routing logic to pin datasource to nodes.
3895+
'''
3896+
self.healthy = healthy if healthy is not None else False
3897+
'''
3898+
True if the datasource is reachable and the credentials are valid.
3899+
'''
3900+
self.hostname = hostname if hostname is not None else ''
3901+
'''
3902+
The host to dial to initiate a connection from the egress node to this resource.
3903+
'''
3904+
self.id = id if id is not None else ''
3905+
'''
3906+
Unique identifier of the Resource.
3907+
'''
3908+
self.name = name if name is not None else ''
3909+
'''
3910+
Unique human-readable name of the Resource.
3911+
'''
3912+
self.password = password if password is not None else ''
3913+
'''
3914+
The password to authenticate with.
3915+
'''
3916+
self.port = port if port is not None else 0
3917+
'''
3918+
The port to dial to initiate a connection from the egress node to this resource.
3919+
'''
3920+
self.port_override = port_override if port_override is not None else 0
3921+
'''
3922+
The local port used by clients to connect to this resource.
3923+
'''
3924+
self.proxy_cluster_id = proxy_cluster_id if proxy_cluster_id is not None else ''
3925+
'''
3926+
ID of the proxy cluster for this resource, if any.
3927+
'''
3928+
self.secret_store_id = secret_store_id if secret_store_id is not None else ''
3929+
'''
3930+
ID of the secret store containing credentials for this resource, if any.
3931+
'''
3932+
self.subdomain = subdomain if subdomain is not None else ''
3933+
'''
3934+
Subdomain is the local DNS address. (e.g. app-prod1 turns into app-prod1.your-org-name.sdm.network)
3935+
'''
3936+
self.tags = tags if tags is not None else _porcelain_zero_value_tags()
3937+
'''
3938+
Tags is a map of key, value pairs.
3939+
'''
3940+
self.username = username if username is not None else ''
3941+
'''
3942+
The username to authenticate with.
3943+
'''
3944+
3945+
def __repr__(self):
3946+
return '<sdm.Aerospike ' + \
3947+
'bind_interface: ' + repr(self.bind_interface) + ' ' +\
3948+
'egress_filter: ' + repr(self.egress_filter) + ' ' +\
3949+
'healthy: ' + repr(self.healthy) + ' ' +\
3950+
'hostname: ' + repr(self.hostname) + ' ' +\
3951+
'id: ' + repr(self.id) + ' ' +\
3952+
'name: ' + repr(self.name) + ' ' +\
3953+
'password: ' + repr(self.password) + ' ' +\
3954+
'port: ' + repr(self.port) + ' ' +\
3955+
'port_override: ' + repr(self.port_override) + ' ' +\
3956+
'proxy_cluster_id: ' + repr(self.proxy_cluster_id) + ' ' +\
3957+
'secret_store_id: ' + repr(self.secret_store_id) + ' ' +\
3958+
'subdomain: ' + repr(self.subdomain) + ' ' +\
3959+
'tags: ' + repr(self.tags) + ' ' +\
3960+
'username: ' + repr(self.username) + ' ' +\
3961+
'>'
3962+
3963+
def to_dict(self):
3964+
return {
3965+
'bind_interface': self.bind_interface,
3966+
'egress_filter': self.egress_filter,
3967+
'healthy': self.healthy,
3968+
'hostname': self.hostname,
3969+
'id': self.id,
3970+
'name': self.name,
3971+
'password': self.password,
3972+
'port': self.port,
3973+
'port_override': self.port_override,
3974+
'proxy_cluster_id': self.proxy_cluster_id,
3975+
'secret_store_id': self.secret_store_id,
3976+
'subdomain': self.subdomain,
3977+
'tags': self.tags,
3978+
'username': self.username,
3979+
}
3980+
3981+
@classmethod
3982+
def from_dict(cls, d):
3983+
return cls(
3984+
bind_interface=d.get('bind_interface'),
3985+
egress_filter=d.get('egress_filter'),
3986+
healthy=d.get('healthy'),
3987+
hostname=d.get('hostname'),
3988+
id=d.get('id'),
3989+
name=d.get('name'),
3990+
password=d.get('password'),
3991+
port=d.get('port'),
3992+
port_override=d.get('port_override'),
3993+
proxy_cluster_id=d.get('proxy_cluster_id'),
3994+
secret_store_id=d.get('secret_store_id'),
3995+
subdomain=d.get('subdomain'),
3996+
tags=d.get('tags'),
3997+
username=d.get('username'),
3998+
)
3999+
4000+
38494001
class AmazonEKS:
38504002
__slots__ = [
38514003
'access_key',

strongdm/plumbing.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2098,6 +2098,58 @@ def convert_repeated_activity_get_response_to_porcelain(plumbings):
20982098
]
20992099

21002100

2101+
def convert_aerospike_to_porcelain(plumbing):
2102+
if plumbing is None:
2103+
return None
2104+
porcelain = models.Aerospike()
2105+
porcelain.bind_interface = (plumbing.bind_interface)
2106+
porcelain.egress_filter = (plumbing.egress_filter)
2107+
porcelain.healthy = (plumbing.healthy)
2108+
porcelain.hostname = (plumbing.hostname)
2109+
porcelain.id = (plumbing.id)
2110+
porcelain.name = (plumbing.name)
2111+
porcelain.password = (plumbing.password)
2112+
porcelain.port = (plumbing.port)
2113+
porcelain.port_override = (plumbing.port_override)
2114+
porcelain.proxy_cluster_id = (plumbing.proxy_cluster_id)
2115+
porcelain.secret_store_id = (plumbing.secret_store_id)
2116+
porcelain.subdomain = (plumbing.subdomain)
2117+
porcelain.tags = convert_tags_to_porcelain(plumbing.tags)
2118+
porcelain.username = (plumbing.username)
2119+
return porcelain
2120+
2121+
2122+
def convert_aerospike_to_plumbing(porcelain):
2123+
plumbing = Aerospike()
2124+
if porcelain is None:
2125+
return plumbing
2126+
plumbing.bind_interface = (porcelain.bind_interface)
2127+
plumbing.egress_filter = (porcelain.egress_filter)
2128+
plumbing.healthy = (porcelain.healthy)
2129+
plumbing.hostname = (porcelain.hostname)
2130+
plumbing.id = (porcelain.id)
2131+
plumbing.name = (porcelain.name)
2132+
plumbing.password = (porcelain.password)
2133+
plumbing.port = (porcelain.port)
2134+
plumbing.port_override = (porcelain.port_override)
2135+
plumbing.proxy_cluster_id = (porcelain.proxy_cluster_id)
2136+
plumbing.secret_store_id = (porcelain.secret_store_id)
2137+
plumbing.subdomain = (porcelain.subdomain)
2138+
plumbing.tags.CopyFrom(convert_tags_to_plumbing(porcelain.tags))
2139+
plumbing.username = (porcelain.username)
2140+
return plumbing
2141+
2142+
2143+
def convert_repeated_aerospike_to_plumbing(porcelains):
2144+
return [
2145+
convert_aerospike_to_plumbing(porcelain) for porcelain in porcelains
2146+
]
2147+
2148+
2149+
def convert_repeated_aerospike_to_porcelain(plumbings):
2150+
return [convert_aerospike_to_porcelain(plumbing) for plumbing in plumbings]
2151+
2152+
21012153
def convert_amazon_eks_to_porcelain(plumbing):
21022154
if plumbing is None:
21032155
return None
@@ -11906,6 +11958,8 @@ def convert_resource_to_plumbing(porcelain):
1190611958
plumbing = Resource()
1190711959
if porcelain is None:
1190811960
return plumbing
11961+
if isinstance(porcelain, models.Aerospike):
11962+
plumbing.aerospike.CopyFrom(convert_aerospike_to_plumbing(porcelain))
1190911963
if isinstance(porcelain, models.AKS):
1191011964
plumbing.aks.CopyFrom(convert_aks_to_plumbing(porcelain))
1191111965
if isinstance(porcelain, models.AKSBasicAuth):
@@ -12181,6 +12235,8 @@ def convert_resource_to_plumbing(porcelain):
1218112235
def convert_resource_to_porcelain(plumbing):
1218212236
if plumbing is None:
1218312237
return None
12238+
if plumbing.HasField('aerospike'):
12239+
return convert_aerospike_to_porcelain(plumbing.aerospike)
1218412240
if plumbing.HasField('aks'):
1218512241
return convert_aks_to_porcelain(plumbing.aks)
1218612242
if plumbing.HasField('aks_basic_auth'):

strongdm/svc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4823,6 +4823,7 @@ class Resources:
48234823
Resources are databases, servers, clusters, websites, or clouds that strongDM
48244824
delegates access to.
48254825
See:
4826+
`strongdm.models.Aerospike`
48264827
`strongdm.models.AKS`
48274828
`strongdm.models.AKSBasicAuth`
48284829
`strongdm.models.AKSServiceAccount`

0 commit comments

Comments
 (0)