skyline/src/resources/image.jsx
Hanxiang Gao 4eb68e7fb2 feat: Add initial code of skyline-console
Add initial code of skyline-console

Change-Id: Icba2152a014761f53789357b5085d0779cd0e2a4
2021-06-01 23:29:30 +08:00

217 lines
5.3 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 ImageType from 'components/ImageType';
import { get } from 'lodash';
export const imageStatus = {
active: t('Active'),
saving: t('Saving'),
queued: t('Queued'),
pending_delete: t('Pending Delete'),
killed: t('Killed'),
deactivated: t('Deactivated'),
deleted: t('Deleted'),
};
export const imageVisibility = {
public: t('Public'),
private: t('Private'),
shared: t('Shared'),
// unknown: t('Unknown'),
};
export const imageOS = {
centos: t('CentOS'),
ubuntu: t('Ubuntu'),
fedora: t('Fedora'),
windows: t('Windows'),
debian: t('Debian'),
coreos: t('CoreOS'),
arch: t('Arch'),
freebsd: t('FreeBSD'),
others: t('Others'),
};
export const imageUsage = {
common: t('Common Server'),
ironic: t('Bare Metal'),
ironic_enroll: t('Bare Metal Enroll'),
octavia: t('Load Balancer'),
trove: t('Database'),
magnum: t('Container'),
heat: t('Application Template'),
};
export const imageFormats = {
raw: t('Raw'),
qcow2: t('QCOW2 - QEMU Emulator'),
iso: t('ISO - Optical Disk Image'),
ova: t('OVA - Open Virtual Appliance'),
vdi: t('VDI - Virtual Disk Image'),
vhd: t('VHD - Virtual Hard Disk'),
vmdk: t('VMDK - Virtual Machine Disk'),
aki: t('AKI - Amazon Kernel Image'),
ami: t('AMI - Amazon Machine Image'),
ari: t('ARI - Amazon Ramdisk Image'),
docker: t('Docker'),
ploop: t('PLOOP - Virtuozzo/Parallels Loopback Disk'),
};
export const imageProperties = {
id: t('ID'),
checksum: t('Checksum'),
members: t('Members'),
min_disk: t('Min. Disk'),
min_ram: t('Min. RAM'),
name: t('Name'),
owner: t('Owner'),
tags: t('Tags'),
updated_at: t('Updated At'),
virtual_size: t('Virtual Size'),
visibility: t('Visibility'),
description: t('Description'),
architecture: t('Architecture'),
kernel_id: t('Kernel ID'),
ramdisk_id: t('Ramdisk ID'),
created_at: t('Created At'),
container_format: { label: t('Container Format'), filter: 'uppercase' },
disk_format: { label: t('Disk Format'), filter: 'uppercase' },
is_public: { label: t('Is Public'), filter: 'yesNo' },
type: t('Type'),
protected: { label: t('Protected'), filter: 'yesNo' },
size: { label: t('Size'), filter: 'bytes' },
status: t('Status'),
};
export const transitionStatusList = ['saving', 'queued', 'pending_delete'];
export const isOwnerOrAdmin = (item) => {
const {
project: { id },
hasAdminRole,
} = globals.user;
if (id === item.owner) {
return true;
}
return hasAdminRole;
};
export const isOwner = (item) => {
const {
project: { id },
} = globals.user;
if (id === item.owner) {
return true;
}
return false;
};
export const isSnapshot = (item) => {
const { block_device_mapping: bdm = '[]', image_type } = item;
return (
image_type === 'snapshot' ||
get(JSON.parse(bdm)[0] || {}, 'source_type') === 'snapshot'
);
};
export const canImageCreateInstance = (item) =>
item.status === 'active' && item.usage_type === 'common';
export const canImageCreateIronicInstance = (item) =>
item.status === 'active' && item.usage_type === 'ironic';
export const canSnapshotCreateInstance = (item) => item.status === 'active';
export const getImageSystemTabs = () => {
const valueList = [
'centos',
'ubuntu',
'fedora',
'windows',
'debian',
'coreos',
'arch',
'freebsd',
'others',
];
return valueList.map((value) => {
const label =
value !== 'others'
? value.slice(0, 1).toUpperCase() + value.slice(1)
: t('Others');
return {
label,
value,
component: <ImageType type={value} />,
};
});
};
export const getImageOS = (item) =>
imageOS[item.os_distro] ? item.os_distro : 'others';
export const getImageColumns = (self) => [
{
title: t('Name'),
dataIndex: 'name',
},
{
title: t('Project'),
dataIndex: 'project_name',
hidden: !self.hasAdminRole,
},
{
title: t('Current Project'),
dataIndex: 'owner',
hidden: !self.hasAdminRole,
render: (value) => (value === self.currentProjectId ? t('Yes') : t('No')),
},
{
title: t('System'),
dataIndex: 'os_distro',
render: (value) => imageOS[value] || value,
},
{
title: t('OS Version'),
dataIndex: 'os_version',
},
{
title: t('Min System Disk'),
dataIndex: 'min_disk',
render: (text) => `${text}GB`,
},
{
title: t('Min Memory'),
dataIndex: 'min_ram',
render: (text) => `${text / 1024}GB`,
},
{
title: t('Access Control'),
dataIndex: 'visibility',
render: (value) => imageVisibility[value] || '-',
},
{
title: t('Format'),
dataIndex: 'disk_format',
render: (value) => imageFormats[value] || '-',
},
{
title: t('Image Size'),
dataIndex: 'size',
valueRender: 'formatSize',
},
];