Skip to content

Commit f9cfb2b

Browse files
authored
fix: Allow force delete on modules details (kyma-project#3751)
* Allow force delete on modules details * Fix loading associated resources
1 parent d6bd8ca commit f9cfb2b

File tree

4 files changed

+281
-70
lines changed

4 files changed

+281
-70
lines changed

src/components/KymaModules/KymaModulesList.js

Lines changed: 23 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from '@ui5/webcomponents-react';
1717

1818
import { HintButton } from 'shared/components/DescriptionHint/DescriptionHint';
19-
import React, { useEffect, useState } from 'react';
19+
import React, { useEffect, useMemo, useState } from 'react';
2020

2121
import { GenericList } from 'shared/components/GenericList/GenericList';
2222
import {
@@ -50,7 +50,7 @@ import {
5050
useModulesReleaseQuery,
5151
useModuleTemplatesQuery,
5252
} from './kymaModulesQueries';
53-
import { findModuleStatus } from './support';
53+
import { findModuleStatus, findModuleTemplate } from './support';
5454
import {
5555
checkIfAssociatedResourceLeft,
5656
deleteAssociatedResources,
@@ -140,28 +140,6 @@ export default function KymaModulesList({
140140
};
141141

142142
const ModulesList = resource => {
143-
const findModuleTemplate = (moduleName, channel, version) => {
144-
// This change was made due to changes in moduleTemplates and should be simplified once all moduleTemplates migrate
145-
const moduleTemplateWithoutInfo = moduleTemplates?.items?.find(
146-
moduleTemplate =>
147-
moduleName ===
148-
moduleTemplate.metadata.labels[
149-
'operator.kyma-project.io/module-name'
150-
] && moduleTemplate.spec.channel === channel,
151-
);
152-
const moduleWithInfo = moduleTemplates?.items?.find(
153-
moduleTemplate =>
154-
moduleName ===
155-
moduleTemplate.metadata.labels[
156-
'operator.kyma-project.io/module-name'
157-
] &&
158-
!moduleTemplate.spec.channel &&
159-
moduleTemplate.spec.version === version,
160-
);
161-
162-
return moduleWithInfo ?? moduleTemplateWithoutInfo;
163-
};
164-
165143
const findModuleReleaseMeta = moduleName => {
166144
return moduleReleaseMetas?.items.find(
167145
item => item.spec.moduleName === moduleName,
@@ -210,6 +188,7 @@ export default function KymaModulesList({
210188
const hasCrd = !!findCrd(resource?.resource?.kind);
211189

212190
let hasModuleTpl = !!findModuleTemplate(
191+
moduleTemplates,
213192
resource.name,
214193
resource.channel,
215194
resource.version,
@@ -230,6 +209,7 @@ export default function KymaModulesList({
230209
);
231210

232211
const currentModuleTemplate = findModuleTemplate(
212+
moduleTemplates,
233213
resource?.name,
234214
resource?.channel || kymaResource?.spec?.channel,
235215
resource?.version,
@@ -352,6 +332,7 @@ export default function KymaModulesList({
352332
// It can be refactored after implementing https://github.com/kyma-project/lifecycle-manager/issues/2232
353333
if (!moduleStatus.resource) {
354334
const connectedModule = findModuleTemplate(
335+
moduleTemplates,
355336
moduleName,
356337
moduleStatus.channel,
357338
moduleStatus.version,
@@ -429,19 +410,24 @@ export default function KymaModulesList({
429410
const [allowForceDelete, setAllowForceDelete] = useState(false);
430411
const [associatedResourceLeft, setAssociatedResourceLeft] = useState(false);
431412

432-
useEffect(() => {
433-
const fetchCounts = async () => {
434-
const resources = getAssociatedResources(
413+
const associatedResources = useMemo(
414+
() =>
415+
getAssociatedResources(
435416
chosenModuleIndex,
436-
findModuleTemplate,
437417
selectedModules,
438418
kymaResource,
439-
);
419+
moduleTemplates,
420+
),
421+
// eslint-disable-next-line react-hooks/exhaustive-deps
422+
[chosenModuleIndex, moduleTemplates],
423+
);
440424

441-
const counts = await fetchResourceCounts(resources, fetchFn);
425+
useEffect(() => {
426+
const fetchCounts = async () => {
427+
const counts = await fetchResourceCounts(associatedResources, fetchFn);
442428

443429
const urls = await generateAssociatedResourcesUrls(
444-
resources,
430+
associatedResources,
445431
fetchFn,
446432
clusterUrl,
447433
getScope,
@@ -451,9 +437,9 @@ export default function KymaModulesList({
451437

452438
const crUResources = getCRResource(
453439
chosenModuleIndex,
454-
findModuleTemplate,
455440
selectedModules,
456441
kymaResource,
442+
moduleTemplates,
457443
);
458444

459445
const crUrl = await generateAssociatedResourcesUrls(
@@ -472,21 +458,18 @@ export default function KymaModulesList({
472458

473459
fetchCounts();
474460
// eslint-disable-next-line react-hooks/exhaustive-deps
475-
}, [chosenModuleIndex]);
461+
}, [associatedResources]);
476462

477463
useEffect(() => {
478464
const resourcesLeft = checkIfAssociatedResourceLeft(
479465
resourceCounts,
480-
chosenModuleIndex,
481-
findModuleTemplate,
482-
selectedModules,
483-
kymaResource,
466+
associatedResources,
484467
);
485468

486469
setAssociatedResourceLeft(resourcesLeft);
487470

488471
// eslint-disable-next-line react-hooks/exhaustive-deps
489-
}, [resourceCounts]);
472+
}, [resourceCounts, associatedResources]);
490473

491474
function getEntries(statusModules = [], specModules = []) {
492475
specModules.forEach(specItem => {
@@ -525,12 +508,7 @@ export default function KymaModulesList({
525508
name: selectedModules[chosenModuleIndex]?.name,
526509
})}
527510
</Text>
528-
{getAssociatedResources(
529-
chosenModuleIndex,
530-
findModuleTemplate,
531-
selectedModules,
532-
kymaResource,
533-
).length > 0 && (
511+
{associatedResources.length > 0 && (
534512
<>
535513
<MessageStrip
536514
design="Information"
@@ -544,12 +522,7 @@ export default function KymaModulesList({
544522
mode="None"
545523
separators="All"
546524
>
547-
{getAssociatedResources(
548-
chosenModuleIndex,
549-
findModuleTemplate,
550-
selectedModules,
551-
kymaResource,
552-
).map(assResource => {
525+
{associatedResources.map(assResource => {
553526
const resourceCount =
554527
resourceCounts[
555528
`${assResource.kind}-${assResource.group}-${assResource.version}`

src/components/KymaModules/deleteModulesHelpers.tsx

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import pluralize from 'pluralize';
2-
import { findModuleStatus } from './support';
2+
import {
3+
findModuleStatus,
4+
findModuleTemplate,
5+
ModuleTemplateListType,
6+
} from './support';
37

48
interface Counts {
59
[key: string]: number;
@@ -13,9 +17,9 @@ type Resource = {
1317

1418
export const getAssociatedResources = (
1519
chosenModuleIndex: number,
16-
findModuleTemplate: Function,
1720
selectedModules: any,
1821
kymaResource: any,
22+
moduleTemplates: ModuleTemplateListType,
1923
) => {
2024
if (!chosenModuleIndex) {
2125
return [];
@@ -27,6 +31,7 @@ export const getAssociatedResources = (
2731
findModuleStatus(kymaResource, selectedModule?.name)?.version;
2832

2933
const module = findModuleTemplate(
34+
moduleTemplates,
3035
selectedModule?.name,
3136
moduleChannel,
3237
moduleVersion,
@@ -36,9 +41,9 @@ export const getAssociatedResources = (
3641

3742
export const getCRResource = (
3843
chosenModuleIndex: number,
39-
findModuleTemplate: Function,
4044
selectedModules: any,
4145
kymaResource: any,
46+
moduleTemplates: ModuleTemplateListType,
4247
) => {
4348
if (!chosenModuleIndex) {
4449
return [];
@@ -50,13 +55,14 @@ export const getCRResource = (
5055
findModuleStatus(kymaResource, selectedModule?.name)?.version;
5156

5257
const module = findModuleTemplate(
58+
moduleTemplates,
5359
selectedModule?.name,
5460
moduleChannel,
5561
moduleVersion,
5662
);
5763

5864
let resource: Resource | null = null;
59-
if (module.spec.data) {
65+
if (module && module.spec.data) {
6066
resource = {
6167
group: module.spec.data.apiVersion.split('/')[0],
6268
version: module.spec.data.apiVersion.split('/')[1],
@@ -185,19 +191,9 @@ export const fetchResourceCounts = async (
185191

186192
export const checkIfAssociatedResourceLeft = (
187193
resourceCounts: Counts,
188-
chosenModuleIndex: number,
189-
findModuleTemplate: Function,
190-
selectedModules: any,
191-
kymaResource: any,
194+
associatedResources: Resource[],
192195
) => {
193-
const resources: Resource[] = getAssociatedResources(
194-
chosenModuleIndex,
195-
findModuleTemplate,
196-
selectedModules,
197-
kymaResource,
198-
);
199-
200-
for (const resource of resources) {
196+
for (const resource of associatedResources) {
201197
if (
202198
resourceCounts[`${resource.kind}-${resource.group}-${resource.version}`] >
203199
0

src/components/KymaModules/support.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,51 @@ export const findModuleSpec = (
137137
);
138138
};
139139

140+
type ModuleTemplateType = {
141+
metadata: {
142+
name: string;
143+
namespace: string;
144+
labels: Record<string, string>;
145+
};
146+
spec: {
147+
associatedResources: any;
148+
data: any;
149+
channel: string;
150+
version: string;
151+
};
152+
};
153+
154+
export type ModuleTemplateListType = {
155+
items: ModuleTemplateType[];
156+
};
157+
158+
export const findModuleTemplate = (
159+
moduleTemplates: ModuleTemplateListType,
160+
moduleName: string,
161+
channel: string,
162+
version: string,
163+
) => {
164+
// This change was made due to changes in moduleTemplates and should be simplified once all moduleTemplates migrate
165+
const moduleTemplateWithoutInfo = moduleTemplates?.items?.find(
166+
moduleTemplate =>
167+
moduleName ===
168+
moduleTemplate.metadata.labels[
169+
'operator.kyma-project.io/module-name'
170+
] && moduleTemplate.spec.channel === channel,
171+
);
172+
const moduleWithInfo = moduleTemplates?.items?.find(
173+
moduleTemplate =>
174+
moduleName ===
175+
moduleTemplate.metadata.labels[
176+
'operator.kyma-project.io/module-name'
177+
] &&
178+
!moduleTemplate.spec.channel &&
179+
moduleTemplate.spec.version === version,
180+
);
181+
182+
return moduleWithInfo ?? moduleTemplateWithoutInfo;
183+
};
184+
140185
export const setChannel = (
141186
module: { name: string },
142187
channel: string,

0 commit comments

Comments
 (0)