mirror of https://github.com/jetkvm/kvm.git
updated jiggler config UI
This commit is contained in:
parent
9a6356ff05
commit
1183ba70e9
|
@ -85,6 +85,7 @@ func runJigglerCronTab() error {
|
||||||
s.Start()
|
s.Start()
|
||||||
delta, err := calculateJobDelta(s)
|
delta, err := calculateJobDelta(s)
|
||||||
jobDelta = delta
|
jobDelta = delta
|
||||||
|
logger.Infof("Time between jiggler runs: %v", jobDelta)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -95,7 +96,7 @@ func runJiggler() {
|
||||||
if jigglerEnabled {
|
if jigglerEnabled {
|
||||||
if config.JigglerConfig.JitterPercentage != 0 {
|
if config.JigglerConfig.JitterPercentage != 0 {
|
||||||
jitter := calculateJitterDuration(jobDelta)
|
jitter := calculateJitterDuration(jobDelta)
|
||||||
logger.Infof("Jitter enabled, Sleeping for %v", jitter)
|
logger.Debugf("Jitter enabled, Sleeping for %v", jitter)
|
||||||
time.Sleep(jitter)
|
time.Sleep(jitter)
|
||||||
}
|
}
|
||||||
inactivitySeconds := config.JigglerConfig.InactivityLimitSeconds
|
inactivitySeconds := config.JigglerConfig.InactivityLimitSeconds
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { InputFieldWithLabel } from "./InputField";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useJsonRpc } from "../hooks/useJsonRpc";
|
import { useJsonRpc } from "../hooks/useJsonRpc";
|
||||||
import notifications from "../notifications";
|
import notifications from "../notifications";
|
||||||
|
import { SelectMenuBasic } from "@components/SelectMenuBasic";
|
||||||
|
|
||||||
export interface JigglerConfig {
|
export interface JigglerConfig {
|
||||||
inactivity_limit_seconds: number;
|
inactivity_limit_seconds: number;
|
||||||
|
@ -12,9 +13,69 @@ export interface JigglerConfig {
|
||||||
schedule_cron_tab: string;
|
schedule_cron_tab: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const jigglerCrontabConfigs = [
|
||||||
|
{
|
||||||
|
label: "Every 20 seconds",
|
||||||
|
value: "*/20 * * * * *",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Every 40 seconds",
|
||||||
|
value: "*/40 * * * * *",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Every 1 minute",
|
||||||
|
value: "0 * * * * *",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Every 3 minutes",
|
||||||
|
value: "0 */3 * * * *",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const jigglerJitterConfigs = [
|
||||||
|
{
|
||||||
|
label: "No Jitter",
|
||||||
|
value: "0.0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "10%",
|
||||||
|
value: ".1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "25%",
|
||||||
|
value: ".25",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "50%",
|
||||||
|
value: ".5",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const jigglerInactivityConfigs = [
|
||||||
|
{
|
||||||
|
label: "20 Seconds",
|
||||||
|
value: "20",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "40 Seconds",
|
||||||
|
value: "40",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "1 Minute",
|
||||||
|
value: "60",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "3 Minutes",
|
||||||
|
value: "180",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export function JigglerSetting() {
|
export function JigglerSetting() {
|
||||||
const [send] = useJsonRpc();
|
const [send] = useJsonRpc();
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [inactivityLimitSeconds, setInactivityLimitSeconds] = useState("");
|
||||||
|
const [jitterPercentage, setJitterPercentage] = useState("");
|
||||||
|
const [scheduleCronTab, setScheduleCronTab] = useState("");
|
||||||
|
|
||||||
const [jigglerConfigState, setJigglerConfigState] = useState<JigglerConfig>({
|
const [jigglerConfigState, setJigglerConfigState] = useState<JigglerConfig>({
|
||||||
inactivity_limit_seconds: 20.0,
|
inactivity_limit_seconds: 20.0,
|
||||||
|
@ -25,27 +86,34 @@ export function JigglerSetting() {
|
||||||
const syncJigglerConfig = useCallback(() => {
|
const syncJigglerConfig = useCallback(() => {
|
||||||
send("getJigglerConfig", {}, resp => {
|
send("getJigglerConfig", {}, resp => {
|
||||||
if ("error" in resp) return;
|
if ("error" in resp) return;
|
||||||
setJigglerConfigState(resp.result as JigglerConfig);
|
const result = resp.result as JigglerConfig;
|
||||||
|
setJigglerConfigState(result);
|
||||||
|
setInactivityLimitSeconds(String(result.inactivity_limit_seconds))
|
||||||
|
setJitterPercentage(String(result.jitter_percentage))
|
||||||
|
setScheduleCronTab(result.schedule_cron_tab)
|
||||||
});
|
});
|
||||||
}, [send]);
|
}, [send, setInactivityLimitSeconds]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
syncJigglerConfig()
|
syncJigglerConfig()
|
||||||
}, [send, syncJigglerConfig]);
|
}, [send, syncJigglerConfig]);
|
||||||
|
|
||||||
const handleJigglerInactivityLimitSecondsChange = (value: string) => {
|
const handleJigglerInactivityLimitSecondsChange = (value: string) => {
|
||||||
|
setInactivityLimitSeconds(value)
|
||||||
setJigglerConfigState({ ...jigglerConfigState, inactivity_limit_seconds: Number(value) });
|
setJigglerConfigState({ ...jigglerConfigState, inactivity_limit_seconds: Number(value) });
|
||||||
};
|
};
|
||||||
//
|
|
||||||
// const handleJigglerJitterPercentageChange = (value: number) => {
|
const handleJigglerJitterPercentageChange = (value: string) => {
|
||||||
// setJigglerConfig({ ...jigglerConfig, jitter_percentage: value });
|
setJitterPercentage(value)
|
||||||
// };
|
setJigglerConfigState({ ...jigglerConfigState, jitter_percentage: Number(value) });
|
||||||
|
};
|
||||||
|
|
||||||
const handleJigglerScheduleCronTabChange = (value: string) => {
|
const handleJigglerScheduleCronTabChange = (value: string) => {
|
||||||
|
setScheduleCronTab(value)
|
||||||
setJigglerConfigState({ ...jigglerConfigState, schedule_cron_tab: value });
|
setJigglerConfigState({ ...jigglerConfigState, schedule_cron_tab: value });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleJigglerConfigChange = useCallback(
|
const handleJigglerConfigSave = useCallback(
|
||||||
(jigglerConfig: JigglerConfig) => {
|
(jigglerConfig: JigglerConfig) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
send("setJigglerConfig", { jigglerConfig }, async resp => {
|
send("setJigglerConfig", { jigglerConfig }, async resp => {
|
||||||
|
@ -69,19 +137,63 @@ export function JigglerSetting() {
|
||||||
return (
|
return (
|
||||||
<div className="">
|
<div className="">
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<InputFieldWithLabel
|
<SelectMenuBasic
|
||||||
required
|
size="SM"
|
||||||
label="Jiggler Schedule"
|
label="Schedule"
|
||||||
placeholder="*/20 * * * * * (Every 20 seconds)"
|
className="max-w-[192px]"
|
||||||
value={jigglerConfigState?.schedule_cron_tab}
|
value={scheduleCronTab}
|
||||||
onChange={e => handleJigglerScheduleCronTabChange(e.target.value)}
|
fullWidth
|
||||||
|
onChange={e => {
|
||||||
|
if (e.target.value === "custom") {
|
||||||
|
setScheduleCronTab(e.target.value);
|
||||||
|
} else {
|
||||||
|
handleJigglerScheduleCronTabChange(e.target.value)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
options={[...jigglerCrontabConfigs, { value: "custom", label: "Custom" }]}
|
||||||
/>
|
/>
|
||||||
<InputFieldWithLabel
|
{jitterPercentage === "custom" && (
|
||||||
required
|
<InputFieldWithLabel
|
||||||
label="Inactivity Limit (Seconds)"
|
required
|
||||||
placeholder="20"
|
label="Jiggler Crontab"
|
||||||
value={jigglerConfigState?.inactivity_limit_seconds}
|
placeholder="Enter Cron Tab"
|
||||||
onChange={e => handleJigglerInactivityLimitSecondsChange(e.target.value)}
|
value={scheduleCronTab}
|
||||||
|
onChange={e => handleJigglerScheduleCronTabChange(e.target.value)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<SelectMenuBasic
|
||||||
|
size="SM"
|
||||||
|
label="Jitter Percentage"
|
||||||
|
className="max-w-[192px]"
|
||||||
|
value={jitterPercentage}
|
||||||
|
fullWidth
|
||||||
|
onChange={e => {
|
||||||
|
if (e.target.value === "custom") {
|
||||||
|
setJitterPercentage(e.target.value);
|
||||||
|
} else {
|
||||||
|
handleJigglerJitterPercentageChange(e.target.value)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
options={[...jigglerJitterConfigs, { value: "custom", label: "Custom" }]}
|
||||||
|
/>
|
||||||
|
{jitterPercentage === "custom" && (
|
||||||
|
<InputFieldWithLabel
|
||||||
|
required
|
||||||
|
label="Jitter Percentage"
|
||||||
|
placeholder="0.0"
|
||||||
|
onChange={e => handleJigglerJitterPercentageChange(e.target.value)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<SelectMenuBasic
|
||||||
|
size="SM"
|
||||||
|
label="Inactivity Limit Seconds"
|
||||||
|
className="max-w-[192px]"
|
||||||
|
value={inactivityLimitSeconds}
|
||||||
|
fullWidth
|
||||||
|
onChange={e => {
|
||||||
|
handleJigglerInactivityLimitSecondsChange(e.target.value);
|
||||||
|
}}
|
||||||
|
options={[...jigglerInactivityConfigs]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-6 flex gap-x-2">
|
<div className="mt-6 flex gap-x-2">
|
||||||
|
@ -90,7 +202,7 @@ export function JigglerSetting() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="primary"
|
theme="primary"
|
||||||
text="Update Jiggler Config"
|
text="Update Jiggler Config"
|
||||||
onClick={() => handleJigglerConfigChange(jigglerConfigState)}
|
onClick={() => handleJigglerConfigSave(jigglerConfigState)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue