Tail-f extensions for transactions in NETCONF

The NETCONF protocol can provide a set of configuration changes for the running datastore in an edit-config RPC and have the NETCONF server process these changes in a transactional way. Since the NETCONF transport is streaming, this can result in an arbitrarily large edit-config.

The NETCONF client can also use the candidate datastore, if this is supported by the NETCONF server, to send a series of edit-config RPCs before committing the changes to the running datastore. This allows the NETCONF client to break up the changes into smaller, possibly related, chunks before committing the changes.

What is available though to the NETCONF client if the NETCONF server does not support the candidate datastore?

Tail-f has taken advantage of the extensibility of the NETCONF protocol to define additional RPCs that allow for the creation of transactions, which then allow multiple edit-config RPCs to be issued, and then an explicit prepare and commit of the transaction. This extension is specified in tailf-netconf-transactions.yang and is implemented by ConfD. How does this work?

First the NETCONF client sends a start-transaction RPC for a specific datastore. This can be the candidate datastore, but would most likely be the running datastore. The NETCONF client can now send any number of edit-config RPCs using the same session. Once all the configuration changes have been sent, the NETCONF client sends a prepare-transaction RPC, followed by a commit-transaction RPC.

This transaction support can be used to allow the NETCONF client to break up a large edit-config RPC into multiple RPCs, but it can also be used by a NETCONF client who wishes to send a series of changes to different NETCONF servers which support this extension to NETCONF, by allowing the changes to be sent to each device, then each device can be sent a prepare-transaction RPC. If one device reports an error, then the other devices do not have to have their transactions committed, and the devices are left in their unmodified state.