Skip to content

NOC 20.2

20.2 release contains 249 bugfixes, optimisations and improvements.


Python3 Compatibility

As it was declared in Python3 Compatibility Statement<release-19.4-py3>, 20.2 is the first Python3-only release. This allows us to clean up and optimize code base in following ways:

  • All Python2 compatibility layers are removed.
  • Key dependencies (Tornado, Django, etc) are upgraded to latest stable versions.
  • async/await are used instead @tornado.gen.coroutine in all the places.
  • Type annotations are heavily used in newly-introduced and in modified code.

Low-level network-handling code, including SNMP, RPC, HTTP-client and all CLI variants are rewritten from Tornado to Python3-native asyncio. It allows to clean up code, fix some old cryptic bugs and introduce gentler error- and timeout- handling.

NOC 20.2 is compatible with Python 3.7 and 3.8.

So we have to admit the Python3 migration Odyssey is over. It tooks over one year, consumes lots of work, sometimes with acrobatic exercises to maintain compatibility and stability. But in addition to code simplicity, stability and instrumentation we gave serious performance benefits. Our investigations on real-world installation shows that NOC 20.2 requires 10-15% less CPU, than previous Python 2 based releases.

Interface Description Topology Discovery

Meet the ifdesc topology discovery method. It is last-resort semi-automatic method of linking based on interface description analysis. ifdesc comes to resque when all other methods failed. Operator has to define a set of regular expressions to extract a neighbor information from descriptions and has to configure network equipment. In contrast to manual linking, ifdesc is configurable as common topology discovery method. Its precedence over other methods can be adjusted, so its results may be refined by more precise automatic methods (i.e. LLDP), and it can be used to refine more error-prone methods (i.e. MAC).

ifdesc is the 14th topology discovery method available out of the box.

MAC Blacklist

Costs cutting and lack of proper Q&A sometimes leads to large parties of network equipment with non-unique MAC addresses. Overall impact may vary: from insignificant, to ARP-cache poisoning, to inpredictable STP topology changes. It-also affects the topology discovery methods based on neighbor identification upon MAC address (LLDP, STP, MAC). So its safer to maintain a list of broken MAC addresses to notify personnel on possible problems.

MAC blacklist is maintained and distributed on deploy, like other collections, and can be adjusted and maintained locally and shared back to the repo.

LLDP discovery method now consults on MAC Blacklist and tries to mitigate problem by using neighbor information from additional TLVs.

Real-world networks often repeats the pattern when aggregation switch (A) is placed on PoP with redundant reserved power and connected to home access switches (B, C, D, E), which are powered from non-redundant city power grid.

graph TD; A --> B; A --> C; A --> D; A --> E;

During the maintenance on power grid, several access switches may expect power loss, while aggregation switch stays on-line as unaffected or switched to reserve power. Current topology-based RCA scheme will register each access switch failure as separate root cause alarms and will propagate them as separate trouble tickets. It may take a time for personnel to detect all those problems are related and inferred by power problems.

NOC 20.2 introduces additional Downlink Merge policy. Downlink Merge is enabled on aggregation switch (A) and allows to tie all direct children alarms together and to process and escalate them as a one failure. Network personnel will take a hint to check alarms as related together and will be notified to check the power.

Multi-Format Datastreams

Datastreams can be configured to separate views, filtering or morphing records. Views, called formats can be used to enrich datastreams with data from external sources, or to restring amount of data to be passed to external systems.

Each format can be configured to additional API Key role, allowing granular access.

Customized SNMP-response parsers

Broken SNMP implementations are in the wild. Sometimes responses are malformed, while still containing meaningful data. So we added Profile.get_snmp_response_parser() method to override default response parser to customized one when necessary.

New features

MR3418Grafana: Add new DOM dash
MR3550Add Ignore Pattern func
MR3600#1287: Multi-Format DataStream
MR3632#1086 IfDesc topology discovery
MR3653#1301: MAC Blacklist
MR3668#1222 RCA 'Downlink Merge' policy


