mirror of
				https://github.com/karl0ss/homepage.git
				synced 2025-11-04 08:20:58 +00:00 
			
		
		
		
	Enhancement: use datasets for truenas pools (#4716)
This commit is contained in:
		
							parent
							
								
									cc6fe63d40
								
							
						
					
					
						commit
						839f6d4baf
					
				@ -12,14 +12,15 @@ export default function Component({ service }) {
 | 
			
		||||
 | 
			
		||||
  const { data: alertData, error: alertError } = useWidgetAPI(widget, "alerts");
 | 
			
		||||
  const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
 | 
			
		||||
  const { data: poolsData, error: poolsError } = useWidgetAPI(widget, "pools");
 | 
			
		||||
  const { data: poolsData, error: poolsError } = useWidgetAPI(widget, widget?.enablePools ? "pools" : null);
 | 
			
		||||
  const { data: datasetData, error: datasetError } = useWidgetAPI(widget, widget?.enablePools ? "dataset" : null);
 | 
			
		||||
 | 
			
		||||
  if (alertError || statusError || poolsError) {
 | 
			
		||||
    const finalError = alertError ?? statusError ?? poolsError;
 | 
			
		||||
    const finalError = alertError ?? statusError ?? poolsError ?? datasetError;
 | 
			
		||||
    return <Container service={service} error={finalError} />;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!alertData || !statusData) {
 | 
			
		||||
  if (!alertData || !statusData || (widget?.enablePools && (!poolsData || !datasetData))) {
 | 
			
		||||
    return (
 | 
			
		||||
      <Container service={service}>
 | 
			
		||||
        <Block label="truenas.load" />
 | 
			
		||||
@ -29,7 +30,22 @@ export default function Component({ service }) {
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const enablePools = widget?.enablePools && Array.isArray(poolsData) && poolsData.length > 0;
 | 
			
		||||
  let pools = [];
 | 
			
		||||
  const showPools =
 | 
			
		||||
    Array.isArray(poolsData) && poolsData.length > 0 && Array.isArray(datasetData) && datasetData.length > 0;
 | 
			
		||||
 | 
			
		||||
  if (showPools) {
 | 
			
		||||
    pools = poolsData.map((pool) => {
 | 
			
		||||
      const dataset = datasetData.find((d) => d.pool === pool.name && d.name === pool.name);
 | 
			
		||||
      return {
 | 
			
		||||
        id: pool.id,
 | 
			
		||||
        name: pool.name,
 | 
			
		||||
        healthy: pool.healthy,
 | 
			
		||||
        allocated: dataset?.used.parsed ?? 0,
 | 
			
		||||
        free: dataset?.available.parsed ?? 0,
 | 
			
		||||
      };
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
@ -38,19 +54,11 @@ export default function Component({ service }) {
 | 
			
		||||
        <Block label="truenas.uptime" value={t("common.duration", { value: statusData.uptime_seconds })} />
 | 
			
		||||
        <Block label="truenas.alerts" value={t("common.number", { value: alertData.pending })} />
 | 
			
		||||
      </Container>
 | 
			
		||||
      {enablePools &&
 | 
			
		||||
        poolsData
 | 
			
		||||
      {showPools &&
 | 
			
		||||
        pools
 | 
			
		||||
          .sort((a, b) => a.name.localeCompare(b.name))
 | 
			
		||||
          .map((pool) => (
 | 
			
		||||
            <Pool
 | 
			
		||||
              key={pool.id}
 | 
			
		||||
              name={pool.name}
 | 
			
		||||
              healthy={pool.healthy}
 | 
			
		||||
              allocated={pool.allocated}
 | 
			
		||||
              free={pool.free}
 | 
			
		||||
              data={pool.data}
 | 
			
		||||
              nasType={widget?.nasType ?? "scale"}
 | 
			
		||||
            />
 | 
			
		||||
            <Pool key={pool.id} name={pool.name} healthy={pool.healthy} allocated={pool.allocated} free={pool.free} />
 | 
			
		||||
          ))}
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
@ -1,19 +1,9 @@
 | 
			
		||||
import classNames from "classnames";
 | 
			
		||||
import prettyBytes from "pretty-bytes";
 | 
			
		||||
import { useTranslation } from "next-i18next";
 | 
			
		||||
 | 
			
		||||
export default function Pool({ name, free, allocated, healthy, data, nasType }) {
 | 
			
		||||
  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);
 | 
			
		||||
export default function Pool({ name, free, allocated, healthy }) {
 | 
			
		||||
  const { t } = useTranslation();
 | 
			
		||||
  const usedPercent = Math.round((allocated / (free + allocated)) * 100);
 | 
			
		||||
  const statusColor = healthy ? "bg-green-500" : "bg-yellow-500";
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
@ -32,7 +22,15 @@ export default function Pool({ name, free, allocated, healthy, data, nasType })
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
 | 
			
		||||
        <span>
 | 
			
		||||
          {prettyBytes(allocated)} / {prettyBytes(total)}
 | 
			
		||||
          {`${t("common.bytes", {
 | 
			
		||||
            value: allocated,
 | 
			
		||||
            maximumFractionDigits: 1,
 | 
			
		||||
            binary: true,
 | 
			
		||||
          })} / ${t("common.bytes", {
 | 
			
		||||
            value: free + allocated,
 | 
			
		||||
            maximumFractionDigits: 1,
 | 
			
		||||
            binary: true,
 | 
			
		||||
          })}`}
 | 
			
		||||
        </span>
 | 
			
		||||
        <span className="pl-2">({usedPercent}%)</span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@ -23,11 +23,11 @@ const widget = {
 | 
			
		||||
          id: entry.name,
 | 
			
		||||
          name: entry.name,
 | 
			
		||||
          healthy: entry.healthy,
 | 
			
		||||
          allocated: entry.allocated,
 | 
			
		||||
          free: entry.free,
 | 
			
		||||
          data: entry.topology?.data ?? [],
 | 
			
		||||
        })),
 | 
			
		||||
    },
 | 
			
		||||
    dataset: {
 | 
			
		||||
      endpoint: "pool/dataset",
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user