openFuyao is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN 'AS IS' BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */
import BreadCrumbCom from '@/components/BreadCrumbCom';
import '@/styles/schedulingPolicyConfiguration.less';
import { ExclamationCircleFilled, QuestionCircleOutlined } from '@ant-design/icons';
import { Radio, Switch, message } from 'antd';
import { Link } from 'inula-router';
import {
getNumaAffinitySchedulingStatus,
updateNumaAffinitySchedulingStatus,
getBinpackSchedulingStatus,
updateBinpackSchedulingStatus,
getFairSchedulingStatus,
updateFairSchedulingStatus,
getGroupSchedulingStatus,
updateGroupSchedulingStatus,
getPrioritySchedulingStatus,
updatePrioritySchedulingStatus,
} from '@/api/schedulingApi';
import { useEffect, useState } from 'openinula';
import noData from '@/assets/images/noData.png';
import { getVolcano, getGang, getBinPack, getPriority, getDrf, getDescVolcano } from '@/assets/md';
import PriorityPreemption from './PriorityPreemption';
import { useIntl } from 'inula-intl';
export default function SchedulingPolicyConfiguration() {
const intl = useIntl();
const [numaAffinitySchedulingStatus, setNumaAffinitySchedulingStatus] = useState(false);
const [numaAffinityPartial, setNumaAffinityPartial] = useState(false);
const [numaAffinityLoading, setNumaAffinityLoading] = useState(false);
const [binpackSchedulingStatus, setBinpackSchedulingStatus] = useState(false);
const [binpackLoading, setBinpackLoading] = useState(false);
const [fairSchedulingStatus, setFairSchedulingStatus] = useState(false);
const [fairLoading, setFairLoading] = useState(false);
const [groupSchedulingStatus, setGroupSchedulingStatus] = useState(false);
const [groupLoading, setGroupLoading] = useState(false);
const [prioritySchedulingStatus, setPrioritySchedulingStatus] = useState(false);
const [priorityLoading, setPriorityLoading] = useState(false);
const [selectedScheduler, setSelectedScheduler] = useState('volcano');
const [explanatoryPanelOpen, setExplanatoryPanel] = useState(false);
const [explanatoryInfo, setExplanatoryInfo] = useState(getVolcano());
const handleChangeNumaAffinitySchedulingStatus = async (checked) => {
setNumaAffinityLoading(true);
try {
await updateNumaAffinitySchedulingStatus({ policy: checked ? 'open' : 'close' });
getNumaAffinitySchedulingStatusInfo();
setNumaAffinityLoading(false);
} catch (error) {
if (error.response.status === 403) {
message.error('操作失败,当前用户没有操作权限,请联系管理员添加权限!');
} else {
message.error(error.data.message);
}
setNumaAffinityLoading(false);
}
};
const getNumaAffinitySchedulingStatusInfo = async () => {
const res = await getNumaAffinitySchedulingStatus();
setNumaAffinitySchedulingStatus(res.data.data !== 'close');
setNumaAffinityPartial(res.data.data === 'partial');
};
const handleChangeBinpackSchedulingStatus = async (checked) => {
setBinpackLoading(true);
try {
await updateBinpackSchedulingStatus({ policy: checked ? 'open' : 'close' });
getBinpackSchedulingStatusInfo();
setBinpackLoading(false);
} catch (error) {
if (error.response.status === 403) {
message.error('操作失败,当前用户没有操作权限,请联系管理员添加权限!');
} else {
message.error(error.response?.data.message);
}
setBinpackLoading(false);
}
};
const getBinpackSchedulingStatusInfo = async () => {
const res = await getBinpackSchedulingStatus();
setBinpackSchedulingStatus(res.data.data === 'open');
};
const handleFairSchedulingStatus = async (checked) => {
setFairLoading(true);
try {
await updateFairSchedulingStatus({ policy: checked ? 'open' : 'close' });
getFairSchedulingStatusInfo();
setBinpackLoading(false);
} catch (error) {
if (error.response.status === 403) {
message.error('操作失败,当前用户没有操作权限,请联系管理员添加权限!');
} else {
message.error(error.response?.data.message);
}
setFairLoading(false);
}
};
const getFairSchedulingStatusInfo = async () => {
const res = await getFairSchedulingStatus();
setFairSchedulingStatus(res.data.data === 'open');
};
const handleGroupSchedulingStatus = async (checked) => {
setGroupLoading(true);
try {
await updateGroupSchedulingStatus({ policy: checked ? 'open' : 'close' });
getGroupSchedulingStatusInfo();
setGroupLoading(false);
} catch (error) {
if (error.response.status === 403) {
message.error('操作失败,当前用户没有操作权限,请联系管理员添加权限!');
} else {
message.error(error.response?.data.message);
}
setGroupLoading(false);
}
};
const getGroupSchedulingStatusInfo = async () => {
const res = await getGroupSchedulingStatus();
setGroupSchedulingStatus(res.data.data === 'open');
};
const handlePrioritySchedulingStatus = async (checked) => {
setPriorityLoading(true);
try {
await updatePrioritySchedulingStatus({ policy: checked ? 'open' : 'close' });
getPrioritySchedulingStatusInfo();
setPriorityLoading(false);
} catch (error) {
if (error.response.status === 403) {
message.error('操作失败,当前用户没有操作权限,请联系管理员添加权限!');
} else {
message.error(error.response?.data.message);
}
setPriorityLoading(false);
}
};
const getPrioritySchedulingStatusInfo = async () => {
const res = await getPrioritySchedulingStatus();
setPrioritySchedulingStatus(res.data.data === 'open');
};
const handleSchedulerChange = (e) => {
setSelectedScheduler(e.target.value);
};
const handleClosePriorityPreemption = () => {
setExplanatoryPanel(false);
};
const handleNumaAwareOpen = () => {
setExplanatoryInfo(getVolcano());
setExplanatoryPanel(true);
};
const handleBinPack = () => {
setExplanatoryInfo(getBinPack());
setExplanatoryPanel(true);
};
const handleDescAbout = () => {
setExplanatoryInfo(getDescVolcano());
setExplanatoryPanel(true);
};
const handleDrfOpen = () => {
setExplanatoryInfo(getDrf());
setExplanatoryPanel(true);
};
const handleGangOpen = () => {
setExplanatoryInfo(getGang());
setExplanatoryPanel(true);
};
const handlePriorityOpen = () => {
setExplanatoryInfo(getPriority());
setExplanatoryPanel(true);
};
const goToCustome = () => {
window.location.href = '/container_platform/platformManage/customResourceDefinition';
};
useEffect(() => {
getNumaAffinitySchedulingStatusInfo();
getBinpackSchedulingStatusInfo();
getFairSchedulingStatusInfo();
getGroupSchedulingStatusInfo();
getPrioritySchedulingStatusInfo();
}, []);
return (
<div className="scheduling_policy_container">
<BreadCrumbCom
items={[
{ title: intl.formatMessage({ id: 'common.numaAffinityScheduling' }), disabled: true },
{ title: intl.formatMessage({ id: 'scheduling.schedulingPolicyConfig' }), disabled: true },
]}
/>
<div className="default_scheduling">
<div className="schedule_title mb_12">{intl.formatMessage({ id: 'scheduling.scheduler' })}</div>
<Radio.Group
buttonStyle="solid"
defaultValue="volcano"
style={{ marginBottom: '32px' }}
onChange={handleSchedulerChange}
>
<Radio.Button value="volcano" className="radio_schedule">
volcano
</Radio.Button>
</Radio.Group>
{selectedScheduler === 'volcano' && (
<div className="custom-switch">
<div className="schedule_description">
{intl.formatMessage({ id: 'scheduling.volcanoDesc' })}
<QuestionCircleOutlined
onClick={handleDescAbout}
className="question-icon-hover"
style={{ marginLeft: '7px' }}
/>
</div>
<div className="schedule_title mb_12">
{intl.formatMessage({ id: 'scheduling.numaAffinityScheduling' })}
<QuestionCircleOutlined onClick={handleNumaAwareOpen} className="question-icon-hover" />
</div>
<Switch
onChange={handleChangeNumaAffinitySchedulingStatus}
loading={numaAffinityLoading}
checked={numaAffinitySchedulingStatus}
className="mb_12"
/>
{numaAffinityPartial && (
<div className="schedule_description" style={{ color: '#d46b08' }}>
<ExclamationCircleFilled style={{ marginRight: '6px' }} />
{intl.formatMessage({ id: 'scheduling.partialEnabled' })}
</div>
)}
<div className="schedule_description">{intl.formatMessage({ id: 'scheduling.numaAffinityDesc' })}</div>
<div className="schedule_title mb_12">
{intl.formatMessage({ id: 'scheduling.binpackScheduling' })}
<QuestionCircleOutlined onClick={handleBinPack} className="question-icon-hover" />
</div>
<Switch
checked={binpackSchedulingStatus}
onChange={handleChangeBinpackSchedulingStatus}
LOADING={binpackLoading}
className="mb_12"
/>
<div className="schedule_description">{intl.formatMessage({ id: 'scheduling.binpackDesc' })}</div>
<div className="schedule_title mb_12">
{intl.formatMessage({ id: 'scheduling.fairScheduling' })}
<QuestionCircleOutlined onClick={handleDrfOpen} className="question-icon-hover" />
</div>
<Switch
onChange={handleFairSchedulingStatus}
checked={fairSchedulingStatus}
LOADING={fairLoading}
className="mb_12"
/>
<div className="schedule_description">{intl.formatMessage({ id: 'scheduling.fairSchedulingDesc' })}</div>
<div className="schedule_title mb_12">
{intl.formatMessage({ id: 'scheduling.groupScheduling' })}
<QuestionCircleOutlined onClick={handleGangOpen} className="question-icon-hover" />
</div>
<Switch
checked={groupSchedulingStatus}
loading={groupLoading}
onChange={handleGroupSchedulingStatus}
className="mb_12"
/>
<div className="schedule_description">{intl.formatMessage({ id: 'scheduling.groupSchedulingDesc' })}</div>
<div className="schedule_title mb_12">
{intl.formatMessage({ id: 'scheduling.priorityPreemption' })}
<QuestionCircleOutlined onClick={handlePriorityOpen} className="question-icon-hover" />
</div>
<Switch
checked={prioritySchedulingStatus}
loading={priorityLoading}
onChange={handlePrioritySchedulingStatus}
className="mb_12"
/>
<div className="schedule_description">
{intl.formatMessage({ id: 'scheduling.priorityPreemptionDesc' })}
<span className="check_title">
<Link to="/SchedulingPolicyConfiguration/priorityClass">
{intl.formatMessage({ id: 'scheduling.viewPriorityQueue' })} >
</Link>
</span>
</div>
</div>
)}
</div>
{selectedScheduler === 'scheduler' && (
<div className="default_scheduling_no_data">
<div>
<img src={noData} style={{ marginBottom: '26px' }} />
<div style={{ textAlign: 'center', color: '#89939b' }}>
{intl.formatMessage({ id: 'scheduling.noConfigurablePolicy' })}
<br />
{intl.formatMessage({ id: 'scheduling.switchScheduler' })}
</div>
</div>
</div>
)}
{selectedScheduler === 'volcano' && explanatoryPanelOpen && (
<PriorityPreemption onClose={handleClosePriorityPreemption} data={explanatoryInfo} />
)}
</div>
);
}