diff --git a/src/misc/controls/Limits.js b/src/misc/controls/Limits.js new file mode 100644 index 0000000..16a71d5 --- /dev/null +++ b/src/misc/controls/Limits.js @@ -0,0 +1,87 @@ +import React from 'react'; + +import { Trans } from '@lingui/macro'; +import Grid from '@mui/material/Grid'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; + +function init(settings) { + const initSettings = { + cpu_usage: 0, + memory_mbytes: 0, + waitfor_seconds: 5, + ...settings, + }; + + return initSettings; +} + +export default function Control(props) { + const settings = init(props.settings); + + // Set the defaults + React.useEffect(() => { + props.onChange(settings, true); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleChange = (what) => (event) => { + const value = event.target.value; + + settings[what] = value; + + props.onChange(settings, false); + }; + + return ( + + + CPU Limit (percent)} + value={settings.cpu_usage} + onChange={handleChange('cpu_usage')} + /> + + CPU usage limit in percent (0-100%), 0 for unlimited + + + + Memory Limit (megabytes)} + value={settings.memory_mbytes} + onChange={handleChange('memory_mbytes')} + /> + + Memory usage limit in megabytes, 0 for unlimited. + + + + Threshold (seconds)} + value={settings.waitfor_seconds} + onChange={handleChange('waitfor_seconds')} + /> + + Number of seconds the limits are allowed to be exceeded. + + + + ); +} + +Control.defaulProps = { + settings: {}, + onChange: function (settings, automatic) {}, +}; diff --git a/src/utils/metadata.js b/src/utils/metadata.js index eb4b28e..a67316b 100644 --- a/src/utils/metadata.js +++ b/src/utils/metadata.js @@ -285,6 +285,11 @@ const defaultIngestMetadata = { enable: true, interval: 60, }, + limits: { + cpu_usage: 0, + memory_mbytes: 0, + waitfor_seconds: 5, + }, }, player: {}, meta: { @@ -311,6 +316,11 @@ const defaultEgressMetadata = { source: { source: 'hls+memfs', }, + limits: { + cpu_usage: 0, + memory_mbytes: 0, + waitfor_seconds: 5, + }, }, outputs: [], settings: {}, diff --git a/src/utils/restreamer.js b/src/utils/restreamer.js index 3d10e8a..b1ae384 100644 --- a/src/utils/restreamer.js +++ b/src/utils/restreamer.js @@ -1571,7 +1571,7 @@ class Restreamer { return await this._deleteProcess(channel.id + '_snapshot'); } - // Upsert the ingest process + // Update/Insert the ingest process async UpsertIngest(channelid, global, inputs, outputs, control) { const channel = this.GetChannel(channelid); if (!channel) { @@ -1589,6 +1589,11 @@ class Restreamer { reconnect: control.process.reconnect, reconnect_delay_seconds: parseInt(control.process.delay), stale_timeout_seconds: parseInt(control.process.staleTimeout), + limits: { + cpu_usage: parseInt(control.limits.cpu_usage), + memory_mbytes: parseInt(control.limits.memory_mbytes), + waitfor_seconds: parseInt(control.limits.waitfor_seconds), + }, }; for (let i in inputs) { @@ -2618,6 +2623,11 @@ class Restreamer { reconnect: control.process.reconnect, reconnect_delay_seconds: parseInt(control.process.delay), stale_timeout_seconds: parseInt(control.process.staleTimeout), + limits: { + cpu_usage: parseInt(control.limits.cpu_usage), + memory_mbytes: parseInt(control.limits.memory_mbytes), + waitfor_seconds: parseInt(control.limits.waitfor_seconds), + }, }; for (let i in outputs) { diff --git a/src/views/Edit/index.js b/src/views/Edit/index.js index 0f778a5..f137818 100644 --- a/src/views/Edit/index.js +++ b/src/views/Edit/index.js @@ -22,6 +22,7 @@ import Dialog from '../../misc/modals/Dialog'; import H from '../../utils/help'; import HLSControl from '../../misc/controls/HLS'; import LicenseControl from '../../misc/controls/License'; +import LimitsControl from '../../misc/controls/Limits'; import MetadataControl from '../../misc/controls/Metadata'; import NotifyContext from '../../contexts/Notify'; import Paper from '../../misc/Paper'; @@ -556,6 +557,17 @@ export default function Edit(props) { + + + + + + Limits + + + + + diff --git a/src/views/Publication/Add.js b/src/views/Publication/Add.js index d3babc5..6372503 100644 --- a/src/views/Publication/Add.js +++ b/src/views/Publication/Add.js @@ -10,6 +10,7 @@ import useMediaQuery from '@mui/material/useMediaQuery'; import Backdrop from '@mui/material/Backdrop'; import Button from '@mui/material/Button'; import CircularProgress from '@mui/material/CircularProgress'; +import Divider from '@mui/material/Divider'; import Grid from '@mui/material/Grid'; import Tab from '@mui/material/Tab'; import Tabs from '@mui/material/Tabs'; @@ -24,6 +25,7 @@ import * as M from '../../utils/metadata'; import EncodingSelect from '../../misc/EncodingSelect'; import FilterSelect from '../../misc/FilterSelect'; import H from '../../utils/help'; +import LimitsControl from '../../misc/controls/Limits'; import NotifyContext from '../../contexts/Notify'; import Paper from '../../misc/Paper'; import PaperHeader from '../../misc/PaperHeader'; @@ -327,7 +329,7 @@ export default function Add(props) { - + , ); } else { serviceList.push( @@ -338,7 +340,7 @@ export default function Add(props) { {s.name} - + , ); } } @@ -448,6 +450,17 @@ export default function Add(props) { + + + + + + Limits + + + + + diff --git a/src/views/Publication/Edit.js b/src/views/Publication/Edit.js index e34ff7a..86edeef 100644 --- a/src/views/Publication/Edit.js +++ b/src/views/Publication/Edit.js @@ -8,6 +8,7 @@ import makeStyles from '@mui/styles/makeStyles'; import Backdrop from '@mui/material/Backdrop'; import Button from '@mui/material/Button'; import CircularProgress from '@mui/material/CircularProgress'; +import Divider from '@mui/material/Divider'; import Grid from '@mui/material/Grid'; import Link from '@mui/material/Link'; import Tab from '@mui/material/Tab'; @@ -24,6 +25,7 @@ import Dialog from '../../misc/modals/Dialog'; import EncodingSelect from '../../misc/EncodingSelect'; import FilterSelect from '../../misc/FilterSelect'; import H from '../../utils/help'; +import LimitsControl from '../../misc/controls/Limits'; import NotifyContext from '../../contexts/Notify'; import Paper from '../../misc/Paper'; import PaperHeader from '../../misc/PaperHeader'; @@ -460,6 +462,17 @@ export default function Edit(props) { + + + + + + Limits + + + + + {$unsavedChanges === true && (