Greg Padgett has uploaded a new change for review.

Change subject: WIP webadmin: Changes for CPU Overcommit (5/5)
......................................................................

WIP webadmin: Changes for CPU Overcommit (5/5)

This patch series adds support for CPU Overcommitment based on counting
host threads as cores for the purpose of VM startup/shutdown/migration.

Patch 5: UI changes:

 Hosts > General tab - add CPU Sockets, CPU Hyperthreading, change core
     display to CPU Cores per Socket
 Clusters > Add/Edit dialog - new setting in Optimization tab (renamed
     from "Memory Optimization", hidden if CV < 3.2
 Cluster > Configure Local Storage dialog - same as above

Change-Id: Iefa963606074133b3dfcfc1b54fd623519e4ec9e
Signed-off-by: Greg Padgett <gpadg...@redhat.com>
---
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostGeneralModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostGeneralView.java
11 files changed, 453 insertions(+), 212 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/70/10170/1

diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index d313b00..d7576f6 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -2606,6 +2606,11 @@
         return 100;
     }
 
+    public static boolean GetClusterDefaultCountThreadsAsCores()
+    {
+        return false;
+    }
+
     public static ArrayList<VolumeType> GetVolumeTypeList()
     {
         return new ArrayList<VolumeType>(Arrays.asList(new VolumeType[] {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterListModel.java
index 05a71f7..2d6e18d 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterListModel.java
@@ -525,6 +525,8 @@
             cluster.setcpu_name(((ServerCpu) 
model.getCPU().getSelectedItem()).getCpuName());
         }
         cluster.setmax_vds_memory_over_commit(model.getMemoryOverCommit());
+        cluster.setcount_threads_as_cores(((Boolean) 
model.getVersionSupportsCPUOvercommit().getEntity())
+                                       && ((Boolean) 
model.getCountThreadsAsCores().getEntity()));
         cluster.setTransparentHugepages(version.compareTo(new Version("3.0")) 
>= 0); //$NON-NLS-1$
         cluster.setcompatibility_version(version);
         cluster.setMigrateOnError(model.getMigrateOnErrorOption());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java
index b708073..2207a06 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java
@@ -31,7 +31,6 @@
 
 public class ClusterModel extends Model
 {
-
     private int privateServerOverCommit;
 
     public int getServerOverCommit()
@@ -56,16 +55,16 @@
         privateDesktopOverCommit = value;
     }
 
-    private int privateDefaultOverCommit;
+    private int privateDefaultMemoryOvercommit;
 
-    public int getDefaultOverCommit()
+    public int getDefaultMemoryOvercommit()
     {
-        return privateDefaultOverCommit;
+        return privateDefaultMemoryOvercommit;
     }
 
-    public void setDefaultOverCommit(int value)
+    public void setDefaultMemoryOvercommit(int value)
     {
-        privateDefaultOverCommit = value;
+        privateDefaultMemoryOvercommit = value;
     }
 
     private VDSGroup privateEntity;
@@ -358,6 +357,30 @@
         privateOptimizationCustom_IsSelected = value;
     }
 
+    private EntityModel privateCountThreadsAsCores;
+
+    public EntityModel getCountThreadsAsCores()
+    {
+        return privateCountThreadsAsCores;
+    }
+
+    public void setCountThreadsAsCores(EntityModel value)
+    {
+        privateCountThreadsAsCores = value;
+    }
+
+    private EntityModel privateVersionSupportsCPUOvercommit;
+
+    public EntityModel getVersionSupportsCPUOvercommit()
+    {
+        return privateVersionSupportsCPUOvercommit;
+    }
+
+    public void setVersionSupportsCPUOvercommit(EntityModel value)
+    {
+        privateVersionSupportsCPUOvercommit = value;
+    }
+
     private EntityModel privateMigrateOnErrorOption_NO;
 
     public EntityModel getMigrateOnErrorOption_NO()
@@ -613,7 +636,11 @@
 
         // Optimization methods:
         // default value =100;
-        
setDefaultOverCommit(AsyncDataProvider.GetClusterDefaultMemoryOverCommit());
+        
setDefaultMemoryOvercommit(AsyncDataProvider.GetClusterDefaultMemoryOverCommit());
+
+        setCountThreadsAsCores(new 
EntityModel(AsyncDataProvider.GetClusterDefaultCountThreadsAsCores()));
+
+        setVersionSupportsCPUOvercommit(new EntityModel(true));
 
         AsyncQuery _asyncQuery = new AsyncQuery();
         _asyncQuery.setModel(this);
@@ -636,10 +663,10 @@
                         EntityModel temp;
 
                         temp = clusterModel1.getOptimizationNone();
-                        temp.setEntity(clusterModel1.getDefaultOverCommit());
+                        
temp.setEntity(clusterModel1.getDefaultMemoryOvercommit());
                         // res1, res2 is used for conversion purposes.
-                        boolean res1 = clusterModel1.getDesktopOverCommit() != 
clusterModel1.getDefaultOverCommit();
-                        boolean res2 = clusterModel1.getServerOverCommit() != 
clusterModel1.getDefaultOverCommit();
+                        boolean res1 = clusterModel1.getDesktopOverCommit() != 
clusterModel1.getDefaultMemoryOvercommit();
+                        boolean res2 = clusterModel1.getServerOverCommit() != 
clusterModel1.getDefaultMemoryOvercommit();
                         temp = clusterModel1.getOptimizationNone_IsSelected();
                         setIsSelected(res1 && res2);
                         temp.setEntity(getIsSelected());
@@ -647,12 +674,12 @@
                         temp = clusterModel1.getOptimizationForServer();
                         temp.setEntity(clusterModel1.getServerOverCommit());
                         temp = 
clusterModel1.getOptimizationForServer_IsSelected();
-                        temp.setEntity(clusterModel1.getServerOverCommit() == 
clusterModel1.getDefaultOverCommit());
+                        temp.setEntity(clusterModel1.getServerOverCommit() == 
clusterModel1.getDefaultMemoryOvercommit());
 
                         temp = clusterModel1.getOptimizationForDesktop();
                         temp.setEntity(clusterModel1.getDesktopOverCommit());
                         temp = temp = 
clusterModel1.getOptimizationForDesktop_IsSelected();
-                        temp.setEntity(clusterModel1.getDesktopOverCommit() == 
clusterModel1.getDefaultOverCommit());
+                        temp.setEntity(clusterModel1.getDesktopOverCommit() == 
clusterModel1.getDefaultMemoryOvercommit());
 
                         temp = clusterModel1.getOptimizationCustom();
                         temp.setIsAvailable(false);
@@ -752,6 +779,8 @@
     {
         getDescription().setEntity(getEntity().getdescription());
         setMemoryOverCommit(getEntity().getmax_vds_memory_over_commit());
+
+        getCountThreadsAsCores().setEntity((boolean) 
getEntity().getcount_threads_as_cores());
 
         AsyncQuery _asyncQuery = new AsyncQuery();
         _asyncQuery.setModel(this);
@@ -881,6 +910,9 @@
         };
         AsyncDataProvider.GetCPUList(_asyncQuery, version);
 
+        // CPU Overcommit is only available for clusters of version 3.2 or 
greater
+        
getVersionSupportsCPUOvercommit().setEntity(version.compareTo(Version.v3_2) >= 
0);
+
     }
 
     private void InitCPU()
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostGeneralModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostGeneralModel.java
index fb3db2e..0cb6232 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostGeneralModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostGeneralModel.java
@@ -131,6 +131,8 @@
         super.setEntity(value);
     }
 
