mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-07-01 11:13:50 +02:00
Migrate nodeList subcomponents
This commit is contained in:
parent
db5f6c7540
commit
e94b250541
@ -6,7 +6,7 @@
|
|||||||
- `items [Any]`: List of plot components to render
|
- `items [Any]`: List of plot components to render
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
Row,
|
Row,
|
||||||
Col,
|
Col,
|
||||||
|
@ -18,6 +18,7 @@ Changes #2: Rewritten for Svelte 5, removed bodyHandler
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
/* Svelte 5 Props */
|
||||||
let {
|
let {
|
||||||
sliderMin,
|
sliderMin,
|
||||||
sliderMax,
|
sliderMax,
|
||||||
@ -26,6 +27,7 @@ Changes #2: Rewritten for Svelte 5, removed bodyHandler
|
|||||||
changeRange
|
changeRange
|
||||||
} = $props();
|
} = $props();
|
||||||
|
|
||||||
|
/* State Init */
|
||||||
let pendingValues = $state([fromPreset, toPreset]);
|
let pendingValues = $state([fromPreset, toPreset]);
|
||||||
let sliderFrom = $state(Math.max(((fromPreset == null ? sliderMin : fromPreset) - sliderMin) / (sliderMax - sliderMin), 0.));
|
let sliderFrom = $state(Math.max(((fromPreset == null ? sliderMin : fromPreset) - sliderMin) / (sliderMax - sliderMin), 0.));
|
||||||
let sliderTo = $state(Math.min(((toPreset == null ? sliderMin : toPreset) - sliderMin) / (sliderMax - sliderMin), 1.));
|
let sliderTo = $state(Math.min(((toPreset == null ? sliderMin : toPreset) - sliderMin) / (sliderMax - sliderMin), 1.));
|
||||||
@ -34,7 +36,10 @@ Changes #2: Rewritten for Svelte 5, removed bodyHandler
|
|||||||
let leftHandle = $state();
|
let leftHandle = $state();
|
||||||
let sliderMain = $state();
|
let sliderMain = $state();
|
||||||
|
|
||||||
|
/* Var Init */
|
||||||
let timeoutId = null;
|
let timeoutId = null;
|
||||||
|
|
||||||
|
/* Functions */
|
||||||
function queueChangeEvent() {
|
function queueChangeEvent() {
|
||||||
if (timeoutId !== null) {
|
if (timeoutId !== null) {
|
||||||
clearTimeout(timeoutId)
|
clearTimeout(timeoutId)
|
||||||
|
@ -16,28 +16,37 @@
|
|||||||
CardBody,
|
CardBody,
|
||||||
Input,
|
Input,
|
||||||
InputGroup,
|
InputGroup,
|
||||||
InputGroupText, } from "@sveltestrap/sveltestrap";
|
InputGroupText,
|
||||||
|
} from "@sveltestrap/sveltestrap";
|
||||||
import {
|
import {
|
||||||
scramble,
|
scramble,
|
||||||
scrambleNames, } from "../../generic/utils.js";
|
scrambleNames,
|
||||||
|
} from "../../generic/utils.js";
|
||||||
|
|
||||||
export let cluster;
|
/* Svelte 5 Props */
|
||||||
export let subCluster
|
let {
|
||||||
export let hostname;
|
cluster,
|
||||||
export let dataHealth;
|
subCluster,
|
||||||
export let nodeJobsData = null;
|
hostname,
|
||||||
|
dataHealth,
|
||||||
|
nodeJobsData = null,
|
||||||
|
} = $props();
|
||||||
|
|
||||||
|
/* Const Init */
|
||||||
// Not at least one returned, selected metric: NodeHealth warning
|
// Not at least one returned, selected metric: NodeHealth warning
|
||||||
const healthWarn = !dataHealth.includes(true);
|
const healthWarn = !dataHealth.includes(true);
|
||||||
// At least one non-returned selected metric: Metric config error?
|
// At least one non-returned selected metric: Metric config error?
|
||||||
const metricWarn = dataHealth.includes(false);
|
const metricWarn = dataHealth.includes(false);
|
||||||
|
|
||||||
let userList;
|
/* Derived */
|
||||||
let projectList;
|
const userList = $derived(nodeJobsData
|
||||||
$: if (nodeJobsData) {
|
? Array.from(new Set(nodeJobsData.jobs.items.map((j) => scrambleNames ? scramble(j.user) : j.user))).sort((a, b) => a.localeCompare(b))
|
||||||
userList = Array.from(new Set(nodeJobsData.jobs.items.map((j) => scrambleNames ? scramble(j.user) : j.user))).sort((a, b) => a.localeCompare(b));
|
: []
|
||||||
projectList = Array.from(new Set(nodeJobsData.jobs.items.map((j) => scrambleNames ? scramble(j.project) : j.project))).sort((a, b) => a.localeCompare(b));
|
);
|
||||||
}
|
const projectList = $derived(nodeJobsData
|
||||||
|
? Array.from(new Set(nodeJobsData.jobs.items.map((j) => scrambleNames ? scramble(j.project) : j.project))).sort((a, b) => a.localeCompare(b))
|
||||||
|
: []);
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Card class="pb-3">
|
<Card class="pb-3">
|
||||||
|
@ -18,10 +18,14 @@
|
|||||||
import MetricPlot from "../../generic/plots/MetricPlot.svelte";
|
import MetricPlot from "../../generic/plots/MetricPlot.svelte";
|
||||||
import NodeInfo from "./NodeInfo.svelte";
|
import NodeInfo from "./NodeInfo.svelte";
|
||||||
|
|
||||||
export let cluster;
|
/* Svelte 5 Props */
|
||||||
export let nodeData;
|
let {
|
||||||
export let selectedMetrics;
|
cluster,
|
||||||
|
nodeData,
|
||||||
|
selectedMetrics,
|
||||||
|
} = $props();
|
||||||
|
|
||||||
|
/* Const Init */
|
||||||
const client = getContextClient();
|
const client = getContextClient();
|
||||||
const paging = { itemsPerPage: 50, page: 1 };
|
const paging = { itemsPerPage: 50, page: 1 };
|
||||||
const sorting = { field: "startTime", type: "col", order: "DESC" };
|
const sorting = { field: "startTime", type: "col", order: "DESC" };
|
||||||
@ -30,7 +34,6 @@
|
|||||||
{ node: { contains: nodeData.host } },
|
{ node: { contains: nodeData.host } },
|
||||||
{ state: ["running"] },
|
{ state: ["running"] },
|
||||||
];
|
];
|
||||||
|
|
||||||
const nodeJobsQuery = gql`
|
const nodeJobsQuery = gql`
|
||||||
query (
|
query (
|
||||||
$filter: [JobFilter!]!
|
$filter: [JobFilter!]!
|
||||||
@ -53,13 +56,19 @@
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
$: nodeJobsData = queryStore({
|
/* Derived */
|
||||||
|
const nodeJobsData = $derived(queryStore({
|
||||||
client: client,
|
client: client,
|
||||||
query: nodeJobsQuery,
|
query: nodeJobsQuery,
|
||||||
variables: { paging, sorting, filter },
|
variables: { paging, sorting, filter },
|
||||||
});
|
})
|
||||||
|
);
|
||||||
|
|
||||||
// Helper
|
let extendedLegendData = $derived($nodeJobsData?.data ? buildExtendedLegend() : null);
|
||||||
|
let refinedData = $derived(nodeData?.metrics ? sortAndSelectScope(nodeData.metrics) : null);
|
||||||
|
let dataHealth = $derived(refinedData.filter((rd) => rd.disabled === false).map((enabled) => (enabled.data.metric.series.length > 0)));
|
||||||
|
|
||||||
|
/* Functions */
|
||||||
const selectScope = (nodeMetrics) =>
|
const selectScope = (nodeMetrics) =>
|
||||||
nodeMetrics.reduce(
|
nodeMetrics.reduce(
|
||||||
(a, b) =>
|
(a, b) =>
|
||||||
@ -89,15 +98,8 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let refinedData;
|
function buildExtendedLegend() {
|
||||||
let dataHealth;
|
let pendingExtendedLegendData = null
|
||||||
$: if (nodeData?.metrics) {
|
|
||||||
refinedData = sortAndSelectScope(nodeData?.metrics)
|
|
||||||
dataHealth = refinedData.filter((rd) => rd.disabled === false).map((enabled) => (enabled.data.metric.series.length > 0))
|
|
||||||
}
|
|
||||||
|
|
||||||
let extendedLegendData = null;
|
|
||||||
$: if ($nodeJobsData?.data) {
|
|
||||||
// Build Extended for allocated nodes [Commented: Only Build extended Legend For Shared Nodes]
|
// Build Extended for allocated nodes [Commented: Only Build extended Legend For Shared Nodes]
|
||||||
if ($nodeJobsData.data.jobs.count >= 1) { // "&& !$nodeJobsData.data.jobs.items[0].exclusive)"
|
if ($nodeJobsData.data.jobs.count >= 1) { // "&& !$nodeJobsData.data.jobs.items[0].exclusive)"
|
||||||
const accSet = Array.from(new Set($nodeJobsData.data.jobs.items
|
const accSet = Array.from(new Set($nodeJobsData.data.jobs.items
|
||||||
@ -107,11 +109,11 @@
|
|||||||
)
|
)
|
||||||
)).flat(2)
|
)).flat(2)
|
||||||
|
|
||||||
extendedLegendData = {}
|
pendingExtendedLegendData = {};
|
||||||
for (const accId of accSet) {
|
for (const accId of accSet) {
|
||||||
const matchJob = $nodeJobsData.data.jobs.items.find((i) => i.resources.find((r) => r.accelerators.includes(accId)))
|
const matchJob = $nodeJobsData.data.jobs.items.find((i) => i.resources.find((r) => r.accelerators.includes(accId)))
|
||||||
const matchUser = matchJob?.user ? matchJob.user : null
|
const matchUser = matchJob?.user ? matchJob.user : null
|
||||||
extendedLegendData[accId] = {
|
pendingExtendedLegendData[accId] = {
|
||||||
user: (scrambleNames && matchUser)
|
user: (scrambleNames && matchUser)
|
||||||
? scramble(matchUser)
|
? scramble(matchUser)
|
||||||
: (matchUser ? matchUser : '-'),
|
: (matchUser ? matchUser : '-'),
|
||||||
@ -120,6 +122,7 @@
|
|||||||
}
|
}
|
||||||
// Theoretically extendable for hwthreadIDs
|
// Theoretically extendable for hwthreadIDs
|
||||||
}
|
}
|
||||||
|
return pendingExtendedLegendData;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user