From c62116469407b6958aba0c5cf77dc5155c37aa8d Mon Sep 17 00:00:00 2001 From: Phillip Bailey Date: Wed, 13 May 2026 07:59:21 -0400 Subject: [PATCH] Fix topology view issue --- cypress/e2e/NewPolicy.spec.cy.ts | 3 ++- src/utils/constants.ts | 3 +++ .../utils/constants.ts | 4 ++++ .../nodenetworkconfiguration/utils/utils.ts | 21 +++++++++++++------ .../list/components/CreatePolicyButtons.tsx | 8 +++++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/cypress/e2e/NewPolicy.spec.cy.ts b/cypress/e2e/NewPolicy.spec.cy.ts index 40c8e971..542c2b89 100644 --- a/cypress/e2e/NewPolicy.spec.cy.ts +++ b/cypress/e2e/NewPolicy.spec.cy.ts @@ -49,7 +49,8 @@ describe('Create new policy with form', () => { cy.byLegacyTestID('review-network-description').should('have.text', testDescription); cy.contains('button', 'Create network').click(); - cy.contains('h1', testPolicyName); + cy.visit('/k8s/cluster/nmstate.io~v1~NodeNetworkConfigurationPolicy'); + cy.contains('a', testPolicyName); deletePolicyFromDetailsPage(testPolicyName); }); diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 6fba48fc..4adcb9e6 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -8,3 +8,6 @@ export const NODE_HOSTNAME_LABEL = 'kubernetes.io/hostname'; export const NO_DATA_DASH = '-'; export const NMSTATE_I18N_NS = 'plugin__nmstate-console-plugin'; + +export const LINK_AGGREGATION = 'link-aggregation'; +export const BASE_IFACE = 'base-iface'; diff --git a/src/views/nodenetworkconfiguration/utils/constants.ts b/src/views/nodenetworkconfiguration/utils/constants.ts index 6daf6ff0..65e314bd 100644 --- a/src/views/nodenetworkconfiguration/utils/constants.ts +++ b/src/views/nodenetworkconfiguration/utils/constants.ts @@ -7,3 +7,7 @@ export const GROUP = 'group'; export const TOPOLOGY_LOCAL_STORAGE_KEY = 'topologyNodePositions'; export const NODE_POSITIONING_EVENT = 'node-positioned'; export const GRAPH_POSITIONING_EVENT = 'graph-position-change'; + +export const OVN_K8S_MP0 = 'ovn-k8s-mp0'; +export const BR_INT = 'br-int'; +export const GENEV_SYS_PREFIX = 'genev_sys_'; diff --git a/src/views/nodenetworkconfiguration/utils/utils.ts b/src/views/nodenetworkconfiguration/utils/utils.ts index f933d67d..4cefe226 100644 --- a/src/views/nodenetworkconfiguration/utils/utils.ts +++ b/src/views/nodenetworkconfiguration/utils/utils.ts @@ -14,11 +14,12 @@ import { NodeShape, NodeStatus, } from '@patternfly/react-topology'; +import { BASE_IFACE, LINK_AGGREGATION } from '@utils/constants'; import { isEmpty } from '@utils/helpers'; import BridgeIcon from '../components/BridgeIcon'; -import { GROUP, NODE_DIAMETER } from './constants'; +import { BR_INT, GENEV_SYS_PREFIX, GROUP, NODE_DIAMETER, OVN_K8S_MP0 } from './constants'; const statusMap: { [key: string]: NodeStatus } = { up: NodeStatus.success, @@ -27,10 +28,13 @@ const statusMap: { [key: string]: NodeStatus } = { }; const networkTypeLevelMap = { + [InterfaceType.OVS_INTERFACE]: 1, + [InterfaceType.OVS_BRIDGE]: 2, [InterfaceType.LINUX_BRIDGE]: 2, [InterfaceType.VLAN]: 3, [InterfaceType.BOND]: 4, [InterfaceType.ETHERNET]: 5, + [InterfaceType.INFINIBAND]: 5, }; export const networkNodeLevel = new Proxy(networkTypeLevelMap, { @@ -58,25 +62,30 @@ const getIcon = (iface: NodeNetworkConfigurationInterface) => { const createNodes = ( nnsName: string, interfaces: NodeNetworkConfigurationInterface[], - nnceConfigredInterfaces: NodeNetworkConfigurationInterface[], + nnceConfiguredInterfaces: NodeNetworkConfigurationInterface[], ): NodeModel[] => interfaces.map((iface) => { - const isDerivedFromPolicy = findInterfaceByName(nnceConfigredInterfaces, iface.name); + const isDerivedFromPolicy = findInterfaceByName(nnceConfiguredInterfaces, iface.name); return { id: `${nnsName}~${iface.name}~${iface.type}`, type: ModelKind.node, label: iface.name, width: NODE_DIAMETER, height: NODE_DIAMETER, - visible: !iface.patch && iface.type !== InterfaceType.LOOPBACK, + visible: + !iface.patch && + iface.type !== InterfaceType.LOOPBACK && + iface.name !== OVN_K8S_MP0 && + iface.name !== BR_INT && + !iface.name.startsWith(GENEV_SYS_PREFIX), shape: isDerivedFromPolicy ? NodeShape.circle : NodeShape.rect, status: getStatus(iface), data: { icon: getIcon(iface), type: iface.type, bridgePorts: iface.bridge?.port, - bondPorts: iface['link-aggregation']?.port, - vlanBaseInterface: iface.vlan?.['base-iface'], + bondPorts: iface[LINK_AGGREGATION]?.port, + vlanBaseInterface: iface.vlan?.[BASE_IFACE], level: networkNodeLevel[iface.type], isDerivedFromPolicy, }, diff --git a/src/views/policies/list/components/CreatePolicyButtons.tsx b/src/views/policies/list/components/CreatePolicyButtons.tsx index 4407b445..abdc0f9f 100644 --- a/src/views/policies/list/components/CreatePolicyButtons.tsx +++ b/src/views/policies/list/components/CreatePolicyButtons.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react'; +import React, { FC, ReactNode } from 'react'; import { useNavigate } from 'react-router'; import NodeNetworkConfigurationPolicyModel, { NodeNetworkConfigurationPolicyModelRef, @@ -10,7 +10,11 @@ import { useNMStateTranslation } from '@utils/hooks/useNMStateTranslation'; import { NNCP_YAML_EDITOR_OPENED } from '@utils/telemetry/constants'; import { logNMStateEvent } from '@utils/telemetry/telemetry'; -const CreatePolicyButtons: FC = ({ children }) => { +type CreatePolicyButtonsProps = { + children: ReactNode; +}; + +const CreatePolicyButtons: FC = ({ children }) => { const { t } = useNMStateTranslation(); const navigate = useNavigate();