MR3392noc/noc#1283 Add allowDiskUse to reportdatasources.
MR3407Add combo connection type to Huawei Quidway series.
MR3428Add Combo port to Raisecom models.
MR3442http-parser 0.9.0
MR3444yield from
MR3445pytest 5.0.3
MR3461Fix some models
MR3470datastream: ManagedObject.object_profile.tags
MR3476Fix report max load metrics 2
MR3490Deduplicate Datastream Changes.
MR3491Replace imp to importlib on mib service.
MR3494Add SubscriberProfile to ETL loader
MR3500ThreadPoolExecutor: Support for context protocol
MR3501Update verify-models script
MR3512Register Datastream Changes when Service - Interface binding changes
MR3516Fix get_interfaces for DES-3200/C1
MR3522Add errors_in_sum, errors_out_sum column to reportmetrics.
MR3527nbi Path API: Specify start by OFM order_id
MR3533Bump requirements versions
MR3539Django 3.0.5
MR3542Add iface_hints to RemoteSystem portmapper.
MR3553Tornado 6 support
MR3554NetworkX 2.4
MR3555Make Service.subscribe a coroutine
MR3557Cleanup interface service field when remove service.
MR3560Add pool to reportdiscoverypoison.
MR3561Impoved logging when use neighbors discovery cache.
MR3571Python 3.8 tests, pyproj 2.6.0
MR3580Add quiet params to etl extract command. Supress exception if set.
MR3581Add retry escalation to Escalation limit exceeded.
MR3591Add rules to test inv.objectmodels
MR3592Fix some models
MR3615Native PeriodicCallback and PeriodicOffsetCallback
MR3617http client: Asynchronous DNS resolver
MR3619Add cutomized dashboard to PM.
MR3624MAC Segment discovery. Check object level on same segment for uplink detect.
MR3625#1298 PrefixDiscovery takes account of MO's VRF
MR3626#1299 Hide hidden custom fields from ipam view
MR3627Django 3.0.6, mongoengine 0.20.0, crontab 0.22.6, redus-3.5.2, hiredis=1.0.1, ipython 7.14.0
MR3633Add ELtex MIB preference.
MR3636Add Eltex MIBs.
MR3637Add catch OIDCollision to mib upload command. Add detect some errors when upload mib.
MR3641IOLoop.add_callback() cleanup
MR3650Native asyncio SNMP implementation
MR3657Add Huawei.MA5600T profile check rules
MR3662Add Eltex MIBs.
MR3674Add json_unique_fields to ProfileCheckRule.
MR3678Add 'Discards In' and 'Discards Out' to Report metrics.
MR3682noc/noc#1295 Add Cisco ASR1001-X model.
MR3685Remove Service.ioloop
MR3694Streamlined SNMP Beef implementation
MR3695asyncio-native NSQ topic implementation
MR3705asyncio-native CLI
MR3713Replace resolve_ifindexes to resolve_properties on InterfaceDiscovery.
MR3716Fix filling Capabilities from ConfDB.
MR3719Add dump argument to confdb commands.
MR3747Add BI Dashboard collection.
MR3751Raise CLI CLILowPrivileges when no up privileges by enable.
MR3752Send command_exit when close cli stream.
MR3754Add get_fqdn to profiles.
MR3760Add 'Exclude on MAC Black List' param to ReportDiscovery Poison.
MR3763Add raw_result params to script http methods.
MR3765Add errors="replace" policy to script parse_object_stream.
MR3768Change docker image's python to 3


