Skip to content

Commit 1b05122

Browse files
Added overrideDiskOfferingId parameter in deploy VM API which will override disk offering for the root disk both in template and ISO case
Added diskSizeStrictness parameter in create Disk offering API which will decide whether to restrict resize or disk offering change of a volume
1 parent 4dab69a commit 1b05122

File tree

14 files changed

+152
-85
lines changed

14 files changed

+152
-85
lines changed

api/src/main/java/com/cloud/vm/UserVmService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s
218218
String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard,
219219
List<Long> affinityGroupIdList, Map<String, String> customParameter, String customId, Map<String, Map<Integer, String>> dhcpOptionMap,
220220
Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap,
221-
Map<String, String> userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException,
221+
Map<String, String> userVmOVFProperties, boolean dynamicScalingEnabled, Long overrideDiskOfferingId) throws InsufficientCapacityException,
222222
ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
223223

224224
/**
@@ -300,7 +300,7 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin
300300
HTTPMethod httpmethod, String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard,
301301
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap,
302302
Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap,
303-
Map<String, String> userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException,
303+
Map<String, String> userVmOVFProperties, boolean dynamicScalingEnabled, Long overrideDiskOfferingId) throws InsufficientCapacityException,
304304
ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
305305

306306
/**
@@ -379,7 +379,7 @@ UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffe
379379
String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData,
380380
String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List<Long> affinityGroupIdList,
381381
Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap, Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap,
382-
Map<String, String> templateOvfPropertiesMap, boolean dynamicScalingEnabled)
382+
Map<String, String> templateOvfPropertiesMap, boolean dynamicScalingEnabled, Long overrideDiskOfferingId)
383383

384384
throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
385385

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,14 @@ public class ApiConstants {
108108
public static final String DISK = "disk";
109109
public static final String DISK_OFFERING_ID = "diskofferingid";
110110
public static final String NEW_DISK_OFFERING_ID = "newdiskofferingid";
111+
public static final String OVERRIDE_DISK_OFFERING_ID = "overridediskofferingid";
111112
public static final String DISK_KBS_READ = "diskkbsread";
112113
public static final String DISK_KBS_WRITE = "diskkbswrite";
113114
public static final String DISK_IO_READ = "diskioread";
114115
public static final String DISK_IO_WRITE = "diskiowrite";
115116
public static final String DISK_IO_PSTOTAL = "diskiopstotal";
116117
public static final String DISK_SIZE = "disksize";
118+
public static final String DISK_SIZE_STRICTNESS = "disksizestrictness";
117119
public static final String DOWNLOAD_DETAILS = "downloaddetails";
118120
public static final String UTILIZATION = "utilization";
119121
public static final String DRIVER = "driver";

api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ public class CreateDiskOfferingCmd extends BaseCmd {
159159
@Parameter(name = ApiConstants.STORAGE_POLICY, type = CommandType.UUID, entityType = VsphereStoragePoliciesResponse.class,required = false, description = "Name of the storage policy defined at vCenter, this is applicable only for VMware", since = "4.15")
160160
private Long storagePolicy;
161161

162+
@Parameter(name = ApiConstants.DISK_SIZE_STRICTNESS, type = CommandType.BOOLEAN, description = "To allow or disallow the resize operation on the disks created from this disk offering, if the flag is true then resize is not allowed")
163+
private Boolean diskSizeStrictness;
164+
162165
@Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "details to specify disk offering parameters", since = "4.16")
163166
private Map details;
164167

@@ -301,6 +304,11 @@ public Map<String, String> getDetails() {
301304
public Long getStoragePolicy() {
302305
return storagePolicy;
303306
}
307+
308+
public boolean getDiskSizeStrictness() {
309+
return diskSizeStrictness != null ? diskSizeStrictness : false;
310+
}
311+
304312
/////////////////////////////////////////////////////
305313
/////////////// API Implementation///////////////////
306314
/////////////////////////////////////////////////////

api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG
239239
description = "true if virtual machine needs to be dynamically scalable")
240240
protected Boolean dynamicScalingEnabled;
241241

242+
@Parameter(name = ApiConstants.OVERRIDE_DISK_OFFERING_ID, type = CommandType.UUID, entityType = DiskOfferingResponse.class, description = "the ID of the disk offering for the virtual machine to be used for root volume instead of the disk offering mapped in service offering." +
243+
"In case of virtual machine deploying from ISO, then the diskofferingid specified for root volume is ignored and uses this override disk offering id")
244+
private Long overrideDiskOfferingId;
245+
242246
/////////////////////////////////////////////////////
243247
/////////////////// Accessors ///////////////////////
244248
/////////////////////////////////////////////////////
@@ -631,6 +635,10 @@ public boolean isDynamicScalingEnabled() {
631635
return dynamicScalingEnabled == null ? true : dynamicScalingEnabled;
632636
}
633637

638+
public Long getOverrideDiskOfferingId() {
639+
return overrideDiskOfferingId;
640+
}
641+
634642
/////////////////////////////////////////////////////
635643
/////////////// API Implementation///////////////////
636644
/////////////////////////////////////////////////////

engine/api/src/main/java/org/apache/cloudstack/engine/service/api/OrchestrationService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,15 @@ VirtualMachineEntity createVirtualMachine(@QueryParam("id") String id, @QueryPar
6767
@QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags,
6868
@QueryParam("network-nic-map") Map<String, List<NicProfile>> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan,
6969
@QueryParam("root-disk-size") Long rootDiskSize, @QueryParam("extra-dhcp-option-map") Map<String, Map<Integer, String>> extraDhcpOptionMap,
70-
@QueryParam("datadisktemplate-diskoffering-map") Map<Long, DiskOffering> datadiskTemplateToDiskOfferingMap) throws InsufficientCapacityException;
70+
@QueryParam("datadisktemplate-diskoffering-map") Map<Long, DiskOffering> datadiskTemplateToDiskOfferingMap, @QueryParam("disk-offering-id") Long diskOfferingId, @QueryParam("root-disk-offering-id") Long rootDiskOfferingId) throws InsufficientCapacityException;
7171

7272
@POST
7373
VirtualMachineEntity createVirtualMachineFromScratch(@QueryParam("id") String id, @QueryParam("owner") String owner, @QueryParam("iso-id") String isoId,
7474
@QueryParam("host-name") String hostName, @QueryParam("display-name") String displayName, @QueryParam("hypervisor") String hypervisor,
7575
@QueryParam("os") String os, @QueryParam("cpu") int cpu, @QueryParam("speed") int speed, @QueryParam("ram") long memory, @QueryParam("disk-size") Long diskSize,
7676
@QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags,
77-
@QueryParam("network-nic-map") Map<String, List<NicProfile>> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan, @QueryParam("extra-dhcp-option-map") Map<String, Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException;
77+
@QueryParam("network-nic-map") Map<String, List<NicProfile>> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan,
78+
@QueryParam("extra-dhcp-option-map") Map<String, Map<Integer, String>> extraDhcpOptionMap, @QueryParam("disk-offering-id") Long diskOfferingId) throws InsufficientCapacityException;
7879

7980
@POST
8081
NetworkEntity createNetwork(String id, String name, String domainName, String cidr, String gateway);

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public void destroyVolume(String volumeEntity) {
156156
@Override
157157
public VirtualMachineEntity createVirtualMachine(String id, String owner, String templateId, String hostName, String displayName, String hypervisor, int cpu,
158158
int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, List<NicProfile>> networkNicMap, DeploymentPlan plan,
159-
Long rootDiskSize, Map<String, Map<Integer, String>> extraDhcpOptionMap, Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException {
159+
Long rootDiskSize, Map<String, Map<Integer, String>> extraDhcpOptionMap, Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap, Long diskOfferingId, Long rootDiskOfferingId) throws InsufficientCapacityException {
160160

161161
// VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks,
162162
// vmEntityManager);
@@ -185,15 +185,14 @@ public VirtualMachineEntity createVirtualMachine(String id, String owner, String
185185

186186
ServiceOfferingVO computeOffering = _serviceOfferingDao.findById(vm.getId(), vm.getServiceOfferingId());
187187

188-
Long diskOfferingId = computeOffering.getDiskOfferingId();
189-
DiskOfferingVO diskOffering = _diskOfferingDao.findById(diskOfferingId);
190-
if (diskOffering == null) {
191-
throw new InvalidParameterValueException("Unable to find disk offering " + diskOfferingId);
188+
DiskOfferingVO rootDiskOffering = _diskOfferingDao.findById(rootDiskOfferingId);
189+
if (rootDiskOffering == null) {
190+
throw new InvalidParameterValueException("Unable to find disk offering " + rootDiskOfferingId);
192191
}
193-
rootDiskOfferingInfo.setDiskOffering(diskOffering);
192+
rootDiskOfferingInfo.setDiskOffering(rootDiskOffering);
194193
rootDiskOfferingInfo.setSize(rootDiskSize);
195194

196-
if (diskOffering.isCustomizedIops() != null && diskOffering.isCustomizedIops()) {
195+
if (rootDiskOffering.isCustomizedIops() != null && rootDiskOffering.isCustomizedIops()) {
197196
Map<String, String> userVmDetails = _userVmDetailsDao.listDetailsKeyPairs(vm.getId());
198197

199198
if (userVmDetails != null) {
@@ -205,34 +204,40 @@ public VirtualMachineEntity createVirtualMachine(String id, String owner, String
205204
}
206205
}
207206

208-
if (!diskOffering.isComputeOnly()) {
209-
Long size = null;
210-
if (diskOffering.getDiskSize() == 0) {
211-
size = diskSize;
212-
if (size == null) {
213-
throw new InvalidParameterValueException("Disk offering " + diskOffering + " requires size parameter.");
214-
}
215-
_volumeMgr.validateVolumeSizeRange(size * 1024 * 1024 * 1024);
207+
if (diskOfferingId != null) {
208+
DiskOfferingVO diskOffering = _diskOfferingDao.findById(diskOfferingId);
209+
if (diskOffering == null) {
210+
throw new InvalidParameterValueException("Unable to find disk offering " + diskOfferingId);
216211
}
212+
if (!diskOffering.isComputeOnly()) {
213+
Long size = null;
214+
if (diskOffering.getDiskSize() == 0) {
215+
size = diskSize;
216+
if (size == null) {
217+
throw new InvalidParameterValueException("Disk offering " + diskOffering + " requires size parameter.");
218+
}
219+
_volumeMgr.validateVolumeSizeRange(size * 1024 * 1024 * 1024);
220+
}
217221

218-
DiskOfferingInfo dataDiskOfferingInfo = new DiskOfferingInfo();
222+
DiskOfferingInfo dataDiskOfferingInfo = new DiskOfferingInfo();
219223

220-
dataDiskOfferingInfo.setDiskOffering(diskOffering);
221-
dataDiskOfferingInfo.setSize(size);
224+
dataDiskOfferingInfo.setDiskOffering(diskOffering);
225+
dataDiskOfferingInfo.setSize(size);
222226

223-
if (diskOffering.isCustomizedIops() != null && diskOffering.isCustomizedIops()) {
224-
Map<String, String> userVmDetails = _userVmDetailsDao.listDetailsKeyPairs(vm.getId());
227+
if (diskOffering.isCustomizedIops() != null && diskOffering.isCustomizedIops()) {
228+
Map<String, String> userVmDetails = _userVmDetailsDao.listDetailsKeyPairs(vm.getId());
225229

226-
if (userVmDetails != null) {
227-
String minIops = userVmDetails.get("minIopsDo");
228-
String maxIops = userVmDetails.get("maxIopsDo");
230+
if (userVmDetails != null) {
231+
String minIops = userVmDetails.get("minIopsDo");
232+
String maxIops = userVmDetails.get("maxIopsDo");
229233

230-
dataDiskOfferingInfo.setMinIops(minIops != null && minIops.trim().length() > 0 ? Long.parseLong(minIops) : null);
231-
dataDiskOfferingInfo.setMaxIops(maxIops != null && maxIops.trim().length() > 0 ? Long.parseLong(maxIops) : null);
234+
dataDiskOfferingInfo.setMinIops(minIops != null && minIops.trim().length() > 0 ? Long.parseLong(minIops) : null);
235+
dataDiskOfferingInfo.setMaxIops(maxIops != null && maxIops.trim().length() > 0 ? Long.parseLong(maxIops) : null);
236+
}
232237
}
233-
}
234238

235-
dataDiskOfferings.add(dataDiskOfferingInfo);
239+
dataDiskOfferings.add(dataDiskOfferingInfo);
240+
}
236241
}
237242

238243
if (dataDiskTemplateToDiskOfferingMap != null && !dataDiskTemplateToDiskOfferingMap.isEmpty()) {
@@ -255,7 +260,8 @@ public VirtualMachineEntity createVirtualMachine(String id, String owner, String
255260

256261
@Override
257262
public VirtualMachineEntity createVirtualMachineFromScratch(String id, String owner, String isoId, String hostName, String displayName, String hypervisor, String os,
258-
int cpu, int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, List<NicProfile>> networkNicMap, DeploymentPlan plan, Map<String, Map<Integer, String>> extraDhcpOptionMap)
263+
int cpu, int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, List<NicProfile>> networkNicMap, DeploymentPlan plan,
264+
Map<String, Map<Integer, String>> extraDhcpOptionMap, Long diskOfferingId)
259265
throws InsufficientCapacityException {
260266

261267
// VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager);
@@ -269,7 +275,6 @@ public VirtualMachineEntity createVirtualMachineFromScratch(String id, String ow
269275

270276
DiskOfferingInfo rootDiskOfferingInfo = new DiskOfferingInfo();
271277

272-
Long diskOfferingId = computeOffering.getDiskOfferingId();
273278
if (diskOfferingId == null) {
274279
throw new InvalidParameterValueException("Installing from ISO requires a disk offering to be specified for the root disk.");
275280
}

engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ ALTER TABLE `cloud`.`service_offering` ADD COLUMN `system_use` tinyint(1) unsign
3333
ALTER TABLE `cloud`.`service_offering` ADD CONSTRAINT `fk_service_offering__disk_offering_id` FOREIGN KEY `fk_service_offering__disk_offering_id`(`disk_offering_id`) REFERENCES `disk_offering`(`id`) ON DELETE CASCADE;
3434
ALTER TABLE `cloud`.`service_offering` ADD COLUMN `disk_offering_strictness` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'strict binding with disk offering or not';
3535

36-
ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `disk_size_strictness` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'allow resize disk when not stri';
36+
ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `disk_size_strictness` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'To allow or disallow the resize operation on the disks created from this offering';
3737
ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `compute_only` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'when set to 1, disk offering has one to one binding with service offering';
3838
ALTER TABLE `cloud`.`disk_offering` DROP COLUMN `type`;
3939

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ protected UserVm createKubernetesNode(String joinIp, int nodeInstance) throws Ma
374374
nodeVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner,
375375
hostName, hostName, null, null, null,
376376
Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(),
377-
null, addrs, null, null, null, customParameterMap, null, null, null, null, true);
377+
null, addrs, null, null, null, customParameterMap, null, null, null, null, true, null);
378378
if (LOGGER.isInfoEnabled()) {
379379
LOGGER.info(String.format("Created node VM : %s, %s in the Kubernetes cluster : %s", hostName, nodeVm.getUuid(), kubernetesCluster.getName()));
380380
}

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ private UserVm createKubernetesControlNode(final Network network, String serverI
211211
controlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner,
212212
hostName, hostName, null, null, null,
213213
Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(),
214-
requestedIps, addrs, null, null, null, customParameterMap, null, null, null, null, true);
214+
requestedIps, addrs, null, null, null, customParameterMap, null, null, null, null, true, null);
215215
if (LOGGER.isInfoEnabled()) {
216216
LOGGER.info(String.format("Created control VM ID: %s, %s in the Kubernetes cluster : %s", controlVm.getUuid(), hostName, kubernetesCluster.getName()));
217217
}
@@ -265,7 +265,7 @@ private UserVm createKubernetesAdditionalControlNode(final String joinIp, final
265265
additionalControlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner,
266266
hostName, hostName, null, null, null,
267267
Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(),
268-
null, addrs, null, null, null, customParameterMap, null, null, null, null, true);
268+
null, addrs, null, null, null, customParameterMap, null, null, null, null, true, null);
269269
if (LOGGER.isInfoEnabled()) {
270270
LOGGER.info(String.format("Created control VM ID : %s, %s in the Kubernetes cluster : %s", additionalControlVm.getUuid(), hostName, kubernetesCluster.getName()));
271271
}

0 commit comments

Comments
 (0)