Skip to content

Commit f8220ca

Browse files
authored
Merge pull request #600 from qoxown12/compress
압축중복 제거 기능 수정 및 오류 개선
2 parents 268f66c + 6c28a98 commit f8220ca

File tree

23 files changed

+840
-137
lines changed

23 files changed

+840
-137
lines changed

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,7 @@ public class ApiConstants {
12541254

12551255
public static final String SHAREABLE = "shareable";
12561256
public static final String KVDO_ENABLE = "kvdoenable";
1257+
public static final String KVDO_IN_USE = "kvdoinuse";
12571258
public static final String VBMC_PORT = "vbmcport";
12581259
public static final String IS_TAG_A_RULE = "istagarule";
12591260
public static final String LINK_STATE = "linkstate";

api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListServiceOfferingsCmd.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ public class ListServiceOfferingsCmd extends BaseListProjectAndAccountResourcesC
110110
since = "4.20.0")
111111
private Long templateId;
112112

113+
@Parameter(name = ApiConstants.KVDO_ENABLE, type = CommandType.BOOLEAN,
114+
required=false, description = "Whether to KVDO compression and deduplication the volume",
115+
since = "4.20")
116+
private Boolean kvdoEnable;
117+
113118
/////////////////////////////////////////////////////
114119
/////////////////// Accessors ///////////////////////
115120
/////////////////////////////////////////////////////
@@ -171,6 +176,10 @@ public Long getTemplateId() {
171176
return templateId;
172177
}
173178

179+
public Boolean getKvdoEnable() {
180+
return kvdoEnable;
181+
}
182+
174183
/////////////////////////////////////////////////////
175184
/////////////// API Implementation///////////////////
176185
/////////////////////////////////////////////////////

