#!/usr/bin/env python

DOCUMENTATION = """
---
module: mongodb_rs_status
short_description: Get the status of a replica set of a mongo cluster.
description:
  - Get the status of the replica set of a mongo cluster. Provide the same info as rs.status() or replSetGetStatus.
version_added: "1.9"
author: Feanil Patel
options:
  host:
    description:
      - The hostname or ip of a server in the mongo cluster.
    required: false
    default: 'localhost'
  port:
    description:
      - The port to connect to mongo on.
    required: false
    default: 27017
  username:
    description:
      - The username of the mongo user to connect as.
    required: false
  password:
    description:
      - The password to use when authenticating.
    required: false
  auth_database:
    description:
      - The database to authenticate against.
    required: false
"""

EXAMPLES = '''
- name: Get status for the stage cluster
  mongo_status:
    host: localhost:27017
    username: root
    password: password
  register: mongo_status
'''
# Magic import
from ansible.module_utils.basic import *

try:
    from pymongo import MongoClient
    from bson import json_util
except ImportError:
    pymongo_found = False
else:
    pymongo_found = True

import json
from urllib import quote_plus

def main():

    arg_spec = dict(
        host=dict(required=False, type='str', default="localhost"),
        port=dict(required=False, type='int', default=27017),
        username=dict(required=False, type='str'),
        password=dict(required=False, type='str'),
        auth_database=dict(required=False, type='str')
    )

    module = AnsibleModule(argument_spec=arg_spec, supports_check_mode=False)

    if not pymongo_found:
        module.fail_json(msg="The python pymongo module is not installed.")

    mongo_uri = 'mongodb://'
    host = module.params.get('host')
    port = module.params.get('port')
    username = module.params.get('username')
    password = module.params.get('password')
    auth_database = module.params.get('auth_database')

    if (username and not password) or (password and not username):
        module.fail_json(msg="Must provide both username and password or neither.")

    if username:
        mongo_uri += "{}:{}@".format(*map(quote_plus, [username,password]))

    mongo_uri += "{}:{}".format(quote_plus(host),port)

    if auth_database:
        mongo_uri += '/{}'.format(quote_plus(auth_database))

    client = MongoClient(mongo_uri)
    status = client.admin.command("replSetGetStatus")

    # This converts the bson into a python dictionary that ansible's standard
    # jsonify function can process and output without throwing errors on bson
    # types that don't exist in JSON
    clean = json.loads(json_util.dumps(status))

    module.exit_json(changed=False, status=clean)

if __name__ == '__main__':
    main()
