Skip to content

Commit 2f36997

Browse files
Harikrishna Patnalanitinmeh
authored andcommitted
CLOUDSTACK-3779: Support System vm scaling on VMWare
Marked the system template new system template as dynamicallyScalable - handled upgrade case - moved "dynamicallyScalable" flag to vm_instance table from user_vm_details to support dynamic scaling of system vm Signed off by : Nitin Mehta<nitin.mehta@citrix.com>
1 parent 8ef097e commit 2f36997

10 files changed

Lines changed: 40 additions & 33 deletions

File tree

engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,14 @@ private void updateSystemVmTemplates(Connection conn) {
265265
throw new CloudRuntimeException("Error while updating "+ hypervisorAndTemplateName.getKey() +" systemVm template", e);
266266
}
267267
}
268-
268+
try {
269+
pstmt = conn.prepareStatement("UPDATE `cloud`.`vm_template` set dynamically_scalable = 1 where name = ? and type = 'SYSTEM'");
270+
pstmt.setString(1, NewTemplateNameList.get(HypervisorType.VMware));
271+
pstmt.executeUpdate();
272+
pstmt.close();
273+
} catch (SQLException e) {
274+
throw new CloudRuntimeException("Error while updating dynamically_scalable flag to 1 for SYSTEM template systemvm-vmware-4.2");
275+
}
269276
s_logger.debug("Updating System Vm Template IDs Complete");
270277
}
271278
finally {

engine/schema/src/com/cloud/vm/VMInstanceVO.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi
146146
@Enumerated(value=EnumType.STRING)
147147
protected HypervisorType hypervisorType;
148148

149+
@Column(name = "dynamically_scalable")
150+
protected boolean dynamicallyScalable;
149151

150152
/*
151153
@Column(name="tags")
@@ -491,4 +493,12 @@ public Long getDiskOfferingId() {
491493
return diskOfferingId;
492494
}
493495

496+
public void setDynamicallyScalable(boolean dynamicallyScalable) {
497+
this.dynamicallyScalable = dynamicallyScalable;
498+
}
499+
500+
public Boolean isDynamicallyScalable() {
501+
return this.dynamicallyScalable;
502+
}
503+
494504
}

engine/schema/src/com/cloud/vm/dao/UserVmDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public interface UserVmDao extends GenericDao<UserVmVO, Long> {
4040
* @param userData updates the userData of the vm
4141
* @param displayVm updates the displayvm attribute signifying whether it has to be displayed to the end user or not.
4242
*/
43-
void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm);
43+
void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable);
4444

4545
List<UserVmVO> findDestroyedVms(Date date);
4646

engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,14 @@ public List<UserVmVO> listByAccountAndDataCenter(long accountId, long dcId) {
224224
}
225225

226226
@Override
227-
public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm) {
227+
public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable) {
228228
UserVmVO vo = createForUpdate();
229229
vo.setDisplayName(displayName);
230230
vo.setHaEnabled(enable);
231231
vo.setGuestOSId(osTypeId);
232232
vo.setUserData(userData);
233233
vo.setDisplayVm(displayVm);
234+
vo.setDynamicallyScalable(isDynamicallyScalable);
234235
update(id, vo);
235236
}
236237

plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,8 @@ protected VM createVmFromTemplate(Connection conn, VirtualMachineTO vmSpec, Host
178178
vmr.memoryDynamicMax = vmSpec.getMaxRam();
179179
} else {
180180
//scaling disallowed, set static memory target
181-
if (s_logger.isDebugEnabled()) {
182-
s_logger.warn("Host "+ host.getHostname(conn) +" does not support dynamic scaling");
181+
if (vmSpec.isEnableDynamicallyScaleVm() && !isDmcEnabled(conn, host)) {
182+
s_logger.warn("Host "+ host.getHostname(conn) +" does not support dynamic scaling, so the vm " + vmSpec.getName() + " is not dynamically scalable");
183183
}
184184
vmr.memoryStaticMin = vmSpec.getMinRam();
185185
vmr.memoryStaticMax = vmSpec.getMaxRam();

server/src/com/cloud/hypervisor/HypervisorGuruBase.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,12 @@ protected VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile vmProfile) {
120120
if(detailsInVm != null) {
121121
details.putAll(detailsInVm);
122122
}
123-
if (details.get(VirtualMachine.IsDynamicScalingEnabled) == null || details.get(VirtualMachine.IsDynamicScalingEnabled).isEmpty()) {
124-
to.setEnableDynamicallyScaleVm(false);
125-
} else {
126-
// check if XStools/VMWare tools are present in the VM and dynamic scaling feature is enabled (per zone/global)
127-
to.setEnableDynamicallyScaleVm(details.get(VirtualMachine.IsDynamicScalingEnabled).equals("true") && Boolean.parseBoolean(_configServer.getConfigValue(Config.EnableDynamicallyScaleVm.key(), Config.ConfigurationParameterScope.zone.toString(), vm.getDataCenterId())));
128-
}
129123
to.setDetails(details);
130124
// Workaround to make sure the TO has the UUID we need for Niciri integration
131125
VMInstanceVO vmInstance = _virtualMachineDao.findById(to.getId());
126+
// check if XStools/VMWare tools are present in the VM and dynamic scaling feature is enabled (per zone/global)
127+
Boolean isDynamicallyScalable = vmInstance.isDynamicallyScalable() && Boolean.parseBoolean(_configServer.getConfigValue(Config.EnableDynamicallyScaleVm.key(), Config.ConfigurationParameterScope.zone.toString(), vm.getDataCenterId()));
128+
to.setEnableDynamicallyScaleVm(isDynamicallyScalable);
132129
to.setUuid(vmInstance.getUuid());
133130

134131
//

server/src/com/cloud/server/ManagementServerImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3736,6 +3736,10 @@ public HypervisorCapabilities updateHypervisorCapabilities(Long id, Long maxGues
37363736
@Override
37373737
public VirtualMachine upgradeSystemVM(ScaleSystemVMCmd cmd) throws ResourceUnavailableException, ManagementServerException, VirtualMachineMigrationException, ConcurrentOperationException {
37383738

3739+
VMInstanceVO vmInstance = _vmInstanceDao.findById(cmd.getId());
3740+
if (vmInstance.getHypervisorType() == HypervisorType.XenServer && vmInstance.getState().equals(State.Running)) {
3741+
throw new InvalidParameterValueException("Dynamic Scaling operation is not permitted for this hypervisor on system vm");
3742+
}
37393743
boolean result = _userVmMgr.upgradeVirtualMachine(cmd.getId(), cmd.getServiceOfferingId());
37403744
if(result){
37413745
VirtualMachine vm = _vmInstanceDao.findById(cmd.getId());

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

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,9 +1189,8 @@ public boolean upgradeVirtualMachine(Long vmId, Long newServiceOfferingId) throw
11891189
if(!enableDynamicallyScaleVm){
11901190
throw new PermissionDeniedException("Dynamically scaling virtual machines is disabled for this zone, please contact your admin");
11911191
}
1192-
UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vmId, VirtualMachine.IsDynamicScalingEnabled);
1193-
if (vmDetailVO == null || !Boolean.parseBoolean(vmDetailVO.getValue())) {
1194-
throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have xs tools to support dynamic scaling");
1192+
if (!vmInstance.isDynamicallyScalable()) {
1193+
throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have tools to support dynamic scaling");
11951194
}
11961195

11971196
while (retry-- != 0) { // It's != so that it can match -1.
@@ -1803,18 +1802,11 @@ public UserVm updateVirtualMachine(UpdateVMCmd cmd)
18031802
}
18041803
}
18051804

1806-
if (isDynamicallyScalable != null) {
1807-
UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vm.getId(), VirtualMachine.IsDynamicScalingEnabled);
1808-
if (vmDetailVO == null) {
1809-
vmDetailVO = new UserVmDetailVO(vm.getId(), VirtualMachine.IsDynamicScalingEnabled, isDynamicallyScalable.toString());
1810-
_vmDetailsDao.persist(vmDetailVO);
1811-
} else {
1812-
vmDetailVO.setValue(isDynamicallyScalable.toString());
1813-
_vmDetailsDao.update(vmDetailVO.getId(), vmDetailVO);
1814-
}
1805+
if (isDynamicallyScalable == null) {
1806+
isDynamicallyScalable = vmInstance.isDynamicallyScalable();
18151807
}
18161808

1817-
_vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled);
1809+
_vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled, isDynamicallyScalable);
18181810

18191811
if (updateUserdata) {
18201812
boolean result = updateUserDataInternal(_vmDao.findById(id));
@@ -2716,8 +2708,7 @@ protected UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOf
27162708
owner.getDomainId(), owner.getId(), offering.getId(), userData,
27172709
hostName, diskOfferingId);
27182710
vm.setUuid(uuidName);
2719-
vm.setDetail(VirtualMachine.IsDynamicScalingEnabled, template.isDynamicallyScalable().toString());
2720-
2711+
vm.setDynamicallyScalable(template.isDynamicallyScalable());
27212712
if (sshPublicKey != null) {
27222713
vm.setDetail("SSH.PublicKey", sshPublicKey);
27232714
}

server/test/com/cloud/vm/VirtualMachineManagerImplTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,6 @@ public void testScaleVM2() throws Exception {
265265
long l = 1L;
266266

267267
doReturn(3L).when(_vmInstance).getId();
268-
when(_vmDetailsDao.findDetail(3L, VirtualMachine.IsDynamicScalingEnabled)).thenReturn(_vmDetailVO);
269-
doReturn("true").when(_vmDetailVO).getValue();
270268
when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
271269
ServiceOfferingVO newServiceOffering = getSvcoffering(512);
272270
doReturn(1L).when(_vmInstance).getHostId();

setup/db/db/schema-410to420.sql

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'manage
4343
ALTER TABLE `cloud`.`load_balancer_vm_map` ADD state VARCHAR(40) NULL COMMENT 'service status updated by LB healthcheck manager';
4444

4545
ALTER TABLE `cloud`.`vm_template` ADD COLUMN `dynamically_scalable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory';
46+
ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `dynamically_scalable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if VM contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory';
4647
UPDATE `cloud`.`vm_template` SET dynamically_scalable = 1 WHERE name = "CentOS 5.6(64-bit) no GUI (XenServer)" AND type = "BUILTIN";
48+
UPDATE `cloud`.`vm_template` SET dynamically_scalable = 1 WHERE name = "SystemVM Template (vSphere)" AND type = "SYSTEM";
4749

4850
alter table storage_pool add hypervisor varchar(32);
4951
alter table storage_pool change storage_provider_id storage_provider_name varchar(255);
@@ -1620,7 +1622,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS
16201622
affinity_group.uuid affinity_group_uuid,
16211623
affinity_group.name affinity_group_name,
16221624
affinity_group.description affinity_group_description,
1623-
vm_details.value dynamically_scalable
1625+
vm_instance.dynamically_scalable dynamically_scalable
16241626

16251627
from
16261628
`cloud`.`user_vm`
@@ -1684,10 +1686,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS
16841686
left join
16851687
`cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id
16861688
left join
1687-
`cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id
1688-
left join
1689-
`cloud`.`user_vm_details` vm_details ON vm_details.vm_id = vm_instance.id
1690-
and vm_details.name = 'enable.dynamic.scaling';
1689+
`cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id;
16911690

16921691
DROP VIEW IF EXISTS `cloud`.`volume_view`;
16931692
CREATE VIEW `cloud`.`volume_view` AS

0 commit comments

Comments
 (0)