MR3389fix report - load metric max
MR3395Fix save on ModelProtectionProfile.
MR3397Tgsender: fix py3
MR3400Fix bi encode error when empty field description.
MR3405Fix changing objectmodel combo field.
MR3419Fix AlowDiskUse param on aggregate report
MR3426Fix DatasourceCache compress encoding.
MR3440Fix Consul session lost logging
MR3446Disable smart_text over return http.get json result.
MR3448Fix comma on mo pm dashboard.
MR3479py3: Fix DNS RR comparison
MR3483Add is_managed=False to maintenance escalator handler.
MR3484Fix detect selected column on ObjectDetail Report.
MR3502Fix bytes on asset generate_serial.
MR3503Change enable_link to enable_service on nri service discovery.
MR3507py3: Fix whois update-cache
MR3513Add json_unique_fields to mibpreference.
MR3517Fix scheduler shutdown
MR3518Fix CH Dictionary split data to chunk.
MR3534Remove validation policy button from UI.
MR3537Fix fix-pip on PIP's beta versions
MR3556Fix SAE return redirect. Was broken on noc/noc!3508.
MR3574Fix Link.managed_objects on Django3
MR3576Fix not operand on ConfDB.
MR3612Catch portmapper exception on NRI discovery.
MR3618httpclient: Fix EOF handling
MR3620noc/noc#1283 Fix ReportLinkDetail for py3.
MR3634Fix trace when export fm.mibpreference collection by command.
MR3640Fix detect coroutine on Script.on_error_sequence.
MR3646Fix ReportDiscovery Poison MAC view.
MR3649Fix script on_unprivileged_prompt when no raise privileges.
MR3651classifier: Fix bytes processing
MR3664Fix 'TypeError' on confdb iter_nodes sorted.
MR3666HTTPClient: Better handling of connection errors
MR3671chwriter: Fix channel messages calculation
MR3672Fix race condition during lazy mib loading
MR3673Lock all RPC deserialization for a better times
MR3676Fix logger argument on xmac discovery.
MR3692Fix dictionary keys changed during iteration on extdocapplication.
MR3693SNMP: Fix GETNEXT raw_varbinds processing
MR3702Fix confdb protocols applicators for type normalizer.
MR3707Fix MRT service
MR3708ETL: Fix parallel extraction for Oracle
MR3710Fix CLI loop context usage
MR3712redis: delete_many may be called with empty keys
MR3714Fix typo in InterfaceDiscovery resolve_properties.
MR3724httpclient: Fix connection reset handling
MR3729CLI: Fix keepalive timeout handling
MR3731py3. Fix get_colors.
MR3749CLI: Fix connection reset handling
MR3750Fix typo on MRT service.
MR3753Fix params on LLDP Discovery logger.
MR3756snmp: Fix broken error-index
MR3757Fix Script.on_error_sequence sequence type.
MR3758Fix typo on MacBlackList js Application.
MR3759Fix NSQ topic shutdown sequence
MR3762Fix BER unknown types reporting
MR3769Fix script.submit debug.
MR3770Fix catch ConnectionResetError on http_client.
MR3771Right fix ConnectionResetError on http client.

Code Cleanup

MR3347py3. Change rogue_chars on profiles to bin.
MR3387Remove py2 tests
MR3388Set black target to python 3.6
MR3390Fix DDash sensorstatus
MR3390Fix DDash sensorstatus
MR3394Remove CLIPS config validation
MR3401py3. Fix compile-bytecode.
MR3417py3: Remove six.PY2/six.PY3 usage
MR3421py3: Remove six type aliases usage
MR3439py3: Remove six.iter* wrappers
MR3447Remove @six.python_2_unicode_compatible and six.with_metaclass
MR3457Move to py3-style type annotations
MR3458Clean up .docker directory
MR3463Remove six
MR3464Cleanup noc.core.comp bord/bchr/make_bytes functions
MR3465Use dict comprehensions
MR3466Use py3 to build docs
MR3467Fix docs builder
MR3469py3: Fix
MR3473Remove CLIPS-based validation models
MR3474mypy: Remove --py2 flag
MR3508py3: Remote raise tornado.gen.Return() usage
MR3509Fix type annotations
MR3519Source coding specification cleanup
MR3523py3.8 compatibility fixes
MR3525Use native time.perf_counter()
MR3526Remove from builtins import
MR3528Remove pypy support
MR3529Ping: Remove io_loop parameter
MR3531httpclient: Remove io_loop parameter
MR3535DCS: Remove io_loop parameter
MR3536Remove coding directive
MR3538Remove deprecated get_absolute_url method
MR3540Remove io_loop parameter from UDPServer
MR3541Remove io_loop parameter from CLI
MR3543Remove PeriodicOffsetCallback and NSQ TopicQueue io_loop parameter
MR3544Remove snmp io_loop parameter
MR3545Remove deprecated TracebackFuture alias
MR3546Remove scheduler IOLoop parameter
MR3593Cleanup super() call
MR3606Cleanup tornado.gen usage
MR3614Fix DOM ddash
MR3628Remove deprecated get_future_loop() compatibility call
MR3631Fix import deprecation warning
MR3639Fix id ddash for Grafana 6
MR3643Add/new ddash stp delta
MR3659Fix Radio Ddash
MR3665Replace socket.error with OSError
MR372620.2 deprecations

Profile Changes


MR3594Alcatel.7302. Add SNMP to profile.


MR3437noc/noc#1181 Alstec.24xx. Add platform name normalizer.


MR3767Cisco.IOS.get_interfaces. Use dict structure instead list.


MR3596DLink.DxS_Cisco_CLI.get_interfaces. Fix description decode.
MR3727DLink.DxS_Smart.get_interfaces. Fix typo.
MR3737DLink.DxS.get_lldp_neighbors. py3. Fix remote_port format to string.


