Skip to content
Merged
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
17 changes: 17 additions & 0 deletions src/components/KymaModules/components/ModuleStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,22 @@ import { StatusBadge } from 'shared/components/StatusBadge/StatusBadge';
import { useModuleStatus } from '../support';

export const resolveType = (status: string) => {
if (typeof status !== 'string') {
return 'None';
}

switch (status) {
case 'Initial':
case 'Pending':
case 'Available':
case 'Released':
return 'Information';
case 'Ready':
case 'Bound':
case 'Running':
case 'Success':
case 'Succeeded':
case 'Ok':
return 'Positive';
case 'Processing':
case 'Deleting':
Expand All @@ -12,7 +26,10 @@ export const resolveType = (status: string) => {
return 'None';
case 'Warning':
return 'Critical';
case 'Failed':
case 'Error':
case 'Failure':
case 'Invalid':
return 'Negative';
default:
return 'None';
Expand Down
27 changes: 24 additions & 3 deletions src/components/KymaModules/components/ModulesListRows.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import {
findModuleTemplate,
KymaResourceType,
ModuleTemplateListType,
ModuleTemplateStatus,
ModuleTemplateType,
resolveInstallationStateName,
useGetManagerStatus,
} from '../support';
import { EMPTY_TEXT_PLACEHOLDER } from 'shared/constants';
import { useTranslation } from 'react-i18next';
Expand Down Expand Up @@ -74,6 +77,10 @@ export const ModulesListRows = ({
resource?.version,
);

const { data: managerResourceState } = useGetManagerStatus(
currentModuleTemplate?.spec?.manager,
);

if (
moduleStatus &&
!moduleStatus.resource &&
Expand All @@ -99,7 +106,7 @@ export const ModulesListRows = ({

const currentModuleReleaseMeta = findModuleReleaseMeta(resource.name);

const isChannelOverriden =
const isChannelOverridden =
kymaResource?.spec?.modules?.[moduleIndex]?.channel !== undefined;

return [
Expand All @@ -122,6 +129,16 @@ export const ModulesListRows = ({
{t('kyma-modules.beta')}
</Tag>
) : null}
{moduleStatus?.state === ModuleTemplateStatus.Unmanaged && (
<Tag
className="sap-margin-begin-tiny"
hideStateIcon
colorScheme="5"
design="Set2"
>
{moduleStatus.state}
</Tag>
)}
</>,
// Namespace
moduleStatus?.resource?.metadata?.namespace || EMPTY_TEXT_PLACEHOLDER,
Expand All @@ -131,7 +148,7 @@ export const ModulesListRows = ({
? moduleStatus?.channel
: kymaResource?.spec?.modules?.[moduleIndex]?.channel ||
kymaResource?.spec?.channel}
{isChannelOverriden ? (
{isChannelOverridden ? (
<Tag
hideStateIcon
design="Set2"
Expand All @@ -155,7 +172,11 @@ export const ModulesListRows = ({
type={resolveType(moduleStatus?.state ?? '')}
tooltipContent={moduleStatus?.message}
>
{moduleStatus?.state || 'Unknown'}
{resolveInstallationStateName(
moduleStatus?.state,
!!currentModuleTemplate?.spec?.manager,
managerResourceState,
)}
</StatusBadge>,
// Documentation
moduleDocs ? (
Expand Down
98 changes: 97 additions & 1 deletion src/components/KymaModules/support.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,27 @@ import React, { useEffect, useState } from 'react';

import { useFetch } from 'shared/hooks/BackendAPI/useFetch';
import { ColumnLayoutState } from 'state/columnLayoutAtom';
import { resolveType } from './components/ModuleStatus';

export const enum ModuleTemplateStatus {
Ready = 'Ready',
Processing = 'Processing',
Deleting = 'Deleting',
Unknown = 'Unknown',
Unmanaged = 'Unmanaged',
Warning = 'Warning',
Error = 'Error',
NotInstalled = 'Not installed',
}

type ConditionType = {
lastTransitionTime: string;
lastUpdateTime: string;
message: string;
reason: string;
status: string;
type: string;
};

export type KymaResourceSpecModuleType = {
name: string;
Expand Down Expand Up @@ -105,7 +126,7 @@ export function useGetAllModulesStatuses(modules: any[]) {
const status = (await response.json())?.status;
return {
key: resource?.metadata?.name ?? resource?.name,
status: status?.state || 'Unknown',
status: status?.state || ModuleTemplateStatus.Unknown,
};
} catch (e) {
return {
Expand Down Expand Up @@ -152,6 +173,14 @@ export const findModuleSpec = (
);
};

type ModuleManagerType = {
name: string;
namespace: string;
group: string;
version: string;
kind: string;
};

export type ModuleTemplateType = {
metadata: {
name: string;
Expand All @@ -167,6 +196,7 @@ export type ModuleTemplateType = {
info?: {
documentation?: string;
};
manager: ModuleManagerType;
};
};

Expand Down Expand Up @@ -244,3 +274,69 @@ export const checkSelectedModule = (
}
return false;
};

export function useGetManagerStatus(manager?: ModuleManagerType) {
const fetch = useFetch();
const [data, setData] = useState<any>(ModuleTemplateStatus.Unknown);
const [error, setError] = useState<Error | null>(null);

useEffect(() => {
if (manager) {
const path = getResourcePath({
apiVersion: `${manager?.group}/${manager?.version}`,
kind: manager?.kind,
metadata: {
name: manager?.name,
namespace: manager?.namespace,
},
} as KymaResourceType);
async function fetchResource() {
try {
const response = await fetch({ relativeUrl: path });
const status = (await response.json())?.status;
const latest = status?.conditions
?.filter((condition: ConditionType) => condition?.status === 'True')
?.reduce(
(acc: ConditionType, condition: ConditionType) =>
new Date(acc?.lastUpdateTime).getTime() >
new Date(condition?.lastUpdateTime).getTime()
? acc
: condition,
{},
);
if (latest?.type) {
setData(latest.type);
}
} catch (error) {
if (error instanceof Error) {
setError(error);
}
}
}

fetchResource();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [manager]);

return { data, error };
}

export const resolveInstallationStateName = (
state?: string,
managerExists?: boolean,
managerResourceState?: string,
) => {
if (state === ModuleTemplateStatus.Unmanaged && !managerExists) {
return ModuleTemplateStatus.NotInstalled;
}

if (state === ModuleTemplateStatus.Unmanaged && managerExists) {
if (resolveType(state) !== resolveType(managerResourceState ?? '')) {
return ModuleTemplateStatus.Processing;
}
return managerResourceState || ModuleTemplateStatus.Unknown;
}

return state || ModuleTemplateStatus.Unknown;
};
Loading