Skip to content

NOC 25.1.3

The 25.1.3 release backports 45 bug fixes, improvements, and deployment changes from the development branch since the 25.1.2 release.

New features

MR Title
b584b94a CPU affinity: new config.process.cpu_affinity parameter
89c48fba CPE: add five more capability collections
148c0713 Juniper.JUNOS: add get_interface_properties script
0e60f4b7 Services now start via python -m entrypoint
12e4f638 Deploy: platform and licence-level checks at install time
fd8570c8 Migrate dependency management and installation to uv

CPU affinity

A new config.process.cpu_affinity parameter allows pinning each NOC service worker to a dedicated CPU via AffinityController (new core/affinity.py). When enabled, a worker is bound to the configured CPU, allowing its CPU scheduling to be controlled independently of other services. The affinity is applied in BaseService.start.

CPE capabilities

CPE profile discovery is extended with five additional capability collections: IP_Address, Location, Modulation, Revision, and SW_Version. These are registered in sa/profiles/CPE/cpe.py, allowing CPE objects to carry IP addresses, geographic locations, modulation modes, hardware revisions, and software versions.

Juniper JUNOS interface properties

A new autoconfiguration script, sa/profiles/Juniper/JUNOS/get_interface_properties.py, collects interface properties such as speed, duplex, and MTU from Juniper JUNOS devices.

Service entrypoint via python -m

Each microservice in services/ now has a __main__.py entrypoint (e.g. SelfMonService().start()), allowing it to be launched with python -m services.<name>. The Tower deployment roles have been updated to use the new entrypoint.

Deploy-time platform and licence checks

A new ansible/check_platform.yml playbook and ansible/vars/platforms.yml define the platforms supported by each NOC licence level (ce / pro). Deployment now fails early with a clear message if the target ansible_distribution is not listed, or if the target platform requires a pro licence and the configured noc_license_level does not grant access.

Dependency management migrated to uv

The development tooling and installation process have been migrated from the pip-based mechanism to uv. This includes dependency groups and build configuration in pyproject.toml, uv invocation in services/selfmon and commands/fix / commands/migrate-sysadmin, and uv-aware service startup in core/service/base.py. Legacy pip requirements files and their associated CI hooks have been removed.

Improvements

MR Title
9b9fff53 deploy: relocate uv cache to /opt/uv
479f0d04 deploy: process TOWER_HOME and TOWER_CACHE variables
e1e241e0 deploy: set PYTHONPATH to {{ noc_root }}/src
2c26a9f4 deploy: set the NOC UI theme by default
527c009b deploy: replace with_items loops with loop
59ba193f docs: adjust emoji rendering settings

Bug fixes

MR Title
578f66d5 Fix custom profile script loading
52a99bce migrate-liftbridge: materialise pools before creating streams
36586b68 Object.get_name_path: allow empty names
bcf99a1b Fix OS.Linux interface type detection
10b93f72 Fix string formatting in the network-scan command
f20962cd net-scan: drop unnecessary tuple wrappers
9c29c5e8 deploy: fix bool filter usage
13c9d060 ansible: fix loop usage
3ff0dc67 deploy: use boolean values for become and gather_facts
fef9aeea deploy: fix system Python handling
89314346 Rename noc_licence_level to noc_license_level
  • Custom profile scripts now resolve their modules under the noc.custom base (core/script/loader.py), fixing the loading of scripts shipped with custom profiles.
  • migrate-liftbridge materialises the full Pool collection before enumerating per-pool streams, avoiding repeated Pool.objects.all() queries and ensuring that pool objects are available before their corresponding liftbridge.<pool> streams are created.
  • Object.get_name_path tolerates an empty or absent name, preventing crashes when a managed object has no name.
  • OS.Linux interface type mapping now recognises eno / enp / ens / enx prefixes as physical interfaces, wl / wlp prefixes as wireless interfaces, and PVE fw / ta / vm prefixes as virtual interfaces. Unrecognised prefixes now return unknown instead of None.
  • The misspelled noc_licence_level variable has been renamed to noc_license_level across Ansible roles and variable definitions.

Removed

MR Title
b5975b80 Revert the disposition rules
bb5695ff Drop the fm.dispositionrules collection
4f76b296 Remove the legacy branding scheme (licence enforcement)
8821f44d deploy: remove EOL platforms from the supported list
c8798ad0 Remove jemalloc usage
26605975 Remove unused Collection.CUSTOM_PREFIX
  • Disposition rules are reverted (#584). The correlator/classifier reprocessing wiring (services/correlator/{rule,service}.py, classifier {actionset,eventconfig,service}.py, fm / main / sa model changes, and the ui/web/fm/dispositionrule UI) has been rolled back, and the fm.dispositionrules seed collection is no longer shipped (#589). The DispositionRule model is retained to preserve the schema in existing deployments; only the behaviour and bundled seed data have been removed.
  • Legacy branding scheme has been removed as part of licence enforcement introduced in 25.1. The brand configuration option and NOC_BRAND environment variable have been dropped. The brand name is now fixed and protected by the licence. See config.py, core/version.py, services/web/apps/main/desktop/views.py, and docs/config-reference/global.md.
  • EOL platforms have been removed from the supported deployment matrix: CentOS_7, Debian_10, OracleLinux_7, RedHat_7 / RED_7, and Ubuntu_20. Debian 11 deployment now uses archive repositories and installs Consul manually.
  • jemalloc is no longer used by the container image or service configuration (Dockerfile, services/*/conf.py).

Deploy changes

MR Title
1557cc17 Use Debian 11 archive repositories
2b1fc57b Debian 11: install Consul manually
4d5e65ae deploy: remove variables for deprecated platforms
c06ea37f deploy: remove the legacy noc_python_interpreter variable
6e34f4e4 deploy: remove the get_tags lookup plugin
cdedce8b deploy: remove the myglob lookup plugin
1cd36918 Remove the legacy compile-bytecode and cleanup-pyc deployment steps
f164c02f Remove the unused facter package

Code cleanup

MR Title
2786df25 Remove obsolete checks and outdated knowledge-base references
9bb0f914 Remove the obsolete lookup_solution parameter
349cdac5 Remove unused variables
be0d63c6 Clean up unused Ansible playbook variables
3b0b34e7 Remove deprecated Molecule test scenarios
094ea58a Add the missing src/noc/cmib → cmib link
d2d810a9 Add the missing development link
caed432f CI: disable CodeQL (security scanning moved elsewhere)

Thanks for your contributions to the NOC project!