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>
This commit is contained in:
Harikrishna Patnala 2013-07-29 15:24:59 +05:30 committed by Nitin Mehta
parent 8ef097ef6e
commit 2f369973e2
10 changed files with 40 additions and 33 deletions

View File

@ -265,7 +265,14 @@ public class Upgrade410to420 implements DbUpgrade {
throw new CloudRuntimeException("Error while updating "+ hypervisorAndTemplateName.getKey() +" systemVm template", e);
}
}
try {
pstmt = conn.prepareStatement("UPDATE `cloud`.`vm_template` set dynamically_scalable = 1 where name = ? and type = 'SYSTEM'");
pstmt.setString(1, NewTemplateNameList.get(HypervisorType.VMware));
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException e) {
throw new CloudRuntimeException("Error while updating dynamically_scalable flag to 1 for SYSTEM template systemvm-vmware-4.2");
}
s_logger.debug("Updating System Vm Template IDs Complete");
}
finally {

View File

@ -146,6 +146,8 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi
@Enumerated(value=EnumType.STRING)
protected HypervisorType hypervisorType;
@Column(name = "dynamically_scalable")
protected boolean dynamicallyScalable;
/*
@Column(name="tags")
@ -491,4 +493,12 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi
return diskOfferingId;
}
public void setDynamicallyScalable(boolean dynamicallyScalable) {
this.dynamicallyScalable = dynamicallyScalable;
}
public Boolean isDynamicallyScalable() {
return this.dynamicallyScalable;
}
}

View File

@ -40,7 +40,7 @@ public interface UserVmDao extends GenericDao<UserVmVO, Long> {
* @param userData updates the userData of the vm
* @param displayVm updates the displayvm attribute signifying whether it has to be displayed to the end user or not.
*/
void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm);
void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable);
List<UserVmVO> findDestroyedVms(Date date);

View File

@ -224,13 +224,14 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
}
@Override
public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm) {
public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable) {
UserVmVO vo = createForUpdate();
vo.setDisplayName(displayName);
vo.setHaEnabled(enable);
vo.setGuestOSId(osTypeId);
vo.setUserData(userData);
vo.setDisplayVm(displayVm);
vo.setDynamicallyScalable(isDynamicallyScalable);
update(id, vo);
}

View File

