You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ni...@apache.org on 2013/07/29 10:42:43 UTC
git commit: updated refs/heads/4.2 to 4d35d92
Updated Branches:
refs/heads/4.2 2b42a2717 -> 4d35d9220
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<ni...@citrix.com>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4d35d922
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4d35d922
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4d35d922
Branch: refs/heads/4.2
Commit: 4d35d92208c9b63ca27c794508d4c534fa773078
Parents: 2b42a27
Author: Harikrishna Patnala <ha...@citrix.com>
Authored: Mon Jul 29 14:12:05 2013 +0530
Committer: Nitin Mehta <ni...@citrix.com>
Committed: Mon Jul 29 14:12:24 2013 +0530
----------------------------------------------------------------------
.../com/cloud/upgrade/dao/Upgrade410to420.java | 9 ++++++++-
.../schema/src/com/cloud/vm/VMInstanceVO.java | 10 ++++++++++
.../schema/src/com/cloud/vm/dao/UserVmDao.java | 2 +-
.../src/com/cloud/vm/dao/UserVmDaoImpl.java | 3 ++-
.../xen/resource/XenServer56FP1Resource.java | 4 ++--
.../cloud/hypervisor/HypervisorGuruBase.java | 9 +++------
.../com/cloud/server/ManagementServerImpl.java | 4 ++++
server/src/com/cloud/vm/UserVmManagerImpl.java | 21 ++++++--------------
.../cloud/vm/VirtualMachineManagerImplTest.java | 2 --
setup/db/db/schema-410to420.sql | 9 ++++-----
10 files changed, 40 insertions(+), 33 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
index a004a79..e8ca579 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
@@ -264,7 +264,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 {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/engine/schema/src/com/cloud/vm/VMInstanceVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/VMInstanceVO.java b/engine/schema/src/com/cloud/vm/VMInstanceVO.java
index e1d2892..8cf7fd0 100644
--- a/engine/schema/src/com/cloud/vm/VMInstanceVO.java
+++ b/engine/schema/src/com/cloud/vm/VMInstanceVO.java
@@ -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;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/engine/schema/src/com/cloud/vm/dao/UserVmDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDao.java
index b4f9991..fa406d3 100755
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDao.java
@@ -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);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
index 1c11563..8afce09 100755
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
@@ -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);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
index 11a7b42..d230be1 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
@@ -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();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
index ec68529..478baf3 100644
--- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
+++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
@@ -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());
//
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index d32441c..996c693 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -3723,6 +3723,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());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 36432f4..0ec296e 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -1194,9 +1194,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
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.
@@ -1819,18 +1818,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
}
}
- 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));
@@ -2732,8 +2724,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
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);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
index f67695d..4da33e6 100644
--- a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -239,8 +239,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();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4d35d922/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index 8446e0f..5b71ca2 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -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);
@@ -1621,7 +1623,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`
@@ -1685,10 +1687,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