mirror of https://github.com/apache/cloudstack.git
storage: add basic B&R support (#64)
This adds basic backup and recovery UI support. Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
parent
2551e2c43f
commit
0aeda824ee
|
|
@ -28,6 +28,11 @@
|
|||
{{ service.name }} : {{ service.provider[0].name }}
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="$route.meta.name === 'backup' && item === 'volumes'">
|
||||
<div v-for="(volume, idx) in JSON.parse(resource[item])" :key="idx">
|
||||
<router-link :to="{ path: '/volume/' + volume.uuid }">{{ volume.type }} - {{ volume.path }}</router-link> ({{ parseFloat(volume.size / (1024.0 * 1024.0 * 1024.0)).toFixed(1) }} GB)
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
{{ resource[item] }}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
</div>
|
||||
<slot name="name">
|
||||
<h4 class="name">
|
||||
{{ resource.displayname || resource.displaytext || resource.name || resource.hostname || resource.username || resource.ipaddress }}
|
||||
{{ resource.displayname || resource.displaytext || resource.name || resource.hostname || resource.username || resource.ipaddress || resource.virtualmachinename }}
|
||||
</h4>
|
||||
<console style="margin-left: 10px" :resource="resource" size="default" v-if="resource.id" />
|
||||
</slot>
|
||||
|
|
@ -214,8 +214,8 @@
|
|||
<div class="resource-detail-item__label">{{ $t('disksize') }}</div>
|
||||
<div class="resource-detail-item__details">
|
||||
<a-icon type="hdd" />
|
||||
<span style="width: 100%;" v-if="resource.volumes">{{ (resource.volumes.reduce((total, item) => total += item.size, 0) / (1024 * 1024 * 1024.0)).toFixed(2) }} GB Storage</span>
|
||||
<span style="width: 100%;" v-else-if="resource.sizegb">{{ resource.sizegb }}</span>
|
||||
<span style="width: 100%;" v-if="$route.meta.name === 'vm' && resource.volumes">{{ (resource.volumes.reduce((total, item) => total += item.size, 0) / (1024 * 1024 * 1024.0)).toFixed(2) }} GB Storage</span>
|
||||
<span style="width: 100%;" v-else-if="resource.sizegb || resource.size">{{ resource.sizegb || (resource.size/1024.0) }}</span>
|
||||
</div>
|
||||
<div style="margin-left: 25px; margin-top: 5px" v-if="resource.diskkbsread && resource.diskkbswrite && resource.diskioread && resource.diskiowrite">
|
||||
<a-tag style="margin-bottom: 5px;">Read {{ toSize(resource.diskkbsread) }}</a-tag>
|
||||
|
|
@ -332,6 +332,17 @@
|
|||
<router-link :to="{ path: '/vpc/' + resource.vpcid }">{{ resource.vpcname || resource.vpcid }}</router-link>
|
||||
</div>
|
||||
</div>
|
||||
<div class="resource-detail-item" v-if="resource.affinitygroup && resource.affinitygroup.length > 0">
|
||||
<div class="resource-detail-item__label">{{ $t('affinitygroup') }}</div>
|
||||
<a-icon type="swap" />
|
||||
<span
|
||||
v-for="(group, index) in resource.affinitygroup"
|
||||
:key="group.id"
|
||||
>
|
||||
<router-link :to="{ path: '/affinitygroup/' + group.id }">{{ group.name }}</router-link>
|
||||
<span v-if="index + 1 < resource.affinitygroup.length">, </span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="resource-detail-item" v-if="resource.serviceofferingname && resource.serviceofferingid">
|
||||
<div class="resource-detail-item__label">{{ $t('serviceofferingname') }}</div>
|
||||
<div class="resource-detail-item__details">
|
||||
|
|
@ -353,6 +364,11 @@
|
|||
<router-link :to="{ path: '/diskoffering/' + resource.diskofferingid }">{{ resource.diskofferingname || resource.diskofferingid }} </router-link>
|
||||
</div>
|
||||
</div>
|
||||
<div class="resource-detail-item" v-if="resource.backupofferingid">
|
||||
<div class="resource-detail-item__label">{{ $t('backupofferingid') }}</div>
|
||||
<a-icon type="cloud-upload" />
|
||||
<router-link :to="{ path: '/backupoffering/' + resource.backupofferingid }">{{ resource.backupofferingname || resource.backupofferingid }} </router-link>
|
||||
</div>
|
||||
<div class="resource-detail-item" v-if="resource.networkofferingid">
|
||||
<div class="resource-detail-item__label">{{ $t('networkofferingid') }}</div>
|
||||
<div class="resource-detail-item__details">
|
||||
|
|
@ -441,16 +457,6 @@
|
|||
<a-icon type="calendar" />{{ resource.created }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="resource-detail-item" v-if="resource.affinitygroup && resource.affinitygroup.length > 0">
|
||||
<a-icon type="swap" />
|
||||
<span
|
||||
v-for="(group, index) in resource.affinitygroup"
|
||||
:key="group.id"
|
||||
>
|
||||
<router-link :to="{ path: '/affinitygroup/' + group.id }">{{ group.name }}</router-link>
|
||||
<span v-if="index + 1 < resource.affinitygroup.length">, </span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="account-center-tags" v-if="$route.meta.related">
|
||||
|
|
|
|||
|
|
@ -45,6 +45,10 @@ export default {
|
|||
name: 'vmsnapshot',
|
||||
title: 'VM Snapshots',
|
||||
param: 'virtualmachineid'
|
||||
}, {
|
||||
name: 'backup',
|
||||
title: 'Backups',
|
||||
param: 'virtualmachineid'
|
||||
}, {
|
||||
name: 'affinitygroup',
|
||||
title: 'Affinity Groups',
|
||||
|
|
@ -125,6 +129,61 @@ export default {
|
|||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'assignVirtualMachineToBackupOffering',
|
||||
icon: 'folder-add',
|
||||
label: 'Assign VM to Backup Offering',
|
||||
dataView: true,
|
||||
args: ['virtualmachineid', 'backupofferingid'],
|
||||
show: (record) => { return !record.backupofferingid },
|
||||
mapping: {
|
||||
virtualmachineid: {
|
||||
value: (record, params) => { return record.id }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'createBackup',
|
||||
icon: 'cloud-upload',
|
||||
label: 'Create Backup',
|
||||
dataView: true,
|
||||
args: ['virtualmachineid'],
|
||||
show: (record) => { return record.backupofferingid },
|
||||
mapping: {
|
||||
virtualmachineid: {
|
||||
value: (record, params) => { return record.id }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'createBackupSchedule',
|
||||
icon: 'schedule',
|
||||
label: 'Configure Backup Schedule',
|
||||
dataView: true,
|
||||
args: ['virtualmachineid', 'intervaltype', 'schedule', 'timezone'],
|
||||
show: (record) => { return record.backupofferingid },
|
||||
mapping: {
|
||||
virtualmachineid: {
|
||||
value: (record, params) => { return record.id }
|
||||
},
|
||||
intervaltype: {
|
||||
options: ['HOURLY', 'DAILY', 'WEEKLY', 'MONTHLY']
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'removeVirtualMachineFromBackupOffering',
|
||||
icon: 'scissor',
|
||||
label: 'Remove VM from Backup Offering',
|
||||
dataView: true,
|
||||
args: ['virtualmachineid', 'forced'],
|
||||
show: (record) => { return record.backupofferingid },
|
||||
mapping: {
|
||||
virtualmachineid: {
|
||||
value: (record, params) => { return record.id }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'attachIso',
|
||||
icon: 'paper-clip',
|
||||
|
|
|
|||
|
|
@ -132,6 +132,26 @@ export default {
|
|||
dataView: true
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: 'backupoffering',
|
||||
title: 'Backup Offerings',
|
||||
icon: 'cloud-upload',
|
||||
permission: ['listBackupOfferings'],
|
||||
columns: ['name', 'description', 'zoneid'],
|
||||
details: ['name', 'id', 'description', 'externalid', 'zone', 'created'],
|
||||
actions: [{
|
||||
api: 'importBackupOffering',
|
||||
icon: 'plus',
|
||||
label: 'Import Offering',
|
||||
listView: true,
|
||||
args: ['name', 'description', 'zoneid', 'externalid']
|
||||
}, {
|
||||
api: 'deleteBackupOffering',
|
||||
icon: 'delete',
|
||||
label: 'Delete Offering',
|
||||
dataView: true
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: 'networkoffering',
|
||||
title: 'Network Offerings',
|
||||
|
|
|
|||
|
|
@ -251,6 +251,58 @@ export default {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'backup',
|
||||
title: 'Backups',
|
||||
icon: 'cloud-upload',
|
||||
permission: ['listBackups'],
|
||||
columns: [{ name: (record) => { return record.virtualmachinename } }, 'status', 'type', 'created', 'account', 'zone'],
|
||||
details: ['virtualmachinename', 'id', 'type', 'externalid', 'size', 'virtualsize', 'volumes', 'backupofferingname', 'zone', 'account', 'domain', 'created'],
|
||||
actions: [
|
||||
{
|
||||
api: 'restoreBackup',
|
||||
icon: 'sync',
|
||||
label: 'Restore Backup',
|
||||
dataView: true
|
||||
},
|
||||
{
|
||||
api: 'restoreVolumeFromBackupAndAttachToVM',
|
||||
icon: 'paper-clip',
|
||||
label: 'Restore Volume and Attach',
|
||||
dataView: true,
|
||||
args: ['backupid', 'virtualmachineid', 'volumeid'],
|
||||
mapping: {
|
||||
backupid: {
|
||||
value: (record) => { return record.id }
|
||||
},
|
||||
volumeid: {
|
||||
options: ['todo: handle custom volume ID']
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'removeVirtualMachineFromBackupOffering',
|
||||
icon: 'scissor',
|
||||
label: 'Expunge Offering Assignment and Delete Backups',
|
||||
dataView: true,
|
||||
args: ['forced', 'virtualmachineid'],
|
||||
mapping: {
|
||||
forced: {
|
||||
value: (record) => { return true }
|
||||
},
|
||||
virtualmachineid: {
|
||||
value: (record) => { return record.virtualmachineid }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
api: 'deleteBackup',
|
||||
icon: 'delete',
|
||||
label: 'Delete Backup',
|
||||
dataView: true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@
|
|||
"add-scaleUpcondition": "Add",
|
||||
"address": "Address",
|
||||
"admin": "Domain Admin",
|
||||
"affinitygroup": "Affinity Group",
|
||||
"agentPassword": "Agent Password",
|
||||
"agentPort": "Agent Port",
|
||||
"agentUsername": "Agent Username",
|
||||
|
|
@ -95,6 +96,7 @@
|
|||
"baremetalCpuCores": "# of CPU Cores",
|
||||
"baremetalMAC": "Host MAC",
|
||||
"baremetalMemory": "Memory (in MB)",
|
||||
"backupofferingid": "Backup Offering",
|
||||
"bcfdeviceid": "ID",
|
||||
"bladeid": "Blade ID",
|
||||
"bootable": "Bootable",
|
||||
|
|
@ -1035,7 +1037,7 @@
|
|||
"volumegroup": "Volume Group",
|
||||
"volumeids": "Volumes to be deleted",
|
||||
"volumename": "Volume Name",
|
||||
"volumes": "Volumes to be deleted",
|
||||
"volumes": "Volumes",
|
||||
"volumetotal": "Volume",
|
||||
"volume.volumeFileUpload.description": "Click or drag file to this area to upload",
|
||||
"vpcLimit": "VPC limits",
|
||||
|
|
|
|||
Loading…
Reference in New Issue