skyline/src/pages/storage/containers/Volume/actions/CreateSnapshot.jsx
Jingwei.Zhang fb83a57550 fix: update volume snaphost/backup display
1. Update 'snaphost' to 'volume snaphost', 'backup' to 'volume backup'
2. Update e2e case

Change-Id: I74dee2e2da7cbaac4ba7607c83848b28cfb81cde
2022-07-28 15:48:16 +08:00

150 lines
3.8 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 { inject, observer } from 'mobx-react';
import { ModalAction } from 'containers/Action';
import globalSnapshotStore from 'stores/cinder/snapshot';
import { isAvailableOrInUse } from 'resources/cinder/volume';
import globalProjectStore from 'stores/keystone/project';
const getQuota = (cinderQuota) => {
const { snapshots: snapshotQuota = {} } = cinderQuota;
const { currentVolumeType } = globalSnapshotStore;
const typeQuota = cinderQuota[`snapshots_${currentVolumeType}`] || {};
return {
snapshotQuota,
typeQuota,
};
};
const getAdd = (cinderQuota) => {
const { snapshotQuota, typeQuota } = getQuota(cinderQuota);
const { left: totalLeft = 0 } = snapshotQuota || {};
const { left: typeLeft = 0 } = typeQuota || {};
return totalLeft !== 0 && typeLeft !== 0 ? 1 : 0;
};
export class CreateSnapshot extends ModalAction {
static id = 'create-snapshot';
static title = t('Create Volume Snapshot');
static buttonText = t('Create Snapshot');
init() {
globalSnapshotStore.setCurrentVolumeType(this.item);
this.state.quota = {};
this.state.quotaLoading = true;
this.store = globalSnapshotStore;
this.projectStore = globalProjectStore;
this.getQuota();
}
get name() {
return t('create volume snapshot');
}
get defaultValue() {
const { name, id, volume_type, size } = this.item;
const value = {
volume: `${name || id}(${volume_type} | ${size}GiB)`,
};
return value;
}
static policy = 'volume:create_snapshot';
static allowed = (item) => Promise.resolve(isAvailableOrInUse(item));
static get disableSubmit() {
const { cinderQuota = {} } = globalProjectStore;
const add = getAdd(cinderQuota);
return add === 0;
}
static get showQuota() {
return true;
}
get showQuota() {
return true;
}
async getQuota() {
this.setState({
quotaLoading: true,
});
const result = await this.projectStore.fetchProjectCinderQuota();
this.setState({
quota: result,
quotaLoading: false,
});
}
get quotaInfo() {
const { quota = {}, quotaLoading } = this.state;
if (quotaLoading) {
return [];
}
const { snapshotQuota = {}, typeQuota = {} } = getQuota(quota);
const add = getAdd(quota);
const snapshotData = {
...snapshotQuota,
add,
name: 'snapshot',
title: t('Volume Snapshot'),
};
const { volume_type } = this.item;
const typeData = {
...typeQuota,
add,
name: 'type',
title: t('{name} type snapshots', { name: volume_type }),
type: 'line',
};
return [snapshotData, typeData];
}
get formItems() {
return [
{
name: 'volume',
label: t('Volume'),
type: 'label',
iconType: 'volume',
},
{
name: 'name',
label: t('Volume Snapshot Name'),
type: 'input-name',
placeholder: t('Please input snapshot name'),
required: true,
},
];
}
onSubmit = (values) => {
const { id, status } = this.item;
const { name } = values;
const data = {
name,
volume_id: id,
force: status === 'in-use',
};
return this.store.create(data);
};
}
export default inject('rootStore')(observer(CreateSnapshot));