Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HDDS-10517. Recon - Add a UI component for showing DN decommissioning detailed status and info #6724

Merged
merged 20 commits into from
Aug 7, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
cf6981f
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 May 24, 2024
a837686
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jun 5, 2024
e77b8f1
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jun 18, 2024
435082b
Merge branch 'master' into HDDS-10517
smitajoshi12 Jun 20, 2024
b43405c
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jun 20, 2024
90f23f7
Merge branch 'master' into HDDS-10517
smitajoshi12 Jun 21, 2024
eac89e1
Merge branch 'master' into HDDS-10517
smitajoshi12 Jul 10, 2024
bc619dd
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 10, 2024
29906a4
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 10, 2024
bb1241d
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 10, 2024
e7a774b
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 10, 2024
c9a9bc1
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 10, 2024
9c000d7
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 11, 2024
92eb7a9
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 18, 2024
ac481d0
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 18, 2024
084c96e
Merge branch 'master' into HDDS-10517
smitajoshi12 Jul 18, 2024
d822239
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 18, 2024
eae8651
Merge branch 'master' into HDDS-10517
smitajoshi12 Jul 19, 2024
8b82426
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Jul 31, 2024
3e08fb7
HDDS-10517. Recon - Add a UI component for showing DN decommissioning…
smitajoshi12 Aug 5, 2024
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 @@ -94,7 +94,7 @@
},
{
"hostname": "localhost1.storage.enterprise.com",
"uuid": "b5907812-a5f2-11ea-bb37-0242ac130011",
"uuid": "4712ba3d-4bb2-477a-9211-d9b50c013055",
"state": "HEALTHY",
"opState": "DECOMMISSIONING",
"lastHeartbeat": 1574724876059,
Expand Down Expand Up @@ -162,7 +162,7 @@
},
{
"hostname": "localhost3.storage.enterprise.com",
"uuid": "b5907812-a5f2-11ea-bb37-0242ac130013",
"uuid": "4712ba3d-4bb2-477a-9211-d9b50c013056",
"state": "HEALTHY",
"opState": "ENTERING_MAINTENANCE",
"lastHeartbeat": 1574724876059,
Expand Down Expand Up @@ -6738,6 +6738,201 @@
],
"status": "OK"
},
"decommissioninfo": {
"DatanodesDecommissionInfo":[
{
"datanodeDetails": {
"level": 3,
"parent": null,
"cost": 0,
"uuid": "4712ba3d-4bb2-477a-9211-d9b50c013055",
"uuidString": "4712ba3d-4bb2-477a-9211-d9b50c013055",
"ipAddress": "172.18.0.13",
"hostName": "ozone-ha-datanode-6.ozone-ha_default",

"certSerialId": null,
"version": null,
"setupTime": 0,
"revision": null,
"buildDate": null,
"persistedOpState": "IN_SERVICE",
"persistedOpStateExpiryEpochSec": 0,
"initialVersion": 0,
"currentVersion": 1,
"decommissioned": false,
"maintenance": false,
"ipAddressAsByteString": {
"string": "172.18.0.13",
"bytes": {
"validUtf8": true,
"empty": false
}
},
"hostNameAsByteString": {
"string": "ozone-ha-datanode-6.ozone-ha_default",
"bytes": {
"validUtf8": true,
"empty": false
}
},
"networkName": "4712ba3d-4bb2-477a-9211-d9b50c013055",
"networkLocation": "/default-rack",
"networkFullPath": "/default-rack/4712ba3d-4bb2-477a-9211-d9b50c013055",
"numOfLeaves": 1,
"networkNameAsByteString": {
"string": "4712ba3d-4bb2-477a-9211-d9b50c013055",
"bytes": {
"validUtf8": true,
"empty": false
}
},
"networkLocationAsByteString": {
"string": "/default-rack",
"bytes": {
"validUtf8": true,
"empty": false
}
}
},
"metrics": null,
"containers": {}
},
{
"datanodeDetails": {
"level": 3,
"parent": null,
"cost": 0,
"uuid": "4712ba3d-4bb2-477a-9211-d9b50c013056",
"uuidString": "4712ba3d-4bb2-477a-9211-d9b50c013056",
"ipAddress": "172.18.0.13",
"hostName": "ozone-ha-datanode-6.ozone-ha_default",
"certSerialId": null,
"version": null,
"setupTime": 0,
"revision": null,
"buildDate": null,
"persistedOpState": "IN_SERVICE",
"persistedOpStateExpiryEpochSec": 0,
"initialVersion": 0,
"currentVersion": 1,
"decommissioned": false,
"maintenance": false,
"networkName": "4712ba3d-4bb2-477a-9211-d9b50c013055",
"networkLocation": "/default-rack",
"networkFullPath": "/default-rack/4712ba3d-4bb2-477a-9211-d9b50c013055",
"numOfLeaves": 1
},
"metrics": null,
"containers": {}
}
]
},
"DatanodesDecommissionInfo": {
"DatanodesDecommissionInfo": [
{
"datanodeDetails": {
"level": 3,
"parent": null,
"cost": 0,
"uuid": "adc72ef9-0850-49d7-935d-e5a4e0d5be3c",
"uuidString": "adc72ef9-0850-49d7-935d-e5a4e0d5be3c",
"ipAddress": "172.18.0.10",
"hostName": "ozone-ha-datanode-2.ozone-ha_default",
"ports": [
{
"name": "HTTP",
"value": 9882
},
{
"name": "CLIENT_RPC",
"value": 19864
},
{
"name": "REPLICATION",
"value": 9886
},
{
"name": "RATIS",
"value": 9858
},
{
"name": "RATIS_ADMIN",
"value": 9857
},
{
"name": "RATIS_SERVER",
"value": 9856
},
{
"name": "RATIS_DATASTREAM",
"value": 9855
},
{
"name": "STANDALONE",
"value": 9859
}
],
"certSerialId": null,
"version": null,
"setupTime": 0,
"revision": null,
"buildDate": null,
"persistedOpState": "DECOMMISSIONING",
"persistedOpStateExpiryEpochSec": 0,
"initialVersion": 0,
"currentVersion": 1,
"decommissioned": true,
"maintenance": false,
"ipAddressAsByteString": {
"string": "172.18.0.10",
"bytes": {
"validUtf8": true,
"empty": false
}
},
"hostNameAsByteString": {
"string": "ozone-ha-datanode-2.ozone-ha_default",
"bytes": {
"validUtf8": true,
"empty": false
}
},
"networkName": "adc72ef9-0850-49d7-935d-e5a4e0d5be3c",
"networkLocation": "/default-rack",
"networkFullPath": "/default-rack/adc72ef9-0850-49d7-935d-e5a4e0d5be3c",
"numOfLeaves": 1,
"networkNameAsByteString": {
"string": "adc72ef9-0850-49d7-935d-e5a4e0d5be3c",
"bytes": {
"validUtf8": true,
"empty": false
}
},
"networkLocationAsByteString": {
"string": "/default-rack",
"bytes": {
"validUtf8": true,
"empty": false
}
}
},
"metrics": {
"decommissionStartTime": "23/05/2024 07:28:35 UTC",
"numOfUnclosedPipelines": 2,
"numOfUnderReplicatedContainers": 0.0,
"numOfUnclosedContainers": 0.0
},
"containers": {
"UnderReplicated": [],
"UnClosed": [
"#6",
"#10",
"#17"
]
}
}
]
},
"datanodesRemove": {
"selectedRowKeys": [
"b5907812-a5f2-11ea-bb37-0242ac130011"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,7 @@

"/containers/mismatch/deleted?limit=*": "/deleted",
"/keys/deletePending/dirs?limit=*": "/dirdeletePending",
"/datanodes/decommission/info": "/decommissioninfo",
"/datanodes/decommission/info/datanode?uuid=*": "/DatanodesDecommissionInfo",
"/datanodes/remove": "/datanodesRemove"
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ import { ColumnSearch } from '@/utils/columnSearch';
import { ReplicationIcon } from '@/utils/themeIcons';
import { AutoReloadHelper } from '@/utils/autoReloadHelper';
import { AxiosGetHelper, AxiosPutHelper } from '@/utils/axiosRequestHelper';
import DecommissionSummary from './decommissionSummary';

import './datanodes.less';


interface IDatanodeResponse {
hostname: string;
state: DatanodeState;
Expand Down Expand Up @@ -190,15 +190,21 @@ const COLUMNS = [
render: (text: DatanodeOpState) => renderDatanodeOpState(text),
sorter: (a: IDatanode, b: IDatanode) => a.opState.localeCompare(b.opState)
},

{
title: 'Uuid',
dataIndex: 'uuid',
key: 'uuid',
isVisible: true,
isSearchable: true,
sorter: (a: IDatanode, b: IDatanode) => a.uuid.localeCompare(b.uuid),
defaultSortOrder: 'ascend' as const
defaultSortOrder: 'ascend' as const,
render: (uuid: IDatanode, record: IDatanode) => {
return (
//1. Compare Decommission Api's UUID with all UUID in table and show Decommission Summary
(decommissionUids && decommissionUids.includes(record.uuid) && record.opState !== 'DECOMMISSIONED') ?
smitajoshi12 marked this conversation as resolved.
Show resolved Hide resolved
<DecommissionSummary uuid={uuid} record={record} /> : <span>{uuid}</span>
);
}
},
{
title: 'Storage Capacity',
Expand Down Expand Up @@ -356,6 +362,9 @@ const defaultColumns: IOption[] = COLUMNS.map(column => ({
}));

let cancelSignal: AbortController;
let cancelDecommissionSignal: AbortController;
let decommissionUids: string | string[] =[];
const COLUMN_UPDATE_DECOMMISSIONING = 'DECOMMISSIONING';

export class Datanodes extends React.Component<Record<string, object>, IDatanodesState> {
autoReload: AutoReloadHelper;
Expand Down Expand Up @@ -389,24 +398,39 @@ export class Datanodes extends React.Component<Record<string, object>, IDatanode
return selectedColumns;
};

_loadData = () => {
this.setState(prevState => ({
loading: true,
selectedColumns: this._getSelectedColumns(prevState.selectedColumns)
}));
_loadData = async () => {
// Need to call decommission API on each interval to get updated status before datanode API to compare UUID's
// update Operation State Column in table Manually before rendering
let decommissionAPIRequest = this._loadDecommisionAPI();
smitajoshi12 marked this conversation as resolved.
Show resolved Hide resolved

const { request, controller } = AxiosGetHelper('/api/v1/datanodes', cancelSignal);
cancelSignal = controller;
request.then(response => {
await decommissionAPIRequest.then(decommissionResponse => {
decommissionUids = decommissionResponse && decommissionResponse.data &&
decommissionResponse.data.DatanodesDecommissionInfo &&
decommissionResponse.data.DatanodesDecommissionInfo.map((item: { datanodeDetails: { uuid: any; }; }) => item.datanodeDetails.uuid);
this.setState({
loading: false
});
}).catch(error => {
this.setState({
loading: false
});
decommissionUids = [];
showDataFetchError(error.toString());
});

// Call Datanode API Synchronously after completing Decommission API to render Operation Status Column
let datanodeApiRequest = this._loadDataNodeAPI();
await datanodeApiRequest.then(response => {
const datanodesResponse: IDatanodesResponse = response.data;
const totalCount = datanodesResponse.totalCount;
const datanodes: IDatanodeResponse[] = datanodesResponse.datanodes;
const dataSource: IDatanode[] = datanodes && datanodes.map(datanode => {
let decommissionCondition = decommissionUids && decommissionUids.includes(datanode.uuid) && datanode.opState !== 'DECOMMISSIONED';
return {
hostname: datanode.hostname,
uuid: datanode.uuid,
state: datanode.state,
opState: datanode.opState,
opState: decommissionCondition ? COLUMN_UPDATE_DECOMMISSIONING : datanode.opState,
lastHeartbeat: datanode.lastHeartbeat,
storageUsed: datanode.storageReport.used,
storageTotal: datanode.storageReport.capacity,
Expand Down Expand Up @@ -434,8 +458,31 @@ export class Datanodes extends React.Component<Record<string, object>, IDatanode
this.setState({
loading: false
});
decommissionUids = [];
showDataFetchError(error.toString());
});

};

_loadDecommisionAPI = async () => {
this.setState({
loading: true
});

decommissionUids = [];
const { request, controller } = await AxiosGetHelper('/api/v1/datanodes/decommission/info', cancelDecommissionSignal);
cancelDecommissionSignal = controller;
return request
};

_loadDataNodeAPI = async () => {
this.setState(prevState => ({
loading: true,
selectedColumns: this._getSelectedColumns(prevState.selectedColumns)
}));
const { request, controller } = await AxiosGetHelper('/api/v1/datanodes', cancelSignal);
cancelSignal = controller;
return request;
};

removeDatanode = async (selectedRowKeys: any) => {
Expand All @@ -462,6 +509,7 @@ export class Datanodes extends React.Component<Record<string, object>, IDatanode
componentWillUnmount(): void {
this.autoReload.stopPolling();
cancelSignal && cancelSignal.abort();
cancelDecommissionSignal && cancelDecommissionSignal.abort();
}

onShowSizeChange = (current: number, pageSize: number) => {
Expand Down
Loading