Skip to content

Commit 38ad9be

Browse files
committed
Limit the volume size of new instance to minimum of backup volume size
1 parent 07f24cb commit 38ad9be

File tree

5 files changed

+28
-25
lines changed

5 files changed

+28
-25
lines changed

api/src/main/java/org/apache/cloudstack/backup/BackupManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
161161

162162
List<DiskOfferingInfo> getDataDiskOfferingListFromBackup(Backup backup);
163163

164+
void updateDiskOfferingSizeFromBackup(List<DiskOfferingInfo> dataDiskOfferingsInfo, Backup backup);
165+
164166
Map<String, String> getVmDetailsForBackup(VirtualMachine vm);
165167

166168
Map<String, String> getDiskOfferingDetailsForBackup(Long vmId);

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8873,6 +8873,9 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
88738873
}
88748874

88758875
List<DiskOfferingInfo> dataDiskOfferingsInfo = cmd.getDataDiskOfferingsInfo();
8876+
if (dataDiskOfferingsInfo != null) {
8877+
backupManager.updateDiskOfferingSizeFromBackup(dataDiskOfferingsInfo, backup);
8878+
}
88768879
if (dataDiskOfferingsInfo != null && diskOfferingId != null) {
88778880
new InvalidParameterValueException("Cannot specify both disk offering id and data disk offering details");
88788881
}

server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,16 @@ private Backup.VolumeInfo getVolumeInfo(List<Backup.VolumeInfo> backedUpVolumes,
820820
return null;
821821
}
822822