api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public class GetUploadParamsForTemplateCmd extends AbstractGetUploadParamsCmd {
9595
private String templateTag;
9696

9797
@Parameter(name = ApiConstants.KVDO_ENABLE, type = CommandType.BOOLEAN, description = "Whether to KVDO compression and deduplication the volume", since = "4.20")
98-
private Boolean kvodEnable;
98+
private Boolean kvdoEnable;
9999

100100
@Parameter(name=ApiConstants.DEPLOY_AS_IS,
101101
type = CommandType.BOOLEAN,
@@ -167,7 +167,7 @@ public String getTemplateTag() {
167167
}
168168

169169
public Boolean isKvdoEnable() {
170-
return kvodEnable;
170+
return kvdoEnable;
171171
}
172172

173173
public boolean isDeployAsIs() {

api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd implements User
111111
since = "4.20")
112112
private String arch;
113113

114+
@Parameter(name = ApiConstants.KVDO_ENABLE, type = CommandType.BOOLEAN,
115+
required=false, description = "Whether to KVDO compression and deduplication the volume",
116+
since = "4.20")
117+
private Boolean kvdoEnable;
118+
114119
/////////////////////////////////////////////////////
115120
/////////////////// Accessors ///////////////////////
116121
/////////////////////////////////////////////////////
@@ -183,6 +188,10 @@ public boolean listInReadyState() {
183188
return onlyReady;
184189
}
185190

191+
public Boolean getKvdoEnable() {
192+
return kvdoEnable;
193+
}
194+
186195
@Parameter(name = ApiConstants.SHOW_RESOURCE_ICON, type = CommandType.BOOLEAN, description = "flag to display the resource image for the templates")
187196
private Boolean showIcon;
188197

api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,10 @@ public class UserVmResponse extends BaseResponseWithTagInformation implements Co
412412
@Param(description = "Whether to KVDO compression and deduplication the volume", since = "4.20")
413413
private Boolean kvdoEnable;
414414

415+
@SerializedName(ApiConstants.KVDO_IN_USE)
416+
@Param(description = "Whether the virtual machine uses a compressed/deduplicated volume", since = "4.20")
417+
private Boolean kvdoInUse;
418+
415419
@SerializedName((ApiConstants.VM_TYPE))
416420
@Param(description = "User VM type", since = "4.20.0")
417421
private String vmType;
@@ -1206,6 +1210,7 @@ public String getQemuAgentVersion() {
12061210
public void setQemuAgentVersion(String qemuAgentVersion) {
12071211
this.qemuAgentVersion = qemuAgentVersion;
12081212
}
1213+
12091214
public boolean getKvdoEnable() {
12101215
return kvdoEnable;
12111216
}
@@ -1214,6 +1219,14 @@ public void setKvdoEnable(boolean kvdoEnable) {
12141219
this.kvdoEnable = kvdoEnable;
12151220
}
12161221

1222+
public boolean getKvdoInUse() {
1223+
return kvdoInUse;
1224+
}
1225+
1226+
public void setKvdoInUse(boolean kvdoInUse) {
1227+
this.kvdoInUse = kvdoInUse;
1228+
}
1229+
12171230
public void setVmType(String vmType) {
12181231
this.vmType = vmType;
12191232
}

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5672,10 +5672,6 @@ public String mapRbdDevice(final KVMPhysicalDisk disk, boolean kvdoEnable){
56725672
Script.runSimpleBashScript("rbd map " + disk.getPath() + " --id " + pool.getAuthUserName());
56735673
device = Script.runSimpleBashScript("rbd showmapped | grep \""+splitPoolImage[0]+"[ ]*"+splitPoolImage[1]+"\" | grep -o \"[^ ]*[ ]*$\"");
56745674
}
5675-
5676-
// kvdo가 활성화 되어있음
5677-
device = Script.runSimpleBashScript("rbd showmapped | grep \""+splitPoolImage[0]+"[ ]*"+splitPoolImage[1]+"\" | grep -o \"[^ ]*[ ]*$\"");
5678-
56795675
if(kvdoEnable){
56805676
try {
56815677
createKvdoCmdLine(splitPoolImage[0], pool.getAuthUserName(), splitPoolImage[1], String.valueOf(disk.getSize()));

scripts/storage/qcow2/resizevolume.sh

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,13 @@ notifyqemu() {
101101
image_name="${result//-/}"
102102
partition_name=$(lsblk $devicePath -p -J |jq -r '.blockdevices[0].children[0].name')
103103

104-
parted -f --script $devicePath resizepart 1 100%
104+
parted -s -f $devicePath resizepart 1 100%
105105
pvresize $partition_name
106+
lvresize -l +100%FREE "vg_"$image_name"/ablestack_kvdo"
106107
lvresize -l +100%FREE "vg_"$image_name
107-
lvresize --size $sizeinkb"kb" "vg_"$image_name"/ablestack_kvdo"
108108
devicepath=$(virsh domblklist $vmname | grep "/dev/mapper/vg_$image_name-ablestack_kvdo" | awk '{print $1}')
109+
deviceBytes=$(lvs --units b "vg_$image_name/ablestack_kvdo" | grep ablestack_kvdo | awk '{print $4}' | sed 's/B$//')
110+
sizeinkb=$(($deviceBytes/1024))
109111
fi
110112
virsh blockresize --path $devicepath --size $sizeinkb $vmname >/dev/null 2>&1
111113
retval=$?
@@ -115,6 +117,26 @@ notifyqemu() {
115117
else
116118
liveresize='true'
117119
fi
120+
elif [ "$kvdoenable" == "true" ]; then
121+
# kvdo devicepath
122+
IFS='/' read -r -a image_info <<< "$path"
123+
devicePath=$(rbd showmapped | grep "${image_info[0]}[ ]*${image_info[1]}" | grep -o "[^ ]*[ ]*$")
124+
if [ -z "$devicePath" ]; then
125+
rbd map "${image_info[0]}/${image_info[1]}"
126+
devicePath=$(rbd showmapped | grep "${image_info[0]}[ ]*${image_info[1]}" | grep -o "[^ ]*[ ]*$")
127+
fi
128+
result="${image_info[1]}"
129+
image_name="${result//-/}"
130+
vg_name=vg_$image_name
131+
partition_name=$(lsblk $devicePath -p -J |jq -r '.blockdevices[0].children[0].name')
132+
133+
vgchange -ay $vg_name
134+
parted -s -f $devicePath resizepart 1 100%
135+
pvresize $partition_name
136+
lvresize -l +100%FREE "vg_"$image_name"/ablestack_kvdo"
137+
lvresize -l +100%FREE "vg_"$image_name
138+
vgchange -an $vg_name
139+
rbd unmap "${image_info[0]}/${image_info[1]}"
118140
fi
119141
fi
120142
}
@@ -257,30 +279,30 @@ kflag=
257279
while getopts 'c:s:v:p:t:r:k:' OPTION
258280
do
259281
case $OPTION in
260-
s) sflag=1
261-
newsize="$OPTARG"
262-
;;
282+
s) sflag=1
283+
newsize="$OPTARG"
284+
;;
263285
c) cflag=1
264286
currentsize="$OPTARG"
265287
;;
266-
v) vflag=1
267-
vmname="$OPTARG"
268-
;;
269-
p) dflag=1
270-
path="$OPTARG"
271-
;;
288+
v) vflag=1
289+
vmname="$OPTARG"
290+
;;
291+
p) dflag=1
292+
path="$OPTARG"
293+
;;
272294
t) tflag=1
273295
ptype="$OPTARG"
274296
;;
275297
r) rflag=1
276298
shrink="$OPTARG"
277299
;;
278-
k) kflag=1
279-
kvdoenable="$OPTARG"
280-
;;
281-
?) usage
282-
exit 2
283-
;;
300+
k) kflag=1
301+
kvdoenable="$OPTARG"
302+
;;
303+
?) usage
304+
exit 2
305+
;;
284306
esac
285307
done
286308

