summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js
blob: a1ca74266845e6d4c4c1f9a1cd3f1e8e52d20ec9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import React from 'react'
import PropTypes from 'prop-types'
import { useSelector } from 'react-redux'
import RackFillBar from './elements/RackFillBar'

function RackSpaceFillContainer({ rackId, ...props }) {
    const fillFraction = useSelector((state) => {
        const rack = state.topology.racks[rackId]
        if (!rack) {
            return 0
        }

        const { machines, cpus, gpus, memories, storages } = state.topology
        let energyConsumptionTotal = 0

        for (const machineId of rack.machines) {
            if (!machineId) {
                continue
            }
            const machine = machines[machineId]
            machine.cpus.forEach((id) => (energyConsumptionTotal += cpus[id].energyConsumptionW))
            machine.gpus.forEach((id) => (energyConsumptionTotal += gpus[id].energyConsumptionW))
            machine.memories.forEach((id) => (energyConsumptionTotal += memories[id].energyConsumptionW))
            machine.storages.forEach((id) => (energyConsumptionTotal += storages[id].energyConsumptionW))
        }

        return Math.min(1, energyConsumptionTotal / rack.powerCapacityW)
    })
    return <RackFillBar {...props} type="energy" fillFraction={fillFraction} />
}

RackSpaceFillContainer.propTypes = {
    rackId: PropTypes.string.isRequired,
}

export default RackSpaceFillContainer