MR3391Eltex.MES Update metrics
MR3434Eltex.MES: Fix get_mac_address_table
MR3441Eltex.MES: Update profile for 3124/3124F
MR3487Eltex.MES. Add detected platform to profile.
MR3679Eltex.MES.get_capabilities. Add SNMP methods.
MR3680Eltex.MES.get_interfaces. Use Generic SNMP method.
MR3700Eltex.MES.get_interfaces. Add Vlan and Lo filter on SNMP.
MR3722Eltex.MES. Add always_prefer S for 3324/3348 models.


MR3697Eltex.MES24xx. Add config prompt to profile.
MR3738Eltex.MES24xx.get_lldp_neighbors. Add 'Interface Alias' to port subtype.


MR3559Generic.get_chassis_id. Add 00:01:02:03:04:05 to IGNORED_MACS.
MR3565Generic.get_mac_address_table. Filter vlan 0 number.
MR3573Generic.get_interfaces. Refactor script for get_interface_properties use.
MR3648Add Generic.get_fqdn script.
MR3681Eltex.MES.get_spanning_tree. Add SNMP method.
MR3687Generic.get_beef. Fix encode method.
MR3688Generic.get_spanning_tree. Add detect port role.
MR3696Generic.get_intefaces. Filter equal values on getting portchannel.
MR3706Add get_interface_properties to get_ifindexes profiles
MR3733Generic.get_vlans. Fix py3.
MR3734Generic.get_mac_address_table. Skip unknown interfaces.


MR3412Huawei.MA5600T.get_cpe. Use codecs.encode instead .encode.
MR3582Huawei.MA5600T.get_interfaces. Add interface hints field.
MR3595Huawei.MA5600T. Add get_lldp_neighbors script.
MR3654Huawei.MA5600T.get_portchannel. Add allow_empty_response to 'display lacp' command.
MR3656Huawei.MA5600T.get_portchannel. Use allow_empty_response on 'display lacp' command.


MR3669Fix tagged vlan parsing on switch with 40G interfaces
MR3699Huawei.VRP.get_interfaces. Use show vlan command for switchport info.
MR3718Huawei.VRP. Fixes ConfDB normalizer.


MR3755noc/noc#1232 Iskrate.MSAN. Change detect version to 'Steer Version'.


MR3386Fix Juniper.JUNOS.get_interfaces script
MR3413Juniper.JUNOS.get_interfaces. Use codecs.decode insterad .decode.


MR3468fix get_version - space removed in platform
MR3492noc/noc#1230 Orion.NOS. Add convert_interface_name method.
MR3590Fix Orion.NOS.get_lldp_neighbors script


MR3599noc/noc#1231 Qtech.QSW.get_version. Fix version regex.


MR3711noc/noc#1190 Qtech.QSW2800.get_version. Fix 3.0.1-R1-BETA3 firmware.
MR3721Qtech.QSW2800. Fix patter_error for QSW-3470-10T with 3.0.1-R1-BETA3.
MR3766noc/noc#1190 Qtech.QSW2800.get_lldp_neighbors. Add port description and sysname


MR3399Raisecom.ROS.get_version. Add detect Qtech vendor.
MR3566Raisecom.ROS. Add fastethernet1/0/1 to management for ISCOM26(?:24|08)G.
MR3735Raisecom.ROS. Add SNMP to scripts.
MR3736Raisecom.ROS.get_capabilities. Fix STP detect.


MR3601noc/noc#1180 SKS.SKS.get_interfaces. Fix tagged vlan none on command.


MR3610Siklu.EH.get_mac_address_table. Fix mac type detected if quota column end.


MR3689noc/noc#1290 Zyxel.ZyNOS. py3, Convert pattern_zynos prompt to binary.
MR3720Zyxel.ZynOS.get_inventory. Disable keep_cli_session after script.


MR3393Eltex.MES5448 update profile
MR3410py3. Cleanup OID iface MAC to IF-MIB::ifPhysAddress name.
MR3420Generic.get_mac_address_table. Fix getting mac address tables by SNMP.
MR3450DCN.DCWL.get_metrics. Fix empty mac address.
MR3453Convert command_submit on self.cli to bytes.
MR3454Qtech.QSW.get_chassis_id. Add render_mac to SNMP method.
MR3459py3. Fix convert hex values on profiles.
MR3495noc/noc#1175 Huawei.MA5300.get_version. Add MA5303 to detecting profile.
MR3725HP.ProCurve. Cleanup py3.
MR3739DCN.DCWL.get_metrics. Fix rtt check.
MR3748Qtech.BFC_PBIC_S. Use strict snmp response parser.
MR3764Vitesse.VSC. Fix profile pattern_more.