+    // 1st column in General tab
+
     private String os;
 
     public String getOS()
@@ -244,6 +246,8 @@
         }
     }
 
+    // 2nd column in General tab
+
     private Integer activeVms;
 
     public Integer getActiveVms()
@@ -261,62 +265,6 @@
         {
             activeVms = value;
             OnPropertyChanged(new PropertyChangedEventArgs("ActiveVms")); 
//$NON-NLS-1$
-        }
-    }
-
-    private Boolean memoryPageSharing;
-
-    public Boolean getMemoryPageSharing()
-    {
-        return memoryPageSharing;
-    }
-
-    public void setMemoryPageSharing(Boolean value)
-    {
-        if (memoryPageSharing == null && value == null)
-        {
-            return;
-        }
-        if (memoryPageSharing == null || !memoryPageSharing.equals(value))
-        {
-            memoryPageSharing = value;
-            OnPropertyChanged(new 
PropertyChangedEventArgs("MemoryPageSharing")); //$NON-NLS-1$
-        }
-    }
-
-    private Object automaticLargePage;
-
-    public Object getAutomaticLargePage()
-    {
-        return automaticLargePage;
-    }
-
-    public void setAutomaticLargePage(Object value)
-    {
-        if (automaticLargePage != value)
-        {
-            automaticLargePage = value;
-            OnPropertyChanged(new 
PropertyChangedEventArgs("AutomaticLargePage")); //$NON-NLS-1$
-        }
-    }
-
-    private Integer numberOfCPUs;
-
-    public Integer getNumberOfCPUs()
-    {
-        return numberOfCPUs;
-    }
-
-    public void setNumberOfCPUs(Integer value)
-    {
-        if (numberOfCPUs == null && value == null)
-        {
-            return;
-        }
-        if (numberOfCPUs == null || !numberOfCPUs.equals(value))
-        {
-            numberOfCPUs = value;
-            OnPropertyChanged(new PropertyChangedEventArgs("NumberOfCPUs")); 
//$NON-NLS-1$
         }
     }
 
@@ -351,6 +299,68 @@
             OnPropertyChanged(new PropertyChangedEventArgs("CpuType")); 
//$NON-NLS-1$
         }
     }
+
+    private Integer numberOfSockets;
+
+    public Integer getNumberOfSockets()
+    {
+        return numberOfSockets;
+    }
+
+    public void setNumberOfSockets(Integer value)
+    {
+        if (numberOfSockets == null && value == null)
+        {
+            return;
+        }
+        if (numberOfSockets == null || !numberOfSockets.equals(value))
+        {
+            numberOfSockets = value;
+            OnPropertyChanged(new 
PropertyChangedEventArgs("NumberOfSockets")); //$NON-NLS-1$
+        }
+    }
+
+    private Integer coresPerSocket;
+
+    public Integer getCoresPerSocket()
+    {
+        return coresPerSocket;
+    }
+
+    public void setCoresPerSocket(Integer value)
+    {
+        if (coresPerSocket == null && value == null)
+        {
+            return;
+        }
+        if (coresPerSocket == null || !coresPerSocket.equals(value))
+        {
+            coresPerSocket = value;
+            OnPropertyChanged(new PropertyChangedEventArgs("CoresPerSocket")); 
//$NON-NLS-1$
+        }
+    }
+
+    private String cpuHyperthreading;
+
+    public String getCpuHyperthreading()
+    {
+        return cpuHyperthreading;
+    }
+
+    public void setCpuHyperthreading(String value)
+    {
+        if (cpuHyperthreading == null && value == null)
+        {
+            return;
+        }
+        if (cpuHyperthreading == null || !cpuHyperthreading.equals(value))
+        {
+            cpuHyperthreading = value;
+            OnPropertyChanged(new 
PropertyChangedEventArgs("CpuHyperthreading")); //$NON-NLS-1$
+        }
+    }
+
+    // 3rd column in General tab
 
     private Integer sharedMemory;
 
@@ -497,6 +507,44 @@
     public Float getMaxSchedulingMemory() {
         return maxSchedulingMemory;
     }
+
+    private Boolean memoryPageSharing;
+
+    public Boolean getMemoryPageSharing()
+    {
+        return memoryPageSharing;
+    }
+
+    public void setMemoryPageSharing(Boolean value)
+    {
+        if (memoryPageSharing == null && value == null)
+        {
+            return;
+        }
+        if (memoryPageSharing == null || !memoryPageSharing.equals(value))
+        {
+            memoryPageSharing = value;
+            OnPropertyChanged(new 
PropertyChangedEventArgs("MemoryPageSharing")); //$NON-NLS-1$
+        }
+    }
+
+    private Object automaticLargePage;
+
+    public Object getAutomaticLargePage()
+    {
+        return automaticLargePage;
+    }
+
+    public void setAutomaticLargePage(Object value)
+    {
+        if (automaticLargePage != value)
+        {
+            automaticLargePage = value;
+            OnPropertyChanged(new 
PropertyChangedEventArgs("AutomaticLargePage")); //$NON-NLS-1$
+        }
+    }
+
+    // Alert section in general tab
 
     private boolean hasAnyAlert;
 
