[OpenNMS/opennms] b9ad63: NMS-20258: Keep the DataSource across an event tra...

joseanesONMS via opennms-cvs <[email protected]>
Newsgroups gmane.network.opennms.cvs
Message-ID <OpenNMS/opennms/push/refs/heads/jira/NMS-20127-new-panels/[email protected]>
  Branch: refs/heads/jira/NMS-20127-new-panels
  Home:   https://github.com/OpenNMS/opennms
  Commit: b9ad63b5948e9e4df47a3ba40bc2cbb3f2b177fe
      https://github.com/OpenNMS/opennms/commit/b9ad63b5948e9e4df47a3ba40bc2cbb3f2b177fe
  Author: Marshall Massengill <[email protected]>
  Date:   2026-08-26 (Wed, 26 Aug 2026)

  Changed paths:
    M opennms-config/src/main/java/org/opennms/netmgt/config/EventTranslatorConfigFactory.java
    A opennms-config/src/test/java/org/opennms/netmgt/config/EventTranslatorConfigReloadTest.java

  Log Message:
  -----------
  NMS-20258: Keep the DataSource across an event translator config reload (#8814)

EventTranslatorConfigFactory.update() unmarshalled the new configuration
through an overload that passed a null DataSource, so m_dbConnFactory was
cleared on every reload. SqlValueSpec reads that field when it evaluates,
so after the first reloadDaemonConfig for the Translator every mapping
holding a type="sql" value threw

  NullPointerException: Cannot invoke "javax.sql.DataSource.getConnection()"
  because "this.m_db" is null

and stopped translating until OpenNMS was restarted. Mappings without a sql
value kept working, which is why the reload looked successful.

update() was the only caller of the single-argument overload, so it now
passes the DataSource it already holds and the overload is gone.

Reproduced on a live 36.0.4 instance against a translation whose values are
resolved in sql. The shipped translator-configuration.xml resolves ifDescr,
ifName and ifAlias that way, so a reload leaves the default link-down and
link-up translations broken. Present unchanged since 2012 and on every
maintained branch.


  Commit: 167337244656caa2ad3a649ac6b9dbcf5c662240
      https://github.com/OpenNMS/opennms/commit/167337244656caa2ad3a649ac6b9dbcf5c662240
  Author: CI/CD System <[email protected]>
  Date:   2026-08-26 (Wed, 26 Aug 2026)

  Changed paths:
    M opennms-config/src/main/java/org/opennms/netmgt/config/EventTranslatorConfigFactory.java
    A opennms-config/src/test/java/org/opennms/netmgt/config/EventTranslatorConfigReloadTest.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2024' into foundation-2025


  Commit: b673d2484793c18d5380c48bd5ccf02b04af56c2
      https://github.com/OpenNMS/opennms/commit/b673d2484793c18d5380c48bd5ccf02b04af56c2
  Author: CI/CD System <[email protected]>
  Date:   2026-08-26 (Wed, 26 Aug 2026)

  Changed paths:
    M opennms-config/src/main/java/org/opennms/netmgt/config/EventTranslatorConfigFactory.java
    A opennms-config/src/test/java/org/opennms/netmgt/config/EventTranslatorConfigReloadTest.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2025' into foundation-2026


  Commit: 48b76a191dd69c2acee461b7582bba1a41630d24
      https://github.com/OpenNMS/opennms/commit/48b76a191dd69c2acee461b7582bba1a41630d24
  Author: Marshall Massengill <[email protected]>
  Date:   2026-08-26 (Wed, 26 Aug 2026)

  Changed paths:
    M opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/SnmpConfigRestService.java
    M opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/SnmpConfigRestServiceIT.java

  Log Message:
  -----------
  NMS-20262: Make the JSON snmp-config download a faithful restore (#8816)

GET /snmp-config/download?format=json serialized SnmpConfig through its
getters, and those getters substitute a default when the backing field is
null (timeout and retry return 0, port 161, max-vars-per-pdu 10, and so
on). Every value a definition inherited from the top-level config was
therefore written out as an explicit one, and re-uploading the file
through POST /snmp-config/upload pinned each definition's timeout and
retry to 0 - agents that had been polling on the global 1800 ms timeout
were left with none. The XML pair was unaffected because JAXB binds to
the fields.

Serialize the download from the fields instead, dropping nulls, so the
file carries only what was actually configured. The upload path and the
other JSON endpoints keep the existing mapper.

Co-authored-by: Marshall Massengill <[email protected]>


  Commit: 25cd7ac0163d23134e1ba278cc362e963fb850e1
      https://github.com/OpenNMS/opennms/commit/25cd7ac0163d23134e1ba278cc362e963fb850e1
  Author: CI/CD System <[email protected]>
  Date:   2026-08-26 (Wed, 26 Aug 2026)

  Changed paths:
    M opennms-config/src/main/java/org/opennms/netmgt/config/EventTranslatorConfigFactory.java
    A opennms-config/src/test/java/org/opennms/netmgt/config/EventTranslatorConfigReloadTest.java
    M opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/SnmpConfigRestService.java
    M opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/SnmpConfigRestServiceIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2026' into release-36.x


  Commit: 6bf8c338ae2f8065055d434fed91dfbe99d00c77
      https://github.com/OpenNMS/opennms/commit/6bf8c338ae2f8065055d434fed91dfbe99d00c77
  Author: CI/CD System <[email protected]>
  Date:   2026-08-26 (Wed, 26 Aug 2026)

  Changed paths:
    M opennms-config/src/main/java/org/opennms/netmgt/config/EventTranslatorConfigFactory.java
    A opennms-config/src/test/java/org/opennms/netmgt/config/EventTranslatorConfigReloadTest.java
    M opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/SnmpConfigRestService.java
    M opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/SnmpConfigRestServiceIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/release-36.x' into develop


  Commit: a5ab207cbc3999a2fdf9e0a7f578cb986677f94c
      https://github.com/OpenNMS/opennms/commit/a5ab207cbc3999a2fdf9e0a7f578cb986677f94c
  Author: mershad-manesh <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/poller/pollables/PendingPollEvent.java
    M opennms-services/src/test/java/org/opennms/netmgt/poller/PollerQueryManagerDaoIT.java

  Log Message:
  -----------
  Fix flaky testInterfaceReparented and a related outage event-ID race in PendingPollEvent (#8815)


  Commit: 334c627d758f9be390e459993e94b790fcf4726a
      https://github.com/OpenNMS/opennms/commit/334c627d758f9be390e459993e94b790fcf4726a
  Author: Marshall Massengill <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/collectd/CollectableService.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectableServiceTest.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/ThresholdIT.java

  Log Message:
  -----------
  NMS-19979: clear data collection alarms after a restart or collectd reload (#8774)

* NMS-19979: clear data collection alarms after a restart or collectd reload

A dataCollectionFailed alarm never cleared if collection recovered across an
OpenNMS restart or a collectd configuration reload.

CollectableService keeps the last collection status in memory and updateStatus()
only emits an event on a transition. That status was seeded to SUCCEEDED, and
both a restart and rebuildScheduler() discard and rebuild every
CollectableService, so the recovery was no longer a transition, no
dataCollectionSucceeded was sent, and the alarm was orphaned.

Seed it to UNKNOWN instead. The first collection then always transitions,
whichever way it goes: a success emits dataCollectionSucceeded and clears the
alarm the previous generation left behind, and a failure emits
dataCollectionFailed exactly as before. Subsequent collections are unchanged,
so this costs one extra event per collected service per restart or reload, not
one per collection cycle.

An unmatched dataCollectionSucceeded creates a Normal severity alarm of its own,
which the default alarmd cleanUp rule deletes after five minutes.

* NMS-19979: Update collectd tests for the first-collection succeeded event

Seeding m_status to UNKNOWN makes the first successful collection of every
scheduling generation a transition, so it now emits dataCollectionSucceeded.
Two existing tests assumed that event never fired.

ThresholdIT anticipates it once per generation. A nodeCategoryMembershipChanged
event unschedules and reschedules the node, building a fresh CollectableService,
so the reschedule reports success again after the second category change.

CollectdIT.testOneMatchingSpec performs real collections, so it accounts for the
send explicitly rather than loosening tearDown's verifyNoMoreInteractions.


  Commit: 2ba73e1539cfbf11943eb2379a5dba239e2f017f
      https://github.com/OpenNMS/opennms/commit/2ba73e1539cfbf11943eb2379a5dba239e2f017f
  Author: CI/CD System <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/poller/pollables/PendingPollEvent.java
    M opennms-services/src/test/java/org/opennms/netmgt/poller/PollerQueryManagerDaoIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2026' into release-36.x


  Commit: 48c6e502187ba2b8344f59f6558e2c16c1fcafd8
      https://github.com/OpenNMS/opennms/commit/48c6e502187ba2b8344f59f6558e2c16c1fcafd8
  Author: CI/CD System <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/collectd/CollectableService.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectableServiceTest.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/ThresholdIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2024' into foundation-2025


  Commit: 3f4bb3e089774cf3022e5c3e490f221ee1a473d3
      https://github.com/OpenNMS/opennms/commit/3f4bb3e089774cf3022e5c3e490f221ee1a473d3
  Author: CI/CD System <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/poller/pollables/PendingPollEvent.java
    M opennms-services/src/test/java/org/opennms/netmgt/poller/PollerQueryManagerDaoIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/release-36.x' into develop


  Commit: 7224c0246ba7c6cb4142fb69dcaae5af43398358
      https://github.com/OpenNMS/opennms/commit/7224c0246ba7c6cb4142fb69dcaae5af43398358
  Author: CI/CD System <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/collectd/CollectableService.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectableServiceTest.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/ThresholdIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2025' into foundation-2026


  Commit: 6ac56f2630835856338eaa1428d9dec0e9f77a68
      https://github.com/OpenNMS/opennms/commit/6ac56f2630835856338eaa1428d9dec0e9f77a68
  Author: CI/CD System <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/collectd/CollectableService.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectableServiceTest.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/ThresholdIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/foundation-2026' into release-36.x


  Commit: ee6df0b663b92bf776257bca63d5ea2d454d50a4
      https://github.com/OpenNMS/opennms/commit/ee6df0b663b92bf776257bca63d5ea2d454d50a4
  Author: CI/CD System <[email protected]>
  Date:   2026-08-27 (Thu, 27 Aug 2026)

  Changed paths:
    M opennms-services/src/main/java/org/opennms/netmgt/collectd/CollectableService.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectableServiceTest.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/ThresholdIT.java

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/release-36.x' into develop


  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: 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: 4c42767200af6cd43f3b0ae3f27e5adc1c670c28
      https://github.com/OpenNMS/opennms/commit/4c42767200af6cd43f3b0ae3f27e5adc1c670c28
  Author: Jose Anes <[email protected]>
  Date:   2026-08-31 (Mon, 31 Aug 2026)

  Changed paths:
    M features/bsm/rest/impl/pom.xml
    M features/status/rest/pom.xml
    M opennms-config/src/main/java/org/opennms/netmgt/config/EventTranslatorConfigFactory.java
    A opennms-config/src/test/java/org/opennms/netmgt/config/EventTranslatorConfigReloadTest.java
    M opennms-openapi-docs/pom.xml
    M opennms-services/src/main/java/org/opennms/netmgt/collectd/CollectableService.java
    M opennms-services/src/main/java/org/opennms/netmgt/poller/pollables/PendingPollEvent.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectableServiceTest.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/CollectdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/collectd/ThresholdIT.java
    M opennms-services/src/test/java/org/opennms/netmgt/poller/PollerQueryManagerDaoIT.java
    M opennms-webapp-rest/pom.xml
    M opennms-webapp-rest/src/main/java/org/opennms/web/rest/v2/SnmpConfigRestService.java
    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
    M opennms-webapp-rest/src/test/java/org/opennms/web/rest/v2/SnmpConfigRestServiceIT.java
    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:
  -----------
  Merge origin/develop into NMS-20127 after the base PR squash-merged

The dashboard base (#8721) landed on develop as a squash, so the shared
Dashboard files show add/add against this branch; develop's copies are
byte-identical to the base content this branch already merged, so the
branch's extended versions win. !smoke


Compare: https://github.com/OpenNMS/opennms/compare/040385574cfb...4c42767200af

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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.