API Reference
=============
This section describes all methods provided by ``NetconfClient`` in pyNetX.
The methods are organized into two main groups:
1. **Synchronous Methods**
2. **Asynchronous Methods**
3. **Common Methods**
Usage Examples:
---------------
.. code-block:: python
from pyNetX import NetconfClient
# Synchronous usage
client = NetconfClient(
hostname="192.168.1.1",
port=830,
username="admin",
password="admin",
notif_queue_size=100 # Optional: set a queue size for notifications
)
client.connect_sync()
response = client.get_config_sync()
client.disconnect_sync()
# Asynchronous usage
import asyncio
async def main():
client = NetconfClient(
hostname="192.168.1.1",
port=830,
username="admin",
password="admin",
notif_queue_size=100 # Optional: set a queue size for notifications
)
await client.connect_async()
response = await client.get_config_async()
await client.disconnect_async()
asyncio.run(main())
Synchronous Methods
-------------------
connect_sync()
~~~~~~~~~~~~~~
**Description**
Establishes a synchronous NETCONF session with the remote device.
**Parameters**
- None (relies on constructor settings like ``hostname``, ``port``, etc.)
**Returns**
- Typically returns a boolean status or raises a connection-related exception.
**Example**
.. code-block:: python
from pyNetX import NetconfClient
client = NetconfClient("192.168.1.1", 830, "admin", "admin")
status = client.connect_sync()
print("Connection status:", status)
disconnect_sync()
~~~~~~~~~~~~~~~~
**Description**
Closes the NETCONF session.
**Parameters**
- None
**Returns**
- None
**Example**
.. code-block:: python
client.disconnect_sync()
print("Disconnected.")
send_rpc_sync(rpc)
~~~~~~~~~~~~~~~~~~
**Description**
Sends a custom RPC command (XML string) to the device and returns the response.
**Parameters**
- **rpc** (str): The XML snippet representing the RPC command.
**Returns**
- A string containing the device’s RPC reply.
**Example**
.. code-block:: python
rpc_command = \"\"\"\"\"\"
response = client.send_rpc_sync(rpc_command)
print("RPC Response:\n", response)
get_sync(filter="")
~~~~~~~~~~~~~~~~~~
**Description**
Retrieves data from the device (equivalent to NETCONF ```` operation). An optional XML filter can be provided.
**Parameters**
- **filter** (str): An XML filter string. Defaults to an empty string (meaning retrieve all).
**Returns**
- A string containing the XML data from the device.
**Example**
.. code-block:: python
response = client.get_sync(filter="")
print("Interfaces:\n", response)
get_config_sync(source="running", filter="")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Retrieves the configuration from the specified datastore (e.g., ``running``, ``candidate``, or ``startup``).
**Parameters**
- **source** (str): Defaults to ``"running"``.
- **filter** (str): Optional XML filter string.
**Returns**
- A string containing the XML configuration.
**Example**
.. code-block:: python
config = client.get_config_sync(source="running", filter="")
print("Running Config:\n", config)
copy_config_sync(target, source)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Copies the configuration from one datastore (``source``) to another (``target``).
**Parameters**
- **target** (str): Target datastore (e.g., ``"candidate"``).
- **source** (str): Source datastore or XML config.
**Returns**
- None or a status string. Raises an exception on failure.
**Example**
.. code-block:: python
# Copy running config to candidate
client.copy_config_sync(target="candidate", source="running")
print("Successfully copied configuration.")
delete_config_sync(target)
~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Deletes the configuration from the specified datastore (``target``).
**Parameters**
- **target** (str): Datastore to delete (e.g., ``"candidate"``).
**Returns**
- None or a success message. Raises an exception on failure.
**Example**
.. code-block:: python
client.delete_config_sync("candidate")
print("Candidate datastore deleted.")
validate_sync(source="running")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Validates the contents of the specified datastore.
**Parameters**
- **source** (str): The datastore to validate. Defaults to ``"running"``.
**Returns**
- None or a validation result. Raises an exception on failure.
**Example**
.. code-block:: python
client.validate_sync(source="candidate")
print("Candidate datastore validated.")
edit_config_sync(target, config, do_validate=False)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Edits the specified datastore with the provided config string. Optionally validates after editing.
**Parameters**
- **target** (str): Datastore to edit (e.g., ``"running"``, ``"candidate"``).
- **config** (str): The XML configuration snippet to apply.
- **do_validate** (bool): Whether to automatically validate after editing. Defaults to ``False``.
**Returns**
- None or a response message. Raises an exception on failure.
**Example**
.. code-block:: python
new_config = \"\"\" ... \"\"\"
client.edit_config_sync("candidate", new_config, do_validate=True)
print("Configuration applied and validated.")
subscribe_sync(stream="NETCONF", filter="")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Subscribes to NETCONF notifications on the given stream.
**Parameters**
- **stream** (str): Defaults to ``"NETCONF"``.
- **filter** (str): Optional XML filter to scope the notifications.
**Returns**
- None or a subscription ID. Raises an exception on failure.
**Example**
.. code-block:: python
client.subscribe_sync(stream="NETCONF")
print("Subscribed to NETCONF notifications.")
receive_notification_sync()
~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Receives a single notification from the device. Blocks until a notification is received or a timeout occurs.
**Parameters**
- None
**Returns**
- A string containing the notification XML or None on timeout.
**Example**
.. code-block:: python
notification = client.receive_notification_sync()
print("Received notification:\n", notification)
lock_sync(target="running")
~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Locks the specified datastore.
**Parameters**
- **target** (str): Defaults to ``"running"``.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
client.lock_sync("candidate")
print("Candidate datastore locked.")
unlock_sync(target="running")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Unlocks the specified datastore.
**Parameters**
- **target** (str): Defaults to ``"running"``.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
client.unlock_sync("candidate")
print("Candidate datastore unlocked.")
commit_sync()
~~~~~~~~~~~~~
**Description**
Commits any configuration changes from the candidate datastore to the running datastore (if your device supports two-phase commit or similar).
**Parameters**
- None
**Returns**
- None or a commit result. Raises an exception on failure.
**Example**
.. code-block:: python
client.commit_sync()
print("Committed changes to the running datastore.")
locked_edit_config_sync(target, config, do_validate=False)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Acquires a lock on the specified datastore, edits the configuration, and unlocks automatically. Optionally validates the new config.
**Parameters**
- **target** (str): Datastore (e.g., ``"running"``, ``"candidate"``).
- **config** (str): XML config snippet to apply.
- **do_validate** (bool): Validate after editing. Defaults to ``False``.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
config_snippet = \"\"\" ... \"\"\"
client.locked_edit_config_sync("candidate", config_snippet)
print("Successfully edited configuration with lock.")
Asynchronous Methods
--------------------
Below are the asynchronous counterparts, returning awaitable tasks that integrate
with Python’s ``asyncio``.
connect_async()
~~~~~~~~~~~~~~~
**Description**
Asynchronously establishes a NETCONF session.
**Parameters**
- None
**Returns**
- An awaitable. Raises an exception on failure.
**Example**
.. code-block:: python
import asyncio
from pyNetX import NetconfClient
async def main():
client = NetconfClient("192.168.1.1", 830, "admin", "admin")
await client.connect_async()
print("Async connection established.")
await client.disconnect_async()
asyncio.run(main())
disconnect_async()
~~~~~~~~~~~~~~~~~
**Description**
Asynchronously disconnects the NETCONF session.
**Parameters**
- None
**Returns**
- An awaitable that completes once the session closes.
**Example**
.. code-block:: python
await client.disconnect_async()
print("Disconnected async.")
send_rpc_async(rpc="")
~~~~~~~~~~~~~~~~~~~~~
**Description**
Sends a custom RPC asynchronously and awaits the response.
**Parameters**
- **rpc** (str): The XML snippet for the RPC.
**Returns**
- The RPC reply as a string.
**Example**
.. code-block:: python
rpc_command = '' + rpc + ''
reply = await client.send_rpc_async(rpc_command)
print("Async RPC reply:", reply)
next_notification()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Polls the internal NETCONF notification queue and
returns the next queued notification, if one is available.
This method is intentionally lightweight and non-awaitable.
It can be called from synchronous code or from inside an async function,
but it should be called directly, not with ``await``.
**Parameters**
- None
**Returns**
- ``str``: The next notification XML string.
- ``""``: No notification was available during the short polling window.
**Example**
.. code-block:: python
notification = client.next_notification()
if notification:
print("Notification received:", notification)
get_async(filter="")
~~~~~~~~~~~~~~~~~~~
**Description**
Performs an asynchronous ```` operation.
**Parameters**
- **filter** (str): XML filter snippet.
**Returns**
- A string containing the requested data.
**Example**
.. code-block:: python
data = await client.get_async("")
print("Async data:\n", data)
get_config_async(source="running", filter="")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously retrieves the specified datastore configuration.
**Parameters**
- **source** (str): e.g., ``"running"`` or ``"candidate"``. Defaults to ``"running"``.
- **filter** (str): Optional filter.
**Returns**
- The config data as a string.
**Example**
.. code-block:: python
running_config = await client.get_config_async(source="running")
print("Async running config:\n", running_config)
copy_config_async(target, source)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously copies the configuration from ``source`` to ``target``.
**Parameters**
- **target** (str)
- **source** (str)
**Returns**
- None or a status message.
**Example**
.. code-block:: python
await client.copy_config_async(target="candidate", source="running")
delete_config_async(target)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously deletes the specified datastore.
**Parameters**
- **target** (str): e.g., ``"candidate"``.
**Returns**
- None or a success/failure message.
**Example**
.. code-block:: python
await client.delete_config_async("candidate")
validate_async(source="running")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously validates the configuration in the specified datastore.
**Parameters**
- **source** (str): defaults to ``"running"``.
**Returns**
- None or a validation message.
**Example**
.. code-block:: python
await client.validate_async("candidate")
edit_config_async(target, config, do_validate=False)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously edits a datastore with the provided configuration. Optionally validates.
**Parameters**
- **target** (str): e.g., ``"running"`` or ``"candidate"``.
- **config** (str): The XML config snippet.
- **do_validate** (bool): Whether to validate after editing.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
config_snippet = \"\"\" ... \"\"\"
await client.edit_config_async("candidate", config_snippet, do_validate=True)
subscribe_async(stream="NETCONF", filter="")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously subscribes to notifications from a given stream.
**Parameters**
- **stream** (str): Defaults to ``"NETCONF"``.
- **filter** (str): Optional XML filter.
**Returns**
- None or a subscription identifier.
**Example**
.. code-block:: python
await client.subscribe_async("NETCONF")
print("Subscribed to NETCONF notifications asynchronously.")
lock_async(target="running")
~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously locks the specified datastore.
**Parameters**
- **target** (str): Defaults to ``"running"``.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
await client.lock_async("candidate")
print("Locked candidate datastore asynchronously.")
unlock_async(target="running")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously unlocks the specified datastore.
**Parameters**
- **target** (str): Defaults to ``"running"``.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
await client.unlock_async("candidate")
print("Unlocked candidate datastore asynchronously.")
commit_async()
~~~~~~~~~~~~~~
**Description**
Asynchronously commits changes from the candidate datastore to the running datastore.
**Parameters**
- None
**Returns**
- None or a commit message.
**Example**
.. code-block:: python
await client.commit_async()
print("Asynchronous commit completed.")
locked_edit_config_async(target, config, do_validate=False)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**
Asynchronously locks the specified datastore, applies an edit-config,
optionally validates, then unlocks.
**Parameters**
- **target** (str)
- **config** (str)
- **do_validate** (bool): whether to validate after editing.
**Returns**
- None or a status message.
**Example**
.. code-block:: python
config_snippet = \"\"\" ... \"\"\"
await client.locked_edit_config_async("candidate", config_snippet, do_validate=True)
Common Methods
--------------------
Below are the some common methods that can be used in both sync and async structures.
delete_subscription()
~~~~~~~~~~~~~~
**Description**
Deletes an established NETCONF notifications subscription for a client.
**Parameters**
- None
**Returns**
- None.
**Example**
.. code-block:: python
client.delete_subscription()
set_threadpool_size(nThreads)
~~~~~~~~~~~~~~
**Description**
Sets the number of threads in the shared task pool.
**Parameters**
- **target** (int): Number of threads present in thread pool.
**Returns**
- None.
**Example**
.. code-block:: python
import pyNetX
pyNetX.set_threadpool_size(10) # Creates 10 threads in the shared task pool.
set_notification_reactor_count(nThreads)
~~~~~~~~~~~~~~
**Description**
Configures how many background epoll reactor threads pyNetX uses
to monitor notification sockets.
If this function is not called, pyNetX automatically creates one
notification reactor when the first subscription is registered.
For large deployments, configure this once during startup before
creating many subscriptions.
**Parameters**
- **nThreads** (int): Number of notification reactor threads to use.
**Returns**
- None.
**Example**
.. code-block:: python
import pyNetX
pyNetX.set_notification_reactor_count(8) # Use 8 background threads to monitor notification sockets.
Common Exceptions
-----------------
All methods may raise one of the following custom exceptions upon failure:
- **NetconfConnectionRefusedError**
- **NetconfAuthError**
- **NetconfChannelError**
- **NetconfException**
For details, see :doc:`introduction` or check out the usage examples in :doc:`examples`.