mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
8ef097ef6e
commit
2f369973e2
@ -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 {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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());
|
||||
|
||||
//
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user