def main():
    argument_spec = dict(type=dict(
        type='str',
        default='CONFIG',
        choices=['ALL', 'CONFIG', 'STATE', 'OPERATIONAL']),
                         prefix=dict(type='str', default='/'),
                         path=dict(type='list', elements='str', default=['']))

    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True)

    connection = Connection(module._socket_path)

    try:
        response = connection.gnmiGet(**module.params)
    except ConnectionError as exc:
        module.fail_json(msg=to_text(exc, errors='surrogate_then_replace'),
                         code=exc.code)

    result = {}
    result['output'] = response
    result['changed'] = False

    module.exit_json(**result)
def main():
    backup_spec = dict(filename=dict(), dir_path=dict(type="path"))
    argument_spec = dict(backup=dict(type="bool", default=False),
                         backup_options=dict(type="dict", options=backup_spec),
                         prefix=dict(type='str', required=False),
                         update=dict(type='list',
                                     elements='dict',
                                     required=False),
                         replace=dict(type='list',
                                      elements='dict',
                                      required=False),
                         delete=dict(type='list',
                                     elements='str',
                                     required=False))
    required_one_of = [["backup", "update", "replace", "delete"]]

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

    pathList = []
    if 'update' in module.params and module.params['update']:
        pathList.extend([update['path'] for update in module.params['update']])
    if 'replace' in module.params and module.params['replace']:
        pathList.extend(
            [update['path'] for update in module.params['replace']])
    if 'delete' in module.params and module.params['delete']:
        pathList.extend(module.params['delete'])

    result = {}
    try:
        connection = Connection(module._socket_path)

        if pathList:
            # changes are contained: update, replace and/or delete
            if module.params["backup"]:
                snapshot1 = connection.gnmiGet(type='config', path=['/'])
            else:
                snapshot1 = connection.gnmiGet(type='config',
                                               prefix=module.params['prefix'],
                                               path=pathList)

            response = connection.gnmiSet(**module.params)

            if module.params["backup"]:
                snapshot2 = connection.gnmiGet(type='config', path=['/'])
            else:
                snapshot2 = connection.gnmiGet(type='config',
                                               prefix=module.params['prefix'],
                                               path=pathList)

            result['output'] = response

            if (snapshot1 != snapshot2):
                result['changed'] = True
                if module._diff:
                    result['diff'] = {'before': snapshot1, 'after': snapshot2}
                if module.params["backup"]:
                    result['__backup__'] = snapshot1
        elif module.params["backup"]:
            # backup only: take full config snapshot an return
            snapshot = connection.gnmiGet(type='config', path=['/'])
            result['__backup__'] = snapshot
        else:
            # Nothing to do: There are no updates and no backup requested
            pass

    except ConnectionError as exc:
        module.fail_json(msg=to_text(exc, errors='surrogate_then_replace'),
                         code=exc.code)

    module.exit_json(**result)