[OpenNMS/opennms] e23ed1: NMS-20154: Migrate the Generate System Report page...
mershad-manesh via opennms-cvs <[email protected]>
| Newsgroups | gmane.network.opennms.cvs |
|---|---|
| Message-ID | <OpenNMS/opennms/push/refs/heads/merge-foundation/release-36.x-to-develop/[email protected]> |
Branch: refs/heads/merge-foundation/release-36.x-to-develop
Home: https://github.com/OpenNMS/opennms
Commit: e23ed1a215fd0499c5ddac9e0a23b792276710f8
https://github.com/OpenNMS/opennms/commit/e23ed1a215fd0499c5ddac9e0a23b792276710f8
Author: joseanesONMS <[email protected]>
Date: 2026-08-28 (Fri, 28 Aug 2026)
Changed paths:
M features/bsm/rest/impl/pom.xml
M features/status/rest/pom.xml
M opennms-openapi-docs/pom.xml
M opennms-webapp-rest/pom.xml
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/SystemReportRestService.java
M opennms-webapp-rest/src/main/webapp/WEB-INF/applicationContext-cxf-rest-v2.xml
M opennms-webapp-rest/src/main/webapp/WEB-INF/menu/menu-template-default.json
M opennms-webapp-rest/src/main/webapp/WEB-INF/menu/menu-template.json
A opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/SystemReportRestServiceTest.java
M opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml
M smoke-test/src/test/java/org/opennms/smoketest/MenuHeaderIT.java
A ui/src/containers/SystemReport.vue
M ui/src/main/router/index.ts
M ui/src/services/index.ts
A ui/src/services/systemReportService.ts
A ui/src/types/systemReport.ts
A ui/tests/systemReport.test.ts
Log Message:
-----------
NMS-20154: Migrate the Generate System Report page to Vue UI (#8824)
* NMS-20154: /api/v2/system-report metadata endpoints for the new report page
Adds a read-only SystemReportRestService exposing the visible report plugins and
formatters as JSON so a PrimeVue Generate System Report page can build its form.
The systemReport bean is wired into the REST v2 context through the SOA service
registry, mirroring the legacy dispatcher wiring, and the endpoints are gated to
ROLE_ADMIN since the report bundles logs and configuration. Report generation
itself continues to stream from the existing SystemReportController.
* NMS-20154: PrimeVue Generate System Report page
Replaces the legacy systemReport JSP form with a PrimeVue page at /system-report:
plugin checkboxes with an All master toggle, a report-type Select, and an optional
file name. The page loads its options from /api/v2/system-report and, on Generate,
posts operation=run to the existing SystemReportController through a hidden iframe
so the browser streams the report download without navigating away. The route is
admin-gated to match the endpoint.
* NMS-20154: wire systemReport via the root-context serviceRegistry bean
serviceRegistry is a root-context bean (applicationContext-soa.xml) and the CXF
/api/v2 servlet context has the root as its parent, so a direct ref resolves it —
matching the legacy dispatcher wiring. Replaces the earlier onmsgi:reference,
which had no matching OSGi service registration.
* NMS-20154: point the Support menu entry at the new system report page
Repoints the "Generate System Report" menu item from the legacy
admin/support/systemReportList.htm JSP to the PrimeVue page at
ui/index.html#/system-report.
* NMS-20154: report-service unit test and a generating-report notice
Adds a SystemReportRestService unit test covering the visible-only filtering and
DTO mapping for plugins and formatters. The page now shows a notice on Generate
that the report is being built and may take a while on a large system, since the
report is produced on demand (plugins run and logs/config are gathered and
compressed before the streamed download begins) and the browser cannot signal
when that download completes.
* NMS-20154: address review — surface generation failures, sanitize filename
The Generate flow now detects when the hidden download frame loads an error page
(a failed download never loads it) and surfaces the failure instead of silently
doing nothing. The optional filename is sanitized to word characters the same way
the server does, and omitted when it would collapse to an empty name. The default
report format returns to the legacy 'text', plugin checkbox ids are made
whitespace-safe, the context path is derived from the URL when the menu base is
unavailable, and a non-admin deep-link no longer flashes a load error before the
route guard redirects. Also drops the dead JSON-shape fallback in the service.
* NMS-20154: update the smoke assertion for the new system report page
The Support -> Generate System Report menu entry now opens the PrimeVue
page (ui/index.html#/system-report), which renders the /ui breadcrumb
(div.breadcrumbs) and an OnmsButton. MenuHeaderIT still waited on the
legacy JSP DOM (ol.breadcrumb 'System Reports' and a Bootstrap submit
input), so testMenuEntries timed out. Point it at the new page's
breadcrumb link and generate button.
* NMS-20154: use Onms-XXX wrappers and a REST download for system report
Address review on the Generate System Report page:
- Swap direct PrimeVue (Card, Checkbox, Select, InputText) for the
@opennms/onms-ui wrappers (OnmsCard/OnmsCheckbox/OnmsSelect/
OnmsInputText); the binary OnmsCheckbox drives per-plugin selection
through an explicit add/remove toggle.
- Replace the hidden-iframe form POST to the legacy systemReport.htm
with a POST /api/v2/system-report/generate that streams the report as
an attachment, consumed via composables/useDownload. The endpoint
ports FormatterView (resolve formatter, run selected plugins, sanitize
filename) and rejects unknown/non-streaming formatters and empty
plugin sets with 400s. Generation is admin-only in spring-security.
- Cover the endpoint (stream order, attachment header, filename
sanitising, the 400 paths) and rewrite the page test for the new flow.
* NMS-20154: give the sibling v2 REST ITs the system-report class on their test classpath
features/status/rest and features/bsm/rest/impl boot opennms-webapp-rest's
shared applicationContext-cxf-rest-v2.xml in their ITs. That context now
instantiates SystemReportRestService and defines the systemReport bean
(class org.opennms.systemreport.SystemReport), which opennms-webapp-rest
declares provided (non-transitive), so those ITs failed to load the whole
context with a ClassNotFoundException. Add system-report as a test-scope
dependency in both modules, mirroring the existing topology-views/jsonStore
entries that cover the same shared-context requirement.
* NMS-20154: re-run CI (flaky smoke test AdminPasswordGateIT, unrelated)
* NMS-20154: put system-report on the openapi-docs classpath
The swagger scan reflects over SystemReportRestService's declared fields, so
the type of m_systemReport must be resolvable when opennms-openapi-docs builds.
webapp-rest declares the system-report feature as provided (non-transitive),
so add it here at provided scope too — matching the topology-views entry that
exists for the same reason and the sibling fixes in bsm/rest and status/rest.
Commit: e9ea5ca0b8c6876b8bb58bae8f392a514b5abcb5
https://github.com/OpenNMS/opennms/commit/e9ea5ca0b8c6876b8bb58bae8f392a514b5abcb5
Author: mershad-manesh <[email protected]>
Date: 2026-08-28 (Fri, 28 Aug 2026)
Changed paths:
M docs/modules/deployment/pages/core/docker/initialize.adoc
M docs/modules/releasenotes/pages/whatsnew.adoc
Log Message:
-----------
NMS-20261, NMS-20259: clarify Docker upgrade docs for etc config and ticketer plugin (#8829)
Docker upgrades don't reconcile a persisted etc volume against the new
version's defaults, so a stock config carrying the removed
opennms.ticketer.plugin=NullTicketerPlugin property causes startup to
fail. Document the gap and point at config-diff.sh/config-tester, and
correct the release note to mention the base opennms.properties file.
Commit: 7497c332b77abc508c108bd117c8687228fee3a3
https://github.com/OpenNMS/opennms/commit/7497c332b77abc508c108bd117c8687228fee3a3
Author: Chandra Gorantla <[email protected]>
Date: 2026-08-31 (Mon, 31 Aug 2026)
Changed paths:
M docs/modules/development/nav.adoc
A docs/modules/development/pages/oia/mcp-server.adoc
M docs/modules/releasenotes/pages/whatsnew.adoc
M pom.xml
Log Message:
-----------
PNNMS-2: Update integration api version, update docs (#8825)
* PNNMS-2: Add docs for MCP server
* Update api version
* Update docs
* Update in whatsnew
Commit: 1a3812687d402f587567d6a8234a89a0ed0306d5
https://github.com/OpenNMS/opennms/commit/1a3812687d402f587567d6a8234a89a0ed0306d5
Author: mershad-manesh <[email protected]>
Date: 2026-08-31 (Mon, 31 Aug 2026)
Changed paths:
M .circleci/epoch
Log Message:
-----------
Update epoch
Commit: 0a8ae2df30724298c030e29b8a6d8b26f7675afe
https://github.com/OpenNMS/opennms/commit/0a8ae2df30724298c030e29b8a6d8b26f7675afe
Author: CI/CD System <[email protected]>
Date: 2026-08-31 (Mon, 31 Aug 2026)
Changed paths:
M docs/modules/deployment/pages/core/docker/initialize.adoc
M docs/modules/development/nav.adoc
A docs/modules/development/pages/oia/mcp-server.adoc
M docs/modules/releasenotes/pages/whatsnew.adoc
M pom.xml
Log Message:
-----------
Merge remote-tracking branch 'origin/foundation-2026' into release-36.x
Commit: 3720b4d574de6708cc18b553e145ae08c13177e8
https://github.com/OpenNMS/opennms/commit/3720b4d574de6708cc18b553e145ae08c13177e8
Author: joseanesONMS <[email protected]>
Date: 2026-08-31 (Mon, 31 Aug 2026)
Changed paths:
A opennms-webapp-rest/127.0.0.1.tm4.epoch
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/DashboardRestService.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/api/DashboardRestApi.java
A opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/DashboardRestServiceIT.java
A opennms-webapp-rest/tmlog4.log
M opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml
M opennms-webapp/src/main/webapp/includes/quicksearch-box.jsp
M ui/package.json
M ui/pnpm-lock.yaml
A ui/src/components/Dashboard/DashboardFilterControl.vue
A ui/src/components/Dashboard/DashboardGrid.vue
A ui/src/components/Dashboard/DashboardToolbar.vue
A ui/src/components/Dashboard/PanelFrame.vue
A ui/src/components/Dashboard/PanelOptionsDialog.vue
A ui/src/components/Dashboard/defaultLayout.ts
A ui/src/components/Dashboard/filter.ts
A ui/src/components/Dashboard/panels/HtmlContentPanel.vue
A ui/src/components/Dashboard/panels/NotesPanel.vue
A ui/src/components/Dashboard/panels/SamplePanel.vue
A ui/src/components/Dashboard/registry.ts
A ui/src/components/Dashboard/severity.ts
A ui/src/components/Dashboard/timeframe.ts
A ui/src/composables/useDashboardRefresh.ts
A ui/src/containers/Dashboard.vue
M ui/src/main/router/index.ts
A ui/src/services/dashboardService.ts
A ui/src/stores/dashboardStore.ts
A ui/src/types/dashboard.ts
A ui/tests/components/Dashboard/HtmlContentPanel.test.ts
A ui/tests/components/Dashboard/filter.test.ts
A ui/tests/components/Dashboard/registry.test.ts
A ui/tests/components/Dashboard/severity.test.ts
A ui/tests/components/Dashboard/timeframe.test.ts
A ui/tests/composables/useDashboardRefresh.test.ts
A ui/tests/services/dashboardService.test.ts
A ui/tests/stores/dashboardStore.test.ts
Log Message:
-----------
NMS-19851: configurable dashboard framework (base) (#8721)
* NMS-19851: Configurable system-wide dashboard (milestones 1-2 + persistence backend)
Adds a configurable, PrimeVue-based Vue 3 dashboard under /ui (route
/dashboard) to begin replacing the legacy JSP homepage, plus the REST
endpoint to persist its layout.
Frontend (ui/):
- Panel framework: registry, Pinia store, default layout, PanelFrame chrome
(PrimeVue Panel), and a sample panel. Panels receive resolved filter /
timeframe / refresh contracts.
- DashboardGrid uses grid-layout-plus for drag + resize (edit mode only);
geometry flows grid -> store, add/remove/collapse flow store -> grid.
- Toolbar: global timeframe, refresh interval + pause (NMS-4404), add panel,
save/edit; per-panel collapse/rename/remove.
- Global filter control (NMS-10507): surveillance categories + IP match.
- dashboardService talks to /api/v2/dashboard/system (404 -> built-in default).
Backend (opennms-webapp-rest):
- DashboardRestApi / DashboardRestService: GET/PUT /api/v2/dashboard/system,
persisting one system-wide JSON layout document via JsonStore.
Addresses NMS-11946 (collapse/rearrange/hide) and lays groundwork for
NMS-4433 (new panel types). Future: per-user / named dashboards reuse the
same layout document by varying its scope.
* NMS-19851: Add first real dashboard panels (notifications, status overview, nodes with alarms)
Replaces the placeholder default layout with three panels matching the legacy
homepage boxes:
- Notifications: outstanding-notice counts from /rest/notifications/summary.
- Status Overview: Chart.js doughnut of alarm counts by severity, read from
/api/v2/alarms totalCount per severity (FIQL alarm.severity==).
- Nodes with Pending Alarms: alarms grouped by node with count + max severity.
Adds a shared severity util (ordering, labels, OpenNMS-standard colors) and a
notificationService. Panels refetch on the global refresh tick.
* NMS-19851: Status Overview outages donut + News Feed panel
- Status Overview now shows BOTH legacy doughnuts (alarms + outages), sourced
from /api/v2/status/summary/nodes/{alarms,outages} (nodes grouped by unacked
alarms / current outages), replacing the prior alarms-only per-severity count.
- New News Feed panel from /api/v2/newsfeed (title/link/short description/tags).
Adds statusService and newsfeedService; both panels added to the default layout.
* NMS-19851: Add Pending Situations and Service Outages panels
- Pending Situations: alarms filtered isSituation==true (/api/v2/alarms), with
severity, affected-node/alarm counts.
- Nodes with Service Outages: currently-open outages from /api/v2/outages
(FIQL ifRegainedService==epoch), node + service name.
Adds outageService and situationService; refactors the default layout into a
three-column arrangement (situations/alarms/outages, status overview,
notifications/news) via a small panel() helper.
* NMS-19851: Add Regional Status map panel
Leaflet/OSM map (vue-leaflet) replicating the legacy homepage map: geolocated
nodes (/api/v2/nodes assetRecord) with markers colored by each node's highest
alarm severity (derived from /api/v2/alarms). Handles grid resize via
ResizeObserver -> invalidateSize. Added to the registry + default layout.
* NMS-19851: Wider middle column in default dashboard layout
Match the legacy homepage proportions: 3 / 6 / 3 of the 12-col grid (was even
4/4/4). Left = situations/alarms/outages, center (wide) = status overview + map,
right = notifications/news. Individual panels remain resizable via the grid.
* NMS-19851: Add Availability (24h) panel
Replicates the legacy "Availability Over the Past 24 Hours" categories box from
GET /rest/availability (RTC category data: outage-text, availability-text,
availability-class). Table of category / outages / availability with an Overall
Service Availability total row; availability colored by class. No new backend
needed. Added to registry + default layout (center column, under Status Overview).
* NMS-19851: Add Business Services and Applications (with pending alarms) panels
Both replicate the legacy summary boxes from the existing status REST
(/api/v2/status/business-services and /status/applications) — no new backend
needed; the list-with-severity endpoints already exist in StatusRestService.
Shared StatusListPanel renders name + severity badge, filtered to problem
severities (WARNING+). Added to registry + left column of the default layout.
* NMS-19851: Search widgets, original-layout order, toolbar tooltips + fullscreen
- Add Quick Search (node id/label/IP -> element/nodeList.htm), and Resource
Graphs / KSC Reports launcher panels (link to legacy chooser pages; full
typeahead is a follow-up).
- Default layout now mirrors the legacy homepage column order/positions for
easy comparison: left = situations/alarms/outages/BSM/apps/news; center =
status/availability/map; right = notifications/resource-graphs/KSC/quick-search.
- Toolbar: title tooltips on the timeframe + refresh selects (and pause), and a
Full screen button (Fullscreen API on the dashboard container) for NOC displays.
* NMS-19851: Dashboard panel polish (map, donuts, panel height, double titles)
- PanelFrame: make the PrimeVue Panel content wrappers flex to a bounded height
so fill-height panels (map, charts) size correctly instead of overflowing.
- Regional Status: always renders the map (even with no nodes); remembers pan +
zoom across reloads via localStorage; empty-state shown as a small pill.
- Status Overview: thicker donuts (cutout 55%) that fit the box (no longer cut).
- Resource Graphs / KSC Reports: drop the redundant in-panel title (the panel
header already shows it).
* NMS-19851: Fix fullscreen, footer overlap, overlay font, donut resize
- web.xml: Permissions-Policy was fullscreen=() which blocked the Fullscreen API;
changed to fullscreen=(self). Toolbar fullscreen toggle now also falls back to
a CSS "maximize" if the API is unavailable.
- DashboardGrid: add bottom padding so the app's fixed copyright bar no longer
cuts the last panels.
- Dashboard: global style so PrimeVue overlays (teleported to <body>) use the app
sans-serif font instead of the serif default (fixes combo-box dropdown font).
- Status Overview: donuts resize with the panel (ResizeObserver) and are clipped
to the box.
* NMS-19851: Per-panel options dialog, fixed/auto height, Notes + HTML panels
- Per-panel options dialog (gear): height mode + panel-type-specific settings.
- Height mode per panel: 'fixed' (fixed grid height + scrollbar) or 'auto'
(PanelFrame measures natural content height; DashboardGrid fits the cell, so
empty list panels shrink to a couple of lines). Auto panels aren't manually
resizable and their height isn't persisted. Registry defaults match the legacy
homepage: News Feed / Availability / Status Overview / Regional map = fixed,
all the list panels = auto.
- New panels: Notes (free text in options) and HTML Content (iframe to a URL;
same-origin per the frame-src CSP).
* NMS-19851: Fix panel overlap from auto-height (manual vertical compaction)
grid-layout-plus doesn't recompact on programmatic height changes, so auto-height
resizes (and add/remove) could leave panels overlapping. Add our own vertical
compaction (place each item at the lowest non-colliding y in its columns) run
after auto-height changes and reconcile.
* NMS-19851: Fix fixed-panel height chain, internal scroll vs footer, HTML URL validation
- Fixed panels now actually bound + scroll: the PrimeVue 4 chain has an extra
.p-panel-content-wrapper between container and content that wasn't flexed —
add it. This fixes News Feed/Availability scrollbars AND the Regional map
(the map now gets a real height and renders tiles even with no nodes).
- Dashboard scrolls internally (flex column; grid is the scroll region) and the
content chain gets a definite height via :has(#dashboard-root), so a tall
dashboard no longer overflows past the app footer/copyright bar.
- HTML Content options: validate the URL — external (cross-origin) URLs are
rejected with an explanation (blocked by frame-src 'self' CSP) before applying.
* NMS-19851: Auto-height panels shrink to content (min-h=1, no reserved whitespace)
Auto panels were clamped to the registry minSize.h, leaving whitespace under
short content (and reserving space visibly in edit mode). Use min-h=1 for
auto-height panels so the cell hugs the measured content.
* NMS-19851: Add Top N panel (rank entities by a chosen KPI over the timeframe)
New 'topn' panel: ranks by a selectable KPI with sort direction and N (options
dialog). Default KPI = Node Response Time (ICMP), descending, N=5. Data via the
measurements API (POST /rest/measurements): enumerate matching resources from
/rest/resources, query one AVERAGE bucket over the resolved timeframe, sort,
take N. KPI registry (topnService) is extensible for more KPIs.
* NMS-19851: TopN measurements use a normal-resolution step (fix NaN)
A single range-sized RRD bucket returns NaN; query at ~range/1000 (min 5min)
and average the series for the aggregate.
* NMS-19851: Fix auto-height measurement + dark-mode panel theming
- PanelFrame now wraps the PrimeVue Panel in a real <div> (frameRef) and measures
that for auto-height — the component ref didn't reliably expose a DOM node, so
auto panels never shrank (the leftover whitespace). Auto panels now fit content.
- Panel surface/header/text/border use Feather theme variables
(--feather-elevation-background-2 / -primary-text-on-surface / -border-on-surface),
which adapt under .open-dark — so panels are legible in dark mode instead of
white-with-invisible-text.
* NMS-19851: Tighten panel padding + compact columns on mount (less whitespace)
Reduce PrimeVue panel header/content padding so short auto panels (Resource
Graphs, KSC, etc.) don't round up to an extra grid row, and run a vertical
compaction pass shortly after mount so columns stack tight once panels report
their auto heights.
* NMS-19851: Real compaction (fresh refs), severity-shading option, legacy->new button
- DashboardGrid: compaction now reassigns the layout with FRESH item objects (and
vertical-compact enabled) so grid-layout-plus actually re-renders compacted
positions — removes the leftover gaps in saved layouts (e.g. Resource Graphs/KSC).
- Per-panel "Shade rows by severity" option (legacy-style) for Pending Situations,
Nodes with Pending Alarms, and Availability — rows tinted by severity.
- Legacy homepage: "Try the new Dashboard (beta)" button below the Quick Search box
(links to /opennms/ui/#/dashboard).
* NMS-19851: Auto-height actually applies (always reassign) + service-types backend/combo
- DashboardGrid: grid-layout-plus only re-renders when the layout ARRAY ref/length
changes (watch on [layout, length]); it ignored in-place h/y mutations. compactLayout
now ALWAYS reassigns fresh item objects, so auto-height + compaction truly apply
(this was why the whitespace "did nothing").
- Backend: DashboardRestService gains GET /api/v2/dashboard/service-types (id+name)
via ServiceTypeDao; rebuilt + deployed the webapp-rest jar.
- Quick Search: "Providing service" combo populated from that endpoint, posting the
service id to element/nodeList.htm (matches the legacy box).
* NMS-19851: Pixel-perfect panel heights, panel/category deep-links, dedup availability total
Spacing (real fix): switch the grid to pixel units — row-height=1, vertical
margin=0, h measured in px. Auto panels size to exactly their content height plus
a 12px gap (was rounding up to the next ~56px row, which caused the persistent
whitespace). Fixed panels fill the cell minus that 12px gap. Old/default layouts
(h in ~44px row units) are auto-converted to px on load.
Linking parity with the legacy front page:
- Panel titles deep-link (Situations/Alarms -> alarm/list.htm, Outages ->
outage/list.htm, Applications -> application/index.jsp, Availability ->
rtc/index.jsp, Notifications -> notification/index.jsp, Resource Graphs ->
graph/index.jsp, KSC -> KSC/index.jsp). Plain text while in edit mode so the
header stays a drag handle.
- Availability category names link to rtc/category.jsp (outage detail).
Availability: render the REST "Total" section's "Overall Service Availability"
row as the bold total instead of appending our own computed row (removes the
duplicate).
Legacy homepage "Try the new Dashboard" button: blue -> light gray.
* NMS-19851: BSM title deep-link + readable donut legend in dark mode
- Business Services panel title now links to the BSM topology view
(topology?provider=Business Services&layout=Hierarchy Layout&szl=1).
- Status Overview donut legends read the Feather text color so labels are
legible on the dark surface (Chart.js' default gray was unreadable); a
MutationObserver recolors them live when the .open-dark theme is toggled.
* NMS-19851: Metric Chart panel — line chart of one entity/metric over the timeframe
New 'metric-chart' panel type: Chart.js line chart of a single metric on a
single entity over the panel's resolved timeframe. Entity and metric are
single-selects in the panel options (entity list = entities with data for
the chosen metric); defaults: localhost / Node Response Time (ICMP).
Reuses the Top-N KPI registry and measurements data path (listKpiSources
extracted from queryTopn).
* NMS-19851: Hide Sample Panel from the Add Panel picker
Registry 'hidden' flag: the panel stays registered (renders if a layout
references it, handy for framework debugging) but is no longer offered
in production via Add Panel.
* NMS-19851: 'Reset to default' in edit mode — restore the factory layout
store.applyFactoryDefault() swaps in createDefaultLayout() (legacy homepage
parity incl. the Regional Map) and marks dirty; persists on Save. Fixes the
gap where a saved layout always shadowed the built-in default with no way
back (store.reset() only reloads the saved doc).
* NMS-19851: Status Overview donut slices deep-link in context (legacy parity)
Clicking a severity slice navigates to the legacy severity-filtered node
list (status/index.jsp?type=nodes&strategy={alarms|outages}&severityFilter=),
matching the original homepage status-box onclick; pointer cursor on hover.
* NMS-19851: adapt the dashboard to current develop
FeatherDS is gone from the UI stack: the SORT enum import moves to its
vendored home in @/types, and the panel styling swaps the feather CSS
variables for the PrimeVue tokens the rest of /ui uses, including the
computed-style reads that color the Chart.js legends. grid-layout-plus is
the only dependency develop did not already carry.
* NMS-19851: dashboard test suite and admin-only layout writes
Adds the missing automated coverage: store behavior (load/save/dirty
tracking, panel operations, geometry sync, override resolution), panel
registry and default-layout consistency, timeframe range math, severity
helpers, the service fallback paths, the global refresh timer, and a REST
integration test for the layout document lifecycle and service types.
The layout endpoint gets the security it implied but never enforced:
every user can read the system dashboard, only admins can save it —
enforced by Spring Security rules and an in-code check, and covered by
the integration test.
* NMS-19851: fix adversarial review findings on the dashboard
Correctness: the grid now applies a loaded layout (a layout-revision watch
rebuilds geometry, and geometry is only written back while editing, so a
saved arrangement is no longer overwritten by defaults on open); a failed
load keeps the current layout instead of fabricating the default that a
Save would then persist; a partial/corrupt stored document is normalized
so it can't crash every user's homepage; route re-entry preserves unsaved
edits. Top-N maps measurements to sources by the label index the backend
returns (not position, which is hash-ordered); Nodes-with-Alarms counts
only unacknowledged WARNING+ alarms; Top-N and the metric chart guard
against stale concurrent responses.
Security: the HTML-content iframe only loads validated same-origin http(s)
URLs (a persisted javascript:/data: URL no longer executes); the app-wide
fullscreen Permissions-Policy relaxation is reverted (the toolbar falls
back to CSS maximize); the dashboard security rules no longer shadow the
/api/v2 GET catch-all; Edit/Save are admin-only, matching the layout PUT.
Features: the global filter (surveillance categories resolved to node ids,
plus IP match) now constrains the node-scoped panels; a custom timeframe
gains a real date-range picker and panels react to from/to; the newsfeed
honors opennms.newsFeedPanel.show=false without any outbound request.
Adds tests for the store, service normalization/errors, the filter helper,
Top-N mapping, and the iframe URL guard.
* NMS-19851: move timeframeRange into the framework timeframe helper
The preset-to-epoch-range resolver is a timeframe concern used by both the
Top-N and metric-chart panels; moving it out of topnService lets the panel
groups be split cleanly without the framework depending on a panel service.
* NMS-19851: configurable dashboard framework (base)
The layout engine and its supporting framework, with an empty default
dashboard: grid-layout-plus grid with drag/resize/collapse/rename/remove,
the panel registry and Add-panel picker, one system-wide layout persisted
as JSON via /api/v2/dashboard (admin-only writes), the global refresh
timer with pause, the timeframe and filter toolbar controls, and full-
screen. Ships the three content-agnostic panels used to exercise the
framework — Sample (hidden), Notes, and HTML Content — and a beta link to
the dashboard on the legacy homepage. Parity panels (NMS-20126) and the
new panels (NMS-20127) build on this and introduce the default layout.
* NMS-19851: resolve dashboard filter categories via the node search that filters
The bare /api/v2/nodes?category=NAME parameter is ignored and returns every
node, so the global filter's category selection resolved to all node ids and
did not filter. Use the node search property that actually constrains by
membership (_s=category.name==NAME).
* NMS-19851: drop accidentally committed ui/node_modules symlink
A stray symlink to a local worktree's node_modules was committed with the
base framework change; it makes the CI pnpm install fail with ENOTDIR when it
tries to create the real node_modules directory.
* NMS-19851: onms-ui seam migration, auto-fit layout option, auto-height compaction fix
Move the dashboard framework chrome off direct PrimeVue onto the
@opennms/onms-ui Onms-* wrappers (NMS-20081 seam), so the framework
passes the no-direct-primevue lint rule. PanelFrame's edit icons move
into the panel header slot since OnmsPanel forwards only that slot.
Add an auto-fit ("squeeze") layout option persisted on the layout doc
and toggleable in edit mode: panels pack up and down against their
neighbours, or stay free-form. Fix the auto-height race where an async
layout reload reset measured panel heights back to their authored
placeholder and left gaps — measured heights are now cached and reused
across rebuilds, so collapse/expand and initial load pack tightly.
* NMS-19851: satisfy arrow-parens lint on listPanelDefinitions
* NMS-19851: satisfy stylistic lint in the dashboard tests !smoke
The develop refresh brought stricter stylistic eslint rules that the
dashboard test files predate; build-ui was red on 17 auto-fixable
object-curly-spacing/arrow-parens/brace-style errors. lint:fix output only;
the 52 dashboard tests still pass.
Commit: 2541cd223eb4b7754eb7c1f1ce16713d5cc9728b
https://github.com/OpenNMS/opennms/commit/2541cd223eb4b7754eb7c1f1ce16713d5cc9728b
Author: Scott Theleman <[email protected]>
Date: 2026-09-01 (Tue, 01 Sep 2026)
Changed paths:
M ui/src/components/Menu/SideMenu.vue
M ui/tests/components/Menu/SideMenu.test.ts
Log Message:
-----------
NMS-20273: Open side menu submenus on hover, in both rail states (#8831)
* NMS-20273: Open side menu submenus on hover, in both rail states
Commit: 703cce78f622eccda59f1e668e2d943083713e74
https://github.com/OpenNMS/opennms/commit/703cce78f622eccda59f1e668e2d943083713e74
Author: mershad-manesh <[email protected]>
Date: 2026-09-01 (Tue, 01 Sep 2026)
Changed paths:
M .circleci/epoch
Log Message:
-----------
Update epoch
Commit: 5c1a89a25d24c98cabab86615ef19afe4a3d459f
https://github.com/OpenNMS/opennms/commit/5c1a89a25d24c98cabab86615ef19afe4a3d459f
Author: Dino <[email protected]>
Date: 2026-09-01 (Tue, 01 Sep 2026)
Changed paths:
M core/schema/src/main/java/org/opennms/core/schema/Migrator.java
M opennms-base-assembly/src/main/filtered/etc/jdbc-datacollection-config.xml
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-activity-graph.properties
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-dead-tuples-graph.properties
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-xid-graph.properties
M opennms-base-assembly/src/main/filtered/etc/threshd-configuration.xml
M opennms-base-assembly/src/main/filtered/etc/thresholds.xml
Log Message:
-----------
NMS-20265: Add PostgreSQL health metrics to the default JDBC collection (#8818)
Commit: f6b7b8b7bb63caccaf92261f33ccbdb79f3e19d7
https://github.com/OpenNMS/opennms/commit/f6b7b8b7bb63caccaf92261f33ccbdb79f3e19d7
Author: joseanesONMS <[email protected]>
Date: 2026-09-01 (Tue, 01 Sep 2026)
Changed paths:
M opennms-config/src/main/java/org/opennms/netmgt/config/GroupManager.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/UsersRestService.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/api/UsersRestApi.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/model/UserDto.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/model/UserPasswordRequest.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/model/UserRenameRequest.java
A opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/model/UserWriteRequest.java
M opennms-webapp-rest/src/main/webapp/WEB-INF/menu/menu-template-default.json
M opennms-webapp-rest/src/main/webapp/WEB-INF/menu/menu-template.json
A opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/UsersRestServiceIT.java
M opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml
M smoke-test/src/test/java/org/opennms/smoketest/MenuHeaderIT.java
A ui/src/components/ManageUsers/DutyScheduleEditor.vue
A ui/src/components/ManageUsers/UserEditorDialog.vue
A ui/src/components/ManageUsers/UserPasswordDialog.vue
A ui/src/components/ManageUsers/UserRenameDialog.vue
A ui/src/components/ManageUsers/UsersAbout.vue
A ui/src/components/ManageUsers/UsersTable.vue
A ui/src/containers/ManageUsers.vue
M ui/src/main/router/index.ts
M ui/src/services/index.ts
A ui/src/services/userAdminService.ts
A ui/src/stores/userAdminStore.ts
A ui/src/types/userAdmin.ts
A ui/tests/components/AdminDialogs/UserEditorDialog.test.ts
A ui/tests/components/ManageUsers/DutyScheduleEditor.test.ts
A ui/tests/stores/userAdminStore.test.ts
Log Message:
-----------
NMS-20106: versioned user management API and PrimeVue Manage Users page (#8713)
* NMS-20106: versioned user management API and PrimeVue Manage Users page
Adds /api/v2/users (interface + impl following the v2 conventions):
list/get/create/update, dedicated password and rename endpoints, delete,
and available-roles — all admin-only via new Spring Security rules plus
in-code checks. users.xml stays the system of record: updates apply only
the exposed fields, so contact types the API does not carry (XMPP among
them) and the password survive untouched, and passwords are stored
salted via the existing UserManager hashing. Unlike the legacy JSPs,
which only hid the buttons, the admin/rtc delete and rename protections
are enforced server-side; responses never include the password hash
(the v1 API returns it to admins).
The new Manage Users page (ui/#/admin/users) is a straight visualization
of that API: users table without the XMPP column, add/edit dialog with
role assignment, password and rename dialogs, and delete disabled for
the protected system accounts. The Manage Users menu entry now points at
the new page.
* NMS-20106: validation, atomic updates, and tests for the users API
Fixes from self-review. The list fields of UserDto now default to null
so a request that omits them genuinely preserves roles and duty
schedules (empty-list defaults made the preservation guards dead code
and a partial update wiped both). Mutations validate the whole request
first and then apply it to a detached copy of the stored user, so a
rejected request can no longer leave partial changes in UserManager's
shared in-memory state; a failed create rolls the phantom map entry
back, and a service-level lock closes the check-then-act races. Duty
schedule validation accepts overnight ranges (legacy wrote MoTu2000-800
and hand-edited files contain them — rejecting those made such users
uneditable), user ids reject characters that cannot appear in a URL
path segment, a body/path user-id mismatch is rejected instead of
ignored, and HEAD joins the admin-only security rules. The UI keeps the
previous user list when a refresh fails instead of blanking the table.
The IT grows to 14 tests including regressions for omitted-field
preservation, rejected-update atomicity, and overnight schedules.
* NMS-20106: duty schedule runtime semantics, clearable fields, and help
Follow-up from the group-management review, applying the same findings
here. Duty schedules with begin after end are rejected for new entries
(DutySchedule.isInSchedule compares within one calendar day, so an
overnight range never matches); strings already stored on the record
keep round-tripping so hand-edited files never make a user uneditable.
Dot-segment user ids are rejected. Emptied form fields now clear the
value instead of silently preserving it. The service serializes on the
same shared monitor as the groups API because user mutations cascade
into GroupManager. Adds a collapsed "?" help panel explaining what user
accounts are for and how to use the page.
* NMS-20106: validate user fields inline and surface API errors in the dialogs
The dialogs previously reported failures only through a toast that renders
behind the modal overlay, so a rejected save looked like nothing happened.
Mutating service calls now return the server's error message, which the
dialogs display inside the form while staying open; new client-side checks
(shared lib/adminValidation.ts) mirror the server rules for user-ids and
flag malformed email addresses before submitting. Users whose ids contain
/ \ or % (possible in hand-edited users.xml) get their row actions replaced
with a file-managed note, since the security filter rejects those characters
in URL paths. Error toasts now use the error styling.
* NMS-20106: close review findings on the users API and editor
The markup regexes used full-string matches that a newline anywhere
bypassed; they now scan for the characters directly. The admin account can
no longer have ROLE_ADMIN removed (it would lock every administrator out).
applyDto treats omitted scalar fields as preserve, matching the documented
contract and the sibling APIs, so a roles-only PUT no longer wipes names,
comments and contacts. User comments now reject markup like group comments
do, with unchanged hand-edited values grandfathered. Deleting a user who
supervises an on-call role is rejected, since GroupManager leaves the
supervisor attribute dangling. The client email check accepts display-name
and comma-separated recipient forms and, like the comments check, only
fires on changed input so hand-edited values never block the editor.
* NMS-20106: follow the Manage Users menu entry to the new page in MenuHeaderIT
The menu entry now lands on the Vue page, so the smoke test waits for its
page title instead of the legacy JSP breadcrumb.
* NMS-20106: use @opennms/onms-ui wrappers on the Manage Users page
Swap direct PrimeVue components for the Onms-XXX seam wrappers across the
users table and its dialogs: Button->OnmsButton (text/outlined mapped to
variant), Dialog->OnmsDialog, InputText->OnmsInputText,
Password->OnmsPassword, MultiSelect->OnmsMultiSelect, DataTable->OnmsTable,
Column->OnmsColumn, Tag->OnmsTag. Message and IftaLabel have no wrapper
yet and stay on PrimeVue. No behaviour change.
* NMS-20106: address review — route dialog sizing through the OnmsDialog width prop
Replace :style="{ width, maxWidth }" on OnmsDialog (which rode $attrs into
PrimeVue) with the seam's declared width prop, using min(Npx, 95vw) to keep
the responsive cap.
* NMS-20106: carry on-call role supervisor across user rename
GroupManager.renameUser rewrote group memberships and schedule names but
left role.getSupervisor() pointing at the old id, so renaming a supervisor
silently killed the rota's supervisor fallback -- the same dangling-reference
case the delete path guards against. Rewrite the supervisor as part of the
rename so every reference follows the user to the new id.
* NMS-20106: bring Manage Users dialogs onto the current onms-ui seam
Drop the nested primevue IftaLabel from every field and use FormField's own
label/for/required/error props, and replace the direct primevue Message error
banners with a themed role=alert element, so the dialogs no longer import any
un-wrapped PrimeVue primitive. Field errors now render through FormField (the
two test selectors follow the FormField-generated error ids).
* NMS-20106: make the v2 users API pure camelCase JSON
Drop the JAXB annotations from the v2 user model DTOs so they serialize as
plain camelCase JSON (userId, fullName, pagerEmail, userComments, dutySchedules,
roles, readOnly, newUserId) instead of the hyphenated XML element names, and
carry that through the UI types, service, dialogs, and table. The XML mapping
to/from users.xml already lives in the REST service. Also swap the hand-rolled
isBlank/trimToNull helpers for org.apache.commons.lang3.StringUtils and match
the request-field names in the validation messages.
* NMS-20106: finish camelCase column fields on the users table
The Full Name and Pager Email columns still bound to the old hyphenated
field names after the camelCase migration, so they rendered blank; point
them at fullName/pagerEmail. Show '--' for an empty roles cell.
* NMS-20106: adopt the Info-dialog help and overflow-menu row actions
Replace the inline About panel with an Info-icon button in the table header
that opens the help copy in an OnmsDialog (new shared AboutDialogButton), and
collapse the four per-row action buttons to inline Edit and Delete plus a
overflow OnmsMenu carrying Change Password and Rename. Protected-account
disabling and the file-managed note for unaddressable ids are unchanged.
* NMS-20106: point the Manage Users menu entry to the Vue page in the default template too
menu-template-default.json must stay identical to menu-template.json.
* NMS-20106: stop cumulative HTML-escaping of full name and contacts on write
copyOf rebuilt the user through the config-model setters (setFullName,
Contact.setInfo), which run a non-idempotent Encode.forHtml, so every write —
a password change or any unrelated edit — re-escaped the stored value one
layer deeper (O'Brien -> O'Brien -> O&#39;Brien ...). Clone via a JAXB
round-trip (field access bypasses the sanitizing setters), and in applyDto only
write full name / email / pager-email through the setter when the value
actually changed. New IT stores escapable values and asserts a password change
and an unrelated edit leave them byte-for-byte unchanged.
Also fixes the build-ui lint failure (arrow-parens/quote style).
* NMS-20106: bring the Manage Users editor to parity with the legacy page
The new page (now the menu target) edited only name, email, pager-email,
comments and roles, dropping the legacy modifyUser.jsp fields that notifd
relies on. Surface the rest so the menu no longer routes to a lesser editor:
- API: UserDto gains work/mobile/home phone and numeric/text pager service +
PIN; UsersRestService maps them to the workPhone/mobilePhone/homePhone and
numericPage/textPage contacts (info + serviceProvider), writing through the
sanitizing setters only when a value changed. tui-pin, time-zone-id and duty
schedules were already on the DTO.
- UI: the editor adds phones, pager service/PIN, telephone PIN, a time-zone
picker, and an add/remove duty-schedule list.
ITs cover create + partial-update round-trips of the new contacts; editor
tests cover load/save of the new fields and the duty-schedule list.
* NMS-20106: richer duty-schedule editor with day toggles and time pickers
Replace the raw MoWeFr800-1700 text inputs in the user editor with a
DutyScheduleEditor: each coverage window is a row of day toggles (Mo–Su)
plus native begin/end time pickers, parsed from and serialized back to the
canonical schedule string. A hand-edited entry the structured form can't
represent stays editable as raw text so it is never silently dropped.
* NMS-20106: validate tuiPin, roll back failed saves, stop dialog rewrites !smoke
users.xsd constrains tui-pin to [0-9]+ but it was the only field written
unvalidated: a bad PIN entered the in-memory map, failed the schema-validating
marshal, and — with isUpdateNeeded() seeing an unchanged file — wedged every
later user mutation until restart. It is now rejected with a 400 before it
touches the map, and the IT proves a valid write still succeeds after the
rejected one.
updateUser and setPassword get the same rollback discipline createUser
already had: a failed save re-saves the previous state, so a 500 no longer
leaves a new password hash live in memory until a restart quietly reverts it.
The duty-schedule editor no longer rewrites schedules on open: parsed rows
keep their incoming string and serialize it byte-identically until the row
itself is edited, and the watcher only emits when the value actually changes.
The server grandfathers legacy strings byte-identically, so the old
mount-time canonicalization (day order, zero-padding) made such users
unsavable for unrelated edits. Tests cover the non-canonical shape from the
review: no emit on mount, untouched rows survive verbatim, canonicalization
only on a real edit.
Commit: ccba3308119c6239abc00ef2e198acb16264301c
https://github.com/OpenNMS/opennms/commit/ccba3308119c6239abc00ef2e198acb16264301c
Author: CI/CD System <[email protected]>
Date: 2026-09-01 (Tue, 01 Sep 2026)
Changed paths:
M .circleci/epoch
M core/schema/src/main/java/org/opennms/core/schema/Migrator.java
M opennms-base-assembly/src/main/filtered/etc/jdbc-datacollection-config.xml
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-activity-graph.properties
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-dead-tuples-graph.properties
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-xid-graph.properties
M opennms-base-assembly/src/main/filtered/etc/threshd-configuration.xml
M opennms-base-assembly/src/main/filtered/etc/thresholds.xml
M ui/src/components/Menu/SideMenu.vue
M ui/tests/components/Menu/SideMenu.test.ts
Log Message:
-----------
Merge remote-tracking branch 'origin/foundation-2026' into release-36.x
Commit: 5d592532346f4f7808ccafaffe1e53bed8ee4bdd
https://github.com/OpenNMS/opennms/commit/5d592532346f4f7808ccafaffe1e53bed8ee4bdd
Author: Chandra Gorantla <[email protected]>
Date: 2026-09-02 (Wed, 02 Sep 2026)
Changed paths:
M opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml
Log Message:
-----------
NMS-20248: Fix missing authorization on /api/v2 PATCH endpoints (#8833)
Commit: 7142cedc289e9fa3d1775006d424dc8de282f258
https://github.com/OpenNMS/opennms/commit/7142cedc289e9fa3d1775006d424dc8de282f258
Author: CI/CD System <[email protected]>
Date: 2026-09-02 (Wed, 02 Sep 2026)
Changed paths:
M opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml
Log Message:
-----------
Merge remote-tracking branch 'origin/foundation-2026' into release-36.x
Commit: 847a82ed7001231e7c9c912b8c923143c5f0c33a
https://github.com/OpenNMS/opennms/commit/847a82ed7001231e7c9c912b8c923143c5f0c33a
Author: Morteza E <[email protected]>
Date: 2026-09-02 (Wed, 02 Sep 2026)
Changed paths:
M core/schema/src/main/java/org/opennms/core/schema/Migrator.java
M docs/modules/deployment/pages/core/docker/initialize.adoc
M docs/modules/development/nav.adoc
A docs/modules/development/pages/oia/mcp-server.adoc
M docs/modules/releasenotes/pages/whatsnew.adoc
M opennms-base-assembly/src/main/filtered/etc/jdbc-datacollection-config.xml
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-activity-graph.properties
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-dead-tuples-graph.properties
A opennms-base-assembly/src/main/filtered/etc/snmp-graph.properties.d/postgresql-xid-graph.properties
M opennms-base-assembly/src/main/filtered/etc/threshd-configuration.xml
M opennms-base-assembly/src/main/filtered/etc/thresholds.xml
M opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml
M pom.xml
M ui/src/components/Menu/SideMenu.vue
M ui/tests/components/Menu/SideMenu.test.ts
Log Message:
-----------
Merge remote-tracking branch 'origin/release-36.x' into develop
Compare: https://github.com/OpenNMS/opennms/compare/ee6df0b663b9...847a82ed7001
To unsubscribe from these emails, change your notification settings at https://github.com/OpenNMS/opennms/settings/notifications
_______________________________________________
Please read the OpenNMS Mailing List FAQ:
http://www.opennms.org/wiki/index.php?page=MailingListFaq
opennms-cvs mailing list
To *unsubscribe* or change your subscription options, see the bottom of this page:
https://lists.sourceforge.net/lists/listinfo/opennms-cvs