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

Reply via email to