#!/usr/bin/python

#    Copyright 2015 Mirantis, Inc.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

import contextlib
import traceback

import kazoo.client
import kazoo.exceptions


@contextlib.contextmanager
def zk_connection(zk_host, zk_port):
    zk = kazoo.client.KazooClient(hosts='{}:{}'.format(zk_host, zk_port))
    zk.start()
    yield zk
    zk.stop()


def main():
    module = AnsibleModule(
        argument_spec=dict(
            zk_host=dict(required=True, type='str'),
            zk_port=dict(required=True, type='str'),
            path=dict(required=True, type='str'),
            value=dict(required=False, default=None, type='str')
        )
    )

    try:
        zk_host = module.params.pop('zk_host')
        zk_port = module.params.pop('zk_port')
        path = module.params.pop('path')
        value = module.params.pop('value')

        changed = False
        with zk_connection(zk_host, zk_port) as zk:
            try:
                zk.get(path)
            except kazoo.exceptions.NoNodeError:
                if value is None:
                    zk.create(path, makepath=True)
                else:
                    zk.create(path, value=value.encode(), makepath=True)
                changed = True

        module.exit_json(changed=changed)
    except Exception:
        module.exit_json(failed=True, changed=True,
                         msg=repr(traceback.format_exc()))


# import module snippets
from ansible.module_utils.basic import *  # noqa
if __name__ == '__main__':
    main()
