Fix: TrueNAS Core support for pool stats (#3206)

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
pull/3221/head
rgon10 2 months ago committed by GitHub
parent 268d8efa0e
commit 4e69ea6088
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -11,6 +11,8 @@ To create an API Key, follow [the official TrueNAS documentation](https://www.tr
A detailed pool listing is disabled by default, but can be enabled with the `enablePools` option. A detailed pool listing is disabled by default, but can be enabled with the `enablePools` option.
To use the `enablePools` option with TrueNAS Core, the `nasType` parameter is required.
```yaml ```yaml
widget: widget:
type: truenas type: truenas
@ -19,4 +21,5 @@ widget:
password: pass # not required if using api key password: pass # not required if using api key
key: yourtruenasapikey # not required if using username / password key: yourtruenasapikey # not required if using username / password
enablePools: true # optional, defaults to false enablePools: true # optional, defaults to false
nasType: scale # defaults to scale, must be set to 'core' if using enablePools with TrueNAS Core
``` ```

@ -450,6 +450,7 @@ export function cleanServiceGroups(groups) {
// truenas // truenas
enablePools, enablePools,
nasType,
// unifi // unifi
site, site,
@ -522,6 +523,7 @@ export function cleanServiceGroups(groups) {
} }
if (type === "truenas") { if (type === "truenas") {
if (enablePools !== undefined) cleanedService.widget.enablePools = JSON.parse(enablePools); if (enablePools !== undefined) cleanedService.widget.enablePools = JSON.parse(enablePools);
if (nasType !== undefined) cleanedService.widget.nasType = nasType;
} }
if (["diskstation", "qnap"].includes(type)) { if (["diskstation", "qnap"].includes(type)) {
if (volume) cleanedService.widget.volume = volume; if (volume) cleanedService.widget.volume = volume;

@ -40,7 +40,15 @@ export default function Component({ service }) {
</Container> </Container>
{enablePools && {enablePools &&
poolsData.map((pool) => ( poolsData.map((pool) => (
<Pool key={pool.id} name={pool.name} healthy={pool.healthy} allocated={pool.allocated} free={pool.free} /> <Pool
key={pool.id}
name={pool.name}
healthy={pool.healthy}
allocated={pool.allocated}
free={pool.free}
data={pool.data}
nasType={widget?.nasType ?? "scale"}
/>
))} ))}
</> </>
); );

@ -1,8 +1,18 @@
import classNames from "classnames"; import classNames from "classnames";
import prettyBytes from "pretty-bytes"; import prettyBytes from "pretty-bytes";
export default function Pool({ name, free, allocated, healthy }) { export default function Pool({ name, free, allocated, healthy, data, nasType }) {
const total = free + allocated; let total = 0;
if (nasType === "scale") {
total = free + allocated;
} else {
allocated = 0; // eslint-disable-line no-param-reassign
for (let i = 0; i < data.length; i += 1) {
total += data[i].stats.size;
allocated += data[i].stats.allocated; // eslint-disable-line no-param-reassign
}
}
const usedPercent = Math.round((allocated / total) * 100); const usedPercent = Math.round((allocated / total) * 100);
const statusColor = healthy ? "bg-green-500" : "bg-yellow-500"; const statusColor = healthy ? "bg-green-500" : "bg-yellow-500";

@ -25,6 +25,7 @@ const widget = {
healthy: entry.healthy, healthy: entry.healthy,
allocated: entry.allocated, allocated: entry.allocated,
free: entry.free, free: entry.free,
data: entry.topology.data,
})), })),
}, },
}, },

Loading…
Cancel
Save