Skip to content

Commit 8b6e9dc

Browse files
authored
[MTV-3311] [UI] mandatory storage incorrectly identified when editing mappings (#1873)
Signed-off-by: Jeff Puzzo <[email protected]>
1 parent 3ce0917 commit 8b6e9dc

File tree

3 files changed

+99
-18
lines changed

3 files changed

+99
-18
lines changed

src/plans/details/components/PlanPageHeader/hooks/usePlanAlerts.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { CATEGORY_TYPES } from '@utils/constants';
1515
import { getNamespace } from '@utils/crds/common/selectors';
1616
import { isEmpty } from '@utils/helpers';
1717

18+
import { usePlanMappingData } from '../../../hooks/usePlanMappingData';
1819
import { getPlanStatus } from '../../PlanStatus/utils/utils';
1920

2021
const usePlanAlerts = (plan: V1beta1Plan) => {
@@ -38,8 +39,17 @@ const usePlanAlerts = (plan: V1beta1Plan) => {
3839
});
3940

4041
const [sourceProvider] = usePlanProviders(plan, namespace!);
41-
const [sourceStorages] = useSourceStorages(sourceProvider);
42-
const [sourceNetworks] = useSourceNetworks(sourceProvider);
42+
const [providerStorages] = useSourceStorages(sourceProvider);
43+
const [providerNetworks] = useSourceNetworks(sourceProvider);
44+
45+
const { sourceNetworks, sourceStorages } = usePlanMappingData({
46+
networkMaps,
47+
plan,
48+
providerNetworks,
49+
providerStorages,
50+
sourceProvider,
51+
storageMaps,
52+
});
4353

4454
const criticalCondition = plan?.status?.conditions?.find(
4555
(condition) => condition?.category === CATEGORY_TYPES.CRITICAL,
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { useMemo } from 'react';
2+
import type { InventoryNetwork } from 'src/modules/Providers/hooks/useNetworks';
3+
import type { InventoryStorage } from 'src/modules/Providers/hooks/useStorages';
4+
5+
import type {
6+
V1beta1NetworkMap,
7+
V1beta1Plan,
8+
V1beta1Provider,
9+
V1beta1StorageMap,
10+
} from '@kubev2v/types';
11+
import { getName } from '@utils/crds/common/selectors';
12+
import { getPlanNetworkMapName, getPlanStorageMapName } from '@utils/crds/plans/selectors';
13+
import { isEmpty } from '@utils/helpers';
14+
15+
type UsePlanMappingDataOptions = {
16+
plan: V1beta1Plan;
17+
networkMaps: V1beta1NetworkMap[];
18+
storageMaps: V1beta1StorageMap[];
19+
providerStorages: InventoryStorage[];
20+
providerNetworks: InventoryNetwork[];
21+
sourceProvider?: V1beta1Provider;
22+
};
23+
24+
/**
25+
* Returns source storage/network data with fallback to map references
26+
* when provider inventory is unavailable.
27+
*/
28+
export const usePlanMappingData = ({
29+
networkMaps,
30+
plan,
31+
providerNetworks,
32+
providerStorages,
33+
sourceProvider,
34+
storageMaps,
35+
}: UsePlanMappingDataOptions) => {
36+
const planNetworkMap = useMemo(
37+
() => networkMaps.find((map) => getName(map) === getPlanNetworkMapName(plan)),
38+
[networkMaps, plan],
39+
);
40+
41+
const planStorageMap = useMemo(
42+
() => storageMaps.find((map) => getName(map) === getPlanStorageMapName(plan)),
43+
[storageMaps, plan],
44+
);
45+
46+
const sourceStorages = useMemo(() => {
47+
if (!isEmpty(providerStorages)) return providerStorages;
48+
49+
return (planStorageMap?.status?.references ?? []).map((ref) => ({
50+
id: ref.id ?? '',
51+
name: ref.name ?? '',
52+
providerType: sourceProvider?.spec?.type,
53+
})) as InventoryStorage[];
54+
}, [providerStorages, planStorageMap, sourceProvider]);
55+
56+
const sourceNetworks = useMemo(() => {
57+
if (!isEmpty(providerNetworks)) return providerNetworks;
58+
59+
return (planNetworkMap?.status?.references ?? []).map((ref) => ({
60+
id: ref.id ?? '',
61+
name: ref.name ?? '',
62+
providerType: sourceProvider?.spec?.type,
63+
})) as InventoryNetwork[];
64+
}, [providerNetworks, planNetworkMap, sourceProvider]);
65+
66+
return {
67+
planNetworkMap,
68+
planStorageMap,
69+
sourceNetworks,
70+
sourceStorages,
71+
};
72+
};

src/plans/details/tabs/Mappings/hooks/useMappingResources.ts

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ import { useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';
2525
import { getName, getNamespace } from '@utils/crds/common/selectors';
2626
import {
2727
getPlanDestinationProviderName,
28-
getPlanNetworkMapName,
2928
getPlanSourceProviderName,
30-
getPlanStorageMapName,
3129
} from '@utils/crds/plans/selectors';
3230
import { isEmpty } from '@utils/helpers';
3331

32+
import { usePlanMappingData } from '../../../hooks/usePlanMappingData';
33+
3434
type MappingResources = {
3535
loadingResources: boolean;
3636
resourcesError: Error | undefined;
@@ -70,16 +70,6 @@ export const useMappingResources = (plan: V1beta1Plan): MappingResources => {
7070
namespaced: true,
7171
});
7272

73-
const planNetworkMaps = useMemo(
74-
() => (networkMaps ?? []).find((net) => getName(net) === getPlanNetworkMapName(plan)),
75-
[networkMaps, plan],
76-
);
77-
78-
const planStorageMaps = useMemo(
79-
() => (storageMaps ?? []).find((storage) => getName(storage) === getPlanStorageMapName(plan)),
80-
[storageMaps, plan],
81-
);
82-
8373
const sourceProvider = useMemo(
8474
() =>
8575
(providers ?? []).find((provider) => getName(provider) === getPlanSourceProviderName(plan)),
@@ -94,15 +84,24 @@ export const useMappingResources = (plan: V1beta1Plan): MappingResources => {
9484
[providers, plan],
9585
);
9686

97-
const [sourceNetworks, sourceNetworksLoading, sourceNetworksError] =
87+
const [providerNetworks, sourceNetworksLoading, sourceNetworksError] =
9888
useSourceNetworks(sourceProvider);
9989
const [targetNetworks, targetNetworksLoading, targetNetworksError] =
10090
useOpenShiftNetworks(targetProvider);
101-
const [sourceStorages, sourceStoragesLoading, sourceStoragesError] =
91+
const [providerStorages, sourceStoragesLoading, sourceStoragesError] =
10292
useSourceStorages(sourceProvider);
10393
const [targetStorages, targetStoragesLoading, targetStoragesError] =
10494
useOpenShiftStorages(targetProvider);
10595

96+
const { planNetworkMap, planStorageMap, sourceNetworks, sourceStorages } = usePlanMappingData({
97+
networkMaps,
98+
plan,
99+
providerNetworks,
100+
providerStorages,
101+
sourceProvider,
102+
storageMaps,
103+
});
104+
106105
const resourcesError = () => {
107106
if (!isEmpty(providersLoadError as Error)) return providersLoadError as Error;
108107

@@ -130,8 +129,8 @@ export const useMappingResources = (plan: V1beta1Plan): MappingResources => {
130129
targetNetworksLoading ||
131130
sourceStoragesLoading ||
132131
targetStoragesLoading,
133-
planNetworkMap: planNetworkMaps ?? null,
134-
planStorageMap: planStorageMaps ?? null,
132+
planNetworkMap: planNetworkMap ?? null,
133+
planStorageMap: planStorageMap ?? null,
135134
resourcesError: resourcesError(),
136135
sourceNetworks: sourceNetworks ?? [],
137136
sourceStorages: sourceStorages ?? [],

0 commit comments

Comments
 (0)