@@ -846,16 +894,24 @@
         setVdsmVersion(vds.getVersion());
         setSpiceVersion(vds.getspice_version());
         setIScsiInitiatorName(vds.getIScsiInitiatorName());
+
         setActiveVms(vds.getvm_active());
-        setMemoryPageSharing(vds.getksm_state());
-        setAutomaticLargePage(vds.getTransparentHugePagesState());
-        setNumberOfCPUs(vds.getcpu_cores());
         setCpuName(vds.getCpuName() != null ? vds.getCpuName().getCpuName() : 
null);
         setCpuType(vds.getcpu_model());
-        setSharedMemory(vds.getmem_shared_percent());
+        setNumberOfSockets(vds.getcpu_sockets());
+        setCoresPerSocket((vds.getcpu_cores() != null && vds.getcpu_sockets() 
!= null)
+                ? vds.getcpu_cores() / vds.getcpu_sockets() : null);
+        // vdsm may be accounting for hyperthreading already by doubling the 
core count
+        setCpuHyperthreading(vds.getvdsm_count_threads_as_cores() == null ? 
"Unknown" //$NON-NLS-1$
+                : (vds.getvdsm_count_threads_as_cores() ? "Virtual (vdsm.conf 
setting)" //$NON-NLS-1$
+                   : (vds.getcpu_ht_enabled() ? "Enabled" : "Disabled"))); 
//$NON-NLS-1$ //$NON-NLS-2$
+
         setPhysicalMemory(vds.getphysical_mem_mb());
         setSwapTotal(vds.getswap_total());
         setSwapFree(vds.getswap_free());
+        setSharedMemory(vds.getmem_shared_percent());
+        setMemoryPageSharing(vds.getksm_state());
+        setAutomaticLargePage(vds.getTransparentHugePagesState());
     }
 
     private void UpdateAlerts()
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
index 1e58204..9d880d0 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
@@ -547,32 +547,26 @@
     @DefaultStringValue("Compatibility Version")
     String clusterPopupVersionLabel();
 
-    @DefaultStringValue("Memory Optimization")
-    String clusterPopupMemoryOptimizationTabLabel();
+    @DefaultStringValue("Optimization")
+    String clusterPopupOptimizationTabLabel();
 