@@ -300,4 +322,4 @@ else
300322
exit 1;
301323
fi
302324

303-
exit 0
325+
exit 0

scripts/vm/hypervisor/kvm/create_kvdo.sh

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ partitionExist=$(lsblk $devicePath -p -J |jq -r '.blockdevices[0].children')
6666
vg_name=vg_$(echo $ImageName| sed 's/-//g')
6767
if [ "$partitionExist" == "null" ]; then
6868
# create partition
69-
parted --script $devicePath mklabel gpt
70-
parted --script $devicePath mkpart primary 1 100%
69+
parted -s $devicePath mklabel gpt mkpart primary 0% 100% set 1 lvm on
7170

7271
firstPartitionPath=$(lsblk $devicePath -p -J |jq -r '.blockdevices[0].children[0].name')
7372

@@ -77,7 +76,7 @@ if [ "$partitionExist" == "null" ]; then
7776
# create vg
7877
vgcreate $vg_name $firstPartitionPath
7978

80-
lvcreate --type vdo --name ablestack_kvdo -l +100%FREE --virtualsize $ImageSize"B" $vg_name
79+
lvcreate --type vdo --name ablestack_kvdo -l +100%FREE $vg_name
8180

8281
else
8382
firstPartitionPath=$(lsblk $devicePath -p -J |jq -r '.blockdevices[0].children[0].name')

