fix(striker-ui-api): add get all anvil node pair summary

main
Tsu-ba-me 2 years ago
parent 3fd611eebb
commit 993c2350e5
  1. 108
      striker-ui-api/src/lib/request_handlers/anvil/buildAnvilSummary.ts
  2. 26
      striker-ui-api/src/lib/request_handlers/anvil/getAnvil.ts
  3. 97
      striker-ui-api/src/lib/request_handlers/anvil/getAnvilDetail.ts
  4. 33
      striker-ui-api/src/lib/request_handlers/anvil/getAnvilSummary.ts
  5. 1
      striker-ui-api/src/lib/request_handlers/anvil/index.ts
  6. 2
      striker-ui-api/src/routes/anvil.ts
  7. 9
      striker-ui-api/src/types/ApiAn.d.ts
  8. 3
      striker-ui-api/src/types/GetAnvilDataFunction.d.ts

@ -0,0 +1,108 @@
import assert from 'assert';
import { query } from '../../accessModule';
import { stderr } from '../../shell';
const buildHostStateMessage = (postfix = 2) => `message_022${postfix}`;
export const buildAnvilSummary = async ({
anvils,
anvilUuid,
hosts,
}: {
anvils: AnvilDataAnvilListHash;
anvilUuid: string;
hosts: AnvilDataHostListHash;
}) => {
const {
anvil_uuid: { [anvilUuid]: ainfo },
} = anvils;
if (!ainfo)
throw new Error(`Anvil information not found with UUID ${anvilUuid}`);
const {
anvil_name: aname,
anvil_node1_host_uuid: n1uuid,
anvil_node2_host_uuid: n2uuid,
} = ainfo;
const result: AnvilDetailSummary = {
anvil_name: aname,
anvil_state: 'optimal',
anvil_uuid: anvilUuid,
hosts: [],
};
for (const huuid of [n1uuid, n2uuid]) {
const {
host_uuid: {
[huuid]: { host_status: hstatus, short_host_name: hname },
},
} = hosts;
const { hosts: rhosts } = result;
const hsummary: AnvilDetailHostSummary = {
host_name: hname,
host_uuid: huuid,
maintenance_mode: false,
state: 'offline',
state_message: buildHostStateMessage(),
state_percent: 0,
};
rhosts.push(hsummary);
if (hstatus !== 'online') continue;
let rows: [
inCcm: NumberBoolean,
crmdMember: NumberBoolean,
clusterMember: NumberBoolean,
maintenanceMode: NumberBoolean,
][];
try {
rows = await query(`SELECT
scan_cluster_node_in_ccm,
scan_cluster_node_crmd_member,
scan_cluster_node_cluster_member,
scan_cluster_node_maintenance_mode
FROM
scan_cluster_nodes
WHERE
scan_cluster_node_host_uuid = '${huuid}';`);
assert.ok(rows.length, 'No node cluster info');
} catch (error) {
stderr(`Failed to get node ${huuid} cluster status; CAUSE: ${error}`);
continue;
}
const [[ccm, crmd, cluster, maintenance]] = rows;
hsummary.maintenance_mode = Boolean(maintenance);
if (cluster) {
hsummary.state = 'online';
hsummary.state_message = buildHostStateMessage(3);
hsummary.state_percent = 100;
} else if (crmd) {
hsummary.state = 'crmd';
hsummary.state_message = buildHostStateMessage(4);
hsummary.state_percent = 75;
} else if (ccm) {
hsummary.state = 'in_ccm';
hsummary.state_message = buildHostStateMessage(5);
hsummary.state_percent = 50;
} else {
hsummary.state = 'booted';
hsummary.state_message = buildHostStateMessage(6);
hsummary.state_percent = 25;
}
}
return result;
};