-    @DefaultStringValue("None")
+    @DefaultStringValue("Memory Optimization")
+    String clusterPopupMemoryOptimizationPanelTitle();
+
+    @DefaultStringValue("Allow VMs to run on the hosts up to the specified 
overcommit threshold. Higher values conserve memory at the expense of greater 
host CPU usage.")
+    String clusterPopupMemoryOptimizationExplanationLabel();
+
+    @DefaultStringValue("None - Disable memory page sharing")
     String clusterPopupOptimizationNoneLabel();
 
-    @DefaultStringValue("For Server Load")
-    String clusterPopupOptimizationForServerLabel();
+    @DefaultStringValue("CPU Hyperthreading")
+    String clusterPopupCpuOvercommitPanelTitle();
 
-    @DefaultStringValue("For Desktop Load")
-    String clusterPopupOptimizationForDesktopLabel();
+    @DefaultStringValue("Allow guests to use host threads as virtual CPU 
cores. Enabling this may be useful for less CPU-intensive workloads.")
+    String clusterPopupCpuOvercommitExplanationLabel();
 
-    @DefaultStringValue("Custom Value")
-    String clusterPopupOptimizationCustomLabel();
-
-    @DefaultStringValue("Memory Page Sharing is Disabled")
-    String clusterPopupOptimizationNoneExplainationLabel();
-
-    @DefaultStringValue("Memory Page Sharing Threshold set to %1$s. Allow VMs 
to run on the Host up to the overcommit threshold")
-    String clusterPopupOptimizationForServerExplainationLabel();
-
-    @DefaultStringValue("Memory Page Sharing Threshold set to %1$s. Allow VMs 
to run on the Host up to the overcommit threshold")
-    String clusterPopupOptimizationForDesktopExplainationLabel();
-
-    @DefaultStringValue("Memory Page Sharing Threshold set to %1$s via 
API/CLI")
-    String clusterPopupOptimizationCustomExplainationLabel();
+    @DefaultStringValue("Count Threads As Cores")
+    String clusterPopupCountThreadsAsCoresLabel();
 
     @DefaultStringValue("Resilience Policy")
     String clusterPopupResiliencePolicyTabLabel();
@@ -1086,20 +1080,20 @@
     @DefaultStringValue("Active VMs")
     String activeVmsHostGeneral();
 
-    @DefaultStringValue("Memory Page Sharing")
-    String memPageSharingHostGeneral();
-
-    @DefaultStringValue("Automatic Large Pages")
-    String autoLargePagesHostGeneral();
-
-    @DefaultStringValue("Number of CPUs")
-    String numOfCpusHostGeneral();
-
     @DefaultStringValue("CPU Name")
     String cpuNameHostGeneral();
 
     @DefaultStringValue("CPU Type")
     String cpuTypeHostGeneral();
+
+    @DefaultStringValue("CPU Sockets")
+    String numOfSocketsHostGeneral();
+
+    @DefaultStringValue("CPU Cores per Socket")
+    String numOfCoresPerSocketHostGeneral();
+
+    @DefaultStringValue("CPU Hyperthreading")
+    String cpuHyperthreadingHostGeneral();
 
     @DefaultStringValue("Physical Memory")
     String physMemHostGeneral();
@@ -1110,6 +1104,12 @@
     @DefaultStringValue("Max free Memory for scheduling new VMs")
     String maxSchedulingMemory();
 
+    @DefaultStringValue("Memory Page Sharing")
+    String memPageSharingHostGeneral();
+
+    @DefaultStringValue("Automatic Large Pages")
+    String autoLargePagesHostGeneral();
+
     @DefaultStringValue("Shared Memory")
     String sharedMemHostGeneral();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java
index 555169d..178b876 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java
@@ -45,14 +45,14 @@
     @DefaultMessage("All references to objects that belong to Data Center {0} 
in the database will be removed. You may need to manually clean the Storage 
Domains in order to reuse them.")
     String detaCenterForceRemovePopupMessageLabel(String dcName);
 
-    @DefaultMessage("Memory Page Sharing Threshold set to {0}. Allow VMs to 
run on the Host up to the overcommit threshold")
-    String clusterPopupOptimizationForServerExplainationLabel(String a);
+    @DefaultMessage("For Server Load - Enable memory page sharing to {0}%")
+    String clusterPopupMemoryOptimizationForServerLabel(String a);
 
-    @DefaultMessage("Memory Page Sharing Threshold set to {0}. Allow VMs to 
run on the Host up to the overcommit threshold")
-    String clusterPopupOptimizationForDesktopExplainationLabel( String a);
+    @DefaultMessage("For Desktop Load - Enable memory page sharing to {0}%")
+    String clusterPopupMemoryOptimizationForDesktopLabel(String a);
 
-    @DefaultMessage("Memory Page Sharing Threshold set to {0} via API/CLI")
-    String clusterPopupOptimizationCustomExplainationLabel(String a);
+    @DefaultMessage("Custom Overcommit Threshold - Set to {0}% via API/CLI")
+    String clusterPopupMemoryOptimizationCustomLabel(String a);
 
     @DefaultMessage("The Network will be added to the Data Center {0} as 
well.")
     String theNetworkWillBeAddedToTheDataCenterAsWell(String dcName);
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java
index 3ca5adf..07fe42c 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java
@@ -126,43 +126,51 @@
 
     @UiField
     @WithElementId
-    DialogTab memoryOptimizationTab;
+    DialogTab optimizationTab;
+
+    @UiField
+    @Ignore
+    Label memoryOptimizationPanelTitle;
+
+    @UiField
+    @Ignore
+    Label memoryOptimizationExplanationLabel;
 
     @UiField(provided = true)
     @Path(value = "optimizationNone_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationNoneEditor;
 
-    @UiField
-    @Ignore
-    Label optimizationNoneExplanationLabel;
-
     @UiField(provided = true)
     @Path(value = "optimizationForServer_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationForServerEditor;
-
-    @UiField
-    @Ignore
-    Label optimizationForServerExplanationLabel;
 
     @UiField(provided = true)
     @Path(value = "optimizationForDesktop_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationForDesktopEditor;
 
-    @UiField
-    @Ignore
-    Label optimizationForDesktopExplanationLabel;
-
     @UiField(provided = true)
     @Path(value = "optimizationCustom_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationCustomEditor;
 
-    @UiField(provided = true)
+    @UiField
+    FlowPanel cpuOvercommitPanel;
+
+    @UiField
     @Ignore
-    Label optimizationCustomExplanationLabel;
+    Label cpuOvercommitPanelTitle;
+
+    @UiField
+    @Ignore
+    Label cpuOvercommitExplanationLabel;
+
+    @UiField(provided = true)
+    @Path(value = "countThreadsAsCores.entity")
+    @WithElementId
+    EntityModelCheckBoxEditor countThreadsAsCoresEditor;
 
     @UiField
     @WithElementId
@@ -205,6 +213,13 @@
         migrateOnErrorOption_NOEditor.addContentWidgetStyleName(style.label());
         
migrateOnErrorOption_YESEditor.addContentWidgetStyleName(style.label());
         
migrateOnErrorOption_HA_ONLYEditor.addContentWidgetStyleName(style.label());
+
+        optimizationNoneEditor.setContentWidgetStyleName(style.fullWidth());
+        
optimizationForServerEditor.setContentWidgetStyleName(style.fullWidth());
+        
optimizationForDesktopEditor.setContentWidgetStyleName(style.fullWidth());
+        optimizationCustomEditor.setContentWidgetStyleName(style.fullWidth());
+
+        countThreadsAsCoresEditor.setContentWidgetStyleName(style.fullWidth());
     }
 
     private void localize(ApplicationConstants constants) {
@@ -224,14 +239,15 @@
         
glusterHostFingerprintEditor.setLabel(constants.hostPopupHostFingerprintLabel());
         
glusterHostPasswordEditor.setLabel(constants.hostPopupRootPasswordLabel());
 
-        
memoryOptimizationTab.setLabel(constants.clusterPopupMemoryOptimizationTabLabel());
+        optimizationTab.setLabel(constants.clusterPopupOptimizationTabLabel());
 
+        
memoryOptimizationPanelTitle.setText(constants.clusterPopupMemoryOptimizationPanelTitle());
+        
memoryOptimizationExplanationLabel.setText(constants.clusterPopupMemoryOptimizationExplanationLabel());
         
optimizationNoneEditor.setLabel(constants.clusterPopupOptimizationNoneLabel());
-        
optimizationForServerEditor.setLabel(constants.clusterPopupOptimizationForServerLabel());
-        
optimizationForDesktopEditor.setLabel(constants.clusterPopupOptimizationForDesktopLabel());
-        
optimizationCustomEditor.setLabel(constants.clusterPopupOptimizationCustomLabel());
 
-        
optimizationNoneExplanationLabel.setText(constants.clusterPopupOptimizationNoneExplainationLabel());
+        
cpuOvercommitPanelTitle.setText(constants.clusterPopupCpuOvercommitPanelTitle());
+        
cpuOvercommitExplanationLabel.setText(constants.clusterPopupCpuOvercommitExplanationLabel());
+        
countThreadsAsCoresEditor.setLabel(constants.clusterPopupCountThreadsAsCoresLabel());
 
         
resiliencePolicyTab.setLabel(constants.clusterPopupResiliencePolicyTabLabel());
 
@@ -250,9 +266,6 @@
         migrateOnErrorOption_YESEditor = new 
EntityModelRadioButtonEditor("2"); //$NON-NLS-1$
         migrateOnErrorOption_HA_ONLYEditor = new 
EntityModelRadioButtonEditor("2"); //$NON-NLS-1$
         migrateOnErrorOption_NOEditor = new EntityModelRadioButtonEditor("2"); 
//$NON-NLS-1$
-
-        optimizationCustomExplanationLabel = new Label();
-        optimizationCustomExplanationLabel.setVisible(false);
     }
 
     private void initListBoxEditors() {
@@ -282,12 +295,14 @@
     private void initCheckBoxEditors()
     {
         importGlusterConfigurationEditor = new 
EntityModelCheckBoxEditor(Align.RIGHT);
+
+        countThreadsAsCoresEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
     }
 
     private void applyModeCustomizations() {
         if (ApplicationModeHelper.getUiMode() == ApplicationMode.GlusterOnly)
         {
-            memoryOptimizationTab.setVisible(false);
+            optimizationTab.setVisible(false);
             resiliencePolicyTab.setVisible(false);
             dataCenterPanel.addStyleName(style.generalTabTopDecoratorEmpty());
         }
@@ -302,40 +317,43 @@
     public void edit(final ClusterModel object) {
         Driver.driver.edit(object);
 
+        optimizationForServerFormatter(object);
+        optimizationForDesktopFormatter(object);
+        optimizationCustomFormatter(object);
+
         
object.getOptimizationForServer().getEntityChangedEvent().addListener(new 
IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
-                
optimizationForServerExplanationLabel.setText(messages.clusterPopupOptimizationForServerExplainationLabel(
 object.getOptimizationForServer().getEntity().toString() + "%")); //$NON-NLS-1$
+                optimizationForServerFormatter(object);
             }
         });
+
         
object.getOptimizationForDesktop().getEntityChangedEvent().addListener(new 
IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
-                
optimizationForDesktopExplanationLabel.setText(messages.clusterPopupOptimizationForDesktopExplainationLabel(object.getOptimizationForDesktop().getEntity().toString()
 + "%")); //$NON-NLS-1$
+                optimizationForDesktopFormatter(object);
             }
         });
-        
object.getOptimizationCustom_IsSelected().getEntityChangedEvent().addListener(new
 IEventListener() {
 
+        
object.getOptimizationCustom_IsSelected().getEntityChangedEvent().addListener(new
 IEventListener() {
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 if ((Boolean) 
object.getOptimizationCustom_IsSelected().getEntity()) {
-                    
optimizationCustomExplanationLabel.setText(messages.clusterPopupOptimizationCustomExplainationLabel(object.getOptimizationCustom().getEntity().toString()
 + "%")); //$NON-NLS-1$
-                    optimizationCustomExplanationLabel.setVisible(true);
+                    optimizationCustomFormatter(object);
+                    optimizationCustomEditor.setVisible(true);
                 }
             }
         });
-        object.getDataCenter().getSelectedItemChangedEvent().addListener(new 
IEventListener() {
 
+        object.getDataCenter().getSelectedItemChangedEvent().addListener(new 
IEventListener() {
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 
resiliencePolicyTab.setVisible(object.getisResiliencePolicyTabAvailable());
                 applyModeCustomizations();
             }
         });
-        
object.getEnableGlusterService().getEntityChangedEvent().addListener(new 
IEventListener() {
 
+        
object.getEnableGlusterService().getEntityChangedEvent().addListener(new 
IEventListener() {
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 importGlusterExplanationLabel.setVisible((Boolean) 
object.getEnableGlusterService().getEntity()
@@ -344,6 +362,38 @@
         });
         importGlusterExplanationLabel.setVisible((Boolean) 
object.getEnableGlusterService().getEntity()
                 && object.getIsNew());
+
+        
object.getVersionSupportsCPUOvercommit().getEntityChangedEvent().addListener(new
 IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                cpuOvercommitPanel.setVisible((Boolean) 
object.getVersionSupportsCPUOvercommit().getEntity());
+            }
+        });
+    }
+
+    private void optimizationForServerFormatter(ClusterModel object) {
+        if (object.getOptimizationForServer() != null
+                && object.getOptimizationForServer().getEntity() != null) {
+            
optimizationForServerEditor.setLabel(messages.clusterPopupMemoryOptimizationForServerLabel(
+                    object.getOptimizationForServer().getEntity().toString()));
+        }
+    }
+
+    private void optimizationForDesktopFormatter(ClusterModel object) {
+        if (object.getOptimizationForDesktop() != null
+                && object.getOptimizationForDesktop().getEntity() != null) {
+            
optimizationForDesktopEditor.setLabel(messages.clusterPopupMemoryOptimizationForDesktopLabel(
+                    
object.getOptimizationForDesktop().getEntity().toString()));
+        }
+    }
+
+    private void optimizationCustomFormatter(ClusterModel object) {
+        if (object.getOptimizationCustom() != null
+                && object.getOptimizationCustom().getEntity() != null) {
+            // use current value because 
object.getOptimizationCustom.getEntity() can be null
+            
optimizationCustomEditor.setLabel(messages.clusterPopupMemoryOptimizationCustomLabel(
+                    String.valueOf(object.getMemoryOverCommit())));
+        }
     }
 
     @Override
@@ -363,6 +413,8 @@
         String generalTabTopDecoratorEmpty();
 
         String editorContentWidget();
+
+        String fullWidth();
     }
 
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml
index 9c47ba8..910ad80 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml
@@ -52,6 +52,23 @@
                        width: 350px;
                        margin-top: 10px;
                }
+
+               .fullWidth {
+                       float: right;
+                       width: 460px;
+                       padding: 0 5px;
+                       line-height: 26px;
+               }
+               .panelTitle {
+                       font-size: 14px;
+                       padding-left: 3px;
+               }
+               .nestedSubsequentPanel {
+                       padding-top: 24px;
+               }
+               .optimizationExplanationLabel {
+                       padding: 8px 8px 8px 12px;
+               }
        </ui:style>
 
        <d:SimpleDialogPanel width="610px" height="530px">
@@ -81,17 +98,22 @@
                                        </t:DialogTab>
                                </t:tab>
                                <t:tab>
-                                       <t:DialogTab 
ui:field="memoryOptimizationTab">
+                                       <t:DialogTab ui:field="optimizationTab">
                                                <t:content>
-                                                       <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
-                                                               
<e:EntityModelRadioButtonEditor ui:field="optimizationNoneEditor" />
-                                                               <g:Label 
ui:field="optimizationNoneExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                                                               
<e:EntityModelRadioButtonEditor ui:field="optimizationForServerEditor" />
-                                                               <g:Label 
ui:field="optimizationForServerExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                                                               
<e:EntityModelRadioButtonEditor ui:field="optimizationForDesktopEditor" />
-                                                               <g:Label 
ui:field="optimizationForDesktopExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                                                               
<e:EntityModelRadioButtonEditor ui:field="optimizationCustomEditor" />
-                                                               <g:Label 
ui:field="optimizationCustomExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
+                                                       <g:FlowPanel>
+                                                               <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
+                                                                       
<g:Label ui:field="memoryOptimizationPanelTitle" 
addStyleNames="{style.panelTitle}" />
+                                                                       
<g:Label ui:field="memoryOptimizationExplanationLabel" 
addStyleNames="generalDialogComment,{style.optimizationExplanationLabel}" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationNoneEditor" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationForServerEditor" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationForDesktopEditor" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationCustomEditor" />
+                                                               </g:FlowPanel>
+                                                               <g:FlowPanel 
ui:field="cpuOvercommitPanel" addStyleNames="{style.nestedSubsequentPanel}">
+                                                                       
<g:Label ui:field="cpuOvercommitPanelTitle" addStyleNames="{style.panelTitle}" 
/>
+                                                                       
<g:Label ui:field="cpuOvercommitExplanationLabel" 
addStyleNames="generalDialogComment,{style.optimizationExplanationLabel}" />
+                                                                       
<e:EntityModelCheckBoxEditor ui:field="countThreadsAsCoresEditor" />
+                                                               </g:FlowPanel>
                                                        </g:FlowPanel>
                                                </t:content>
                                        </t:DialogTab>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.java
index a35048d..1defa40 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.java
@@ -4,19 +4,21 @@
 import org.ovirt.engine.core.compat.Event;
 import org.ovirt.engine.core.compat.EventArgs;
 import org.ovirt.engine.core.compat.IEventListener;
-import org.ovirt.engine.core.compat.StringFormat;
 import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
 import org.ovirt.engine.ui.common.idhandler.WithElementId;
 import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
+import org.ovirt.engine.ui.common.widget.Align;
 import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
 import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab;
+import org.ovirt.engine.ui.common.widget.editor.EntityModelCheckBoxEditor;
 import org.ovirt.engine.ui.common.widget.editor.EntityModelRadioButtonEditor;
 import org.ovirt.engine.ui.common.widget.editor.EntityModelTextBoxEditor;
 import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
 import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.ConfigureLocalStorageModel;
 import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import org.ovirt.engine.ui.webadmin.ApplicationMessages;
 import org.ovirt.engine.ui.webadmin.ApplicationResources;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.ConfigureLocalStoragePopupPresenterWidget;
 
@@ -25,9 +27,11 @@
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.inject.Inject;
@@ -55,6 +59,14 @@
         return constants;
     }
 
+    private final ApplicationMessages messages;
+
+    private ApplicationMessages getMessages() {
+        return messages;
+    }
+
+    @UiField
+    WidgetStyle style;
 
     @UiField
     DialogTab generalTab;
@@ -114,55 +126,64 @@
 
     @UiField
     @WithElementId
-    DialogTab memoryOptimizationTab;
+    DialogTab optimizationTab;
+
+    @UiField
+    @Ignore
+    Label memoryOptimizationPanelTitle;
+
+    @UiField
+    @Ignore
+    Label memoryOptimizationExplanationLabel;
 
     @UiField(provided = true)
     @Path(value = "cluster.optimizationNone_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationNoneEditor;
 
-    @UiField
-    @Ignore
-    Label optimizationNoneExplanationLabel;
-
     @UiField(provided = true)
     @Path(value = "cluster.optimizationForServer_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationForServerEditor;
-
-    @UiField
-    @Ignore
-    Label optimizationForServerExplanationLabel;
 
     @UiField(provided = true)
     @Path(value = "cluster.optimizationForDesktop_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationForDesktopEditor;
 
-    @UiField
-    @Ignore
-    Label optimizationForDesktopExplanationLabel;
-
     @UiField(provided = true)
     @Path(value = "cluster.optimizationCustom_IsSelected.entity")
     @WithElementId
     EntityModelRadioButtonEditor optimizationCustomEditor;
 
-    @UiField(provided = true)
-    @Ignore
-    Label optimizationCustomExplanationLabel;
+    @UiField
+    FlowPanel cpuOvercommitPanel;
 
+    @UiField
+    @Ignore
+    Label cpuOvercommitPanelTitle;
+
+    @UiField
+    @Ignore
+    Label cpuOvercommitExplanationLabel;
+
+    @UiField(provided = true)
+    @Path(value = "cluster.countThreadsAsCores.entity")
+    @WithElementId
+    EntityModelCheckBoxEditor countThreadsAsCoresEditor;
 
     @Inject
-    public HostConfigureLocalStoragePopupView(EventBus eventBus, 
ApplicationResources resources, ApplicationConstants constants) {
+    public HostConfigureLocalStoragePopupView(EventBus eventBus, 
ApplicationResources resources, ApplicationConstants constants, 
ApplicationMessages messages) {
         super(eventBus, resources);
 
         this.constants = constants;
+        this.messages = messages;
 
         initialize();
 
         initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
         ViewIdHandler.idHandler.generateAndSetIds(this);
+        addStyles();
         localize();
         Driver.driver.initialize(this);
 
@@ -232,14 +253,23 @@
         optimizationForDesktopEditor = new EntityModelRadioButtonEditor("1"); 
//$NON-NLS-1$
         optimizationCustomEditor = new EntityModelRadioButtonEditor("1"); 
//$NON-NLS-1$
 
-        optimizationCustomExplanationLabel = new Label();
-        optimizationCustomExplanationLabel.setVisible(false);
+        optimizationCustomEditor.setVisible(false);
+
+        countThreadsAsCoresEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
+    }
+
+    private void addStyles() {
+        optimizationNoneEditor.setContentWidgetStyleName(style.fullWidth());
+        
optimizationForServerEditor.setContentWidgetStyleName(style.fullWidth());
+        
optimizationForDesktopEditor.setContentWidgetStyleName(style.fullWidth());
+        optimizationCustomEditor.setContentWidgetStyleName(style.fullWidth());
+
+        countThreadsAsCoresEditor.setContentWidgetStyleName(style.fullWidth());
     }
 
     void localize() {
 
         generalTab.setLabel(getConstants().hostPopupGeneralTabLabel());
-        
memoryOptimizationTab.setLabel(getConstants().hostPopupMemoryOptimizationTabLabel());
 
         dataCenterButton.setText(getConstants().editText());
         dataCenterNameEditor.setLabel(getConstants().nameLabel());
@@ -256,17 +286,15 @@
 
         
pathLabel.setText(getConstants().configureLocalStoragePopupPathLabel());
 
-        
memoryOptimizationTab.setLabel(constants.clusterPopupMemoryOptimizationTabLabel());
+        
optimizationTab.setLabel(getConstants().clusterPopupOptimizationTabLabel());
 
-        
optimizationNoneEditor.setLabel(constants.clusterPopupOptimizationNoneLabel());
-        
optimizationForServerEditor.setLabel(constants.clusterPopupOptimizationForServerLabel());
-        
optimizationForDesktopEditor.setLabel(constants.clusterPopupOptimizationForDesktopLabel());
-        
optimizationCustomEditor.setLabel(constants.clusterPopupOptimizationCustomLabel());
+        
memoryOptimizationPanelTitle.setText(getConstants().clusterPopupMemoryOptimizationPanelTitle());
+        
memoryOptimizationExplanationLabel.setText(getConstants().clusterPopupMemoryOptimizationExplanationLabel());
+        
optimizationNoneEditor.setLabel(getConstants().clusterPopupOptimizationNoneLabel());
 
-        
optimizationNoneExplanationLabel.setText(constants.clusterPopupOptimizationNoneExplainationLabel());
-        
optimizationForServerExplanationLabel.setText(constants.clusterPopupOptimizationForServerExplainationLabel());
-        
optimizationForDesktopExplanationLabel.setText(constants.clusterPopupOptimizationForDesktopExplainationLabel());
-        
optimizationCustomExplanationLabel.setText(constants.clusterPopupOptimizationCustomExplainationLabel());
+        
cpuOvercommitPanelTitle.setText(getConstants().clusterPopupCpuOvercommitPanelTitle());
+        
cpuOvercommitExplanationLabel.setText(getConstants().clusterPopupCpuOvercommitExplanationLabel());
+        
countThreadsAsCoresEditor.setLabel(getConstants().clusterPopupCountThreadsAsCoresLabel());
     }
 
     @Override
@@ -279,9 +307,9 @@
 
         optimizationForServerFormatter(model);
         optimizationForDesktopFormatter(model);
+        optimizationCustomFormatter(model);
 
         
model.getCluster().getOptimizationForServer().getEntityChangedEvent().addListener(new
 IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 optimizationForServerFormatter(model);
@@ -289,7 +317,6 @@
         });
 
         
model.getCluster().getOptimizationForDesktop().getEntityChangedEvent().addListener(new
 IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 optimizationForDesktopFormatter(model);
@@ -297,14 +324,19 @@
         });
 
         
model.getCluster().getOptimizationCustom_IsSelected().getEntityChangedEvent().addListener(new
 IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 if ((Boolean) 
model.getCluster().getOptimizationCustom_IsSelected().getEntity()) {
-                    
optimizationCustomExplanationLabel.setText(StringFormat.format(optimizationCustomExplanationLabel.getText(),
-                        
model.getCluster().getOptimizationCustom().getEntity().toString() + "%")); 
//$NON-NLS-1$
-                    optimizationCustomExplanationLabel.setVisible(true);
+                    optimizationCustomFormatter(model);
+                    optimizationCustomEditor.setVisible(true);
                 }
+            }
+        });
+
+        
model.getCluster().getVersionSupportsCPUOvercommit().getEntityChangedEvent().addListener(new
 IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                cpuOvercommitPanel.setVisible((Boolean) 
model.getCluster().getVersionSupportsCPUOvercommit().getEntity());
             }
         });
     }
@@ -312,16 +344,25 @@
     private void optimizationForDesktopFormatter(ConfigureLocalStorageModel 
model) {
         if (model.getCluster() != null && 
model.getCluster().getOptimizationForDesktop() != null
                 && model.getCluster().getOptimizationForDesktop().getEntity() 
!= null) {
-            
optimizationForDesktopExplanationLabel.setText(StringFormat.format(optimizationForDesktopExplanationLabel.getText(),
-                    
model.getCluster().getOptimizationForDesktop().getEntity().toString() + "%")); 
//$NON-NLS-1$
+            
optimizationForDesktopEditor.setLabel(getMessages().clusterPopupMemoryOptimizationForDesktopLabel(
+                    
model.getCluster().getOptimizationForDesktop().getEntity().toString()));
         }
     }
 
     private void optimizationForServerFormatter(ConfigureLocalStorageModel 
model) {
         if (model.getCluster() != null && 
model.getCluster().getOptimizationForServer() != null
                 && model.getCluster().getOptimizationForServer().getEntity() 
!= null) {
-            
optimizationForServerExplanationLabel.setText(StringFormat.format(optimizationForServerExplanationLabel.getText(),
-                    
model.getCluster().getOptimizationForServer().getEntity().toString() + "%")); 
//$NON-NLS-1$
+            
optimizationForServerEditor.setLabel(getMessages().clusterPopupMemoryOptimizationForServerLabel(
+                    
model.getCluster().getOptimizationForServer().getEntity().toString()));
+        }
+    }
+
+    private void optimizationCustomFormatter(ConfigureLocalStorageModel model) 
{
+        if (model.getCluster() != null && 
model.getCluster().getOptimizationCustom() != null
+                && model.getCluster().getOptimizationCustom().getEntity() != 
null) {
+            // use current value because 
object.getOptimizationCustom.getEntity() can be null
+            
optimizationCustomEditor.setLabel(getMessages().clusterPopupMemoryOptimizationCustomLabel(
+                    String.valueOf(model.getCluster().getMemoryOverCommit())));
         }
     }
 
@@ -333,4 +374,8 @@
     @Override
     public void focusInput() {
     }
+
+    interface WidgetStyle extends CssResource {
+        String fullWidth();
+    }
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.ui.xml
index e8b3ef3..6a3fb41 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.ui.xml
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostConfigureLocalStoragePopupView.ui.xml
@@ -6,7 +6,7 @@
 
              <ui:with field='constants' 
type='org.ovirt.engine.ui.webadmin.ApplicationConstants' />
 
-       <ui:style>
+       <ui:style 
type="org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostConfigureLocalStoragePopupView.WidgetStyle">
                .generalTabTopDecorator {
                        background-color: #D3D3D3;
             width: 540px;
@@ -48,6 +48,24 @@
             color: #C0C0C0;
             margin: 6px;
         }
+
+        .fullWidth {
+                       float: right;
+                       width: 460px;
+                       padding: 0 5px;
+                       line-height: 26px;
+               }
+               .panelTitle {
+                       font-size: 14px;
+                       padding-left: 3px;
+               }
+               .nestedSubsequentPanel {
+                       padding-top: 24px;
+               }
+               .optimizationExplanationLabel {
+                       padding: 8px 8px 8px 12px;
+               }
+
        </ui:style>
 
        <d:SimpleDialogPanel width="723px" height="500px">
@@ -101,20 +119,25 @@
                                        </t:DialogTab>
                                </t:tab>
                                <t:tab>
-                    <t:DialogTab ui:field="memoryOptimizationTab">
-                        <t:content>
-                            <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
-                                <e:EntityModelRadioButtonEditor 
ui:field="optimizationNoneEditor" />
-                                <g:Label 
ui:field="optimizationNoneExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                                <e:EntityModelRadioButtonEditor 
ui:field="optimizationForServerEditor" />
-                                <g:Label 
ui:field="optimizationForServerExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                                <e:EntityModelRadioButtonEditor 
ui:field="optimizationForDesktopEditor" />
-                                <g:Label 
ui:field="optimizationForDesktopExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                                <e:EntityModelRadioButtonEditor 
ui:field="optimizationCustomEditor" />
-                                <g:Label 
ui:field="optimizationCustomExplanationLabel" 
addStyleNames="{style.explanationLabel},generalDialogComment" />
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
+                                       <t:DialogTab ui:field="optimizationTab">
+                                               <t:content>
+                                                       <g:FlowPanel>
+                                                               <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
+                                                                       
<g:Label ui:field="memoryOptimizationPanelTitle" 
addStyleNames="{style.panelTitle}" />
+                                                                       
<g:Label ui:field="memoryOptimizationExplanationLabel" 
addStyleNames="generalDialogComment,{style.optimizationExplanationLabel}" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationNoneEditor" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationForServerEditor" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationForDesktopEditor" />
+                                                                       
<e:EntityModelRadioButtonEditor ui:field="optimizationCustomEditor" />
+                                                               </g:FlowPanel>
+                                                               <g:FlowPanel 
ui:field="cpuOvercommitPanel" addStyleNames="{style.nestedSubsequentPanel}">
+                                                                       
<g:Label ui:field="cpuOvercommitPanelTitle" addStyleNames="{style.panelTitle}" 
/>
+                                                                       
<g:Label ui:field="cpuOvercommitExplanationLabel" 
addStyleNames="generalDialogComment,{style.optimizationExplanationLabel}" />
+                                                                       
<e:EntityModelCheckBoxEditor ui:field="countThreadsAsCoresEditor" />
+                                                               </g:FlowPanel>
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
                                </t:tab>
                        </t:DialogTabPanel>
                </d:content>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostGeneralView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostGeneralView.java
index 91c0ca4..b244bbb 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostGeneralView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/host/SubTabHostGeneralView.java
@@ -57,11 +57,13 @@
     TextBoxLabel iScsiInitiatorName = new TextBoxLabel();
     TextBoxLabel cpuName = new TextBoxLabel();
     TextBoxLabel cpuType = new TextBoxLabel();
+    TextBoxLabel cpuHyperthreading = new TextBoxLabel();
     VersionLabel vdsmVersion = new VersionLabel();
     PercentLabel<Integer> sharedMemory = new PercentLabel<Integer>();
     BooleanLabel memoryPageSharing = new BooleanLabel("Active", "Inactive"); 
//$NON-NLS-1$ //$NON-NLS-2$
     NullableNumberLabel<Integer> activeVms = new 
NullableNumberLabel<Integer>();
-    NullableNumberLabel<Integer> numberOfCPUs = new 
NullableNumberLabel<Integer>();
+    NullableNumberLabel<Integer> numberOfSockets = new 
NullableNumberLabel<Integer>();
+    NullableNumberLabel<Integer> coresPerSocket = new 
NullableNumberLabel<Integer>();
 
     MemorySizeLabel<Integer> physicalMemory;
     MemorySizeLabel<Integer> usedMemory;
@@ -134,16 +136,18 @@
         formItems.add(new FormItem(constants.isciInitNameHostGeneral(), 
iScsiInitiatorName, 6, 0));
 
         formItems.add(new FormItem(constants.activeVmsHostGeneral(), 
activeVms, 0, 1));
-        formItems.add(new FormItem(constants.memPageSharingHostGeneral(), 
memoryPageSharing, 1, 1));
-        formItems.add(new FormItem(constants.autoLargePagesHostGeneral(), 
automaticLargePage, 2, 1));
-        formItems.add(new FormItem(constants.numOfCpusHostGeneral(), 
numberOfCPUs, 3, 1));
-        formItems.add(new FormItem(constants.cpuNameHostGeneral(), cpuName, 4, 
1));
-        formItems.add(new FormItem(constants.cpuTypeHostGeneral(), cpuType, 5, 
1));
+        formItems.add(new FormItem(constants.cpuNameHostGeneral(), cpuName, 1, 
1));
+        formItems.add(new FormItem(constants.cpuTypeHostGeneral(), cpuType, 2, 
1));
+        formItems.add(new FormItem(constants.numOfSocketsHostGeneral(), 
numberOfSockets, 3, 1));
+        formItems.add(new FormItem(constants.numOfCoresPerSocketHostGeneral(), 
coresPerSocket, 4, 1));
+        formItems.add(new FormItem(constants.cpuHyperthreadingHostGeneral(), 
cpuHyperthreading, 5, 1));
 
         formItems.add(new FormItem(constants.physMemHostGeneral(), 
physicalMemoryDetails, 0, 2));
         formItems.add(new FormItem(constants.swapSizeHostGeneral(), 
swapSizeDetails, 1, 2));
         formItems.add(new FormItem(constants.sharedMemHostGeneral(), 
sharedMemory, 2, 2));
         formItems.add(new FormItem(constants.maxSchedulingMemory(), 
maxSchedulingMemory, 3, 2));
+        formItems.add(new FormItem(constants.memPageSharingHostGeneral(), 
memoryPageSharing, 4, 2));
+        formItems.add(new FormItem(constants.autoLargePagesHostGeneral(), 
automaticLargePage, 5, 2));
 
         applyModeCustomizations(formItems);
 


--
To view, visit http://gerrit.ovirt.org/10170
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iefa963606074133b3dfcfc1b54fd623519e4ec9e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Greg Padgett <gpadg...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to