server/src/main/java/com/cloud/api/query/QueryManagerImpl.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3836,6 +3836,7 @@ private Pair<List<Long>, Integer> searchForServiceOfferingIdsAndCount(ListServic
38363836
String storageType = cmd.getStorageType();
38373837
ServiceOffering.State state = cmd.getState();
38383838
final Long templateId = cmd.getTemplateId();
3839+
Boolean kvdoEnable = cmd.getKvdoEnable();
38393840

38403841
final Account owner = accountMgr.finalizeOwner(caller, accountName, domainId, projectId);
38413842

@@ -4014,10 +4015,11 @@ private Pair<List<Long>, Integer> searchForServiceOfferingIdsAndCount(ListServic
40144015
zone = _dcJoinDao.findById(zoneId);
40154016
}
40164017

4017-
if (encryptRoot != null || vmId != null || (zone != null && DataCenter.Type.Edge.equals(zone.getType()))) {
4018+
if (encryptRoot != null || vmId != null || (zone != null && DataCenter.Type.Edge.equals(zone.getType())) || kvdoEnable != null) {
40184019
SearchBuilder<DiskOfferingVO> diskOfferingSearch = _diskOfferingDao.createSearchBuilder();
40194020
diskOfferingSearch.and("useLocalStorage", diskOfferingSearch.entity().isUseLocalStorage(), SearchCriteria.Op.EQ);
40204021
diskOfferingSearch.and("encrypt", diskOfferingSearch.entity().getEncrypt(), SearchCriteria.Op.EQ);
4022+
diskOfferingSearch.and("kvdoEnable", diskOfferingSearch.entity().getKvdoEnable(), SearchCriteria.Op.EQ);
40214023

40224024
if (diskOffering != null) {
40234025
List<String> storageTags = com.cloud.utils.StringUtils.csvTagsToList(diskOffering.getTags());
@@ -4233,6 +4235,10 @@ private Pair<List<Long>, Integer> searchForServiceOfferingIdsAndCount(ListServic
42334235
sc.setJoinParameters("diskOfferingSearch", "encrypt", encryptRoot);
42344236
}
42354237

4238+
if (kvdoEnable != null) {
4239+
sc.setJoinParameters("diskOfferingSearch", "kvdoEnable", kvdoEnable);
4240+
}
4241+
42364242
if (name != null) {
42374243
sc.setParameters("name", name);
42384244
}
@@ -4593,7 +4599,7 @@ private Pair<List<TemplateJoinVO>, Integer> searchForTemplatesInternal(ListTempl
45934599
null, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), cmd.getStoragePoolId(),
45944600
cmd.getImageStoreId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller,
45954601
listProjectResourcesCriteria, tags, showRemovedTmpl, cmd.getIds(), parentTemplateId, cmd.getShowUnique(),
4596-
templateType, isVnf, cmd.getArch());
4602+
templateType, isVnf, cmd.getArch(), cmd.getKvdoEnable());
45974603
}
45984604

45994605
private Pair<List<TemplateJoinVO>, Integer> searchForTemplatesInternal(Long templateId, String name, String keyword,
@@ -4602,7 +4608,7 @@ private Pair<List<TemplateJoinVO>, Integer> searchForTemplatesInternal(Long temp
46024608
boolean showDomr, boolean onlyReady, List<Account> permittedAccounts, Account caller,
46034609
ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags,
46044610
boolean showRemovedTmpl, List<Long> ids, Long parentTemplateId, Boolean showUnique, String templateType,
4605-
Boolean isVnf, CPU.CPUArch arch) {
4611+
Boolean isVnf, CPU.CPUArch arch, Boolean kvdoEnable) {
46064612

46074613
// check if zone is configured, if not, just return empty list
46084614
List<HypervisorType> hypers = null;
@@ -4648,6 +4654,10 @@ private Pair<List<TemplateJoinVO>, Integer> searchForTemplatesInternal(Long temp
46484654
sc.setJoinParameters("storagePool", "pool_id", storagePoolId);
46494655
}
46504656

4657+
if (kvdoEnable != null) {
4658+
sc.addAnd("kvdoEnable", SearchCriteria.Op.EQ, kvdoEnable);
4659+
}
4660+
46514661
// verify templateId parameter and specially handle it
46524662
if (templateId != null) {
46534663
template = _templateDao.findByIdIncludingRemoved(templateId); // Done for backward compatibility - Bug-5221
@@ -5034,7 +5044,7 @@ private Pair<List<TemplateJoinVO>, Integer> searchForIsosInternal(ListIsosCmd cm
50345044
return searchForTemplatesInternal(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(),
50355045
cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), cmd.getStoragePoolId(), cmd.getImageStoreId(),
50365046
hypervisorType, true, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria,
5037-
tags, showRemovedISO, null, null, cmd.getShowUnique(), null, null, cmd.getArch());
5047+
tags, showRemovedISO, null, null, cmd.getShowUnique(), null, null, cmd.getArch(), null);
50385048
}
50395049

50405050
@Override

server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,11 @@
6464
import com.cloud.storage.VnfTemplateDetailVO;
6565
import com.cloud.storage.VnfTemplateNicVO;
6666
import com.cloud.storage.Volume;
67+
import com.cloud.storage.VolumeVO;
68+
import com.cloud.storage.dao.DiskOfferingDao;
6769
import com.cloud.storage.dao.VnfTemplateDetailsDao;
6870
import com.cloud.storage.dao.VnfTemplateNicDao;
71+
import com.cloud.storage.dao.VolumeDao;
6972
import com.cloud.user.Account;
7073
import com.cloud.user.AccountManager;
7174
import com.cloud.user.User;
@@ -113,6 +116,10 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation<UserVmJo
113116
VnfTemplateNicDao vnfTemplateNicDao;
114117
@Inject
115118
VbmcDao vbmcDao;
119+
@Inject
120+
VolumeDao _volsDao;
121+
@Inject
122+
DiskOfferingDao _diskOfferingDao;
116123

117124
private final SearchBuilder<UserVmJoinVO> VmDetailSearch;
118125
private final SearchBuilder<UserVmJoinVO> activeVmByIsoSearch;
@@ -223,6 +230,17 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us
223230
}
224231
}
225232
userVmResponse.setKvdoEnable(userVm.getKvdoEnable());
233+
userVmResponse.setKvdoInUse(false);
234+
List<VolumeVO> volumesForVm = _volsDao.findUsableVolumesForInstance(userVm.getId());
235+
for (VolumeVO vol : volumesForVm) {
236+
if (vol.getDiskOfferingId() != null) {
237+
DiskOfferingVO diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId());
238+
if (diskOffering.getKvdoEnable()) {
239+
userVmResponse.setKvdoInUse(true);
240+
break;
241+
}
242+
}
243+
}
226244
if (details.contains(VMDetails.all) || details.contains(VMDetails.backoff)) {
227245
userVmResponse.setBackupOfferingId(userVm.getBackupOfferingUuid());
228246
userVmResponse.setBackupOfferingName(userVm.getBackupOfferingName());

0 commit comments

Comments
 (0)