Expose MongoDB Atlas Cloud provider APIs
Project description
Python Bindings for the Atlas Public API
This project intends to create a fairly opinionated set of bindings for the Atlas Public API which makes interacting with Atlas using Python easier. The API makes extensive use of enums and other helper type objects to take some of the guess work of administering Atlas clusters with Python.
In most cases objects will be returned based upon the structure of the json returned but the API Endpoints. These objects are defined either in the specs.py module or in a module named after the objects themselves (alerts.py for example).
All calls to the Atlas API require API credentials, you can configure them in your Atlas project.
Current state of the python-atlasapi support
Documentation
Found at https://python-atlasapi.readthedocs.io/
Autobuilt on each commit.
Installation
This package is available for Python 3.6+.
You can install the latest released version from pypi.
pip3 install atlasapi
Usage
Get All Database Users
from atlasapi.atlas import Atlas
a = Atlas("<user>","<password>","<groupid>")
# Low level Api
details = a.DatabaseUsers.get_all_database_users(pageNum=1, itemsPerPage=100)
# Iterable
for user in a.DatabaseUsers.get_all_database_users(iterable=True):
print(user["username"])
Create a Database User
from atlasapi.atlas import Atlas
from atlasapi.specs import DatabaseUsersPermissionsSpecs, RoleSpecs
a = Atlas("<user>","<password>","<groupid>")
p = DatabaseUsersPermissionsSpecs("test", "password for test user")
p.add_roles("test-db",
[RoleSpecs.dbAdmin,
RoleSpecs.readWrite])
p.add_role("other-test-db", RoleSpecs.readWrite, "a_collection")
details = a.DatabaseUsers.create_a_database_user(p)
Update a Database User
from atlasapi.atlas import Atlas
from atlasapi.specs import DatabaseUsersUpdatePermissionsSpecs, RoleSpecs
a = Atlas("<user>","<password>","<groupid>")
# Update roles and password
p = DatabaseUsersUpdatePermissionsSpecs("password for test user")
p.add_role("test-db", RoleSpecs.read, "a_collection")
details = a.DatabaseUsers.update_a_database_user("test", p)
Delete a Database User
from atlasapi.atlas import Atlas
a = Atlas("<user>","<password>","<groupid>")
details = a.DatabaseUsers.delete_a_database_user("test")
Get a Single Database User
from atlasapi.atlas import Atlas
a = Atlas("<user>","<password>","<groupid>")
details = a.DatabaseUsers.get_a_single_database_user("test")
Clusters
from atlasapi.atlas import Atlas
from atlasapi.clusters import AdvancedOptions
a = Atlas("<user>","<password>","<groupid>")
# Is existing cluster ?
a.Clusters.is_existing_cluster("cluster-dev")
# Get All Clusters
for cluster in a.Clusters.get_all_clusters(iterable=True):
print(cluster["name"])
# Get a Single Cluster
details = a.Clusters.get_single_cluster("cluster-dev")
# Delete a Cluster (dry run, raise ErrConfirmationRequested)
details = a.Clusters.delete_cluster("cluster-dev")
# Delete a Cluster (approved)
details = a.Clusters.delete_cluster("cluster-dev", areYouSure=True)
# Create a Simple Replica Set Cluster
details = a.Clusters.create_basic_rs(name="cluster-dev")
# Create a cluster
provider_settings: ProviderSettings = ProviderSettings()
regions_config = RegionConfig()
replication_specs = ReplicationSpecs(regions_config={provider_settings.region_name: regions_config.__dict__})
cluster_config = ClusterConfig(name='test2',
providerSettings=provider_settings,
replication_specs=replication_specs)
output = a.Clusters.create_cluster(cluster_config)
# Modify a cluster
existing_config = a.Clusters.get_single_cluster_as_obj(cluster=TEST_CLUSTER_NAME)
out.providerSettings.instance_size_name = InstanceSizeName.M10
out.disk_size_gb = 13
new_config = a.Clusters.modify_cluster('pyAtlasAPIClustersTest', out)
pprint(new_config)
# Modify cluster instance size
a.Clusters.modify_cluster_instanct_size(cluster='pyAtlasAPIClustersTest',new_cluster_size=InstanceSizeName.M20)
# Pause(unpause) a cluster
a.Clusters.pause_cluster(cluster='pyAtlasAPIClustersTest', toggle_if_paused=True)
# Get Advanced Options
a.Clusters.get_single_cluster_advanced_options(cluster='pyAtlasAPIClustersTest')
# Set Advanced Options
options = AdvancedOptions(failIndexKeyTooLong=True)
self.a.Clusters.modify_cluster_advanced_options(cluster='pyAtlasAPIClustersTest',
advanced_options=options)
Alerts
from atlasapi.atlas import Atlas
from atlasapi.specs import AlertStatusSpec
a = Atlas("<user>","<password>","<groupid>")
# Get All Alerts in OPEN status
for alert in a.Alerts.get_all_alerts(AlertStatusSpec.OPEN, iterable=True):
print(alert["id"])
# Get an Alert
details = a.Alerts.get_an_alert("597f221fdf9db113ce1755cd")
# Acknowledge an Alert (BROKEN)
# until (now + 6 hours)
from datetime import datetime, timezone, timedelta
now = datetime.now(timezone.utc)
until = now + timedelta(hours=6)
details = a.Alerts.acknowledge_an_alert("597f221fdf9db113ce1755cd", until, "Acknowledge reason")
# forever (BROKEN)
details = a.Alerts.acknowledge_an_alert_forever("597f221fdf9db113ce1755cd", "Acknowledge reason")
# Unacknowledge an Alert (BROKEN
details = a.Alerts.unacknowledge_an_alert("597f221fdf9db113ce1755cd")
Metrics (Measurements)
Examples coming soon.
Logs
from atlasapi.atlas import Atlas
from atlasapi.specs import AlertStatusSpec
atlas = Atlas("<user>","<password>","<groupid>")
atlas.Hosts.fill_host_list()
test_host = atlas.Hosts.host_list[0]
print(f'Will get a mongod log for {test_host.hostname}')
out = atlas.Hosts.get_loglines_for_host(host_obj=test_host, log_name=AtlasLogNames.MONGODB)
for each_line in out:
print(each_line.__dict__)
Whitelists
Examples coming soon.
Maintenance Windows
Examples coming soon.
Error Types
About ErrAtlasGeneric
All ErrAtlas* Exception class inherit from ErrAtlasGeneric.
try:
...
except ErrAtlasGeneric as e:
c, details = e.getAtlasResponse()
- ‘c’
HTTP return code (4xx or 5xx for an error, 2xx otherwise)
- ‘details’
Response payload
Exceptions
- ErrRole
A role is not compatible with Atlas
- ErrPagination
An issue occurs during a “Get All” function with ‘iterable=True’
- ErrPaginationLimits
Out of limit on ‘pageNum’ or ‘itemsPerPage’ parameters
- ErrAtlasBadRequest
Something was wrong with the client request.
- ErrAtlasUnauthorized
Authentication is required
- ErrAtlasForbidden
Access to the specified resource is not permitted.
- ErrAtlasNotFound
The requested resource does not exist.
- ErrAtlasMethodNotAllowed
The HTTP method is not supported for the specified resource.
- ErrAtlasConflict
This is typically the response to a request to create or modify a property of an entity that is unique when an existing entity already exists with the same value for that property.
- ErrAtlasServerErrors
Something unexpected went wrong.
- ErrConfirmationRequested
Confirmation requested to execute the call.
Bugs or Issues
Please report bugs, issues or feature requests to Github Issues
Testing
develop
master
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file atlasapi-2.0.11.tar.gz
.
File metadata
- Download URL: atlasapi-2.0.11.tar.gz
- Upload date:
- Size: 74.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c7ee0edd23f459ae5df2d6b24fc33fd6772da3b1b41856760638b537890ecec |
|
MD5 | 8feb13e9422f1983b5b3fc90aa3dbf6d |
|
BLAKE2b-256 | e1d3c090222b53a94d0910f3d0a646b0df8f3df4b3f7fd897864f454f0c3f746 |
File details
Details for the file atlasapi-2.0.11-py3-none-any.whl
.
File metadata
- Download URL: atlasapi-2.0.11-py3-none-any.whl
- Upload date:
- Size: 90.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0474c53b3245fe2a048411aee30380e984fca0a03a6965a9855763e8a33bfc4b |
|
MD5 | fcd78bc91f97773f1364ebbcc894144c |
|
BLAKE2b-256 | da1b046ba4a8e89d4061d168602f7037807633bf4e513ec76e995c29b2ed686b |