Prompt mode
Starting with gnmic v0.4.0
release the users can enjoy the interactive prompt mode which can be enabled with the prompt
command.
The prompt mode delivers two major features:
- simplifies
gnmic
commands and flags navigation, as every option is suggested and auto-completed - provides interactive YANG path auto-suggestions for
get
,set
,subscribe
commands effectively making the terminal your YANG browser
Using the prompt interface#
Depending on the cursor position in the prompt line, a so-called suggestion box pops up with contextual auto-completions. The user can enter the suggestion box by pressing the TAB key. The ↑ and ↓ keys can be used to navigate the suggestion list.
Select the suggested menu item with SPACE key or directly commit your command with ENTER, its that easy!
The following most-common key bindings will work in the prompt mode:
Key combination | Description |
---|---|
Option/Control + →/← | move cursor a word right/left |
Control + W | delete a word to the left |
Control + Z | delete a path element in the xpath string (example) |
Control + A | move cursor to the beginning of a line |
Control + E | move cursor to the end of a line |
Control + C | discard the current line |
Control + D | exit prompt |
Control + K | delete the line after the cursor to the clipboard |
Control + U | delete the line before the cursor to the clipboard |
Control + L | clear screen |
Commands and flags suggestions#
To make gnmic
configurable and flexible we introduced a considerable amount of flags and sub-commands.
To help the users navigate the sheer selection of gnmic
configuration options, the prompt mode will auto-suggest the global flags, sub-commands and local flags of those sub-commands.
When the prompt mode is launched, the suggestions will be shown for the top-level commands and all the global flags. Once the sub-command is typed into the terminal, the auto-suggestions will be provided for the commands nested under this command and its local flags.
In the following demo we show how the command and flag suggestions work. As the prompt starts, the suggestion box immediately hints what commands and global flags are available for input as well as their description.
The user starts with adding the global flags --address, --insecure, --username
and then selects the capabilities
command and commits it. This results in gNMI Capability RPC execution against a specified target.
Mixed mode#
Its perfectly fine to specify some global flags outside of the prompt command and add more within the prompt mode. For example, the following is a valid invocation:
gnmic --insecure --username admin --password admin --address 10.1.0.11 prompt
Here the prompt will start with with the insecure, username, password, address
flags set.
YANG-completions#
One of the most challenging problems in the network automation field is to process the YANG models and traverse YANG trees to construct the requests used against the network elements.
Be it gNMI, NETCONF or RESTCONF a users still needs to have a path pointing to specific YANG-defined node which is targeted by a request.
In gNMI paths can be represented in a human readable XPATH-like form - /a/b/c[key=val]/d
- and these paths are based on the underlying YANG models.
The problem at hand was how to get these paths interactively, or even better - walk the YANG tree from within the CLI and dynamically build the path used in a gNMI RPC?
With YANG-completions feature embedded in gnmic
what used to be a dream is now a reality 🎉
Let us explain what just happened there.
In the demonstration above, we called the gnmic
with the well-known flags defining the gNMI target (address
, username
, password
). But this time we also added a few YANG specific flags (--file
and --dir
) that load the full set of Nokia SR OS YANG models and the 3rd party models SR OS rely on.
gnmic --address 10.1.0.11 --insecure --username admin --password admin \
--file ~/7x50_YangModels/YANG/nokia-combined \
--dir ~/7x50_YangModels/YANG \
prompt
In the background gnmic
processed these YANG models to build the entire schema tree of the Nokia SR OS state and configuration datastores. With that in-mem stored information, gnmic
was able to auto-suggest all the possible YANG paths when the user entered the --path
flag which accepts gNMI paths.
By using the auto-suggestion hints, a user navigated the /state
tree of a router and drilled down to the version-number leaf that, in the end, was retrieved with the gNMI Get RPC.
YANG-driven path suggestions
gnmic
is now capable of reading and processing YANG modules to enable live path auto-suggestions
YANG processing#
For the YANG-completion feature to work its absolutely imperative for gnmic
to successfully parse and compile the YANG models.
The prompt
command leverages the --file
and --dir
flags to select the YANG models for processing.
With the --file
flag a user specifies a file path to a YANG file or a directory of them that gnmic
will read and process. If it points to a directory it will be visited recursively reading in all *.yang
files it finds.
The --dir
flag also points to a YANG file or a directory and indicates which additional YANG files might be required. For example, if the YANG modules that a user specified with the --file
flag import or include modules that were not part of the path specified with --file
, they need to be added with the --dir
flag.
The Examples section provide some good practical examples on how these two flags can be used together to process the YANG models from different vendors.
Understanding path suggestions#
When gnmic
provides a user with the path suggestions it does it in a smart and intuitive way.
First, it understands in what part of the tree a user currently is and suggests only the next possible elements.
Additionally, the suggested next path elements will be augmented with the information extracted from the YANG model, such as:
- element description, as given in the YANG
description
statement for the element - element configuration state (
rw
/ro
), as defined in section 4.2.3 of RFC 7950. - node type:
- The containers and lists will be denoted with the
[+]
marker, which means that a user can type/
char after them to receive suggestions for the nested elements. - the
[⋯]
character belongs to a leaf-list element. - an empty space will indicate the leaf element.
- The containers and lists will be denoted with the
Examples#
The examples in this section will show how to use the --file
and --dir
flags of the prompt
command with the YANG collections from different vendors and standard bodies.
Nokia SR OS#
YANG repo: nokia/7x50_YangModels
Clone the repository with Nokia YANG models and checkout the release of interest:
git clone https://github.com/nokia/7x50_YangModels
cd 7x50_YangModels
git checkout sros_20.7.r2
Start gnmic
in prompt mode and read in the nokia-combined YANG modules:
gnmic --file YANG/nokia-combined \
--dir YANG \
prompt
This will enable path auto-suggestions for the entire tree of the Nokia SR OS YANG models.
The full command with the gNMI target specified could look like this:
gnmic --address 10.1.0.11 --insecure --username admin --password admin \
prompt \
--file ~/7x50_YangModels/YANG/nokia-combined \
--dir ~/7x50_YangModels/YANG
Openconfig#
YANG repo: openconfig/public
Clone the OpenConfig repository:
git clone https://github.com/openconfig/public
cd public
Start gnmic
in prompt mode and read in all the modules:
gnmic --file release/models \
--dir third_party \
--exclude ietf-interfaces \
prompt
Note
With OpenConfig models we have to use --exclude
flag to exclude ietf-interfaces module from being clashed with OpenConfig interfaces module.
Cisco#
YANG repo: YangModels/yang
Clone the YangModels/yang
repo and change into the main directory of the repo:
git clone https://github.com/YangModels/yang
cd yang/vendor
IOS-XR#
The IOS-XR native YANG models are disaggregated and spread all over the place. Although its technically possible to load them all in one go, this approach will produce a lot of top-level modules making the navigation quite hard.
An easier and cleaner approach would be to find the relevant module(s) and load them separately or in small batches. For example here we load BGP config and operational models together:
gnmic --file vendor/cisco/xr/721/Cisco-IOS-XR-um-router-bgp-cfg.yang \
--file vendor/cisco/xr/721/Cisco-IOS-XR-ipv4-bgp-oper.yang \
--dir standard/ietf \
prompt
Note
We needed to include the ietf/
directory by means of the --dir
flag, since the Cisco's native modules rely on the IETF modules and these modules are not in the same directory as the BGP modules.
The full command that you can against the real Cisco IOS-XR node must have a target defined, the encoding set and origin suggestions enabled. Here is what it can look like:
gnmic -a 10.10.30.5:57500 --insecure -e json_ietf -u admin -p Cisco123 \
prompt \
--file yang/vendor/cisco/xr/662/Cisco-IOS-XR-ipv4-bgp-cfg.yang \
--file yang/vendor/cisco/xr/662/Cisco-IOS-XR-ipv4-bgp-oper.yang \
--dir yang/standard/ietf \
--suggest-with-origin
NX-OS#
Cisco NX-OS native modules, on the other hand, are aggregated in a single file, here is how you can generate the suggestions from it:
gnmic --file vendor/cisco/xr/721/Cisco-IOS-XR-um-router-bgp-cfg.yang \
--dir standard/ietf \
prompt
Juniper#
YANG repo: Juniper/yang
Clone the Juniper YANG repository and change into the release directory:
git clone https://github.com/Juniper/yang
cd yang/20.3/20.3R1
Start gnmic
and generate path suggestions for the whole configuration tree of Juniper MX:
gnmic --file junos/conf --dir common prompt
Note
- Juniper models are constructed in a way that a top-level container appears to be
/configuration
, that will not work with your gNMI Subscribe RPC. Instead, you should omit this top level container. So, for example, the suggested path/configuration/interfaces/interface/state
should become/interfaces/interface/state
. - Juniper vMX doesn't support gNMI Get RPC, if you plan to test it, use gNMI Subscribe RPC
- With gNMI Subscribe, specify
-e proto
flag to enable protobuf encoding.
Arista#
YANG repo: aristanetworks/yang
Arista uses a subset of OpenConfig modules and does not provide IETF modules inside their repo. So make sure you have IETF models available so you can reference it, a openconfig/public
is a good candidate.
Clone the Arista YANG repo:
git clone https://github.com/aristanetworks/yang
cd yang
Generate path suggestions for all Arista OpenConfig modules:
gnmic --file EOS-4.23.2F/openconfig/public/release/models \
--dir ~/public/third_party/ietf \
--exclude ietf-interfaces \
prompt
Enumeration suggestions#
gnmic
flags that can take pre-defined values (enumerations) will get suggestions as well. For example, no need to keep in mind which subscription modes are available, the prompt will hint you:
File-path completions#
Whenever a user needs to provide a file path in a prompt mode, the filepath suggestions will make the process interactive: