Skip to content

Instantly share code, notes, and snippets.

@tfogo
Last active August 26, 2019 14:14
Show Gist options
  • Save tfogo/5d02d31f8d337422f88e6c5482c6d224 to your computer and use it in GitHub Desktop.
Save tfogo/5d02d31f8d337422f88e6c5482c6d224 to your computer and use it in GitHub Desktop.
Automate deploying with the mLab Management API
###################################################
# Automate deploying with the mLab Management API #
# Link Here: #
###################################################
#################
# STEP 0: Setup #
#################
import os # for getting environment variables
import requests # for making HTTP requests
import json # for formatting JSON responses
from time import sleep # for sleeping between status requests
from pymongo import MongoClient # for querying the cluster
json_settings = {
'sort_keys': True,
'indent': 4
}
BASE_URL = 'https://v1.api.mlab.com'
# Get your key headers from environment variables
headers = {
'access-key-id': os.getenv('MLAB_KEY_ID'),
'access-key-secret': os.getenv('MLAB_KEY_SECRET')
}
##########################
# STEP 1: Get Account ID #
##########################
# Send a request to /me
response = requests.get(f'{BASE_URL}/me', headers=headers)
response.raise_for_status() # Raise an error if not a 2XX status code
print("me Response:\n" + json.dumps(response.json(), **json_settings) + "\n")
# Get your account ID from the request
account_id = response.json()['account']['_id']
print("Account ID:\n" + account_id + "\n")
############################
# STEP 2: Create a Cluster #
############################
json_data = {
'plan': 'aws-m1-std-cluster-v2',
'provider': 'aws',
'region': 'us-east-1',
'dbName': 'test-database',
'initialDbUser': {
'username': 'db_user',
'password': 'secure_pass' # Make sure to use a secure password
},
'sslMode': 'deployment',
'name': 'new_deployment',
'environment': 'EnvironmentId' # Substitute your own environment ID
}
response = requests.post(f'{BASE_URL}/accounts/{account_id}/deployments', headers=headers, json=json_data)
response.raise_for_status() # Raise an error if not a 2XX status code
deployment = response.json()
deployment_id = deployment['_id']
print("Provisioning request enqueued:\n" + json.dumps(deployment, **json_settings) + "\n")
connection_uri = deployment['connectionInfo']['uriTemplate'].format(**options.initialDbUser)
#######################################
# STEP 3: Check when cluster is built #
#######################################
status = ''
while status != 'OK':
sleep(10)
uri = f'{BASE_URL}/accounts/{account_id}/deployments/{deployment_id}/status'
response = requests.get(uri, headers=headers)
response.raise_for_status() # Raise an error if not a 2XX status code
status = response.json()['status']
print("Status: " + status)
# If there's a problem building the cluster, throw an error.
if status == 'ERROR':
raise Exception("Error building cluster")
##############################
# STEP 4: Add firewall rules #
##############################
firewall_rules = {
'inboundAllowRules': [
{
'description': 'Open internet',
'ipAddressSpace': '0.0.0.0/0'
}
]
}
response = requests.put(f'{BASE_URL}/accounts/{account_id}/deployments/{deployment_id}/firewall', headers=headers, json=firewall_rules)
response.raise_for_status() # Raise an error if not a 2XX status code
print("Added firewall rule:\n" + json.dumps(response.json(), **json_settings) + "\n")
######################################
# STEP 5: Query cluster with pymongo #
######################################
client = MongoClient(connection_uri)
db = client[options['dbName']]
db['test_collection'].insert_one({'firstname': 'Ada', 'lastname': 'Lovelace'})
print("Query result:\n" + db['test_collection'].find_one())
@ennisa-ire
Copy link

👍 thank you sir for responding, ill get onto the good folks at mlab and see what can be done. Out of interest, are you still using your script today, I suppose what I am saying, is the beta albeit closed, still operational?

@tfogo
Copy link
Author

tfogo commented Aug 26, 2019

I'm not still using the script, but any changes to the API have been minimal since MongoDB's acquisition of mLab. Since mLab is migrating all users to MongoDB Atlas, you may want to look at using the MongoDB Atlas API too.

@ennisa-ire
Copy link

Yes thank you, I had a look at this API, but unfortunately I didn't see anything that suggest I could create a new deployment, aka new database via this new mongdb API , which is where I wanted to get to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment