Skip to content

Commit fdbf23b

Browse files
committed
CONSOLE-4840: Topology static extension cleanup
1 parent 5a3d063 commit fdbf23b

File tree

12 files changed

+77
-279
lines changed

12 files changed

+77
-279
lines changed

frontend/packages/console-dynamic-plugin-sdk/CHANGELOG-core.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ table in [Console dynamic plugins README](./README.md).
1818
- Begin alignment of plugin SDK types with `@openshift/dynamic-plugin-sdk` ([CONSOLE-3769], [#15509])
1919
- Add optional `fetch` property to extension `console.dashboards/overview/health/url` ([CONSOLE-4796], [#15526])
2020
- Add optional `infrastructure` parameter to `PrometheusHealthHandler` type ([CONSOLE-4796], [#15526])
21+
- Allow `K8sResourceKind` in `TopologyDataObject`, `TopologyResourcesObject`, and `OverviewItem` types ([CONSOLE-4840], [#15699])
2122

2223
## 4.20.0-prerelease.1 - 2025-08-15
2324

@@ -195,3 +196,4 @@ table in [Console dynamic plugins README](./README.md).
195196
[#15509]: https://github.com/openshift/console/pull/15509
196197
[#15526]: https://github.com/openshift/console/pull/15526
197198
[#15671]: https://github.com/openshift/console/pull/15671
199+
[#15699]: https://github.com/openshift/console/pull/15699

frontend/packages/console-dynamic-plugin-sdk/src/extensions/topology-types.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export interface OdcEdgeModel extends EdgeModel {
4747
resourceKind?: K8sResourceKindReference;
4848
}
4949

50-
export type TopologyResourcesObject = { [key: string]: K8sResourceCommon[] };
50+
export type TopologyResourcesObject = { [key: string]: K8sResourceKind[] };
5151

5252
export type TopologyDataResources = WatchK8sResults<TopologyResourcesObject>;
5353

@@ -101,9 +101,9 @@ export type TopologyDisplayOption = {
101101
value: boolean;
102102
};
103103

104-
export type OverviewItem<T = K8sResourceCommon> = {
104+
export type OverviewItem<T = K8sResourceKind> = {
105105
obj: T;
106-
hpas?: K8sResourceCommon[];
106+
hpas?: K8sResourceKind[];
107107
isOperatorBackedService?: boolean;
108108
isMonitorable?: boolean;
109109
monitoringAlerts?: PrometheusAlert[];
@@ -133,9 +133,9 @@ export interface TopologyDataObject<D = {}> {
133133
name: string;
134134
type: string;
135135
resources: OverviewItem;
136-
pods?: K8sResourceCommon[];
136+
pods?: K8sResourceKind[];
137137
data: D;
138-
resource: K8sResourceCommon | null;
138+
resource: K8sResourceKind | null;
139139
groupResources?: OdcNodeModel[];
140140
}
141141

frontend/packages/knative-plugin/src/topology/knative-topology-utils.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
} from '@patternfly/react-topology/dist/esm/types';
1010
import i18next from 'i18next';
1111
import * as _ from 'lodash';
12-
import { WatchK8sResultsObject } from '@console/dynamic-plugin-sdk';
12+
import { WatchK8sResultsObject } from '@console/dynamic-plugin-sdk/src/extensions/console-types';
13+
import { OverviewItem } from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
1314
import { getImageForIconClass } from '@console/internal/components/catalog/catalog-item-icon';
1415
import { DeploymentModel, PodModel, ServiceModel } from '@console/internal/models';
1516
import {
@@ -25,7 +26,7 @@ import {
2526
groupVersionFor,
2627
} from '@console/internal/module/k8s';
2728
import { RootState } from '@console/internal/redux';
28-
import { getOwnedResources, OverviewItem } from '@console/shared';
29+
import { getOwnedResources } from '@console/shared';
2930
import { NODE_WIDTH, NODE_HEIGHT, NODE_PADDING } from '@console/topology/src/const';
3031
import {
3132
getTopologyGroupItems,

frontend/packages/knative-plugin/src/topology/topology-plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';
22
import { Plugin } from '@console/plugin-sdk';
3-
import { TopologyDataModelFactory } from '@console/topology/src/extensions';
3+
import { TopologyDataModelFactory } from '@console/topology/src/extensions/topology';
44
import {
55
FLAG_CAMEL_KAMELETS,
66
FLAG_KNATIVE_EVENTING,

frontend/packages/knative-plugin/src/topology/topology-types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import { PodControllerOverviewItem } from '@console/dynamic-plugin-sdk/src/extensions/console-types';
2+
import { OverviewItem } from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
13
import { K8sResourceKind } from '@console/internal/module/k8s';
2-
import { OverviewItem, PodControllerOverviewItem } from '@console/shared/src';
34
import { TopologyDataObject } from '@console/topology/src/topology-types';
45
import { KnativeItem } from '../utils/get-knative-resources';
56

frontend/packages/topology/src/components/dropdowns/ApplicationDropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ResourceDropdown } from '@console/shared';
1010
import { ResourceDropdownProps } from '../../../../console-shared/src/components/dropdown/ResourceDropdown';
1111
import { getNamespacedDynamicModelFactories } from '../../data-transforms/DataModelProvider';
1212
import { getBaseWatchedResources } from '../../data-transforms/transform-utils';
13-
import { isTopologyDataModelFactory, TopologyDataModelFactory } from '../../extensions';
13+
import { isTopologyDataModelFactory, TopologyDataModelFactory } from '../../extensions/topology';
1414

1515
type ApplicationDropdownProps = Omit<ResourceDropdownProps, 'dataSelector' | 'placeholder'> & {
1616
namespace?: string;

frontend/packages/topology/src/components/graph-view/Topology.tsx

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ import {
2323
import * as _ from 'lodash';
2424
import { action } from 'mobx';
2525
import { connect } from 'react-redux';
26+
import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions';
2627
import {
27-
useResolvedExtensions,
28-
isTopologyComponentFactory as isDynamicTopologyComponentFactory,
29-
TopologyComponentFactory as DynamicTopologyComponentFactory,
30-
} from '@console/dynamic-plugin-sdk';
28+
isTopologyComponentFactory,
29+
TopologyComponentFactory,
30+
} from '@console/dynamic-plugin-sdk/src/extensions/topology';
3131
import { RootState } from '@console/internal/redux';
3232
import {
3333
useQueryParams,
@@ -37,7 +37,6 @@ import {
3737
import { withFallback, ErrorBoundaryFallbackPage } from '@console/shared/src/components/error';
3838
import { TOPOLOGY_LAYOUT_CONFIG_STORAGE_KEY, TOPOLOGY_LAYOUT_LOCAL_STORAGE_KEY } from '../../const';
3939
import { odcElementFactory } from '../../elements';
40-
import { isTopologyComponentFactory, TopologyComponentFactory } from '../../extensions/topology';
4140
import { getTopologyGraphModel, setTopologyGraphModel } from '../../redux/action';
4241
import { SHOW_GROUPING_HINT_EVENT, ShowGroupingHintEventListener } from '../../topology-types';
4342
import { componentFactory } from './components';
@@ -148,12 +147,9 @@ const Topology: React.FC<
148147
const storedLayoutApplied = React.useRef<boolean>(false);
149148
const queryParams = useQueryParams();
150149
const selectedId = queryParams.get('selectId');
151-
const [componentFactoryExtensions, isStaticResolved] = useResolvedExtensions<
152-
TopologyComponentFactory
153-
>(isTopologyComponentFactory);
154-
const [dynamicComponentFactoryExtensions, isDynamicResolved] = useResolvedExtensions<
155-
DynamicTopologyComponentFactory
156-
>(isDynamicTopologyComponentFactory);
150+
const [componentFactoryExtensions, isResolved] = useResolvedExtensions<TopologyComponentFactory>(
151+
isTopologyComponentFactory,
152+
);
157153

158154
const createVisualization = React.useCallback(() => {
159155
const storedLayout = topologyLayoutDataJson?.[namespace];
@@ -296,12 +292,12 @@ const Topology: React.FC<
296292
}, [model, visualization, visualizationReady]);
297293

298294
React.useEffect(() => {
299-
if (!isStaticResolved || !isDynamicResolved) {
295+
if (!isResolved) {
300296
return;
301297
}
302298

303299
visualization.registerComponentFactory(componentFactory);
304-
[...componentFactoryExtensions, ...dynamicComponentFactoryExtensions].forEach((factory) => {
300+
componentFactoryExtensions.forEach((factory) => {
305301
visualization.registerComponentFactory(factory.properties.getFactory);
306302
});
307303

@@ -312,13 +308,7 @@ const Topology: React.FC<
312308
},
313309
);
314310
setVisualizationReady(true);
315-
}, [
316-
visualization,
317-
isStaticResolved,
318-
isDynamicResolved,
319-
componentFactoryExtensions,
320-
dynamicComponentFactoryExtensions,
321-
]);
311+
}, [visualization, isResolved, componentFactoryExtensions]);
322312

323313
React.useEffect(() => {
324314
if (!applicationRef.current) {

frontend/packages/topology/src/components/page/TopologyView.tsx

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ import {
1616
FileUploadContext,
1717
} from '@console/app/src/components/file-upload/file-upload-context';
1818
import { useAddToProjectAccess } from '@console/dev-console/src/utils/useAddToProjectAccess';
19+
import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions';
1920
import {
20-
useResolvedExtensions,
2121
isTopologyCreateConnector,
22-
isTopologyDecoratorProvider as isDynamicTopologyDecoratorProvider,
23-
isTopologyDisplayFilters as isDynamicTopologyDisplayFilters,
22+
isTopologyDecoratorProvider,
23+
isTopologyDisplayFilters,
2424
TopologyCreateConnector,
25-
TopologyDecoratorProvider as DynamicTopologyDecoratorProvider,
26-
TopologyDisplayFilters as DynamicTopologyDisplayFilters,
25+
TopologyDecoratorProvider,
26+
TopologyDisplayFilters,
2727
TopologyRelationshipProvider,
2828
isTopologyRelationshipProvider,
29-
} from '@console/dynamic-plugin-sdk';
29+
} from '@console/dynamic-plugin-sdk/src/extensions/topology';
3030
import { selectOverviewDetailsTab } from '@console/internal/actions/ui';
3131
import {
3232
getQueryArgument,
@@ -40,12 +40,6 @@ import { useDeepCompareMemoize, useQueryParams } from '@console/shared';
4040
import { useTelemetry } from '@console/shared/src/hooks/useTelemetry';
4141
import { LAST_TOPOLOGY_OVERVIEW_OPEN_STORAGE_KEY } from '../../const';
4242
import { updateModelFromFilters } from '../../data-transforms/updateModelFromFilters';
43-
import {
44-
isTopologyDecoratorProvider,
45-
isTopologyDisplayFilters,
46-
TopologyDecoratorProvider,
47-
TopologyDisplayFilters,
48-
} from '../../extensions/topology';
4943
import {
5044
getTopologySearchQuery,
5145
TOPOLOGY_LABELS_FILTER_KEY,
@@ -135,24 +129,16 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
135129
[fireTelemetryEvent],
136130
);
137131
const appliedFilters = useAppliedDisplayFilters();
132+
138133
const [displayFilterExtensions, displayFilterExtensionsResolved] = useResolvedExtensions<
139134
TopologyDisplayFilters
140135
>(isTopologyDisplayFilters);
141-
142-
const [extensionDecorators, extensionDecoratorsResolved] = useResolvedExtensions<
143-
TopologyDecoratorProvider
144-
>(isTopologyDecoratorProvider);
145-
146-
const [
147-
dynamicDisplayFilterExtensions,
148-
dynamicDisplayFilterExtensionsResolved,
149-
] = useResolvedExtensions<DynamicTopologyDisplayFilters>(isDynamicTopologyDisplayFilters);
150136
const [createConnectors, createConnectorsResolved] = useResolvedExtensions<
151137
TopologyCreateConnector
152138
>(isTopologyCreateConnector);
153-
const [dynamicExtensionDecorators, dynamicExtensionDecoratorsResolved] = useResolvedExtensions<
154-
DynamicTopologyDecoratorProvider
155-
>(isDynamicTopologyDecoratorProvider);
139+
const [extensionDecorators, extensionDecoratorsResolved] = useResolvedExtensions<
140+
TopologyDecoratorProvider
141+
>(isTopologyDecoratorProvider);
156142
const [relationshipProvider] = useResolvedExtensions<TopologyRelationshipProvider>(
157143
isTopologyRelationshipProvider,
158144
);
@@ -218,8 +204,8 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
218204
}, [visualization, graphData]);
219205

220206
React.useEffect(() => {
221-
if (extensionDecoratorsResolved && dynamicExtensionDecoratorsResolved) {
222-
const allDecorators = [...extensionDecorators, ...dynamicExtensionDecorators].reduce(
207+
if (extensionDecoratorsResolved) {
208+
const allDecorators = extensionDecorators.reduce(
223209
(acc, extensionDecorator) => {
224210
const decorator: TopologyDecorator = extensionDecorator.properties;
225211
if (!acc[decorator.quadrant]) {
@@ -240,17 +226,12 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
240226
);
241227
setTopologyDecorators(allDecorators);
242228
}
243-
}, [
244-
dynamicExtensionDecorators,
245-
dynamicExtensionDecoratorsResolved,
246-
extensionDecorators,
247-
extensionDecoratorsResolved,
248-
]);
229+
}, [extensionDecorators, extensionDecoratorsResolved]);
249230

250231
React.useEffect(() => {
251-
if (displayFilterExtensionsResolved && dynamicDisplayFilterExtensionsResolved) {
232+
if (displayFilterExtensionsResolved) {
252233
const updateFilters = [...filters];
253-
[...displayFilterExtensions, ...dynamicDisplayFilterExtensions].forEach((extension) => {
234+
displayFilterExtensions.forEach((extension) => {
254235
const extFilters = extension.properties.getTopologyFilters();
255236
extFilters?.forEach((filter) => {
256237
if (!updateFilters.find((f) => f.id === filter.id)) {
@@ -266,22 +247,15 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
266247
}
267248
// Only update on extension changes
268249
// eslint-disable-next-line react-hooks/exhaustive-deps
269-
}, [
270-
displayFilterExtensionsResolved,
271-
dynamicDisplayFilterExtensionsResolved,
272-
displayFilterExtensions,
273-
dynamicDisplayFilterExtensions,
274-
]);
250+
}, [displayFilterExtensionsResolved, displayFilterExtensions]);
275251

276252
React.useEffect(() => {
277253
if (filtersLoaded) {
278254
const newModel = updateModelFromFilters(
279255
model,
280256
filters,
281257
application,
282-
[...displayFilterExtensions, ...dynamicDisplayFilterExtensions].map(
283-
(extension) => extension.properties.applyDisplayOptions,
284-
),
258+
displayFilterExtensions.map((extension) => extension.properties.applyDisplayOptions),
285259
onSupportedFiltersChange,
286260
onSupportedKindsChange,
287261
);
@@ -296,7 +270,6 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
296270
onSupportedFiltersChange,
297271
onSupportedKindsChange,
298272
displayFilterExtensions,
299-
dynamicDisplayFilterExtensions,
300273
]);
301274

302275
React.useEffect(() => {

frontend/packages/topology/src/data-transforms/transform-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
GetTopologyNodeItem,
1313
GetWorkloadResources,
1414
MergeGroup,
15+
OverviewItem,
1516
} from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
1617
import { getImageForIconClass } from '@console/internal/components/catalog/catalog-item-icon';
1718
import { Alerts } from '@console/internal/components/monitoring/types';
@@ -28,7 +29,7 @@ import {
2829
TYPE_EVENT_SOURCE_KAFKA,
2930
TYPE_KNATIVE_REVISION,
3031
} from '@console/knative-plugin/src/topology/const';
31-
import { isKnativeServing, OverviewItem } from '@console/shared';
32+
import { isKnativeServing } from '@console/shared/src/utils/pod-utils';
3233
import { returnIfValidURL } from '@console/shared/src/utils/utils';
3334
import {
3435
TYPE_APPLICATION_GROUP,

frontend/packages/topology/src/extensions/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)