Files
skyline-console/src/resources/volume.jsx
xusongfu 0061ce4f15 feat: Restore volume use snapshot
Restore volume based on its own snapshot

Change-Id: I2e65474d3805b919552fbc16869a8bffda0edd08
2021-08-24 15:28:06 +08:00

215 lines
4.6 KiB
JavaScript

// Copyright 2021 99cloud
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import React from 'react';
import { yesNoOptions } from 'utils/constants';
export const volumeStatus = {
available: t('Available'),
'in-use': t('In-use'),
error: t('Error'),
creating: t('Creating'),
error_extending: t('Error Extending'),
extending: t('Extending'),
downloading: t('Downloading'),
attaching: t('Attaching'),
detaching: t('Detaching'),
deleting: t('Deleting'),
error_deleting: t('Error Deleting'),
'backing-up': t('Backing Up'),
'restoring-backup': t('Restoring Backup'),
error_restoring: t('Error Restoring'),
maintenance: t('Maintained'),
uploading: t('Uploading'),
'awaiting-transfer': t('Awaiting Transfer'),
restoring: t('Restoring'),
rollbacking: t('Restoring'),
retyping: t('Retyping'),
reserved: t('Reserved'),
reverting: t('Reverting'),
};
export const creationMethod = {
manu: t('Manu'),
auto: t('Auto'),
};
export const diskTag = {
os_disk: t('OS Disk'),
data_disk: t('Data Disk'),
};
export const bootableType = {
true: t('Yes'),
false: t('No'),
};
export const isOsDisk = (item) => {
if (item.disk_tag) {
return item.disk_tag === 'os_disk';
}
if (
item.bootable === 'true' &&
item.attachments &&
item.attachments.length !== 0 &&
item.attachments[0].device === '/dev/vda'
) {
return true;
}
return false;
};
export const isAttachIsoVolume = (item) => {
if (
item.bootable === 'true' &&
item.attachments &&
item.attachments.length !== 0 &&
item.attachments[0].device.indexOf('/dev/hd') !== -1
) {
return true;
}
return false;
};
export const volumeTransitionStatuses = [
'creating',
'extending',
'downloading',
'attaching',
'detaching',
'deleting',
'backing-up',
'restoring-backup',
'awaiting-transfer',
'uploading',
'rollbacking',
'retyping',
];
export const snapshotTransitionStatuses = [
'creating',
'deleting',
'updating',
'unmanaging',
'backing-up',
'restoring',
'uploading',
'rollbacking',
];
export const canCreateInstance = (item) =>
item.bootable === 'true' &&
['available', 'downloading'].indexOf(item.status) >= 0;
export const isAvailable = (item) => item.status === 'available';
export const isAvailableOrInUse = (item) =>
item && ['available', 'in-use'].indexOf(item.status) > -1;
export const isInUse = (item) => item.status === 'in-use';
export const isMultiAttach = (item) => item.multiattach;
export const multiTip = t(
'"Shared" volume can be mounted on multiple instances'
);
export const volumeColumns = [
{
title: t('ID/Name'),
dataIndex: 'name',
render: (value, record) => (
<div>
<div>{record.id}</div>
<div>{value || '-'}</div>
</div>
),
},
{
title: t('Type'),
dataIndex: 'volume_type',
sorter: false,
},
{
title: t('Size'),
dataIndex: 'size',
render: (value) => `${value}GB`,
},
{
title: t('Status'),
dataIndex: 'status',
render: (value) => volumeStatus[value] || '-',
},
{
title: t('Shared'),
dataIndex: 'multiattach',
valueRender: 'yesNo',
titleTip: multiTip,
sorter: false,
},
{
title: t('Attached To'),
dataIndex: 'attachments',
isHideable: true,
sorter: false,
render: (value) => {
if (value && value.length > 0) {
return value.map((it) => (
<div key={it.server_id}>
{it.device} on {it.server_name}
</div>
));
}
return '-';
},
},
{
title: t('Created At'),
dataIndex: 'created_at',
valueRender: 'sinceTime',
},
];
export const volumeFilters = [
{
label: t('Name'),
name: 'name',
},
{
label: t('Status'),
name: 'status',
options: ['available', 'in-use', 'error'].map((it) => ({
key: it,
label: volumeStatus[it],
})),
},
{
label: t('Shared'),
name: 'multiattach',
options: yesNoOptions,
},
];
export const volumeSortProps = {
isSortByBack: true,
defaultSortKey: 'created_at',
defaultSortOrder: 'descend',
};
export const volumeSelectTablePropsBackend = {
...volumeSortProps,
filterParams: volumeFilters,
columns: volumeColumns,
};