Merge "refactor: optimize the way to fetch the list of volumes mounted on the instance"
This commit is contained in:
commit
1be5f3509b
@ -13,7 +13,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { inject, observer } from 'mobx-react';
|
import { inject, observer } from 'mobx-react';
|
||||||
import { VolumeStore } from 'stores/cinder/volume';
|
import { InstanceVolumeStore } from 'stores/nova/instance-volume';
|
||||||
import globalServerStore from 'stores/nova/instance';
|
import globalServerStore from 'stores/nova/instance';
|
||||||
import globalRootStore from 'stores/root';
|
import globalRootStore from 'stores/root';
|
||||||
import { ModalAction } from 'containers/Action';
|
import { ModalAction } from 'containers/Action';
|
||||||
@ -27,7 +27,7 @@ export class DetachVolume extends ModalAction {
|
|||||||
|
|
||||||
init() {
|
init() {
|
||||||
this.store = globalServerStore;
|
this.store = globalServerStore;
|
||||||
this.volumeStore = new VolumeStore();
|
this.volumeStore = new InstanceVolumeStore();
|
||||||
this.getVolumes();
|
this.getVolumes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,14 +91,10 @@ export class Volume extends Base {
|
|||||||
|
|
||||||
updateFetchParams = (params) => {
|
updateFetchParams = (params) => {
|
||||||
if (this.inDetailPage) {
|
if (this.inDetailPage) {
|
||||||
const { match, detail } = this.props;
|
const { id, ...rest } = params;
|
||||||
const { id } = match.params;
|
|
||||||
const { tenant_id: projectId, name } = detail || {};
|
|
||||||
return {
|
return {
|
||||||
...params,
|
...rest,
|
||||||
serverId: id,
|
serverId: id,
|
||||||
serverName: name,
|
|
||||||
projectId,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return params;
|
return params;
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { yesNoOptions } from 'utils/constants';
|
import { yesNoOptions } from 'utils/constants';
|
||||||
import { toLocalTimeFilter } from 'utils/index';
|
import { toLocalTimeFilter, renderFilterMap } from 'utils/index';
|
||||||
import globalProjectStore from 'stores/keystone/project';
|
import globalProjectStore from 'stores/keystone/project';
|
||||||
import globalVolumeStore from 'stores/cinder/volume';
|
import globalVolumeStore from 'stores/cinder/volume';
|
||||||
import { isEmpty } from 'lodash';
|
import { isEmpty } from 'lodash';
|
||||||
@ -75,6 +75,19 @@ export const isOsDisk = (item) => {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const updateVolume = (volume) => {
|
||||||
|
return {
|
||||||
|
...volume,
|
||||||
|
disk_tag: isOsDisk(volume) ? 'os_disk' : 'data_disk',
|
||||||
|
description: volume.description || (volume.origin_data || {}).description,
|
||||||
|
delete_interval:
|
||||||
|
volume.metadata && volume.metadata.delete_interval
|
||||||
|
? new Date(renderFilterMap.toLocalTime(volume.updated_at)).getTime() +
|
||||||
|
Number(volume.metadata.delete_interval) * 1000
|
||||||
|
: null,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export const isAttachIsoVolume = (item) => {
|
export const isAttachIsoVolume = (item) => {
|
||||||
if (
|
if (
|
||||||
item.bootable === 'true' &&
|
item.bootable === 'true' &&
|
||||||
@ -239,7 +252,6 @@ export const getVolumeColumnsList = (self) => {
|
|||||||
title: t('ID/Name'),
|
title: t('ID/Name'),
|
||||||
dataIndex: 'name',
|
dataIndex: 'name',
|
||||||
routeName: self.getRouteName('volumeDetail'),
|
routeName: self.getRouteName('volumeDetail'),
|
||||||
stringify: (name, record) => name || record.id,
|
|
||||||
sortKey: 'name',
|
sortKey: 'name',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { action, observable } from 'mobx';
|
import { action, observable } from 'mobx';
|
||||||
import { renderFilterMap } from 'utils/index';
|
|
||||||
import client from 'client';
|
import client from 'client';
|
||||||
import Base from 'stores/base';
|
import Base from 'stores/base';
|
||||||
import globalVolumeTypeStore from 'stores/cinder/volume-type';
|
import globalVolumeTypeStore from 'stores/cinder/volume-type';
|
||||||
@ -64,22 +63,9 @@ export class VolumeStore extends Base {
|
|||||||
return this.skylineClient.extension.volumes(params);
|
return this.skylineClient.extension.volumes(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
isOsDisk(item) {
|
|
||||||
const { isOsDisk } = require('resources/cinder/volume');
|
|
||||||
return isOsDisk(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
get mapper() {
|
get mapper() {
|
||||||
return (volume) => ({
|
const { updateVolume } = require('resources/cinder/volume');
|
||||||
...volume,
|
return (volume) => updateVolume(volume);
|
||||||
disk_tag: this.isOsDisk(volume) ? 'os_disk' : 'data_disk',
|
|
||||||
description: volume.description || (volume.origin_data || {}).description,
|
|
||||||
delete_interval:
|
|
||||||
volume.metadata && volume.metadata.delete_interval
|
|
||||||
? new Date(renderFilterMap.toLocalTime(volume.updated_at)).getTime() +
|
|
||||||
Number(volume.metadata.delete_interval) * 1000
|
|
||||||
: null,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get paramsFunc() {
|
get paramsFunc() {
|
||||||
|
@ -12,9 +12,10 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { isOsDisk } from 'resources/cinder/volume';
|
|
||||||
import client from 'client';
|
import client from 'client';
|
||||||
import Base from 'stores/base';
|
import Base from 'stores/base';
|
||||||
|
import { groupArray } from 'utils/index';
|
||||||
|
import { updateVolume } from 'resources/cinder/volume';
|
||||||
|
|
||||||
export class InstanceVolumeStore extends Base {
|
export class InstanceVolumeStore extends Base {
|
||||||
get client() {
|
get client() {
|
||||||
@ -46,42 +47,30 @@ export class InstanceVolumeStore extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get mapper() {
|
get mapper() {
|
||||||
return (volume) => ({
|
return (volume) => updateVolume(volume);
|
||||||
...volume,
|
|
||||||
disk_tag: isOsDisk(volume) ? 'os_disk' : 'data_disk',
|
|
||||||
host: volume['os-vol-host-attr:host'],
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async listDidFetch(items, allProjects, filters) {
|
get groupArraySize() {
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
async listDidFetch(items, allProjects) {
|
||||||
if (items.length === 0) {
|
if (items.length === 0) {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
const { serverName, serverId } = filters;
|
const volumeIds = items.map((it) => it.volumeId);
|
||||||
const { project_id, project_name } = items[0];
|
const idArray = groupArray(volumeIds, this.groupArraySize);
|
||||||
const results = await Promise.all(
|
const results = await Promise.all(
|
||||||
items.map((it) => {
|
idArray.map((it) => {
|
||||||
const { volumeId } = it;
|
const newParams = { uuid: it, all_projects: allProjects };
|
||||||
return client.cinder.volumes.show(volumeId);
|
return this.skylineClient.extension.volumes(newParams);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
const volumes = results.map((result) => {
|
const resultVolumes = [];
|
||||||
const { volume } = result;
|
results.forEach((result) => {
|
||||||
const { attachments = [] } = volume;
|
resultVolumes.push(...result.volumes);
|
||||||
const newAttachments = attachments.filter(
|
|
||||||
(it) => it.server_id === serverId
|
|
||||||
);
|
|
||||||
newAttachments.forEach((it) => {
|
|
||||||
it.server_name = serverName;
|
|
||||||
});
|
|
||||||
volume.attachments = newAttachments;
|
|
||||||
return {
|
|
||||||
...volume,
|
|
||||||
project_id,
|
|
||||||
project_name,
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
return volumes;
|
return resultVolumes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user