Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions .agents/skills/project-create-topology/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -430,9 +430,21 @@ For SNMP managed device actor modals:
logical adjacency. It must not be presented as discovery, physical, L2, or
port-neighbor evidence.
- Preserve protocol-neighbor diagnostics that do not become graph links in
actor-owned detail tables, such as `actor_ospf_neighbors`. Non-full or
unresolved OSPF neighbors should remain visible there without creating loose
router/IP actors.
actor-owned detail tables, such as `actor_ospf_neighbors` and
`actor_bgp_peers`. Non-full, non-established, or unresolved protocol
neighbors should remain visible there without creating loose router/IP
actors.
- `bgp_adjacency` links represent established BGP control-plane adjacency
between resolved managed SNMP device actors. They must use explicit BGP
link/evidence types, carry `semantic_role: control`, and must not be
presented as discovery, physical, L2, or port-neighbor links.
- Deduplicate BGP adjacency by managed actor pair plus routing instance. Keep
BGP identifiers, ASNs, and endpoint IPs as evidence/display fields, but do not
make them the primary graph identity because vendor profiles expose those
fields asymmetrically. Parallel sessions between the same managed actor pair
in the same routing instance should remain actor-owned peer detail rows under
one compact graph relationship unless a future producer contract explicitly
adds a more detailed BGP graph mode.
- Keep generic graph-link `Links` sections only for endpoint, segment, or
custom actors that do not own port inventory.
- Build link endpoint port labels only from real port fields: `port_name`,
Expand Down
28 changes: 25 additions & 3 deletions .agents/sow/specs/topology-modes-correlation-aggregation.md
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,20 @@ Current SNMP OSPF topology scope is OSPFv2 non-virtual neighbors from
`ospfNbrTable`; OSPFv3 and OSPF virtual-neighbor tables are future scope unless
a later topology feature explicitly adds their distinct semantics.

`bgp_adjacency` represents BGP control-plane adjacency between two resolved
managed SNMP device actors. It is a logical routing-protocol relationship, not
physical, L2, discovery, or port-neighbor evidence. The producer emits graph
links only for established BGP peers with resolved local and remote managed
actors. Unresolved or non-established BGP peer rows remain diagnostic
actor-owned detail rows and must not create loose router/IP graph actors.
BGP adjacency graph identity should use the managed actor pair plus routing
instance. BGP identifiers, ASNs, and endpoint IPs are useful evidence and
display fields, but they must not be the primary graph deduplication key because
SNMP BGP profiles expose those fields inconsistently across vendors. Parallel
sessions between the same managed actor pair in the same routing instance should
remain actor-owned peer detail rows under one compact graph relationship unless
a future producer contract explicitly adds a more detailed BGP graph mode.

When `ospf_adjacency` and `l3_subnet` describe the same resolved actor pair and
endpoint/subnet relationship, OSPF is the stronger protocol-specific signal for
the graph. The producer may suppress the matching `l3_subnet` graph link while
Expand Down Expand Up @@ -586,6 +600,14 @@ evidence. Actor-owned OSPF neighbor detail rows should remain attached to the
local device actor and are not loose-side graph materialization input unless a
future producer contract explicitly defines such a policy.

For `bgp_adjacency`, aggregation MUST preserve the explicit `bgp_adjacency`
link and evidence type, including its `semantic_role: control`. Replacement may
rewire endpoint actors to stronger managed device actors, but it MUST NOT
reinterpret BGP adjacency as discovery, physical, L2, or port-neighbor
evidence. Actor-owned BGP peer detail rows should remain attached to the local
device actor and are not loose-side graph materialization input unless a future
producer contract explicitly defines such a policy.

### UI SNMP

The UI should not expose a detailed/aggregated toggle for SNMP unless the
Expand All @@ -605,9 +627,9 @@ Device modals should remain port-centric:
- L3 adjacency information: derived from typed `l3_subnet` relationship
evidence, not from `actor_port_links`.
- routing protocol neighbor information: derived from typed actor-owned detail
rows such as `actor_ospf_neighbors`, not from `actor_port_links`. The modal
may show unresolved or non-full protocol neighbors as diagnostics without
creating graph links.
rows such as `actor_ospf_neighbors` and `actor_bgp_peers`, not from
`actor_port_links`. The modal may show unresolved or non-established protocol
neighbors as diagnostics without creating graph links.

## Streaming

Expand Down
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1214,6 +1214,7 @@ set(LIBNETDATA_FILES
src/libnetdata/locks/rw-spinlock-unittest.c
src/libnetdata/atomics/atomic_flags.h
src/libnetdata/atomics/atomics.h
src/libnetdata/atomics/single_writer.h
src/libnetdata/locks/waitq.c
src/libnetdata/locks/waitq.h
src/libnetdata/object-state/object-state.c
Expand All @@ -1235,6 +1236,8 @@ set(LIBNETDATA_FILES
src/libnetdata/os/get_system_pagesize.h
src/libnetdata/os/hostname.c
src/libnetdata/os/hostname.h
src/libnetdata/os/socket_egress_interface.c
src/libnetdata/os/socket_egress_interface.h
src/libnetdata/exit/exit_initiated.c
src/libnetdata/exit/exit_initiated.h
src/libnetdata/os/disk_space.c
Expand Down
1 change: 1 addition & 0 deletions src/daemon/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,7 @@ int netdata_main(int argc, char **argv) {
if (ctx_unittest()) return 1;
if (query_plan_unittest()) return 1;
if (uuid_unittest()) return 1;
if (os_socket_egress_interface_unittest()) return 1;
if (dyncfg_unittest()) return 1;
if (eval_unittest()) return 1;
if (duration_unittest()) return 1;
Expand Down
Loading
Loading