823+
@Override
824+
public void updateDiskOfferingSizeFromBackup(List<DiskOfferingInfo> dataDiskOfferingsInfo, Backup backup) {
825+
List<DiskOfferingInfo> dataDiskOfferingsInfoFromBackup = getDataDiskOfferingListFromBackup(backup);
826+
int index = 0;
827+
for(DiskOfferingInfo diskOfferingInfo : dataDiskOfferingsInfo) {
828+
diskOfferingInfo.setSize(Math.max(diskOfferingInfo.getSize(), dataDiskOfferingsInfoFromBackup.get(index).getSize()));
829+
index++;
830+
}
831+
}
832+
823833
@Override
824834
public List<DiskOfferingInfo> getDataDiskOfferingListFromBackup(Backup backup) {
825835
List<DiskOfferingInfo> diskOfferingInfoList = new ArrayList<>();
@@ -862,8 +872,7 @@ public List<DiskOfferingInfo> getDataDiskOfferingListFromBackup(Backup backup) {
862872
index++;
863873
continue;
864874
}
865-
Long size = diskOffering.isCustomized() ? diskSizes.get(index) : diskOffering.getDiskSize();
866-
size = size / (1024 * 1024 * 1024);
875+
Long size = diskSizes.get(index) / (1024 * 1024 * 1024);
867876
Long minIops = (diskOffering.isCustomizedIops() != null && diskOffering.isCustomizedIops()) ?
868877
minIopsList.get(index) : null;
869878
Long maxIops = (diskOffering.isCustomizedIops() != null && diskOffering.isCustomizedIops()) ?

ui/src/views/compute/wizard/VolumeDiskOfferingMap.vue

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@
2727

2828
<template #bodyCell="{ column, record }">
2929
<template v-if="column.key === 'name'">
30-
<span>{{ record.displaytext || record.name }}</span>
30+
<span>{{ record.name }}</span>
3131
</template>
3232
<template v-if="column.key === 'offering'">
33-
<span
34-
v-if="validOfferings[record.id] && validOfferings[record.id].length > 0">
33+
<span>
3534
<a-select
3635
@change="updateOfferingSelect($event, record.id)"
3736
:defaultValue="record.diskofferingid"
@@ -40,20 +39,18 @@
4039
:filterOption="(input, option) => {
4140
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
4241
}" >
43-
<a-select-option v-for="offering in validOfferings[record.id]" :key="offering.id" :label="offering.displaytext">
42+
<a-select-option v-for="offering in diskOfferings" :key="offering.id" :label="offering.displaytext">
4443
{{ offering.displaytext }}
4544
</a-select-option>
4645
</a-select>
4746
</span>
48-
<span v-else style="width: 50%">
49-
{{ $t('label.no.matching.offering') }}
50-
</span>
5147
</template>
5248
<template v-if="column.key === 'size'">
5349
<span
5450
v-if="custom[record.id]">
5551
<a-input-number
5652
:defaultValue="record.size"
53+
:min="items[record.id].size"
5754
@change="updateCustomDiskSize($event, record.id)"
5855
/>
5956
</span>
@@ -136,7 +133,6 @@ export default {
136133
],
137134
loading: false,
138135
diskOfferings: [],
139-
validOfferings: {},
140136
tablerows: {},
141137
selectedCustomDiskOffering: null,
142138
values: {
@@ -151,7 +147,7 @@ export default {
151147
computed: {
152148
tableSource () {
153149
return this.tablerows.map(row => {
154-
var disk = { ...row, disabled: this.validOfferings[row.id] && this.validOfferings[row.id].length === 0 }
150+
var disk = { ...row, disabled: this.diskofferings && this.diskOfferings.length === 0 }
155151
var item = this.items.find(item => item.id === row.id)
156152
disk.name = `${item.name} (${item.size} GB)`
157153
return disk
@@ -190,10 +186,6 @@ export default {
190186
},
191187
orderDiskOfferings () {
192188
this.loading = true
193-
this.validOfferings = {}
194-
for (const item of this.items) {
195-
this.validOfferings[item.id] = this.diskOfferings.filter(x => x.disksize >= item.size || (x.iscustomized))
196-
}
197189
this.items.map(x => {
198190
this.custom[x.id] = this.diskOfferings.find(offering => offering.id === x.diskofferingid)?.iscustomized
199191
this.customIops[x.id] = this.diskOfferings.find(offering => offering.id === x.diskofferingid)?.iscustomizediops || false
@@ -233,11 +225,10 @@ export default {
233225
this.values[diskId].offering = value
234226
if (this.diskOfferings.find(x => x.id === value)?.iscustomized) {
235227
this.values[diskId].size = this.items[diskId].size
236-
this.tablerows[diskId].size = this.items[diskId].size
237228
} else {
238-
this.values[diskId].size = this.diskOfferings.find(x => x.id === value)?.disksize
239-
this.tablerows[diskId].size = this.diskOfferings.find(x => x.id === value)?.disksize
229+
this.values[diskId].size = Math.max(this.diskOfferings.find(x => x.id === value)?.disksize, this.items[diskId].size)
240230
}
231+
this.tablerows[diskId].size = this.values[diskId].size
241232
242233
this.values[diskId].iscustomizediops = this.diskOfferings.find(x => x.id === value)?.iscustomizediops || false
243234

ui/src/views/storage/CreateVMFromBackup.vue

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<div v-else class="form">
4141
<DeployVMFromBackup
4242
:preFillContent="dataPreFill"
43-
@close-action="closeModal"/>
43+
@close-action="closeAction"/>
4444
</div>
4545
</div>
4646
</template>
@@ -82,17 +82,18 @@ export default {
8282
this.deviceid = (this.resource.vmdetails.deviceids || '').split(',').map(item => item === 'null' ? '' : item)
8383
const volumes = JSON.parse(this.resource.volumes)
8484
const disksdetails = volumes.map((volume, index) => ({
85-
id: index,
8685
name: volume.path,
8786
type: volume.type,
8887
size: volume.size / (1024 * 1024 * 1024),
8988
diskofferingid: this.diskofferingids[index],
9089
miniops: this.miniops[index],
9190
maxiops: this.maxiops[index],
9291
deviceid: this.deviceid[index]
92+
})).filter(volume => volume.type !== 'ROOT')
93+
this.dataPreFill.datadisksdetails = disksdetails.map((disk, index) => ({
94+
id: index,
95+
...disk
9396
}))
94-
const datadisksdetails = disksdetails.filter(datadisk => datadisk.type !== 'ROOT')
95-
this.dataPreFill.datadisksdetails = datadisksdetails
9697
},
9798
methods: {
9899
setConfigure () {
@@ -101,9 +102,6 @@ export default {
101102
closeAction () {
102103
this.$emit('close-action')
103104
},
104-
closeModal () {
105-
this.$emit('close-action')
106-
},
107105
handleSubmit (e) {
108106
console.log('wizard submit')
109107
e.preventDefault()

0 commit comments

Comments
 (0)