Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ table in [Console dynamic plugins README](./README.md).
- Begin alignment of plugin SDK types with `@openshift/dynamic-plugin-sdk` ([CONSOLE-3769], [#15509])
- Add optional `fetch` property to extension `console.dashboards/overview/health/url` ([CONSOLE-4796], [#15526])
- Add optional `infrastructure` parameter to `PrometheusHealthHandler` type ([CONSOLE-4796], [#15526])
- Allow `K8sResourceKind` in `TopologyDataObject`, `TopologyResourcesObject`, and `OverviewItem` types ([CONSOLE-4840], [#15699])

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

Expand Down Expand Up @@ -195,3 +196,4 @@ table in [Console dynamic plugins README](./README.md).
[#15509]: https://github.com/openshift/console/pull/15509
[#15526]: https://github.com/openshift/console/pull/15526
[#15671]: https://github.com/openshift/console/pull/15671
[#15699]: https://github.com/openshift/console/pull/15699
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export interface OdcEdgeModel extends EdgeModel {
resourceKind?: K8sResourceKindReference;
}

export type TopologyResourcesObject = { [key: string]: K8sResourceCommon[] };
export type TopologyResourcesObject = { [key: string]: K8sResourceKind[] };

export type TopologyDataResources = WatchK8sResults<TopologyResourcesObject>;

Expand Down Expand Up @@ -101,9 +101,9 @@ export type TopologyDisplayOption = {
value: boolean;
};

export type OverviewItem<T = K8sResourceCommon> = {
export type OverviewItem<T = K8sResourceKind> = {
obj: T;
hpas?: K8sResourceCommon[];
hpas?: K8sResourceKind[];
isOperatorBackedService?: boolean;
isMonitorable?: boolean;
monitoringAlerts?: PrometheusAlert[];
Expand Down Expand Up @@ -133,9 +133,9 @@ export interface TopologyDataObject<D = {}> {
name: string;
type: string;
resources: OverviewItem;
pods?: K8sResourceCommon[];
pods?: K8sResourceKind[];
data: D;
resource: K8sResourceCommon | null;
resource: K8sResourceKind | null;
groupResources?: OdcNodeModel[];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import {
} from '@patternfly/react-topology/dist/esm/types';
import i18next from 'i18next';
import * as _ from 'lodash';
import { WatchK8sResultsObject } from '@console/dynamic-plugin-sdk';
import { WatchK8sResultsObject } from '@console/dynamic-plugin-sdk/src/extensions/console-types';
import { OverviewItem } from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
import { getImageForIconClass } from '@console/internal/components/catalog/catalog-item-icon';
import { DeploymentModel, PodModel, ServiceModel } from '@console/internal/models';
import {
Expand All @@ -25,7 +26,7 @@ import {
groupVersionFor,
} from '@console/internal/module/k8s';
import { RootState } from '@console/internal/redux';
import { getOwnedResources, OverviewItem } from '@console/shared';
import { getOwnedResources } from '@console/shared';
import { NODE_WIDTH, NODE_HEIGHT, NODE_PADDING } from '@console/topology/src/const';
import {
getTopologyGroupItems,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';
import { Plugin } from '@console/plugin-sdk';
import { TopologyDataModelFactory } from '@console/topology/src/extensions';
import { TopologyDataModelFactory } from '@console/topology/src/extensions/topology';
import {
FLAG_CAMEL_KAMELETS,
FLAG_KNATIVE_EVENTING,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { PodControllerOverviewItem } from '@console/dynamic-plugin-sdk/src/extensions/console-types';
import { OverviewItem } from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { OverviewItem, PodControllerOverviewItem } from '@console/shared/src';
import { TopologyDataObject } from '@console/topology/src/topology-types';
import { KnativeItem } from '../utils/get-knative-resources';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { ResourceDropdown } from '@console/shared';
import { ResourceDropdownProps } from '../../../../console-shared/src/components/dropdown/ResourceDropdown';
import { getNamespacedDynamicModelFactories } from '../../data-transforms/DataModelProvider';
import { getBaseWatchedResources } from '../../data-transforms/transform-utils';
import { isTopologyDataModelFactory, TopologyDataModelFactory } from '../../extensions';
import { isTopologyDataModelFactory, TopologyDataModelFactory } from '../../extensions/topology';

type ApplicationDropdownProps = Omit<ResourceDropdownProps, 'dataSelector' | 'placeholder'> & {
namespace?: string;
Expand Down
26 changes: 8 additions & 18 deletions frontend/packages/topology/src/components/graph-view/Topology.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ import {
import * as _ from 'lodash';
import { action } from 'mobx';
import { connect } from 'react-redux';
import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions';
import {
useResolvedExtensions,
isTopologyComponentFactory as isDynamicTopologyComponentFactory,
TopologyComponentFactory as DynamicTopologyComponentFactory,
} from '@console/dynamic-plugin-sdk';
isTopologyComponentFactory,
TopologyComponentFactory,
} from '@console/dynamic-plugin-sdk/src/extensions/topology';
import { RootState } from '@console/internal/redux';
import {
useQueryParams,
Expand All @@ -37,7 +37,6 @@ import {
import { withFallback, ErrorBoundaryFallbackPage } from '@console/shared/src/components/error';
import { TOPOLOGY_LAYOUT_CONFIG_STORAGE_KEY, TOPOLOGY_LAYOUT_LOCAL_STORAGE_KEY } from '../../const';
import { odcElementFactory } from '../../elements';
import { isTopologyComponentFactory, TopologyComponentFactory } from '../../extensions/topology';
import { getTopologyGraphModel, setTopologyGraphModel } from '../../redux/action';
import { SHOW_GROUPING_HINT_EVENT, ShowGroupingHintEventListener } from '../../topology-types';
import { componentFactory } from './components';
Expand Down Expand Up @@ -148,12 +147,9 @@ const Topology: React.FC<
const storedLayoutApplied = React.useRef<boolean>(false);
const queryParams = useQueryParams();
const selectedId = queryParams.get('selectId');
const [componentFactoryExtensions, isStaticResolved] = useResolvedExtensions<
const [componentFactoryExtensions, extensionsResolved] = useResolvedExtensions<
TopologyComponentFactory
>(isTopologyComponentFactory);
const [dynamicComponentFactoryExtensions, isDynamicResolved] = useResolvedExtensions<
DynamicTopologyComponentFactory
>(isDynamicTopologyComponentFactory);

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

React.useEffect(() => {
if (!isStaticResolved || !isDynamicResolved) {
if (!extensionsResolved) {
return;
}

visualization.registerComponentFactory(componentFactory);
[...componentFactoryExtensions, ...dynamicComponentFactoryExtensions].forEach((factory) => {
componentFactoryExtensions.forEach((factory) => {
visualization.registerComponentFactory(factory.properties.getFactory);
});

Expand All @@ -312,13 +308,7 @@ const Topology: React.FC<
},
);
setVisualizationReady(true);
}, [
visualization,
isStaticResolved,
isDynamicResolved,
componentFactoryExtensions,
dynamicComponentFactoryExtensions,
]);
}, [visualization, extensionsResolved, componentFactoryExtensions]);

React.useEffect(() => {
if (!applicationRef.current) {
Expand Down
61 changes: 17 additions & 44 deletions frontend/packages/topology/src/components/page/TopologyView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@ import {
FileUploadContext,
} from '@console/app/src/components/file-upload/file-upload-context';
import { useAddToProjectAccess } from '@console/dev-console/src/utils/useAddToProjectAccess';
import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions';
import {
useResolvedExtensions,
isTopologyCreateConnector,
isTopologyDecoratorProvider as isDynamicTopologyDecoratorProvider,
isTopologyDisplayFilters as isDynamicTopologyDisplayFilters,
isTopologyDecoratorProvider,
isTopologyDisplayFilters,
TopologyCreateConnector,
TopologyDecoratorProvider as DynamicTopologyDecoratorProvider,
TopologyDisplayFilters as DynamicTopologyDisplayFilters,
TopologyDecoratorProvider,
TopologyDisplayFilters,
TopologyRelationshipProvider,
isTopologyRelationshipProvider,
} from '@console/dynamic-plugin-sdk';
} from '@console/dynamic-plugin-sdk/src/extensions/topology';
import { selectOverviewDetailsTab } from '@console/internal/actions/ui';
import {
getQueryArgument,
Expand All @@ -40,12 +40,6 @@ import { useDeepCompareMemoize, useQueryParams } from '@console/shared';
import { useTelemetry } from '@console/shared/src/hooks/useTelemetry';
import { LAST_TOPOLOGY_OVERVIEW_OPEN_STORAGE_KEY } from '../../const';
import { updateModelFromFilters } from '../../data-transforms/updateModelFromFilters';
import {
isTopologyDecoratorProvider,
isTopologyDisplayFilters,
TopologyDecoratorProvider,
TopologyDisplayFilters,
} from '../../extensions/topology';
import {
getTopologySearchQuery,
TOPOLOGY_LABELS_FILTER_KEY,
Expand Down Expand Up @@ -135,24 +129,16 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
[fireTelemetryEvent],
);
const appliedFilters = useAppliedDisplayFilters();

const [displayFilterExtensions, displayFilterExtensionsResolved] = useResolvedExtensions<
TopologyDisplayFilters
>(isTopologyDisplayFilters);

const [extensionDecorators, extensionDecoratorsResolved] = useResolvedExtensions<
TopologyDecoratorProvider
>(isTopologyDecoratorProvider);

const [
dynamicDisplayFilterExtensions,
dynamicDisplayFilterExtensionsResolved,
] = useResolvedExtensions<DynamicTopologyDisplayFilters>(isDynamicTopologyDisplayFilters);
const [createConnectors, createConnectorsResolved] = useResolvedExtensions<
TopologyCreateConnector
>(isTopologyCreateConnector);
const [dynamicExtensionDecorators, dynamicExtensionDecoratorsResolved] = useResolvedExtensions<
DynamicTopologyDecoratorProvider
>(isDynamicTopologyDecoratorProvider);
const [extensionDecorators, extensionDecoratorsResolved] = useResolvedExtensions<
TopologyDecoratorProvider
>(isTopologyDecoratorProvider);
const [relationshipProvider] = useResolvedExtensions<TopologyRelationshipProvider>(
isTopologyRelationshipProvider,
);
Expand Down Expand Up @@ -218,8 +204,8 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
}, [visualization, graphData]);

React.useEffect(() => {
if (extensionDecoratorsResolved && dynamicExtensionDecoratorsResolved) {
const allDecorators = [...extensionDecorators, ...dynamicExtensionDecorators].reduce(
if (extensionDecoratorsResolved) {
const allDecorators = extensionDecorators.reduce(
(acc, extensionDecorator) => {
const decorator: TopologyDecorator = extensionDecorator.properties;
if (!acc[decorator.quadrant]) {
Expand All @@ -240,17 +226,12 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
);
setTopologyDecorators(allDecorators);
}
}, [
dynamicExtensionDecorators,
dynamicExtensionDecoratorsResolved,
extensionDecorators,
extensionDecoratorsResolved,
]);
}, [extensionDecorators, extensionDecoratorsResolved]);

React.useEffect(() => {
if (displayFilterExtensionsResolved && dynamicDisplayFilterExtensionsResolved) {
if (displayFilterExtensionsResolved) {
const updateFilters = [...filters];
[...displayFilterExtensions, ...dynamicDisplayFilterExtensions].forEach((extension) => {
displayFilterExtensions.forEach((extension) => {
const extFilters = extension.properties.getTopologyFilters();
extFilters?.forEach((filter) => {
if (!updateFilters.find((f) => f.id === filter.id)) {
Expand All @@ -266,22 +247,15 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
}
// Only update on extension changes
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [
displayFilterExtensionsResolved,
dynamicDisplayFilterExtensionsResolved,
displayFilterExtensions,
dynamicDisplayFilterExtensions,
]);
}, [displayFilterExtensionsResolved, displayFilterExtensions]);

React.useEffect(() => {
if (filtersLoaded) {
const newModel = updateModelFromFilters(
model,
filters,
application,
[...displayFilterExtensions, ...dynamicDisplayFilterExtensions].map(
(extension) => extension.properties.applyDisplayOptions,
),
displayFilterExtensions.map((extension) => extension.properties.applyDisplayOptions),
onSupportedFiltersChange,
onSupportedKindsChange,
);
Expand All @@ -296,7 +270,6 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
onSupportedFiltersChange,
onSupportedKindsChange,
displayFilterExtensions,
dynamicDisplayFilterExtensions,
]);

React.useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
GetTopologyNodeItem,
GetWorkloadResources,
MergeGroup,
OverviewItem,
} from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
import { getImageForIconClass } from '@console/internal/components/catalog/catalog-item-icon';
import { Alerts } from '@console/internal/components/monitoring/types';
Expand All @@ -28,7 +29,7 @@ import {
TYPE_EVENT_SOURCE_KAFKA,
TYPE_KNATIVE_REVISION,
} from '@console/knative-plugin/src/topology/const';
import { isKnativeServing, OverviewItem } from '@console/shared';
import { isKnativeServing } from '@console/shared/src/utils/pod-utils';
import { returnIfValidURL } from '@console/shared/src/utils/utils';
import {
TYPE_APPLICATION_GROUP,
Expand Down
1 change: 0 additions & 1 deletion frontend/packages/topology/src/extensions/index.ts

This file was deleted.

57 changes: 3 additions & 54 deletions frontend/packages/topology/src/extensions/topology.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
import { TopologyQuadrant } from '@patternfly/react-topology';
import { WatchK8sResources } from '@console/dynamic-plugin-sdk';
import { CodeRef } from '@console/dynamic-plugin-sdk/src/types';
import { Extension } from '@console/plugin-sdk/src/typings/base';
import {
TopologyApplyDisplayOptions,
TopologyDataModelDepicted,
TopologyDataModelGetter,
TopologyDisplayOption,
ViewComponentFactory,
TopologyDataModelReconciler,
TopologyDecoratorGetter,
} from '../topology-types';
} from '@console/dynamic-plugin-sdk/src/extensions/topology-types';
import { CodeRef } from '@console/dynamic-plugin-sdk/src/types';
import { Extension } from '@console/plugin-sdk/src/typings/base';

namespace ExtensionProperties {
export interface TopologyComponentFactory {
/** Getter for a ViewComponentFactory */
getFactory: CodeRef<ViewComponentFactory>;
}

export interface TopologyDataModelFactory {
/** Unique ID for the factory. */
id: string;
Expand All @@ -34,54 +24,13 @@ namespace ExtensionProperties {
/** Getter for function to reconcile data model after all extensions' models have loaded */
getDataModelReconciler?: CodeRef<TopologyDataModelReconciler>;
}

export interface TopologyDisplayFilters {
// Getter for topology filters specific to the extension
getTopologyFilters: CodeRef<() => TopologyDisplayOption[]>;
// Function to apply filters to the model
applyDisplayOptions: CodeRef<TopologyApplyDisplayOptions>;
}

export interface TopologyDecoratorProvider {
id: string;
priority: number;
quadrant: TopologyQuadrant;
decorator: CodeRef<TopologyDecoratorGetter>;
}
}

export interface TopologyComponentFactory
extends Extension<ExtensionProperties.TopologyComponentFactory> {
type: 'Topology/ComponentFactory';
}

export interface TopologyDataModelFactory
extends Extension<ExtensionProperties.TopologyDataModelFactory> {
type: 'Topology/DataModelFactory';
}

export interface TopologyDisplayFilters
extends Extension<ExtensionProperties.TopologyDisplayFilters> {
type: 'Topology/DisplayFilters';
}

export interface TopologyDecoratorProvider
extends Extension<ExtensionProperties.TopologyDecoratorProvider> {
type: 'Topology/Decorator';
}

export const isTopologyComponentFactory = (e: Extension): e is TopologyComponentFactory => {
return e.type === 'Topology/ComponentFactory';
};

export const isTopologyDataModelFactory = (e: Extension): e is TopologyDataModelFactory => {
return e.type === 'Topology/DataModelFactory';
};

export const isTopologyDisplayFilters = (e: Extension): e is TopologyDisplayFilters => {
return e.type === 'Topology/DisplayFilters';
};

export const isTopologyDecoratorProvider = (e: Extension): e is TopologyDecoratorProvider => {
return e.type === 'Topology/Decorator';
};
Loading