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
2 changes: 2 additions & 0 deletions packages/odf/components/overview/Overview.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ jest.mock('@openshift-console/dynamic-plugin-sdk', () => ({
storageClusters: { data: [], loaded: true, loadError: null },
flashSystemClusters: { data: [], loaded: true, loadError: null },
remoteClusters: { data: [], loaded: true, loadError: null },
sanClusters: { data: [], loaded: true, loadError: null },
daemons: { data: [], loaded: true, loadError: null },
})),
useActivePerspective: jest.fn(() => ''),
}));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import * as React from 'react';
import {
IBM_SCALE_LOCAL_CLUSTER_NAME,
SAN_STORAGE_SYSTEM_NAME,
} from '@odf/core/constants';
import { FDF_FLAG } from '@odf/core/redux';
import { RemoteClusterKind } from '@odf/core/types/scale';
import {
ClusterKind,
DaemonKind,
RemoteClusterKind,
} from '@odf/core/types/scale';
import { isClusterIgnored, isExternalCluster } from '@odf/core/utils/odf';
import { DASH } from '@odf/shared/constants';
import { useWatchStorageClusters } from '@odf/shared/hooks/useWatchStorageClusters';
import { getName } from '@odf/shared/selectors';
import { resourceStatus } from '@odf/shared/status/Resource';
import { Status } from '@odf/shared/status/Status';
import { StorageClusterPhase } from '@odf/shared/types/storage';
Expand Down Expand Up @@ -81,8 +90,29 @@ const getClustersStatuses = (
);
};

type IBMScaleOperandKind = RemoteClusterKind | ClusterKind;

const getIBMScaleExternalSystemNames = (
remoteClusters: RemoteClusterKind[] = [],
sanClusters: ClusterKind[] = [],
gpfsClusterNameFromDaemon?: string
): string[] => {
const remoteNames = remoteClusters.map((c) => getName(c));
const sanNames = sanClusters.map((c) => {
if (sanClusters.length === 1 && gpfsClusterNameFromDaemon) {
return gpfsClusterNameFromDaemon;
}
const crName = getName(c);
if (sanClusters.length === 1 && crName === IBM_SCALE_LOCAL_CLUSTER_NAME) {
return SAN_STORAGE_SYSTEM_NAME;
}
return crName;
});
return [...remoteNames, ...sanNames];
};
Comment on lines +95 to +112
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SAN storage and scale are two different resources. Why are we showing it under the same header?


const getScaleClustersStatuses = (
clusters: RemoteClusterKind[] = [],
clusters: IBMScaleOperandKind[] = [],
t: TFunction
): React.ReactNode => {
let [healthy, error, warning] = [0, 0, 0];
Expand All @@ -92,11 +122,9 @@ const getScaleClustersStatuses = (
)?.status;
if (clusterStatus === 'True') {
healthy++;
}
if (clusterStatus === 'False') {
} else if (clusterStatus === 'False') {
error++;
}
if (clusterStatus === 'Unknown') {
} else {
warning++;
}
}
Expand Down Expand Up @@ -129,8 +157,13 @@ const getScaleClustersStatuses = (
};
export const ExternalSystemsCard: React.FC<CardProps> = ({ className }) => {
const { t } = useCustomTranslation();
const { storageClusters, flashSystemClusters, remoteClusters } =
useWatchStorageClusters();
const {
storageClusters,
flashSystemClusters,
remoteClusters,
sanClusters,
daemons,
} = useWatchStorageClusters();
const navigate = useNavigate();

const isFDF = useFlag(FDF_FLAG);
Expand All @@ -149,10 +182,37 @@ export const ExternalSystemsCard: React.FC<CardProps> = ({ className }) => {
flashSystemClusters?.loaded && !flashSystemClusters?.loadError
? getClustersStatuses(flashSystemClusters?.data, t)
: DASH;
const scaleClustersStatuses =
(isFDF ? remoteClusters?.loaded : true) && !remoteClusters?.loadError
? getScaleClustersStatuses(remoteClusters?.data, t)
: DASH;

const ibmScaleResourcesLoaded =
!isFDF ||
(Boolean(remoteClusters?.loaded) &&
Boolean(sanClusters?.loaded) &&
Boolean(daemons?.loaded) &&
!remoteClusters?.loadError &&
!sanClusters?.loadError &&
!daemons?.loadError);

const remoteClustersData = remoteClusters?.data ?? [];
const sanClustersData = sanClusters?.data ?? [];
const gpfsClusterNameFromDaemon = (
daemons?.data as DaemonKind[] | undefined
)?.[0]?.status?.clusterName;

const ibmScaleClusters: IBMScaleOperandKind[] = isFDF
? [...remoteClustersData, ...sanClustersData]
: [];

const ibmScaleExternalSystemNames = isFDF
? getIBMScaleExternalSystemNames(
remoteClustersData,
sanClustersData,
gpfsClusterNameFromDaemon
)
: [];

const scaleClustersStatuses = ibmScaleResourcesLoaded
? getScaleClustersStatuses(ibmScaleClusters, t)
: DASH;

return (
<Card className={classNames(className, 'odf-external-system-card')}>
Expand All @@ -169,7 +229,14 @@ export const ExternalSystemsCard: React.FC<CardProps> = ({ className }) => {
{t('IBM Scale System')}
</DescriptionListTerm>
<DescriptionListDescription>
{scaleClustersStatuses}
<Stack hasGutter>
{ibmScaleExternalSystemNames.length > 0 && (
<StackItem>
{ibmScaleExternalSystemNames.join(', ')}
</StackItem>
)}
<StackItem>{scaleClustersStatuses}</StackItem>
</Stack>
</DescriptionListDescription>
</DescriptionListGroup>
)}
Expand Down
4 changes: 4 additions & 0 deletions packages/shared/src/hooks/useWatchStorageClusters.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { IBM_SCALE_NAMESPACE } from '@odf/core/constants';
import { FDF_FLAG } from '@odf/core/redux';
import {
ClusterKind,
Expand Down Expand Up @@ -50,6 +51,7 @@ const resources = (isFDF: boolean): WatchK8sResources<AllClusters> => ({
kind: RemoteClusterModel.kind,
},
isList: true,
namespace: IBM_SCALE_NAMESPACE,
},
sanClusters: {
groupVersionKind: {
Expand All @@ -58,6 +60,7 @@ const resources = (isFDF: boolean): WatchK8sResources<AllClusters> => ({
kind: ClusterModel.kind,
},
isList: true,
namespace: IBM_SCALE_NAMESPACE,
},
daemons: {
groupVersionKind: {
Expand All @@ -66,6 +69,7 @@ const resources = (isFDF: boolean): WatchK8sResources<AllClusters> => ({
kind: DaemonModel.kind,
},
isList: true,
namespace: IBM_SCALE_NAMESPACE,
},
}
: {}),
Expand Down
2 changes: 1 addition & 1 deletion packages/shared/src/models/scale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const ClusterModel: K8sModel = {
labelPlural: 'Clusters',
crd: true,
abbr: 'Cl',
namespaced: false,
namespaced: true,
};

export const EncryptionConfigModel: K8sModel = {
Expand Down
Loading