はじめに
NSOとその southbound 機器は NED を介してやりとりをします。NED はデバイスの通信方法により大まかに4つのタイプにわけられます。トランザクションを実行する観点からは、NED のタイプや ( low-level での) 実装に関わらず共通する部分があります。本記事は、トランザクション実行中の NED とデバイスのやりとりを フロー図をみながら説明します。
NED コードのフロー図

トランザクションの各フェーズをハイレベルで記述します。なお、NED のタイプにより実行される内容は変わります。
1. INITIALIZE
INITIALIZE フェーズはトランザクション開始の準備をするフェーズです。機器のタイプにより特に何もしないケースもあります。initialize()の例、config モードに切り替える、トランザクションをサポートする機器ではトランザクションを開始、lock を取得
2. UNINITIALIZE
UNINITIALIZE は、INITIALIZE 実行前の状態に戻ります。INITIALIZEフェーズで何もしないケースでは、UNINITIALIZEでも何もしません。uninitialize()の例、unlock する、トランザクションを abort する
3. prepare
PREPARE では、実際の変更を southbound にて設定し応答を待ちます。ここで NED が OK すると、NSO は、トランザクションが次のフェーズに移行できると判断します。
prepare(Data) の例、変更を機器に送信する、変更をトランザクションに追加する、edit-config 送信
4. ABORT
ABORT は、トランザクションの対象デバイスのうち何れかの処理が失敗することで開始されます。NED は PREPARE フェーズで設定した変更を戻す処理を始めます。変更前の状態に戻すため、reverse diff を使用することがあります。
abort(ReverseData | null) の例、ReverseDataの適用、トランザクションの abort 、discard-changes の実施と close
5. COMMIT
COMMIT では、NED が OK と判断すると、変更はここで Commit されます。Commit がもし失敗した場合、NED は必要に応じて REVERT 処理を開始します。
commit(Timeout)の例、特に何もしない、機器側でトランザクションを commit する、commit (confirmed)
6. REVERT
REVERT は、COMMIT フェーズが失敗したとき開始されます。NED のタイプにより reverse diff を送信します。
revert(ReverseData | null) の例、copy startup 、ReverseData の適用、discard-changes を実行し close する
7. PERSIST
PERSIST は、NED のトランザクション最後のフェーズです。すべての変更が問題なく適用された場合のみ、このフェーズに移行します。デバイスの再起動後に変更が消えないようにします。
persist() の例、copy running to startup、何もしない、commit を validate する
参考情報
https://developer.cisco.com/docs/nso/guides/#!network-element-drivers-neds/dumb-versus-capable-devices