@ -9,19 +9,19 @@ export const getAnvil: RequestHandler = buildGetRequestHandler(
const { anvilUUIDs, isForProvisionServer } = request.query; const { anvilUUIDs, isForProvisionServer } = request.query;
let query = ` let query = `
SELECT SELECT
anv.anvil_name, anv.anvil_name,
anv.anvil_uuid, anv.anvil_uuid,
hos.host_name, hos.host_name,
hos.host_uuid hos.host_uuid
FROM anvils AS anv FROM anvils AS anv
JOIN hosts AS hos JOIN hosts AS hos
ON hos.host_uuid IN ( ON hos.host_uuid IN (
anv.anvil_node1_host_uuid, anv.anvil_node1_host_uuid,
anv.anvil_node2_host_uuid, anv.anvil_node2_host_uuid,
anv.anvil_dr1_host_uuid anv.anvil_dr1_host_uuid
) )
ORDER BY anv.anvil_uuid;`; ORDER BY anv.anvil_uuid;`;
if (buildQueryOptions) { if (buildQueryOptions) {
buildQueryOptions.afterQueryReturn = (queryStdout) => { buildQueryOptions.afterQueryReturn = (queryStdout) => {

@ -1,14 +1,12 @@
import assert from 'assert';
import { RequestHandler } from 'express'; import { RequestHandler } from 'express';
import { getAnvilData, getHostData, query } from '../../accessModule'; import { getAnvilData, getHostData } from '../../accessModule';
import { stderr } from '../../shell'; import { stderr } from '../../shell';
import { buildAnvilSummary } from './buildAnvilSummary';
const buildHostStateMessage = (postfix = 2) => `message_022${postfix}`;
export const getAnvilDetail: RequestHandler< export const getAnvilDetail: RequestHandler<
AnvilDetailParamsDictionary, AnvilDetailParamsDictionary,
AnvilDetail, AnvilDetailSummary,
undefined undefined
> = async (request, response) => { > = async (request, response) => {
const { const {
@ -27,85 +25,20 @@ export const getAnvilDetail: RequestHandler<
return response.status(500).send(); return response.status(500).send();
} }
const { let result: AnvilDetailSummary;
anvil_uuid: {
[anvilUuid]: {
anvil_node1_host_uuid: n1uuid,
anvil_node2_host_uuid: n2uuid,
},
},
} = anvils;
const result: AnvilDetail = { anvil_state: 'optimal', hosts: [] };
for (const huuid of [n1uuid, n2uuid]) {
const {
host_uuid: {
[huuid]: { host_status: hstatus, short_host_name: hname },
},
} = hosts;
const { hosts: rhosts } = result;
const hsummary: AnvilDetailHostSummary = {
host_name: hname,
host_uuid: huuid,
maintenance_mode: false,
state: 'offline',
state_message: buildHostStateMessage(),
state_percent: 0,
};
rhosts.push(hsummary);
if (hstatus !== 'online') continue;
let rows: [ try {
inCcm: NumberBoolean, result = await buildAnvilSummary({
crmdMember: NumberBoolean, anvils,
clusterMember: NumberBoolean, anvilUuid,
maintenanceMode: NumberBoolean, hosts,
][]; });
} catch (error) {
try { stderr(
rows = await query(`SELECT `Failed to get summary of anvil node pair ${anvilUuid}; CAUSE: ${error}`,
scan_cluster_node_in_ccm, );
scan_cluster_node_crmd_member,
scan_cluster_node_cluster_member,
scan_cluster_node_maintenance_mode
FROM
scan_cluster_nodes
WHERE
scan_cluster_node_host_uuid = '${huuid}';`);
assert.ok(rows.length, 'No node cluster info');
} catch (error) {
stderr(`Failed to get node ${huuid} cluster status; CAUSE: ${error}`);
continue;
}
const [[ccm, crmd, cluster, maintenance]] = rows;
hsummary.maintenance_mode = Boolean(maintenance);
if (cluster) { return response.status(500).send();
hsummary.state = 'online';
hsummary.state_message = buildHostStateMessage(3);
hsummary.state_percent = 100;
} else if (crmd) {
hsummary.state = 'crmd';
hsummary.state_message = buildHostStateMessage(4);
hsummary.state_percent = 75;
} else if (ccm) {
hsummary.state = 'in_ccm';
hsummary.state_message = buildHostStateMessage(5);
hsummary.state_percent = 50;
} else {
hsummary.state = 'booted';
hsummary.state_message = buildHostStateMessage(6);
hsummary.state_percent = 25;
}
} }
response.status(200).send(result); response.status(200).send(result);

@ -0,0 +1,33 @@
import { RequestHandler } from 'express';
import { getAnvilData, getHostData } from '../../accessModule';
import { buildAnvilSummary } from './buildAnvilSummary';
import { stderr } from '../../shell';
export const getAnvilSummary: RequestHandler<unknown, AnvilSummary> = async (
request,
response,
) => {
let anvils: AnvilDataAnvilListHash;
let hosts: AnvilDataHostListHash;
try {
anvils = await getAnvilData();
hosts = await getHostData();
} catch (error) {
stderr(`Failed to get anvil and/or host data; CAUSE: ${error}`);
return response.status(500).send();
}
const { anvil_uuid: alist } = anvils;
const result: AnvilSummary = { anvils: [] };
for (const auuid of Object.keys(alist)) {
result.anvils.push(
await buildAnvilSummary({ anvils, anvilUuid: auuid, hosts }),
);
}
response.json(result);
};

@ -4,3 +4,4 @@ export * from './getAnvilDetail';
export * from './getAnvilMemory'; export * from './getAnvilMemory';
export * from './getAnvilNetwork'; export * from './getAnvilNetwork';
export * from './getAnvilStore'; export * from './getAnvilStore';
export * from './getAnvilSummary';

@ -3,6 +3,7 @@ import express from 'express';
import { import {
getAnvil, getAnvil,
getAnvilCpu, getAnvilCpu,
getAnvilSummary,
getAnvilDetail, getAnvilDetail,
getAnvilMemory, getAnvilMemory,
getAnvilNetwork, getAnvilNetwork,
@ -13,6 +14,7 @@ const router = express.Router();
router router
.get('/', getAnvil) .get('/', getAnvil)
.get('/summary', getAnvilSummary)
.get('/:anvilUuid/cpu', getAnvilCpu) .get('/:anvilUuid/cpu', getAnvilCpu)
.get('/:anvilUuid/memory', getAnvilMemory) .get('/:anvilUuid/memory', getAnvilMemory)
.get('/:anvilUuid/network', getAnvilNetwork) .get('/:anvilUuid/network', getAnvilNetwork)

@ -71,11 +71,18 @@ type AnvilDetailHostSummary = {
state_percent: number; state_percent: number;
}; };
type AnvilDetail = { type AnvilDetailSummary = {
anvil_name: string;
anvil_state: string; anvil_state: string;
anvil_uuid: string;
hosts: AnvilDetailHostSummary[]; hosts: AnvilDetailHostSummary[];
}; };
/**
* @deprecated
*/
type AnvilSummary = { anvils: AnvilDetailSummary[] };
type AnvilDetailForProvisionServer = { type AnvilDetailForProvisionServer = {
anvilDescription: string; anvilDescription: string;
anvilName: string; anvilName: string;

@ -7,9 +7,10 @@ type AnvilDataAnvilListHash = {
[uuid: string]: { [uuid: string]: {
anvil_description: string; anvil_description: string;
anvil_dr1_host_uuid?: string; anvil_dr1_host_uuid?: string;
anvil_name: string;
anvil_node1_host_uuid: string; anvil_node1_host_uuid: string;
anvil_node2_host_uuid: string; anvil_node2_host_uuid: string;
query_time: number; modified_date: string;
}; };
}; };
host_uuid: { host_uuid: {

Loading…
Cancel
Save