Release 1.1.0
New Features
Enhanced Exception Handling
- Default exception
- Look for ncclient RPCError to process XML (ncclient 0.4.3 exception handling improved)
- Otherwise will raise a generic
- CommitError
- Added information as to why the commit failed
- ConfigLoadError
- New exception – gives information on why loading a config failed.
- RpcTimeoutError
- New exception – displays device, rpc, and timeout value.
Per execution timeout
-
New feature adds the keyword argument dev_timeout with the value of seconds to the RPC on demand function. This will set the timeout for only that operation. (The device timeout is still globally updated automatically before and after execution).
Example
dev.rpc.get_route_information(table='inet.0', dev_timeout=55)
Serialization of Junos facts
-
Custom encoders added for the object in both YAML and JSON. Default encoders set to this custom version by default in the library.
Example
import yaml print yaml.dump(dev.facts['version_info']) build: 6 major: !!python/tuple [14, 2] minor: '1' type: R import json print json.dumps(dev.facts['version_info']) {"major": [14, 2], "type": "R", "build": 6, "minor": "1"}
Composite table key support for missing XPATH
-
Table items are defined by a key, that is either a single element (such as name), or as a list of multiple XPATHs ('FPC 0', 'MIC 0', 'PIC 0'). In 1.0 if one of the XPATH elements was missing, an uncaught exception was thrown.
-
Updated the code to replace missing elements with None.
Example
PicHwTable: rpc: get-chassis-inventory item: .//name[starts-with(.,'PIC')]/parent::* key: - ancestor::*[starts-with(name,'FPC')]/name - ancestor::*[starts-with(name,'MIC')]/name - name view: _pic_hw_view
pic.name: ('FPC 2', 'MIC 0', 'PIC 1') pic.pn: BUILTIN pic.sn: XXXX pic.desc: 10x 1GE(LAN) SFP pic.name: ('FPC 3', None, 'PIC 0') pic.pn: BUILTIN pic.sn: XXXX
Regex support for View boolean values
-
Values in views can be set to a Boolean based on the presence of a field.
-
Regex support was added to allow for easier matching and multiple values. This is done by setting the format to True/False=regex():
Example
no_absorb: { no-absorb: True=regex(no-absorb) } no_refresh: { no-refresh: True=regex(\dx\d) } no_refresh: { no-refresh: 'True=regex(Session ID: 0x0|no-refresh)' }
OS Install force-host
-
Added force_host to support QFX OS Install
Example
SW.install('file', no_copy=True, force_host=True)
Added display_xml_rpc command
-
To support the limiting of cli() a new function display_xml_rpc is introduced. By default it will return the XML element and text format is also supported.
Example
dev.display_xml_rpc('show system login lockout') <Element get-system-login-lockout-information at 0x37b4b48> dev.display_xml_rpc('show system login lockout', format='text') '<get-system-login-lockout-information>\n</get-system-login-lockout-information>\n'
ncclient proxycommand support
-
Updated to be compatible with the enhancements in ncclient 0.4.2 and added optional path variable for sshconfig file (by default ~/.ssh/config is queried).
Example
[rsherman@localhost ~]$ cat .ssh/config Host 192.168.74.31 User juniper ProxyCommand ssh -l juniper 192.168.74.128 nc %h 22 2>/dev/null >>> dev = Device('192.168.74.31') >>> dev.open() Device(192.168.74.31)
Added support for pipe (union) operator in Table keys
-
Added the ability to use an XPATH pipe (union) operator for Table keys. This feature was already supported with View fields.
-
The syntax is ' | ' (space + pipe + space) between the values. The table will automatically append the item value + / to each element specified in the piped key.
-
The most common use case for this is the implicit "or"; there are situations where keys may have a different name between releases or types of configuration (as is the case with LLDP on ELS and non-ELS switches).
-
If there are multiple keys (of fields) listed with pipes that are found in the RPC reply they will be added to the list.
Example
key: lldp-local-interface | lldp-local-port-id lldp.keys() ['me0.0', 'me0.0', 'me0.0', 'me0.0', 'xe-0/1/0.0']
Format optional for configuration strings
-
When passing configuration data in as a string the library will attempt to automatically determine the format.
Example
config_string = "set interfaces ge-0/0/1 unit 10 family inet address 10.10.10.10/24" cu.load(config_string)
Bugs Fixed
JSON Output
-
Views that had compound keys failed to dump.
-
RPC command output failed to dump.
Example
pic = PicHwTable(dev) pic.get() PicHwTable:sprite.englab.juniper.net: 1 items pic.to_json() '{"(\'FPC 2\', \'MIC 0\', \'PIC 0\')": {"pn": "BUILTIN", "sn": "BUILTIN", "name": ["FPC 2", "MIC 0", "PIC 0"], "desc": "4x 10GE(LAN) SFP+"}}' import json json.dumps(dev.rpc.get_system_uptime_information()) '{"system-booted-time": {"time-length": "3w3d 01:44", "date-time": "2014-11-11 13:47:28 PST"}, "uptime-information": {"active-user-count": "\\n1\\n", "load-average-5": "\\n0.03\\n", "load-average-15": "\\n0.03\\n", "up-time": "\\n24 days, 1:44\\n", "load-average-1": "\\n0.00\\n", "date-time": "\\n3:31PM\\n"}, "protocols-started-time": {"time-length": "2d 04:10", "date-time": "2014-12-03 11:21:27 PST"}, "last-configured-time": {"time-length": "2d 00:58", "user": "regress", "date-time": "2014-12-03 14:33:27 PST"}, "current-time": {"date-time": "2014-12-05 15:31:35 PST"}}'
FutureWarning
- Config utility would output a FutureWarning