parent
cf5cba3950
commit
b0b9314a08
5 changed files with 385 additions and 5 deletions
@ -0,0 +1,4 @@ |
|||||||
|
// Unit: bytes
|
||||||
|
const NODE_AND_DR_RESERVED_MEMORY_SIZE = 8589934592; |
||||||
|
|
||||||
|
export default NODE_AND_DR_RESERVED_MEMORY_SIZE; |
@ -0,0 +1,327 @@ |
|||||||
|
import { execSync } from 'child_process'; |
||||||
|
|
||||||
|
import NODE_AND_DR_RESERVED_MEMORY_SIZE from '../../consts/NODE_AND_DR_RESERVED_MEMORY_SIZE'; |
||||||
|
import SERVER_PATHS from '../../consts/SERVER_PATHS'; |
||||||
|
|
||||||
|
import join from '../../join'; |
||||||
|
|
||||||
|
const buildQueryAnvilDetail = ({ |
||||||
|
anvilsUUID, |
||||||
|
isForProvisionServer, |
||||||
|
}: { |
||||||
|
anvilsUUID?: string[] | '*'; |
||||||
|
isForProvisionServer?: boolean; |
||||||
|
}) => { |
||||||
|
const condAnvilsUUID = join(anvilsUUID, { |
||||||
|
beforeReturn: (toReturn) => |
||||||
|
toReturn ? `WHERE anv.anvil_uuid IN (${toReturn})` : '', |
||||||
|
elementWrapper: "'", |
||||||
|
separator: ', ', |
||||||
|
}); |
||||||
|
|
||||||
|
console.log(`condAnvilsUUID=[${condAnvilsUUID}]`); |
||||||
|
|
||||||
|
const buildHostQuery = ({ |
||||||
|
isSummary = false, |
||||||
|
}: { isSummary?: boolean } = {}) => { |
||||||
|
let fieldsToSelect = ` |
||||||
|
host_uuid, |
||||||
|
host_name, |
||||||
|
scan_hardware_cpu_cores, |
||||||
|
scan_hardware_ram_total`;
|
||||||
|
let groupByPhrase = ''; |
||||||
|
|
||||||
|
if (isSummary) { |
||||||
|
fieldsToSelect = ` |
||||||
|
MIN(scan_hardware_cpu_cores) AS anvil_total_cpu_cores, |
||||||
|
MIN(scan_hardware_ram_total) AS anvil_total_memory`;
|
||||||
|
|
||||||
|
groupByPhrase = 'GROUP BY anvil_uuid'; |
||||||
|
} |
||||||
|
|
||||||
|
return ` |
||||||
|
SELECT |
||||||
|
anvil_uuid, |
||||||
|
${fieldsToSelect} |
||||||
|
FROM anvils AS anv |
||||||
|
JOIN hosts AS hos |
||||||
|
ON host_uuid IN ( |
||||||
|
anvil_node1_host_uuid, |
||||||
|
anvil_node2_host_uuid, |
||||||
|
anvil_dr1_host_uuid |
||||||
|
) |
||||||
|
JOIN scan_hardware AS sca_har |
||||||
|
ON host_uuid = scan_hardware_host_uuid |
||||||
|
${groupByPhrase}`;
|
||||||
|
}; |
||||||
|
|
||||||
|
const buildServerQuery = ({ |
||||||
|
isSummary = false, |
||||||
|
}: { isSummary?: boolean } = {}) => { |
||||||
|
let fieldsToSelect = ` |
||||||
|
server_uuid, |
||||||
|
server_name, |
||||||
|
server_cpu_cores, |
||||||
|
server_memory`;
|
||||||
|
let groupByPhrase = ''; |
||||||
|
|
||||||
|
if (isSummary) { |
||||||
|
fieldsToSelect = ` |
||||||
|
SUM(server_cpu_cores) AS anvil_total_allocated_cpu_cores, |
||||||
|
SUM(server_memory) AS anvil_total_allocated_memory`;
|
||||||
|
|
||||||
|
groupByPhrase = 'GROUP BY server_anvil_uuid'; |
||||||
|
} |
||||||
|
|
||||||
|
return ` |
||||||
|
SELECT |
||||||
|
server_anvil_uuid, |
||||||
|
${fieldsToSelect} |
||||||
|
FROM servers AS ser |
||||||
|
JOIN ( |
||||||
|
SELECT |
||||||
|
server_definition_server_uuid, |
||||||
|
server_cpu_cores, |
||||||
|
CASE server_memory_unit |
||||||
|
WHEN 'KiB' THEN server_memory_value * 1024 |
||||||
|
ELSE server_memory_value |
||||||
|
END AS server_memory |
||||||
|
FROM ( |
||||||
|
SELECT |
||||||
|
server_definition_server_uuid, |
||||||
|
CAST( |
||||||
|
SUBSTRING( |
||||||
|
server_definition_xml, '%cores=''#"[0-9]+#"''%', '#' |
||||||
|
) AS INTEGER |
||||||
|
) AS server_cpu_cores, |
||||||
|
CAST( |
||||||
|
SUBSTRING( |
||||||
|
server_definition_xml, '%memory%>#"[0-9]+#"</memory%', '#' |
||||||
|
) AS BIGINT |
||||||
|
) AS server_memory_value, |
||||||
|
SUBSTRING( |
||||||
|
server_definition_xml, '%memory%unit=''#"[A-Za-z]+#"''%', '#' |
||||||
|
) AS server_memory_unit |
||||||
|
FROM server_definitions AS ser_def |
||||||
|
) AS ser_def_memory_converted |
||||||
|
) AS pos_ser_def |
||||||
|
ON server_uuid = server_definition_server_uuid |
||||||
|
${groupByPhrase}`;
|
||||||
|
}; |
||||||
|
|
||||||
|
const buildStorageGroupQuery = () => ` |
||||||
|
SELECT |
||||||
|
storage_group_anvil_uuid, |
||||||
|
storage_group_uuid, |
||||||
|
storage_group_name, |
||||||
|
MIN(scan_lvm_vg_size) AS storage_group_size, |
||||||
|
MIN(scan_lvm_vg_free) AS storage_group_free |
||||||
|
FROM storage_groups AS sto_gro |
||||||
|
JOIN storage_group_members AS sto_gro_mem |
||||||
|
ON storage_group_uuid = storage_group_member_storage_group_uuid |
||||||
|
JOIN scan_lvm_vgs AS sca_lvm_vgs |
||||||
|
ON storage_group_member_vg_uuid = scan_lvm_vg_internal_uuid |
||||||
|
GROUP BY |
||||||
|
storage_group_anvil_uuid, |
||||||
|
storage_group_uuid, |
||||||
|
storage_group_name`;
|
||||||
|
|
||||||
|
const buildFileQuery = () => ` |
||||||
|
SELECT |
||||||
|
file_location_anvil_uuid, |
||||||
|
file_uuid, |
||||||
|
file_name |
||||||
|
FROM file_locations as fil_loc |
||||||
|
JOIN files as fil |
||||||
|
ON file_location_file_uuid = file_uuid |
||||||
|
WHERE |
||||||
|
file_type = 'iso' |
||||||
|
AND file_location_active = 't'`;
|
||||||
|
|
||||||
|
const buildQueryForProvisionServer = () => ` |
||||||
|
SELECT |
||||||
|
anv.anvil_uuid, |
||||||
|
anv.anvil_name, |
||||||
|
host_list.host_uuid, |
||||||
|
host_list.host_name, |
||||||
|
host_list.scan_hardware_cpu_cores, |
||||||
|
host_list.scan_hardware_ram_total, |
||||||
|
host_summary.anvil_total_cpu_cores, |
||||||
|
host_summary.anvil_total_memory, |
||||||
|
server_list.server_uuid, |
||||||
|
server_list.server_name, |
||||||
|
server_list.server_cpu_cores, |
||||||
|
server_list.server_memory, |
||||||
|
server_summary.anvil_total_allocated_cpu_cores, |
||||||
|
server_summary.anvil_total_allocated_memory, |
||||||
|
(host_summary.anvil_total_cpu_cores |
||||||
|
- server_summary.anvil_total_allocated_cpu_cores |
||||||
|
) AS anvil_total_available_cpu_cores, |
||||||
|
(host_summary.anvil_total_memory |
||||||
|
- server_summary.anvil_total_allocated_memory |
||||||
|
- ${NODE_AND_DR_RESERVED_MEMORY_SIZE} |
||||||
|
) AS anvil_total_available_memory, |
||||||
|
storage_group_list.storage_group_uuid, |
||||||
|
storage_group_list.storage_group_name, |
||||||
|
storage_group_list.storage_group_size, |
||||||
|
storage_group_list.storage_group_free, |
||||||
|
file_list.file_uuid, |
||||||
|
file_list.file_name |
||||||
|
FROM anvils AS anv |
||||||
|
JOIN (${buildHostQuery()}) AS host_list |
||||||
|
ON anv.anvil_uuid = host_list.anvil_uuid |
||||||
|
JOIN (${buildHostQuery({ isSummary: true })}) AS host_summary |
||||||
|
ON anv.anvil_uuid = host_summary.anvil_uuid |
||||||
|
LEFT JOIN (${buildServerQuery()}) AS server_list |
||||||
|
ON anv.anvil_uuid = server_list.server_anvil_uuid |
||||||
|
LEFT JOIN (${buildServerQuery({ isSummary: true })}) AS server_summary |
||||||
|
ON anv.anvil_uuid = server_summary.server_anvil_uuid |
||||||
|
LEFT JOIN (${buildStorageGroupQuery()}) AS storage_group_list |
||||||
|
ON anv.anvil_uuid = storage_group_list.storage_group_anvil_uuid |
||||||
|
LEFT JOIN (${buildFileQuery()}) AS file_list |
||||||
|
ON anv.anvil_uuid = file_list.file_location_anvil_uuid |
||||||
|
;`;
|
||||||
|
|
||||||
|
let query = ` |
||||||
|
SELECT |
||||||
|
* |
||||||
|
FROM anvils AS anv |
||||||
|
${condAnvilsUUID} |
||||||
|
;`;
|
||||||
|
let afterQueryReturn = undefined; |
||||||
|
|
||||||
|
if (isForProvisionServer) { |
||||||
|
query = buildQueryForProvisionServer(); |
||||||
|
|
||||||
|
afterQueryReturn = (queryStdout: unknown) => { |
||||||
|
let results = queryStdout; |
||||||
|
|
||||||
|
if (queryStdout instanceof Array) { |
||||||
|
let rowStage: AnvilDetailForProvisionServer | undefined; |
||||||
|
|
||||||
|
const anvils = queryStdout.reduce<AnvilDetailForProvisionServer[]>( |
||||||
|
( |
||||||
|
reducedRows, |
||||||
|
[ |
||||||
|
anvilUUID, |
||||||
|
anvilName, |
||||||
|
hostUUID, |
||||||
|
hostName, |
||||||
|
hostCPUCores, |
||||||
|
hostMemory, |
||||||
|
anvilTotalCPUCores, |
||||||
|
anvilTotalMemory, |
||||||
|
serverUUID, |
||||||
|
serverName, |
||||||
|
serverCPUCores, |
||||||
|
serverMemory, |
||||||
|
anvilTotalAllocatedCPUCores, |
||||||
|
anvilTotalAllocatedMemory, |
||||||
|
anvilTotalAvailableCPUCores, |
||||||
|
anvilTotalAvailableMemory, |
||||||
|
storageGroupUUID, |
||||||
|
storageGroupName, |
||||||
|
storageGroupSize, |
||||||
|
storageGroupFree, |
||||||
|
fileUUID, |
||||||
|
fileName, |
||||||
|
], |
||||||
|
) => { |
||||||
|
if (!rowStage || anvilUUID !== rowStage.anvilUUID) { |
||||||
|
rowStage = { |
||||||
|
anvilUUID, |
||||||
|
anvilName, |
||||||
|
anvilTotalCPUCores: parseInt(anvilTotalCPUCores), |
||||||
|
anvilTotalMemory: String(anvilTotalMemory), |
||||||
|
anvilTotalAllocatedCPUCores: parseInt( |
||||||
|
anvilTotalAllocatedCPUCores, |
||||||
|
), |
||||||
|
anvilTotalAllocatedMemory: String(anvilTotalAllocatedMemory), |
||||||
|
anvilTotalAvailableCPUCores: parseInt( |
||||||
|
anvilTotalAvailableCPUCores, |
||||||
|
), |
||||||
|
anvilTotalAvailableMemory: String(anvilTotalAvailableMemory), |
||||||
|
hosts: [], |
||||||
|
servers: [], |
||||||
|
storageGroups: [], |
||||||
|
files: [], |
||||||
|
}; |
||||||
|
|
||||||
|
reducedRows.push(rowStage); |
||||||
|
} |
||||||
|
|
||||||
|
if ( |
||||||
|
!rowStage.hosts.find(({ hostUUID: added }) => added === hostUUID) |
||||||
|
) { |
||||||
|
rowStage.hosts.push({ |
||||||
|
hostUUID, |
||||||
|
hostName, |
||||||
|
hostCPUCores: parseInt(hostCPUCores), |
||||||
|
hostMemory: String(hostMemory), |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
if ( |
||||||
|
!rowStage.servers.find( |
||||||
|
({ serverUUID: added }) => added === serverUUID, |
||||||
|
) |
||||||
|
) { |
||||||
|
rowStage.servers.push({ |
||||||
|
serverUUID, |
||||||
|
serverName, |
||||||
|
serverCPUCores: parseInt(serverCPUCores), |
||||||
|
serverMemory: String(serverMemory), |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
if ( |
||||||
|
!rowStage.storageGroups.find( |
||||||
|
({ storageGroupUUID: added }) => added === storageGroupUUID, |
||||||
|
) |
||||||
|
) { |
||||||
|
rowStage.storageGroups.push({ |
||||||
|
storageGroupUUID, |
||||||
|
storageGroupName, |
||||||
|
storageGroupSize: String(storageGroupSize), |
||||||
|
storageGroupFree: String(storageGroupFree), |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
if ( |
||||||
|
!rowStage.files.find(({ fileUUID: added }) => added === fileUUID) |
||||||
|
) { |
||||||
|
rowStage.files.push({ |
||||||
|
fileUUID, |
||||||
|
fileName, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
return reducedRows; |
||||||
|
}, |
||||||
|
[], |
||||||
|
); |
||||||
|
|
||||||
|
const osList = execSync( |
||||||
|
`${SERVER_PATHS.usr.sbin['striker-parse-os-list'].self} | ${SERVER_PATHS.usr.bin['sed'].self} -E 's/^.*name="([^"]+).*CDATA[[]([^]]+).*$/\\1,\\2/'`, |
||||||
|
{ encoding: 'utf-8', timeout: 10000 }, |
||||||
|
).split('\n'); |
||||||
|
|
||||||
|
osList.pop(); |
||||||
|
|
||||||
|
results = { |
||||||
|
anvils, |
||||||
|
osList, |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
return results; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
return { |
||||||
|
query, |
||||||
|
afterQueryReturn, |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
export default buildQueryAnvilDetail; |
@ -0,0 +1,32 @@ |
|||||||
|
type AnvilDetailForProvisionServer = { |
||||||
|
anvilUUID: string; |
||||||
|
anvilName: string; |
||||||
|
hosts: Array<{ |
||||||
|
hostUUID: string; |
||||||
|
hostName: string; |
||||||
|
hostCPUCores: number; |
||||||
|
hostMemory: string; |
||||||
|
}>; |
||||||
|
anvilTotalCPUCores: number; |
||||||
|
anvilTotalMemory: string; |
||||||
|
servers: Array<{ |
||||||
|
serverUUID: string; |
||||||
|
serverName: string; |
||||||
|
serverCPUCores: number; |
||||||
|
serverMemory: string; |
||||||
|
}>; |
||||||
|
anvilTotalAllocatedCPUCores: number; |
||||||
|
anvilTotalAllocatedMemory: string; |
||||||
|
anvilTotalAvailableCPUCores: number; |
||||||
|
anvilTotalAvailableMemory: string; |
||||||
|
storageGroups: Array<{ |
||||||
|
storageGroupUUID: string; |
||||||
|
storageGroupName: string; |
||||||
|
storageGroupSize: string; |
||||||
|
storageGroupFree: string; |
||||||
|
}>; |
||||||
|
files: Array<{ |
||||||
|
fileUUID: string; |
||||||
|
fileName: string; |
||||||
|
}>; |
||||||
|
}; |
Loading…
Reference in new issue