Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: db miss dbtype & update operation log #5315

Merged
merged 14 commits into from
Dec 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,10 @@ const AppBaseInfo = ({ app = MOCK_APP_DETAIL }: { app: AppDetailType }) => {
iconName: 'deployMode',
items: app.hpa.use
? [
{ label: `${app.hpa.target} ${t('target_value')}`, value: `${app.hpa.value}%` },
{
label: `${app.hpa.target} ${t('target_value')}`,
value: `${app.hpa.value}${app.hpa.target === 'gpu' ? '' : '%'}`
},
{
label: 'Number of Instances',
value: `${app.hpa.minReplicas} ~ ${app.hpa.maxReplicas}`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,13 +281,17 @@ const Form = ({
const cpuList = formSliderListConfig[key].cpu;
const memoryList = formSliderListConfig[key].memory;

const sortedCpuList =
cpu !== undefined ? [...new Set([...cpuList, cpu])].sort((a, b) => a - b) : cpuList;
const sortedCpuList = !!gpuType
? cpuList
: cpu !== undefined
? [...new Set([...cpuList, cpu])].sort((a, b) => a - b)
: cpuList;

const sortedMemoryList =
memory !== undefined
? [...new Set([...memoryList, memory])].sort((a, b) => a - b)
: memoryList;
const sortedMemoryList = !!gpuType
? memoryList
: memory !== undefined
? [...new Set([...memoryList, memory])].sort((a, b) => a - b)
: memoryList;

return {
cpu: sliderNumber2MarkList({
Expand All @@ -304,7 +308,7 @@ const Form = ({
}, [formSliderListConfig, getValues]);

// eslint-disable-next-line react-hooks/exhaustive-deps
const SliderList = useMemo(() => countSliderList(), [already]);
const SliderList = useMemo(() => countSliderList(), [already, refresh]);

return (
<>
Expand Down Expand Up @@ -600,7 +604,7 @@ const Form = ({
}
})}
/>
<Box>%</Box>
<Box>{getValues('hpa.target') === 'gpu' ? '' : '%'}</Box>
<Tip
ml={4}
icon={<InfoOutlineIcon />}
Expand Down Expand Up @@ -675,6 +679,9 @@ const Form = ({
const inventory = countGpuInventory(type);
if (type === '' || (selected && inventory > 0)) {
setValue('gpu.type', type);
const sliderList = countSliderList();
setValue('cpu', sliderList.cpu[1].value);
setValue('memory', sliderList.memory[1].value);
}
}}
/>
Expand Down
2 changes: 1 addition & 1 deletion frontend/providers/applaunchpad/src/utils/adapt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ export const sliderNumber2MarkList = ({
type: 'cpu' | 'memory';
gpuAmount?: number;
}) => {
const newVal = val.map((item) => item * gpuAmount);
const newVal = val.map((item) => item);

return newVal.map((item) => ({
label: type === 'memory' ? (item >= 1024 ? `${item / 1024} G` : `${item} M`) : `${item / 1000}`,
Expand Down
11 changes: 9 additions & 2 deletions frontend/providers/dbprovider/public/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@
"db_name": "DataBase Name",
"db_table": "DataBase Table",
"dbconfig": {
"change_history": "Modification History",
"change_history": "Operation History",
"commit": "submit",
"confirm_updates": "Please confirm the parameters you modified:",
"get_config_err": "Failed to obtain configuration file",
Expand Down Expand Up @@ -330,5 +330,12 @@
"within_1_hour": "Within 1 hour",
"within_5_minutes": "Within 5 minutes",
"yaml_file": "YAML",
"you_have_successfully_deployed_database": "You have successfully deployed and created a database!"
"you_have_successfully_deployed_database": "You have successfully deployed and created a database!",
"change_log": "History",
"VerticalScaling": "Vertical Scaling",
"VerticalScalingCPU": "Vertical Scaling (CPU)",
"VerticalScalingMemory": "Vertical Scaling (Memory)",
"HorizontalScaling": "Horizontal Scaling (Instance)",
"VolumeExpansion": "Volume Expansion (Disk)",
"Stop": "Stop"
}
13 changes: 10 additions & 3 deletions frontend/providers/dbprovider/public/locales/zh/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@
"db_name": "数据库名字",
"db_table": "数据库表",
"dbconfig": {
"change_history": "修改历史",
"change_history": "变更历史",
"commit": "提交",
"confirm_updates": "请确认您修改的参数:",
"get_config_err": "获取配置文件失败",
Expand Down Expand Up @@ -331,5 +331,12 @@
"within_1_hour": "一小时内",
"within_5_minutes": "五分钟内",
"yaml_file": "YAML 文件",
"you_have_successfully_deployed_database": "您已成功部署创建一个数据库!"
}
"you_have_successfully_deployed_database": "您已成功部署创建一个数据库!",
"change_log": "变更历史",
"VerticalScaling": "纵向扩展",
"VerticalScalingCPU": "纵向扩展(CPU)",
"VerticalScalingMemory": "纵向扩展(内存)",
"HorizontalScaling": "横向扩展(实例数)",
"VolumeExpansion": "卷扩展(磁盘)",
"Stop": "停止"
}
10 changes: 8 additions & 2 deletions frontend/providers/dbprovider/src/api/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import type {
import { LogTypeEnum } from '@/constants/log';
import { MonitorChartDataResult } from '@/types/monitor';
import { adaptDBDetail, adaptDBListItem, adaptEvents, adaptPod } from '@/utils/adapt';
import { json2Restart } from '@/utils/json2Yaml';
import { json2BasicOps } from '@/utils/json2Yaml';
import { TFile } from '@/utils/kubeFileSystem';
import { LogResult } from '@/utils/logParsers/LogParser';
import { V1Service, V1StatefulSet } from '@kubernetes/client-node';
Expand Down Expand Up @@ -62,7 +62,7 @@ export const restartPodByName = (podName: string) => GET(`/api/pod/restartPod?po

/* db operation */
export const restartDB = (data: { dbName: string; dbType: DBType }) => {
const yaml = json2Restart(data);
const yaml = json2BasicOps({ ...data, type: 'Restart' });
return applyYamlList([yaml], 'update');
};

Expand Down Expand Up @@ -106,6 +106,12 @@ export const getOpsRequest = ({
dbType
});

export const getOperationLog = ({ name, dbType }: { name: string; dbType: DBType }) =>
GET<OpsRequestItemType[]>(`/api/opsrequest/operationlog`, {
name,
dbType
});

export const getLogFiles = ({
podName,
dbType,
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion frontend/providers/dbprovider/src/pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ function App({ Component, pageProps }: AppProps) {
try {
if (e.data?.type === 'InternalAppCall' && e.data?.name) {
router.push({
pathname: '/db/detail',
pathname: '/redirect',
query: {
name: e.data.name
}
Expand Down
12 changes: 7 additions & 5 deletions frontend/providers/dbprovider/src/pages/api/createDB.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { jsonRes } from '@/services/backend/response';
import { ApiResp } from '@/services/kubernet';
import { KbPgClusterType } from '@/types/cluster';
import { BackupItemType, DBEditType } from '@/types/db';
import { json2Account, json2ClusterOps, json2CreateCluster } from '@/utils/json2Yaml';
import { json2Account, json2ResourceOps, json2CreateCluster } from '@/utils/json2Yaml';
import type { NextApiRequest, NextApiResponse } from 'next';
import { updateBackupPolicyApi } from './backup/updatePolicy';
import { BackupSupportedDBTypeList } from '@/constants/db';
Expand Down Expand Up @@ -38,17 +38,17 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
const opsRequests = [];

if (cpu !== dbForm.cpu || memory !== dbForm.memory) {
const verticalScalingYaml = json2ClusterOps(dbForm, 'VerticalScaling');
const verticalScalingYaml = json2ResourceOps(dbForm, 'VerticalScaling');
opsRequests.push(verticalScalingYaml);
}

if (replicas !== dbForm.replicas) {
const horizontalScalingYaml = json2ClusterOps(dbForm, 'HorizontalScaling');
const horizontalScalingYaml = json2ResourceOps(dbForm, 'HorizontalScaling');
opsRequests.push(horizontalScalingYaml);
}

if (dbForm.storage > storage) {
const volumeExpansionYaml = json2ClusterOps(dbForm, 'VolumeExpansion');
const volumeExpansionYaml = json2ResourceOps(dbForm, 'VolumeExpansion');
opsRequests.push(volumeExpansionYaml);
}

Expand Down Expand Up @@ -97,7 +97,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
}

const account = json2Account(dbForm);
const cluster = json2CreateCluster(dbForm, backupInfo);
const cluster = json2CreateCluster(dbForm, backupInfo, {
storageClassName: process.env.STORAGE_CLASSNAME
});
await applyYamlList([account, cluster], 'create');
const { body } = (await k8sCustomObjects.getNamespacedCustomObject(
'apps.kubeblocks.io',
Expand Down
7 changes: 5 additions & 2 deletions frontend/providers/dbprovider/src/pages/api/getDBByName.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ApiResp } from '@/services/kubernet';
import { authSession } from '@/services/backend/auth';
import { getK8s } from '@/services/backend/kubernetes';
import { jsonRes } from '@/services/backend/response';
import { KbPgClusterType } from '@/types/cluster';

export default async function handler(req: NextApiRequest, res: NextApiResponse<ApiResp>) {
try {
Expand All @@ -29,13 +30,15 @@ export async function getCluster(req: NextApiRequest, name: string) {
kubeconfig: await authSession(req)
});

const { body } = await k8sCustomObjects.getNamespacedCustomObject(
const { body } = (await k8sCustomObjects.getNamespacedCustomObject(
'apps.kubeblocks.io',
'v1alpha1',
namespace,
'clusters',
name
);
)) as {
body: KbPgClusterType;
};

return body;
}
137 changes: 137 additions & 0 deletions frontend/providers/dbprovider/src/pages/api/opsrequest/operationlog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
import { crLabelKey, DBReconfigStatusMap } from '@/constants/db';
import { authSession } from '@/services/backend/auth';
import { getK8s } from '@/services/backend/kubernetes';
import { jsonRes } from '@/services/backend/response';
import { ApiResp } from '@/services/kubernet';
import { KubeBlockOpsRequestType } from '@/types/cluster';
import { DBType, OpsRequestItemType } from '@/types/db';
import { cpuFormatToC, memoryFormatToGi } from '@/utils/tools';
import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(req: NextApiRequest, res: NextApiResponse<ApiResp>) {
try {
const { name } = req.query as {
name: string;
};

const { k8sCustomObjects, namespace } = await getK8s({
kubeconfig: await authSession(req)
});

let labelSelector = `app.kubernetes.io/instance=${name},${crLabelKey}=${name}`;

const opsrequestsList = (await k8sCustomObjects.listNamespacedCustomObject(
'apps.kubeblocks.io',
'v1alpha1',
namespace,
'opsrequests',
undefined,
undefined,
undefined,
undefined,
labelSelector
)) as {
body: {
items: KubeBlockOpsRequestType[];
};
};

const opsrequests = opsrequestsList.body.items
.map((item) => {
const simpleTypes = ['Start', 'Stop', 'Restart'];

const configurations = (() => {
if (simpleTypes.includes(item.spec.type)) {
return [{ parameterName: item.spec.type, newValue: '-', oldValue: '-' }];
}

if (item.spec.type === 'VerticalScaling') {
const componentName = item.spec?.verticalScaling?.[0]?.componentName!;
const oldConfig = item.status?.lastConfiguration?.components?.[componentName];
const newConfig = item.spec?.verticalScaling?.[0];

const changedConfigs = [];

if (oldConfig?.limits?.cpu !== newConfig?.limits?.cpu) {
changedConfigs.push({
parameterName: item.spec.type + 'CPU',
newValue: cpuFormatToC(newConfig?.limits?.cpu) || '-',
oldValue: cpuFormatToC(oldConfig?.limits?.cpu) || '-'
});
}

if (oldConfig?.limits?.memory !== newConfig?.limits?.memory) {
changedConfigs.push({
parameterName: item.spec.type + 'Memory',
newValue: memoryFormatToGi(newConfig?.limits?.memory) || '-',
oldValue: memoryFormatToGi(oldConfig?.limits?.memory) || '-'
});
}

return changedConfigs;
}

if (item.spec.type === 'HorizontalScaling') {
const componentName = item.spec?.horizontalScaling?.[0]?.componentName!;
const oldReplicas =
item.status?.lastConfiguration?.components?.[componentName]?.replicas;
const newReplicas = item.spec?.horizontalScaling?.[0]?.replicas;

return [
{
parameterName: 'HorizontalScaling',
newValue: String(newReplicas || '-'),
oldValue: String(oldReplicas || '-')
}
];
}

if (item.spec.type === 'VolumeExpansion') {
const componentName = item.spec?.volumeExpansion?.[0]?.componentName!;
const oldStorage =
item.status?.lastConfiguration?.components?.[componentName]?.volumeClaimTemplates?.[0]
?.storage;
const newStorage = item.spec?.volumeExpansion?.[0]?.volumeClaimTemplates?.[0]?.storage;

return [
{
parameterName: 'VolumeExpansion',
newValue: String(newStorage || '-'),
oldValue: String(oldStorage || '-')
}
];
}

return [
{
parameterName: item.spec.type,
newValue: '-',
oldValue: '-'
}
];
})();

return {
id: item.metadata.uid,
name: item.metadata.name,
status:
item.status?.phase && DBReconfigStatusMap[item.status.phase]
? DBReconfigStatusMap[item.status.phase]
: DBReconfigStatusMap.Creating,
startTime: new Date(item.metadata.creationTimestamp),
namespace: item.metadata.namespace,
configurations
};
})
.filter((item) => item.configurations.length > 0) as OpsRequestItemType[];

jsonRes(res, {
data: opsrequests
});
} catch (err: any) {
jsonRes(res, {
code: 500,
error: err
});
}
}
Loading
Loading