diff --git a/lib/ansible/modules/network/netconf/netconf_get.py b/lib/ansible/modules/network/netconf/netconf_get.py index b41e15dc66f..a4b9050c805 100644 --- a/lib/ansible/modules/network/netconf/netconf_get.py +++ b/lib/ansible/modules/network/netconf/netconf_get.py @@ -51,15 +51,13 @@ options: choices: ['json', 'pretty', 'xml'] lock: description: - - Instructs the module to explicitly lock the datastore specified as C(source) before fetching - configuration and/or state information from remote host. If the value is I(never) in that case - the C(source) datastore is never locked, if the value is I(if-supported) the C(source) datastore - is locked only if the Netconf server running on remote host supports locking of that datastore, - if the lock on C(source) datastore is not supported module will report appropriate error before - executing lock. If the value is I(always) the lock operation on C(source) datastore will always - be executed irrespective if the remote host supports it or not, if it doesn't the module with - fail will the execption message received from remote host and might vary based on the platform. - default: 'never' + - Instructs the module to explicitly lock the datastore specified as C(source). If no + I(source) is defined, the I(running) datastore will be locked. By setting the option + value I(always) is will explicitly lock the datastore mentioned in C(source) option. + By setting the option value I(never) it will not lock the C(source) datastore. The + value I(if-supported) allows better interworking with NETCONF servers, which do not + support the (un)lock operation for all supported datastores. + default: never choices: ['never', 'always', 'if-supported'] requirements: - ncclient (>=v0.5.2) @@ -90,26 +88,33 @@ EXAMPLES = """ - name: get schema list using subtree w/ namespaces netconf_get: - format: json + display: json filter: - lock: False + lock: never - name: get schema list using xpath netconf_get: - format: json + display: xml filter: /netconf-state/schemas/schema - name: get interface confiugration with filter (iosxr) netconf_get: + display: pretty filter: + lock: if-supported + +- name: Get system configuration data from running datastore state (junos) + netconf_get: + source: running + filter: + lock: if-supported -- name: Get system configuration data from running datastore state (sros) +- name: Get complete configuration data from running datastore (SROS) netconf_get: source: running - filter: - lock: True + filter: -- name: Get state data (sros) +- name: Get complete state data (SROS) netconf_get: filter: """ @@ -203,28 +208,19 @@ def main(): if filter_type == 'xpath' and not operations.get('supports_xpath', False): module.fail_json(msg="filter value '%s' of type xpath is not supported on this device" % filter) - execute_lock = True if lock in ('always', 'if-supported') else False - - if lock == 'always' and not operations.get('supports_lock', False): - module.fail_json(msg='lock operation is not supported on this device') - - if execute_lock: - if source is None: - # if source is None, in that case operation is 'get' and `get` supports - # fetching data only from running datastore - if 'running' not in operations.get('lock_datastore', []): - # lock is not supported, don't execute lock operation - if lock == 'if-supported': - execute_lock = False - else: - module.warn("lock operation on 'running' source is not supported on this device") - else: - if source not in operations.get('lock_datastore', []): - if lock == 'if-supported': - # lock is not supported, don't execute lock operation - execute_lock = False - else: - module.warn("lock operation on '%s' source is not supported on this device" % source) + # If source is None, NETCONF operation is issued, reading config/state data + # from the running datastore. The python expression "(source or 'running')" results + # in the value of source (if not None) or the value 'running' (if source is None). + + if lock == 'never': + execute_lock = False + elif (source or 'running') in operations.get('lock_datastore', []): + # lock is requested (always/if-support) and supported => lets do it + execute_lock = True + else: + # lock is requested (always/if-supported) but not supported => issue warning + module.warn("lock operation on '%s' source is not supported on this device" % (source or 'running')) + execute_lock = (lock == 'always') if display == 'json' and not HAS_JXMLEASE: module.fail_json(msg='jxmlease is required to display response in json format'