@ -178,8 +178,8 @@ public class XenServer56FP1Resource extends XenServer56Resource {
vmr.memoryDynamicMax = vmSpec.getMaxRam();
} else {
//scaling disallowed, set static memory target
if (s_logger.isDebugEnabled()) {
s_logger.warn("Host "+ host.getHostname(conn) +" does not support dynamic scaling");
if (vmSpec.isEnableDynamicallyScaleVm() && !isDmcEnabled(conn, host)) {
s_logger.warn("Host "+ host.getHostname(conn) +" does not support dynamic scaling, so the vm " + vmSpec.getName() + " is not dynamically scalable");
}
vmr.memoryStaticMin = vmSpec.getMinRam();
vmr.memoryStaticMax = vmSpec.getMaxRam();

View File

@ -120,15 +120,12 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
if(detailsInVm != null) {
details.putAll(detailsInVm);
}
if (details.get(VirtualMachine.IsDynamicScalingEnabled) == null || details.get(VirtualMachine.IsDynamicScalingEnabled).isEmpty()) {
to.setEnableDynamicallyScaleVm(false);
} else {
// check if XStools/VMWare tools are present in the VM and dynamic scaling feature is enabled (per zone/global)
to.setEnableDynamicallyScaleVm(details.get(VirtualMachine.IsDynamicScalingEnabled).equals("true") && Boolean.parseBoolean(_configServer.getConfigValue(Config.EnableDynamicallyScaleVm.key(), Config.ConfigurationParameterScope.zone.toString(), vm.getDataCenterId())));
}
to.setDetails(details);
// Workaround to make sure the TO has the UUID we need for Niciri integration
VMInstanceVO vmInstance = _virtualMachineDao.findById(to.getId());
// check if XStools/VMWare tools are present in the VM and dynamic scaling feature is enabled (per zone/global)
Boolean isDynamicallyScalable = vmInstance.isDynamicallyScalable() && Boolean.parseBoolean(_configServer.getConfigValue(Config.EnableDynamicallyScaleVm.key(), Config.ConfigurationParameterScope.zone.toString(), vm.getDataCenterId()));
to.setEnableDynamicallyScaleVm(isDynamicallyScalable);
to.setUuid(vmInstance.getUuid());
//

View File

@ -3736,6 +3736,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
@Override
public VirtualMachine upgradeSystemVM(ScaleSystemVMCmd cmd) throws ResourceUnavailableException, ManagementServerException, VirtualMachineMigrationException, ConcurrentOperationException {
VMInstanceVO vmInstance = _vmInstanceDao.findById(cmd.getId());
if (vmInstance.getHypervisorType() == HypervisorType.XenServer && vmInstance.getState().equals(State.Running)) {
throw new InvalidParameterValueException("Dynamic Scaling operation is not permitted for this hypervisor on system vm");
}
boolean result = _userVmMgr.upgradeVirtualMachine(cmd.getId(), cmd.getServiceOfferingId());
if(result){
VirtualMachine vm = _vmInstanceDao.findById(cmd.getId());

View File

@ -1189,9 +1189,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
if(!enableDynamicallyScaleVm){
throw new PermissionDeniedException("Dynamically scaling virtual machines is disabled for this zone, please contact your admin");
}
UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vmId, VirtualMachine.IsDynamicScalingEnabled);
if (vmDetailVO == null || !Boolean.parseBoolean(vmDetailVO.getValue())) {
throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have xs tools to support dynamic scaling");
if (!vmInstance.isDynamicallyScalable()) {
throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have tools to support dynamic scaling");
}
while (retry-- != 0) { // It's != so that it can match -1.
@ -1803,18 +1802,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
}
if (isDynamicallyScalable != null) {
UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vm.getId(), VirtualMachine.IsDynamicScalingEnabled);
if (vmDetailVO == null) {
vmDetailVO = new UserVmDetailVO(vm.getId(), VirtualMachine.IsDynamicScalingEnabled, isDynamicallyScalable.toString());
_vmDetailsDao.persist(vmDetailVO);
} else {
vmDetailVO.setValue(isDynamicallyScalable.toString());
_vmDetailsDao.update(vmDetailVO.getId(), vmDetailVO);
}
if (isDynamicallyScalable == null) {
isDynamicallyScalable = vmInstance.isDynamicallyScalable();
}
_vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled);
_vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled, isDynamicallyScalable);
if (updateUserdata) {
boolean result = updateUserDataInternal(_vmDao.findById(id));
@ -2716,8 +2708,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
owner.getDomainId(), owner.getId(), offering.getId(), userData,
hostName, diskOfferingId);
vm.setUuid(uuidName);
vm.setDetail(VirtualMachine.IsDynamicScalingEnabled, template.isDynamicallyScalable().toString());
vm.setDynamicallyScalable(template.isDynamicallyScalable());
if (sshPublicKey != null) {
vm.setDetail("SSH.PublicKey", sshPublicKey);
}

View File

@ -265,8 +265,6 @@ public class VirtualMachineManagerImplTest {
long l = 1L;
doReturn(3L).when(_vmInstance).getId();
when(_vmDetailsDao.findDetail(3L, VirtualMachine.IsDynamicScalingEnabled)).thenReturn(_vmDetailVO);
doReturn("true").when(_vmDetailVO).getValue();
when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
ServiceOfferingVO newServiceOffering = getSvcoffering(512);
doReturn(1L).when(_vmInstance).getHostId();

View File

@ -43,7 +43,9 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'manage
ALTER TABLE `cloud`.`load_balancer_vm_map` ADD state VARCHAR(40) NULL COMMENT 'service status updated by LB healthcheck manager';
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';
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';
UPDATE `cloud`.`vm_template` SET dynamically_scalable = 1 WHERE name = "CentOS 5.6(64-bit) no GUI (XenServer)" AND type = "BUILTIN";
UPDATE `cloud`.`vm_template` SET dynamically_scalable = 1 WHERE name = "SystemVM Template (vSphere)" AND type = "SYSTEM";
alter table storage_pool add hypervisor varchar(32);
alter table storage_pool change storage_provider_id storage_provider_name varchar(255);
@ -1620,7 +1622,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS
affinity_group.uuid affinity_group_uuid,
affinity_group.name affinity_group_name,
affinity_group.description affinity_group_description,
vm_details.value dynamically_scalable
vm_instance.dynamically_scalable dynamically_scalable
from
`cloud`.`user_vm`
@ -1684,10 +1686,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS
left join
`cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id
left join
`cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id
left join
`cloud`.`user_vm_details` vm_details ON vm_details.vm_id = vm_instance.id
and vm_details.name = 'enable.dynamic.scaling';
`cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id;
DROP VIEW IF EXISTS `cloud`.`volume_view`;
CREATE VIEW `cloud`.`volume_view` AS