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
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ interface HealthcheckIssueDetailsProps {

export function IssueDetails({issue}: HealthcheckIssueDetailsProps) {
const {database} = useTenantQueryParams();
const {location} = issue;

const {detailsFields, hiddenStorageFields, hiddenComputeFields} = React.useMemo(() => {
const hiddenStorageFields: LocationFieldStorage[] = [];
Expand Down Expand Up @@ -75,17 +74,19 @@ export function IssueDetails({issue}: HealthcheckIssueDetailsProps) {
return {detailsFields: fields, hiddenComputeFields, hiddenStorageFields};
}, [issue, database]);

const {location} = issue;

return (
<Flex direction="column" gap={4}>
<LocationDetails
title={i18n('label_details')}
fields={detailsFields}
titleVariant="subheader-2"
/>
<StorageLocation location={location.storage} hiddenFields={hiddenStorageFields} />
<ComputeLocation location={location.compute} hiddenFields={hiddenComputeFields} />
<NodeLocation location={location.node} />
<PeerLocation location={location.peer} />
<StorageLocation location={location?.storage} hiddenFields={hiddenStorageFields} />
<ComputeLocation location={location?.compute} hiddenFields={hiddenComputeFields} />
<NodeLocation location={location?.node} />
<PeerLocation location={location?.peer} />
</Flex>
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ function PDiskInfo({location}: StorageSectionProps) {
return null;
}

return pdisk.map((disk: {id: string; path: string}) => (
return pdisk.map((disk) => (
<LocationDetails
key={disk.id}
key={disk.id || disk.path}
fields={[
{
value:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ export function HealthcheckIssueTabs({
onClick={() => setSelectedTab(parent.id)}
>
<Flex gap={2} wrap="nowrap" alignItems="center">
<TabStatus status={parent.status} />
{getTypeText(parent.type)}
{parent.status && <TabStatus status={parent.status} />}
{parent.type && getTypeText(parent.type)}
</Flex>
</HealthcjeckIssueTab>
{index !== parents.length - 1 && <Text color="secondary">/</Text>}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export function Issues({issues}: IssuesProps) {
view
? filteredIssues.filter((issue) => {
const type = issue.firstParentType || issue.type;
return type.toLowerCase().startsWith(view);
return type?.toLowerCase().startsWith(view);
})
: [],
[filteredIssues, view],
Expand Down
3 changes: 3 additions & 0 deletions src/containers/Tenant/Healthcheck/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ export function countHealthcheckIssuesByType(

for (const issue of issueTrees) {
const type = issue.firstParentType ?? issue.type;
if (!type) {
continue;
}
if (type.startsWith('STORAGE')) {
result.storage++;
} else if (type.startsWith('COMPUTE')) {
Expand Down
4 changes: 2 additions & 2 deletions src/store/reducers/healthcheckInfo/healthcheckInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ const mapStatusToPriority: Partial<Record<StatusFlag, number>> = {

const sortIssues = (data: IssueLog[]): IssueLog[] => {
return data.sort((a, b) => {
const aPriority = mapStatusToPriority[a.status] || 0;
const bPriority = mapStatusToPriority[b.status] || 0;
const aPriority = a.status ? mapStatusToPriority[a.status] || 0 : 0;
const bPriority = b.status ? mapStatusToPriority[b.status] || 0 : 0;

return aPriority - bPriority;
});
Expand Down
138 changes: 69 additions & 69 deletions src/types/api/healthcheck.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,60 +18,60 @@ export enum StatusFlag {
}

interface LocationNode {
id: number;
host: string;
port: number;
id?: number;
host?: string;
port?: number;
}

interface LocationStoragePDisk {
id: string;
path: string;
id?: string;
path?: string;
}

interface LocationStorageVDisk {
id: string[];
pdisk: LocationStoragePDisk[];
id?: string[];
pdisk?: LocationStoragePDisk[];
}

interface LocationStorageGroup {
id: string[];
vdisk: LocationStorageVDisk;
id?: string[];
vdisk?: LocationStorageVDisk;
}

interface LocationStoragePool {
name: string;
group: LocationStorageGroup;
name?: string;
group?: LocationStorageGroup;
}

interface LocationStorage {
node: LocationNode;
pool: LocationStoragePool;
node?: LocationNode;
pool?: LocationStoragePool;
}

interface LocationComputePool {
name: string;
name?: string;
}

interface LocationComputeTablet {
type: string;
id: string[];
count: number;
type?: string;
id?: string[];
count?: number;
}

interface LocationComputeSchema {
type: string;
path: string;
type?: string;
path?: string;
}

interface LocationCompute {
node: LocationNode;
pool: LocationComputePool;
tablet: LocationComputeTablet;
schema: LocationComputeSchema;
node?: LocationNode;
pool?: LocationComputePool;
tablet?: LocationComputeTablet;
schema?: LocationComputeSchema;
}

interface LocationDatabase {
name: string;
name?: string;
}

export interface Location {
Expand All @@ -84,91 +84,91 @@ export interface Location {

export interface IssueLog {
id: string;
status: StatusFlag;
message: string;
location: Location;
status?: StatusFlag;
message?: string;
location?: Location;
reason?: string[];
type: string;
level: number;
type?: string;
level?: number;
listed?: number;
count?: number;
}

interface StoragePDiskStatus {
id: string;
overall: StatusFlag;
id?: string;
overall?: StatusFlag;
}

interface StorageVDiskStatus {
id: string;
overall: StatusFlag;
vdisk_status: StatusFlag;
pdisk: StoragePDiskStatus;
id?: string;
overall?: StatusFlag;
vdisk_status?: StatusFlag;
pdisk?: StoragePDiskStatus;
}

interface StorageGroupStatus {
id: string;
overall: StatusFlag;
vdisks: StorageVDiskStatus[];
id?: string;
overall?: StatusFlag;
vdisks?: StorageVDiskStatus[];
}

interface StoragePoolStatus {
id: string;
overall: StatusFlag;
groups: StorageGroupStatus[];
id?: string;
overall?: StatusFlag;
groups?: StorageGroupStatus[];
}

interface StorageStatus {
overall: StatusFlag;
pools: StoragePoolStatus[];
overall?: StatusFlag;
pools?: StoragePoolStatus[];
}

interface ComputeTabletStatus {
overall: StatusFlag;
type: string;
state: string;
count: number;
id: string[];
overall?: StatusFlag;
type?: string;
state?: string;
count?: number;
id?: string[];
}

interface ThreadPoolStatus {
overall: StatusFlag;
name: string;
usage: number;
overall?: StatusFlag;
name?: string;
usage?: number;
}

interface LoadAverageStatus {
overall: StatusFlag;
load: number;
cores: number;
overall?: StatusFlag;
load?: number;
cores?: number;
}

interface ComputeNodeStatus {
id: string;
overall: StatusFlag;
tablets: ComputeTabletStatus[];
pools: ThreadPoolStatus[];
load: LoadAverageStatus;
id?: string;
overall?: StatusFlag;
tablets?: ComputeTabletStatus[];
pools?: ThreadPoolStatus[];
load?: LoadAverageStatus;
}

interface ComputeStatus {
overall: StatusFlag;
nodes: ComputeNodeStatus[];
tablets: ComputeTabletStatus[];
paths_quota_usage: number;
shards_quota_usage: number;
overall?: StatusFlag;
nodes?: ComputeNodeStatus[];
tablets?: ComputeTabletStatus[];
paths_quota_usage?: number;
shards_quota_usage?: number;
}

interface DatabaseStatus {
name: string;
overall: StatusFlag;
storage: StorageStatus;
compute: ComputeStatus;
name?: string;
overall?: StatusFlag;
storage?: StorageStatus;
compute?: ComputeStatus;
}

export interface HealthCheckAPIResponse {
// eslint-disable-next-line camelcase
self_check_result: SelfCheckResult;
self_check_result?: SelfCheckResult;
// eslint-disable-next-line camelcase
issue_log?: IssueLog[];
// eslint-disable-next-line camelcase
Expand Down
Loading