Tomer Saban has uploaded a new change for review. Change subject: webadmin: Fixed VM moving between clusters error. ......................................................................
webadmin: Fixed VM moving between clusters error. When moving vm between clusters(Hosts from different clusters), an error message would appear saying: ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER But, after closing the message the vm would move to the other cluster as meant. This bug was fixed and now no error message appears. Change-Id: I191425b7d6ac53d0f6f9c3d5a3ba53d52e7e8c42 Bug-Url: https://bugzilla.redhat.com/1142629 Signed-off-by: Tomer Saban <tsa...@redhat.com> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 5 files changed, 370 insertions(+), 337 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/34157/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 695051c..b502570 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -1042,10 +1042,10 @@ ACTION_TYPE_FAILED_DISK_PROFILE_NOT_FOUND(ErrorType.BAD_PARAMETERS), ACTION_TYPE_DISK_PROFILE_STORAGE_DOMAIN_NOT_PROVIDED(ErrorType.BAD_PARAMETERS), ACTION_TYPE_DISK_PROFILE_NOT_MATCH_STORAGE_DOMAIN(ErrorType.BAD_PARAMETERS), + ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER(ErrorType.BAD_PARAMETERS), ACTION_TYPE_CPU_PROFILE_CLUSTER_NOT_PROVIDED(ErrorType.BAD_PARAMETERS), ACTION_TYPE_CPU_PROFILE_EMPTY(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_CPU_PROFILE_NOT_FOUND(ErrorType.BAD_PARAMETERS), - ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER(ErrorType.BAD_PARAMETERS), ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER(ErrorType.NOT_SUPPORTED), ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN(ErrorType.NOT_SUPPORTED), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index fb5ab1b..c82f1ad 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1163,6 +1163,7 @@ ACTION_TYPE_FAILED_DISK_PROFILE_NOT_FOUND=Cannot ${action} ${type}. Disk Profile wasn't found. ACTION_TYPE_DISK_PROFILE_STORAGE_DOMAIN_NOT_PROVIDED=Cannot ${action} ${type}. Storage Domain wasn't provided. ACTION_TYPE_DISK_PROFILE_NOT_MATCH_STORAGE_DOMAIN=Cannot ${action} ${type}. Disk Profile doesn't match provided Storage Domain. +ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER=Cannot ${action} ${type}. Disk Profile doesn't match provided Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER=Cannot ${action} ${type}. Cannot remove last CPU profile in Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN=Cannot ${action} ${type}. Cannot remove last Disk profile in Storage Domain. diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index f9a5a87..55ec97b 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -3140,6 +3140,9 @@ @DefaultStringValue("Cannot ${action} ${type}. Disk Profile doesn't match provided Storage Domain.") String ACTION_TYPE_DISK_PROFILE_NOT_MATCH_STORAGE_DOMAIN(); + @DefaultStringValue("Cannot ${action} ${type}. Disk Profile doesn't match provided Cluster.") + String ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER(); + @DefaultStringValue("Cannot ${action} ${type}. Cannot remove last CPU profile in Cluster.") String ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java index 693ad48..be3f917 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java @@ -31,365 +31,393 @@ import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.ExistingVmInstanceTypeManager; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.InstanceTypeManager; -public class ExistingVmModelBehavior extends VmModelBehaviorBase -{ - private InstanceTypeManager instanceTypeManager; +public class ExistingVmModelBehavior extends VmModelBehaviorBase { + private InstanceTypeManager instanceTypeManager; - protected VM vm; + protected VM vm; - private int hostCpu; - private VDS runningOnHost; + private int hostCpu; + private VDS runningOnHost; - public ExistingVmModelBehavior(VM vm) - { - this.vm = vm; - } - - public VM getVm() { - return vm; - } - - public void setVm(VM vm) { - this.vm = vm; - } - - @Override - public void initialize(SystemTreeItemModel systemTreeSelectedItem) { - super.initialize(systemTreeSelectedItem); - - getModel().getVmInitEnabled().setEntity(getVm().getVmInit() != null); - getModel().getVmInitModel().init(getVm().getStaticData()); - getModel().getVmType().setIsChangable(true); - getModel().getIsSoundcardEnabled().setIsChangable(true); - getModel().getInstanceTypes().setIsChangable(!vm.isRunning()); - - loadDataCenter(); - instanceTypeManager = new ExistingVmInstanceTypeManager(getModel(), vm); - - if (vm.getVmPoolId() != null) { - instanceTypeManager.setAlwaysEnabledFieldUpdate(true); + public ExistingVmModelBehavior(VM vm) { + this.vm = vm; } - Frontend.getInstance().runQuery(VdcQueryType.GetVmNumaNodesByVmId, - new IdQueryParameters(vm.getId()), - new AsyncQuery(new INewAsyncCallback() { + public VM getVm() { + return vm; + } - @Override - public void onSuccess(Object model, Object returnValue) { - List<VmNumaNode> nodes = - (List<VmNumaNode>) ((VdcQueryReturnValue) returnValue).getReturnValue(); - ExistingVmModelBehavior.this.getModel().setVmNumaNodes(nodes); - ExistingVmModelBehavior.this.getModel().updateNodeCount(nodes.size()); - } - })); - } + public void setVm(VM vm) { + this.vm = vm; + } - private void loadDataCenter() { - AsyncDataProvider.getInstance().getDataCenterById(new AsyncQuery(getModel(), - new INewAsyncCallback() { - @Override - public void onSuccess(Object target, Object returnValue) { + @Override + public void initialize(SystemTreeItemModel systemTreeSelectedItem) { + super.initialize(systemTreeSelectedItem); - UnitVmModel model = (UnitVmModel) target; - if (returnValue != null) { - StoragePool dataCenter = (StoragePool) returnValue; - final List<StoragePool> dataCenters = - new ArrayList<StoragePool>(Arrays.asList(new StoragePool[]{dataCenter})); + getModel().getVmInitEnabled().setEntity(getVm().getVmInit() != null); + getModel().getVmInitModel().init(getVm().getStaticData()); + getModel().getVmType().setIsChangable(true); + getModel().getIsSoundcardEnabled().setIsChangable(true); + getModel().getInstanceTypes().setIsChangable(!vm.isRunning()); - initClusters(dataCenters); - } else { - ExistingVmModelBehavior behavior = (ExistingVmModelBehavior) model.getBehavior(); - VM currentVm = behavior.vm; - VDSGroup tempVar = new VDSGroup(); - tempVar.setId(currentVm.getVdsGroupId()); - tempVar.setName(currentVm.getVdsGroupName()); - tempVar.setcompatibility_version(currentVm.getVdsGroupCompatibilityVersion()); - tempVar.setStoragePoolId(currentVm.getStoragePoolId()); - VDSGroup cluster = tempVar; - DataCenterWithCluster dataCenterWithCluster = - new DataCenterWithCluster(null, cluster); - model.getDataCenterWithClustersList().setItems(Arrays.asList(dataCenterWithCluster)); - model.getDataCenterWithClustersList().setSelectedItem(dataCenterWithCluster); - behavior.initTemplate(); - behavior.initCdImage(); - } + loadDataCenter(); + instanceTypeManager = new ExistingVmInstanceTypeManager(getModel(), vm); - } - }, - getModel().getHash()), - vm.getStoragePoolId()); - } - - protected void initClusters(final List<StoragePool> dataCenters) { - AsyncDataProvider.getInstance().getClusterListByService( - new AsyncQuery(getModel(), new INewAsyncCallback() { - - @Override - public void onSuccess(Object target, Object returnValue) { - UnitVmModel model = (UnitVmModel) target; - - List<VDSGroup> clusters = (List<VDSGroup>) returnValue; - - List<VDSGroup> filteredClusters = - AsyncDataProvider.getInstance().filterByArchitecture(clusters, vm.getClusterArch()); - - model.setDataCentersAndClusters(model, - dataCenters, - filteredClusters, vm.getVdsGroupId()); - initTemplate(); - initCdImage(); - } - }, getModel().getHash()), - true, false); - } - - @Override - protected void baseTemplateSelectedItemChanged() { - } - - @Override - public void template_SelectedItemChanged() - { - // This method will be called even if a VM created from Blank template. - - // Update model state according to VM properties. - buildModel(vm.getStaticData()); - - getModel().getIsStateless().setIsAvailable(vm.getVmPoolId() == null); - - getModel().getIsRunAndPause().setIsAvailable(vm.getVmPoolId() == null); - - getModel().getCpuSharesAmount().setEntity(vm.getCpuShares()); - updateCpuSharesSelection(); - - updateRngDevice(getVm().getId()); - updateTimeZone(vm.getTimeZone()); - - getModel().getHostCpu().setEntity(vm.isUseHostCpuFlags()); - - // Storage domain and provisioning are not available for an existing VM. - getModel().getStorageDomain().setIsChangable(false); - getModel().getProvisioning().setIsAvailable(false); - getModel().getProvisioning().setEntity(Guid.Empty.equals(vm.getVmtGuid())); - - getModel().getCpuPinning().setEntity(vm.getCpuPinning()); - - getModel().getCustomPropertySheet().deserialize(vm.getCustomProperties()); - - if (isHotSetCpuSupported()) { - // cancel related events while fetching data - getModel().getTotalCPUCores().getEntityChangedEvent().removeListener(getModel()); - getModel().getCoresPerSocket().getSelectedItemChangedEvent().removeListener(getModel()); - getModel().getNumOfSockets().getSelectedItemChangedEvent().removeListener(getModel()); - - AsyncDataProvider.getInstance().getHostById(new AsyncQuery(this, new INewAsyncCallback() { - @Override - public void onSuccess(Object model, Object returnValue) { - ExistingVmModelBehavior existingVmModelBehavior = (ExistingVmModelBehavior) model; - runningOnHost = (VDS) returnValue; - hostCpu = calculateHostCpus(); - existingVmModelBehavior.updateNumOfSockets(); + if (vm.getVmPoolId() != null) { + instanceTypeManager.setAlwaysEnabledFieldUpdate(true); } - }), vm.getRunOnVds()); + + Frontend.getInstance().runQuery(VdcQueryType.GetVmNumaNodesByVmId, + new IdQueryParameters(vm.getId()), + new AsyncQuery(new INewAsyncCallback() { + + @Override + public void onSuccess(Object model, Object returnValue) { + List<VmNumaNode> nodes = (List<VmNumaNode>) ((VdcQueryReturnValue) returnValue) + .getReturnValue(); + ExistingVmModelBehavior.this.getModel().setVmNumaNodes( + nodes); + ExistingVmModelBehavior.this.getModel() + .updateNodeCount(nodes.size()); + } + })); } - updateCpuProfile(vm.getVdsGroupId(), vm.getVdsGroupCompatibilityVersion(), vm.getCpuProfileId()); - } + private void loadDataCenter() { + AsyncDataProvider.getInstance().getDataCenterById( + new AsyncQuery(getModel(), new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { - @Override - protected void buildModel(VmBase vm) { - BuilderExecutor.build(vm, getModel(), - new NameAndDescriptionVmBaseToUnitBuilder(), - new CommentVmBaseToUnitBuilder(), - new CommonVmBaseToUnitBuilder()); - } + UnitVmModel model = (UnitVmModel) target; + if (returnValue != null) { + StoragePool dataCenter = (StoragePool) returnValue; + final List<StoragePool> dataCenters = new ArrayList<StoragePool>( + Arrays.asList(new StoragePool[] { dataCenter })); - private int calculateHostCpus() { - return getModel().getSelectedCluster().getCountThreadsAsCores() ? runningOnHost.getCpuThreads() : runningOnHost.getCpuCores(); - } + initClusters(dataCenters); + } else { + ExistingVmModelBehavior behavior = (ExistingVmModelBehavior) model + .getBehavior(); + VM currentVm = behavior.vm; + VDSGroup tempVar = new VDSGroup(); + tempVar.setId(currentVm.getVdsGroupId()); + tempVar.setName(currentVm.getVdsGroupName()); + tempVar.setcompatibility_version(currentVm + .getVdsGroupCompatibilityVersion()); + tempVar.setStoragePoolId(currentVm + .getStoragePoolId()); + VDSGroup cluster = tempVar; + DataCenterWithCluster dataCenterWithCluster = new DataCenterWithCluster( + null, cluster); + model.getDataCenterWithClustersList().setItems( + Arrays.asList(dataCenterWithCluster)); + model.getDataCenterWithClustersList() + .setSelectedItem(dataCenterWithCluster); + behavior.initTemplate(); + behavior.initCdImage(); + } - @Override - public void postDataCenterWithClusterSelectedItemChanged() - { - updateDefaultHost(); - updateCustomPropertySheet(); - updateNumOfSockets(); - updateQuotaByCluster(vm.getQuotaId(), vm.getQuotaName()); - updateCpuPinningVisibility(); - updateMemoryBalloon(); - updateCpuSharesAvailability(); - updateVirtioScsiAvailability(); - updateOSValues(); - - instanceTypeManager.updateAll(); - } - - @Override - protected void changeDefualtHost() - { - super.changeDefualtHost(); - doChangeDefautlHost(vm.getDedicatedVmForVds()); - } - - @Override - public void defaultHost_SelectedItemChanged() - { - updateCdImage(); - } - - @Override - public void provisioning_SelectedItemChanged() - { - } - - @Override - public void oSType_SelectedItemChanged() { - Integer osType = getModel().getOSType().getSelectedItem(); - - if (osType != null) { - Guid id = basedOnCustomInstanceType() ? vm.getId() : getModel().getInstanceTypes().getSelectedItem().getId(); - updateVirtioScsiEnabledWithoutDetach(id, osType); - } - } - - @Override - public void updateMinAllocatedMemory() - { - DataCenterWithCluster dataCenterWithCluster = getModel().getDataCenterWithClustersList().getSelectedItem(); - if (dataCenterWithCluster == null) { - return; + } + }, getModel().getHash()), vm.getStoragePoolId()); } - VDSGroup cluster = dataCenterWithCluster.getCluster(); + protected void initClusters(final List<StoragePool> dataCenters) { + AsyncDataProvider.getInstance().getClusterListByService( + new AsyncQuery(getModel(), new INewAsyncCallback() { - if (cluster == null) - { - return; + @Override + public void onSuccess(Object target, Object returnValue) { + UnitVmModel model = (UnitVmModel) target; + + List<VDSGroup> clusters = (List<VDSGroup>) returnValue; + + List<VDSGroup> filteredClusters = AsyncDataProvider + .getInstance().filterByArchitecture(clusters, + vm.getClusterArch()); + + model.setDataCentersAndClusters(model, dataCenters, + filteredClusters, vm.getVdsGroupId()); + initTemplate(); + initCdImage(); + } + }, getModel().getHash()), true, false); } - if (getModel().getMemSize().getEntity() < vm.getVmMemSizeMb()) - { - double overCommitFactor = 100.0 / cluster.getmax_vds_memory_over_commit(); - getModel().getMinAllocatedMemory() - .setEntity((int) (getModel().getMemSize().getEntity() * overCommitFactor)); - } - else - { - getModel().getMinAllocatedMemory().setEntity(vm.getMinAllocatedMem()); - } - } - - protected void initTemplate() - { - setupTemplate(vm.getVmtGuid(), vm.isUseLatestVersion()); - } - - public void initCdImage() - { - getModel().getCdImage().setSelectedItem(vm.getIsoPath()); - - boolean hasCd = !StringHelper.isNullOrEmpty(vm.getIsoPath()); - getModel().getCdImage().setIsChangable(hasCd); - getModel().getCdAttached().setEntity(hasCd); - - updateCdImage(); - } - - @Override - public void numOfSocketChanged() { - if (isHotSetCpuSupported()) { - int numOfSockets = extractIntFromListModel(getModel().getNumOfSockets()); - int coresPerSocket = vm.getCpuPerSocket(); - getModel().getTotalCPUCores().setEntity(Integer.toString(numOfSockets * coresPerSocket)); - } else { - super.numOfSocketChanged(); - } - } - - @Override - public void totalCpuCoresChanged() { - if (isHotSetCpuSupported()) { - if (runningOnHost == null) { - return; //async call didn't return with the host yet - } - // must not change the num of cpu per socket so the list has only 1 item - List<Integer> coresPerSockets = Arrays.asList(new Integer[]{vm.getCpuPerSocket()}); - - getModel().getCoresPerSocket().setItems(coresPerSockets); - getModel().getNumOfSockets().setItems(createSocketsRange()); - - getModel().getCoresPerSocket().setSelectedItem(vm.getCpuPerSocket()); - getModel().getNumOfSockets().setSelectedItem(vm.getNumOfSockets()); - - getModel().getNumOfSockets().getSelectedItemChangedEvent().addListener(getModel()); - numOfSocketChanged(); - } else { - super.totalCpuCoresChanged(); - } - } - - /** - * span a list of all possible sockets values - */ - private List<Integer> createSocketsRange() { - List<Integer> res = new ArrayList<Integer>(); - int maxHostCpu = getHostCpu(); - int cpusPerSockets = vm.getCpuPerSocket(); - - for (int i = 1; i <= maxHostCpu; i++) { - // sockets stepping must not exceed the host maximum - if (i * cpusPerSockets <= maxHostCpu) { - res.add(i); - } - } - return res; - } - - public boolean isHotSetCpuSupported() { - VDSGroup selectedCluster = getModel().getSelectedCluster(); - Version clusterVersion = selectedCluster.getcompatibility_version(); - Boolean hotplugEnabled = (Boolean) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.HotPlugEnabled, clusterVersion.getValue()); - boolean hotplugCpuSupported = Boolean.parseBoolean(((Map<String, String>) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.HotPlugCpuSupported, - clusterVersion.getValue())).get(selectedCluster.getArchitecture().name())); - - return getVm().getStatus() == VMStatus.Up && hotplugEnabled && hotplugCpuSupported; - } - - public int getHostCpu() { - return hostCpu; - } - - @Override - public void enableSinglePCI(boolean enabled) { - super.enableSinglePCI(enabled); - if (getInstanceTypeManager() != null) { - getInstanceTypeManager().maybeSetSingleQxlPci(vm.getStaticData()); - } - } - - @Override - public ExistingVmInstanceTypeManager getInstanceTypeManager() { - return (ExistingVmInstanceTypeManager) instanceTypeManager; - } - - @Override - protected VM getVmWithNuma() { - VM dummyVm = super.getVmWithNuma(); - dummyVm.setId(vm.getId()); - List<VmNumaNode> vmNumaNodes = getModel().getVmNumaNodes(); - if (vmNumaNodes != null && !vmNumaNodes.isEmpty() && vmNumaNodes.size() == dummyVm.getvNumaNodeList().size()) { - dummyVm.setvNumaNodeList(vmNumaNodes); + @Override + protected void baseTemplateSelectedItemChanged() { } - return dummyVm; - } + @Override + public void template_SelectedItemChanged() { + // This method will be called even if a VM created from Blank template. - @Override - protected void updateNumaEnabled() { - super.updateNumaEnabled(); - updateNumaEnabledHelper(); - if (Boolean.TRUE.equals(getModel().getNumaEnabled().getEntity()) && getModel().getVmNumaNodes() != null) { - getModel().getNumaNodeCount().setEntity(getModel().getVmNumaNodes().size()); + // Update model state according to VM properties. + buildModel(vm.getStaticData()); + + getModel().getIsStateless().setIsAvailable(vm.getVmPoolId() == null); + + getModel().getIsRunAndPause().setIsAvailable(vm.getVmPoolId() == null); + + getModel().getCpuSharesAmount().setEntity(vm.getCpuShares()); + updateCpuSharesSelection(); + + updateRngDevice(getVm().getId()); + updateTimeZone(vm.getTimeZone()); + + getModel().getHostCpu().setEntity(vm.isUseHostCpuFlags()); + + // Storage domain and provisioning are not available for an existing VM. + getModel().getStorageDomain().setIsChangable(false); + getModel().getProvisioning().setIsAvailable(false); + getModel().getProvisioning().setEntity( + Guid.Empty.equals(vm.getVmtGuid())); + + getModel().getCpuPinning().setEntity(vm.getCpuPinning()); + + getModel().getCustomPropertySheet().deserialize( + vm.getCustomProperties()); + + if (isHotSetCpuSupported()) { + // cancel related events while fetching data + getModel().getTotalCPUCores().getEntityChangedEvent() + .removeListener(getModel()); + getModel().getCoresPerSocket().getSelectedItemChangedEvent() + .removeListener(getModel()); + getModel().getNumOfSockets().getSelectedItemChangedEvent() + .removeListener(getModel()); + + AsyncDataProvider.getInstance().getHostById( + new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + ExistingVmModelBehavior existingVmModelBehavior = (ExistingVmModelBehavior) model; + runningOnHost = (VDS) returnValue; + hostCpu = calculateHostCpus(); + existingVmModelBehavior.updateNumOfSockets(); + } + }), vm.getRunOnVds()); + } } - } + + @Override + public void dataCenterWithClusterSelectedItemChanged() { + super.dataCenterWithClusterSelectedItemChanged(); + + if (getModel().getSelectedCluster() != null) { + updateCpuProfile(getModel().getSelectedCluster().getId(), + getClusterCompatibilityVersion(), vm.getCpuProfileId()); + } + + } + + @Override + protected void buildModel(VmBase vm) { + BuilderExecutor.build(vm, getModel(), + new NameAndDescriptionVmBaseToUnitBuilder(), + new CommentVmBaseToUnitBuilder(), + new CommonVmBaseToUnitBuilder()); + } + + private int calculateHostCpus() { + return getModel().getSelectedCluster().getCountThreadsAsCores() ? runningOnHost + .getCpuThreads() : runningOnHost.getCpuCores(); + } + + @Override + public void postDataCenterWithClusterSelectedItemChanged() { + updateDefaultHost(); + updateCustomPropertySheet(); + updateNumOfSockets(); + updateQuotaByCluster(vm.getQuotaId(), vm.getQuotaName()); + updateCpuPinningVisibility(); + updateMemoryBalloon(); + updateCpuSharesAvailability(); + updateVirtioScsiAvailability(); + updateOSValues(); + + instanceTypeManager.updateAll(); + } + + @Override + protected void changeDefualtHost() { + super.changeDefualtHost(); + doChangeDefautlHost(vm.getDedicatedVmForVds()); + } + + @Override + public void defaultHost_SelectedItemChanged() { + updateCdImage(); + } + + @Override + public void provisioning_SelectedItemChanged() { + } + + @Override + public void oSType_SelectedItemChanged() { + Integer osType = getModel().getOSType().getSelectedItem(); + + if (osType != null) { + Guid id = basedOnCustomInstanceType() ? vm.getId() : getModel() + .getInstanceTypes().getSelectedItem().getId(); + updateVirtioScsiEnabledWithoutDetach(id, osType); + } + } + + @Override + public void updateMinAllocatedMemory() { + DataCenterWithCluster dataCenterWithCluster = getModel() + .getDataCenterWithClustersList().getSelectedItem(); + if (dataCenterWithCluster == null) { + return; + } + + VDSGroup cluster = dataCenterWithCluster.getCluster(); + + if (cluster == null) { + return; + } + + if (getModel().getMemSize().getEntity() < vm.getVmMemSizeMb()) { + double overCommitFactor = 100.0 / cluster + .getmax_vds_memory_over_commit(); + getModel() + .getMinAllocatedMemory() + .setEntity( + (int) (getModel().getMemSize().getEntity() * overCommitFactor)); + } else { + getModel().getMinAllocatedMemory().setEntity( + vm.getMinAllocatedMem()); + } + } + + protected void initTemplate() { + setupTemplate(vm.getVmtGuid(), vm.isUseLatestVersion()); + } + + public void initCdImage() { + getModel().getCdImage().setSelectedItem(vm.getIsoPath()); + + boolean hasCd = !StringHelper.isNullOrEmpty(vm.getIsoPath()); + getModel().getCdImage().setIsChangable(hasCd); + getModel().getCdAttached().setEntity(hasCd); + + updateCdImage(); + } + + @Override + public void numOfSocketChanged() { + if (isHotSetCpuSupported()) { + int numOfSockets = extractIntFromListModel(getModel() + .getNumOfSockets()); + int coresPerSocket = vm.getCpuPerSocket(); + getModel().getTotalCPUCores().setEntity( + Integer.toString(numOfSockets * coresPerSocket)); + } else { + super.numOfSocketChanged(); + } + } + + @Override + public void totalCpuCoresChanged() { + if (isHotSetCpuSupported()) { + if (runningOnHost == null) { + return; // async call didn't return with the host yet + } + // must not change the num of cpu per socket so the list has only 1 + // item + List<Integer> coresPerSockets = Arrays.asList(new Integer[] { vm + .getCpuPerSocket() }); + + getModel().getCoresPerSocket().setItems(coresPerSockets); + getModel().getNumOfSockets().setItems(createSocketsRange()); + + getModel().getCoresPerSocket() + .setSelectedItem(vm.getCpuPerSocket()); + getModel().getNumOfSockets().setSelectedItem(vm.getNumOfSockets()); + + getModel().getNumOfSockets().getSelectedItemChangedEvent() + .addListener(getModel()); + numOfSocketChanged(); + } else { + super.totalCpuCoresChanged(); + } + } + + /** + * span a list of all possible sockets values + */ + private List<Integer> createSocketsRange() { + List<Integer> res = new ArrayList<Integer>(); + int maxHostCpu = getHostCpu(); + int cpusPerSockets = vm.getCpuPerSocket(); + + for (int i = 1; i <= maxHostCpu; i++) { + // sockets stepping must not exceed the host maximum + if (i * cpusPerSockets <= maxHostCpu) { + res.add(i); + } + } + return res; + } + + public boolean isHotSetCpuSupported() { + VDSGroup selectedCluster = getModel().getSelectedCluster(); + Version clusterVersion = selectedCluster.getcompatibility_version(); + Boolean hotplugEnabled = (Boolean) AsyncDataProvider.getInstance() + .getConfigValuePreConverted(ConfigurationValues.HotPlugEnabled, + clusterVersion.getValue()); + boolean hotplugCpuSupported = Boolean + .parseBoolean(((Map<String, String>) AsyncDataProvider + .getInstance().getConfigValuePreConverted( + ConfigurationValues.HotPlugCpuSupported, + clusterVersion.getValue())).get(selectedCluster + .getArchitecture().name())); + + return getVm().getStatus() == VMStatus.Up && hotplugEnabled + && hotplugCpuSupported; + } + + public int getHostCpu() { + return hostCpu; + } + + @Override + public void enableSinglePCI(boolean enabled) { + super.enableSinglePCI(enabled); + if (getInstanceTypeManager() != null) { + getInstanceTypeManager().maybeSetSingleQxlPci(vm.getStaticData()); + } + } + + @Override + public ExistingVmInstanceTypeManager getInstanceTypeManager() { + return (ExistingVmInstanceTypeManager) instanceTypeManager; + } + + @Override + protected VM getVmWithNuma() { + VM dummyVm = super.getVmWithNuma(); + dummyVm.setId(vm.getId()); + List<VmNumaNode> vmNumaNodes = getModel().getVmNumaNodes(); + if (vmNumaNodes != null && !vmNumaNodes.isEmpty() + && vmNumaNodes.size() == dummyVm.getvNumaNodeList().size()) { + dummyVm.setvNumaNodeList(vmNumaNodes); + } + + return dummyVm; + } + + @Override + protected void updateNumaEnabled() { + super.updateNumaEnabled(); + updateNumaEnabledHelper(); + if (Boolean.TRUE.equals(getModel().getNumaEnabled().getEntity()) + && getModel().getVmNumaNodes() != null) { + getModel().getNumaNodeCount().setEntity( + getModel().getVmNumaNodes().size()); + } + } } diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index be087ee..b7c1699 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1132,6 +1132,7 @@ ACTION_TYPE_FAILED_DISK_PROFILE_NOT_FOUND=Cannot ${action} ${type}. Disk Profile wasn't found. ACTION_TYPE_DISK_PROFILE_STORAGE_DOMAIN_NOT_PROVIDED=Cannot ${action} ${type}. Storage Domain wasn't provided. ACTION_TYPE_DISK_PROFILE_NOT_MATCH_STORAGE_DOMAIN=Cannot ${action} ${type}. Disk Profile doesn't match provided Storage Domain. +ACTION_TYPE_DISK_PROFILE_NOT_MATCH_CLUSTER=Cannot ${action} ${type}. Disk Profile doesn't match provided Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER=Cannot ${action} ${type}. Cannot remove last CPU profile in Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN=Cannot ${action} ${type}. Cannot remove last Disk profile in Storage Domain. -- To view, visit http://gerrit.ovirt.org/34157 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I191425b7d6ac53d0f6f9c3d5a3ba53d52e7e8c42 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Tomer Saban <tsa...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches