Dudi Maroshi has uploaded a new change for review.

Change subject: engine: Add KSM awaremess for NUMA optimization
......................................................................

engine: Add KSM awaremess for NUMA optimization

Add boolean field to cluster table reflecting KSM policy for NUMA.
Add GUI to manage the KSM policy for NUMA at cluster level
Bug-Url: https://bugzilla.redhat.com/840114

Change-Id: I464542fd7a25ccb230ab22f45686dd3c22b394a6
Signed-off-by: Dudi Maroshi <d...@redhat.com>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
M backend/manager/modules/dal/src/test/resources/fixtures.xml
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/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.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/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 packaging/branding/ovirt.brand/ovirt-patternfly-compat.css
A packaging/dbscripts/upgrade/03_06_1190_add_ksm_with_numa_awareness.sql
M packaging/dbscripts/vds_groups_sp.sql
12 files changed, 517 insertions(+), 311 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/39777/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java
index b198c34..fd7e659 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java
@@ -110,6 +110,8 @@
 
     private Boolean migrateCompressed;
 
+    private Boolean ksmMergeAcrossNumaNodes;
+
     public VDSGroup() {
         migrateOnError = MigrateOnErrorOptions.YES;
         name = "";
@@ -117,6 +119,7 @@
         optimizationType = OptimizationType.NONE;
         requiredRngSources = new HashSet<>();
         fencingPolicy = new FencingPolicy();
+        ksmMergeAcrossNumaNodes = true;
     }
 
     @Override
@@ -400,18 +403,22 @@
         this.fencingPolicy = fencingPolicy;
     }
 
+    @Override
     public Boolean getAutoConverge() {
         return autoConverge;
     }
 
+    @Override
     public void setAutoConverge(Boolean autoConverge) {
         this.autoConverge = autoConverge;
     }
 
+    @Override
     public Boolean getMigrateCompressed() {
         return migrateCompressed;
     }
 
+    @Override
     public void setMigrateCompressed(Boolean migrateCompressed) {
         this.migrateCompressed = migrateCompressed;
     }
@@ -422,6 +429,14 @@
 
     public void setGroupHostsAndVms(VDSGroupHostsAndVMs groupHostsAndVms) {
         this.groupHostsAndVms = groupHostsAndVms;
+    }
+
+    public Boolean isKsmMergeAcrossNumaNodes() {
+        return ksmMergeAcrossNumaNodes;
+    }
+
+    public void setKsmMergeAcrossNumaNodes(Boolean ksmMergeAcrossNumaNodes) {
+        this.ksmMergeAcrossNumaNodes = ksmMergeAcrossNumaNodes;
     }
 
     @Override
@@ -459,6 +474,7 @@
         result = prime * result + (autoConverge == null ? 0 : 
autoConverge.hashCode());
         result = prime * result + (migrateCompressed == null ? 0 : 
migrateCompressed.hashCode());
         result = prime * result + (maintenanceReasonRequired ? 1231 : 1237);
+        result = prime * result + (ksmMergeAcrossNumaNodes == null ? 0 : 
ksmMergeAcrossNumaNodes.hashCode());
         return result;
     }
 
@@ -505,7 +521,8 @@
                 && ObjectUtils.objectsEqual(fencingPolicy, other.fencingPolicy)
                 && ObjectUtils.objectsEqual(autoConverge, other.autoConverge)
                 && ObjectUtils.objectsEqual(migrateCompressed, 
other.migrateCompressed)
-                && ObjectUtils.objectsEqual(maintenanceReasonRequired, 
other.maintenanceReasonRequired);
+                && ObjectUtils.objectsEqual(maintenanceReasonRequired, 
other.maintenanceReasonRequired)
+                && ObjectUtils.objectsEqual(ksmMergeAcrossNumaNodes, 
other.ksmMergeAcrossNumaNodes);
     }
 
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
index 8f7e169..6890c43 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
@@ -234,7 +234,8 @@
                 .addValue("hosts_with_broken_connectivity_threshold", 
group.getFencingPolicy().getHostsWithBrokenConnectivityThreshold())
                 .addValue("fencing_enabled", 
group.getFencingPolicy().isFencingEnabled())
                 .addValue("is_auto_converge", group.getAutoConverge())
-                .addValue("is_migrate_compressed", 
group.getMigrateCompressed());
+                .addValue("is_migrate_compressed", 
group.getMigrateCompressed())
+                .addValue("ksm_merge_across_nodes", 
group.isKsmMergeAcrossNumaNodes());
 
         return parameterSource;
     }
@@ -302,6 +303,7 @@
             
entity.getFencingPolicy().setFencingEnabled(rs.getBoolean("fencing_enabled"));
             entity.setAutoConverge((Boolean) rs.getObject("is_auto_converge"));
             entity.setMigrateCompressed((Boolean) 
rs.getObject("is_migrate_compressed"));
+            entity.setKsmMergeAcrossNumaNodes((Boolean) 
rs.getObject("ksm_merge_across_nodes"));
 
             return entity;
         }
diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml 
b/backend/manager/modules/dal/src/test/resources/fixtures.xml
index 7fc618e..54c688a 100644
--- a/backend/manager/modules/dal/src/test/resources/fixtures.xml
+++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml
@@ -827,6 +827,7 @@
             <value>true</value>
             <value>true</value>
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>b399944a-81ab-4ec5-8266-e19ba7c3c9d2</value>
@@ -860,6 +861,7 @@
             <value>true</value>
             <value>false</value>
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>b399944a-81ab-4ec5-8266-e19ba7c3c9d3</value>
@@ -893,6 +895,7 @@
             <value>false</value>
             <value>true</value>
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>0e57070e-2469-4b38-84a2-f111aaabd49d</value>
@@ -926,6 +929,7 @@
             <null />
             <value>true</value>
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>eba797fb-8e3b-4777-b63c-92e7a5957d7c</value>
@@ -959,6 +963,7 @@
             <value>true</value>
             <null />
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>eba797fb-8e3b-4777-b63c-92e7a5957d7d</value>
@@ -992,6 +997,7 @@
             <null />
             <value>false</value>
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>eba797fb-8e3b-4777-b63c-92e7a5957d7e</value>
@@ -1025,6 +1031,7 @@
             <value>false</value>
             <null />
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>eba797fb-8e3b-4777-b63c-92e7a5957d7f</value>
@@ -1058,6 +1065,7 @@
             <null />
             <null />
             <value>false</value>
+            <value>true</value>
         </row>
         <row>
             <value>ae956031-6be2-43d6-bb8f-5191c9253314</value>
@@ -1091,6 +1099,7 @@
             <null />
             <null />
             <value>true</value>
+            <value>true</value>
         </row>
     </table>
 
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 a015c1d..da99896 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
@@ -4,7 +4,6 @@
 import java.util.List;
 import java.util.Map;
 
-import com.google.inject.Inject;
 import org.ovirt.engine.core.common.action.AddVdsActionParameters;
 import 
org.ovirt.engine.core.common.action.ManagementNetworkOnClusterOperationParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
@@ -61,6 +60,8 @@
 import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback;
 import org.ovirt.engine.ui.uicompat.NotifyCollectionChangedEventArgs;
 import org.ovirt.engine.ui.uicompat.UIConstants;
+
+import com.google.inject.Inject;
 
 public class ClusterListModel<E> extends ListWithDetailsAndReportsModel<E, 
VDSGroup> implements ISupportSystemTreeContext {
 
@@ -381,6 +382,7 @@
         
clusterModel.getEnableGlusterService().setEntity(cluster.supportsGlusterService());
         clusterModel.getEnableGlusterService().setIsChangable(true);
         clusterModel.getEnableKsm().setEntity(cluster.isEnableKsm());
+        clusterModel.setKsmPolicyForNuma(cluster.isKsmMergeAcrossNumaNodes());
         
clusterModel.getEnableBallooning().setEntity(cluster.isEnableBallooning());
         
clusterModel.getArchitecture().setSelectedItem(cluster.getArchitecture());
         
clusterModel.getSerialNumberPolicy().setSelectedSerialNumberPolicy(cluster.getSerialNumberPolicy());
@@ -680,6 +682,7 @@
         
cluster.setCountThreadsAsCores(Boolean.TRUE.equals(model.getVersionSupportsCpuThreads().getEntity())
                 && 
Boolean.TRUE.equals(model.getCountThreadsAsCores().getEntity()));
         
cluster.setEnableKsm(Boolean.TRUE.equals(model.getEnableKsm().getEntity()));
+        cluster.setKsmMergeAcrossNumaNodes(model.getKsmPolicyForNuma());
         
cluster.setEnableBallooning(Boolean.TRUE.equals(model.getEnableBallooning().getEntity())
                 && version.compareTo(Version.v3_3) >= 0);
         cluster.setTransparentHugepages(version.compareTo(new Version("3.0")) 
>= 0); //$NON-NLS-1$
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 d5c7749..5703b57 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
@@ -36,8 +36,8 @@
 import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
 import org.ovirt.engine.ui.uicommonweb.models.ApplicationModeHelper;
 import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
-import org.ovirt.engine.ui.uicommonweb.models.HasEntity;
 import org.ovirt.engine.ui.uicommonweb.models.FilteredListModel;
+import org.ovirt.engine.ui.uicommonweb.models.HasEntity;
 import org.ovirt.engine.ui.uicommonweb.models.HasValidatedTabs;
 import org.ovirt.engine.ui.uicommonweb.models.ListModel;
 import org.ovirt.engine.ui.uicommonweb.models.TabName;
@@ -59,7 +59,7 @@
 {
     private Map<Guid, PolicyUnit> policyUnitMap;
     private ListModel<ClusterPolicy> clusterPolicy;
-    private Map<Guid, Network> defaultManagementNetworkCache = new HashMap<>();
+    private final Map<Guid, Network> defaultManagementNetworkCache = new 
HashMap<>();
     private Boolean detached;
 
     public ListModel<ClusterPolicy> getClusterPolicy() {
@@ -550,6 +550,16 @@
         this.enableKsm = enableKsm;
     }
 
+    private ListModel<KsmPolicyForNuma> ksmPolicyForNumaSelection;
+
+    public ListModel<KsmPolicyForNuma> getKsmPolicyForNumaSelection() {
+        return ksmPolicyForNumaSelection;
+    }
+
+    private void setKsmPolicyForNumaSelection(ListModel<KsmPolicyForNuma> 
value) {
+        ksmPolicyForNumaSelection = value;
+    }
+
     private EntityModel<Boolean> enableBallooning;
 
     public EntityModel<Boolean> getEnableBallooning() {
@@ -862,6 +872,9 @@
     public ClusterModel()
     {
         super();
+        ListModel<KsmPolicyForNuma> ksmPolicyForNumaSelection = new 
ListModel<KsmPolicyForNuma>();
+        
ksmPolicyForNumaSelection.setItems(Arrays.asList(KsmPolicyForNuma.values()));
+        setKsmPolicyForNumaSelection(ksmPolicyForNumaSelection);
     }
 
     public void init(final boolean isEdit) {
@@ -1057,8 +1070,21 @@
         tempVar7.setEntity(false);
         setMigrateOnErrorOption_HA_ONLY(tempVar7);
         
getMigrateOnErrorOption_HA_ONLY().getEntityChangedEvent().addListener(this);
+        // KSM feature
         setEnableKsm(new EntityModel<Boolean>());
         getEnableKsm().setEntity(false);
+        getEnableKsm().getEntityChangedEvent().addListener(new 
IEventListener<EventArgs>() {
+            @Override
+            public void eventRaised(Event<? extends EventArgs> ev, Object 
sender, EventArgs args) {
+                if (getEnableKsm().getEntity() == null)
+                    return;
+                if (getEnableKsm().getEntity() == true)
+                    getKsmPolicyForNumaSelection().setIsChangable(true);
+                if (getEnableKsm().getEntity() == false)
+                    getKsmPolicyForNumaSelection().setIsChangable(false);
+            }
+        });
+
         setEnableBallooning(new EntityModel<Boolean>());
         getEnableBallooning().setEntity(false);
         // Optimization methods:
@@ -1385,6 +1411,8 @@
             }
         };
         AsyncDataProvider.getInstance().getDataCenterList(_asyncQuery);
+        if (getEnableKsm().getEntity() == false)
+            getKsmPolicyForNumaSelection().setIsChangable(false);
     }
 
     private void loadCurrentClusterManagementNetwork() {
@@ -1621,6 +1649,15 @@
         if (isSmallerThanVersion3_4) {
             getEnableKsm().setEntity(true);
         }
+        // allow KSM with NUMA awareness only from version 3.6
+//        boolean isSmallerThanVersion3_6 = version.compareTo(Version.v3_6) < 
0;
+//        
getKsmMergeAcrossNumaNodes().setIsChangable(!isSmallerThanVersion3_6);
+//        
getKsmMergeAcrossNumaNodes().setChangeProhibitionReason(ConstantsManager.getInstance()
+//                .getConstants()
+//                .ksmWithNumaAwarnessNotAvailable());
+//        if (isSmallerThanVersion3_6) {// set default value for versions 
lower then 3.6
+//            getKsmMergeAcrossNumaNodes().setEntity(true);
+//        }
 
         updateMigrateOnError();
 
@@ -1998,4 +2035,43 @@
                 ? ""
                 : srcs;
     }
+
+    public boolean getKsmPolicyForNuma() {
+        switch (getKsmPolicyForNumaSelection().getSelectedItem()) {
+        case shareAcrossNumaNodes:
+            return true;
+        case shareInsideEachNumaNode:
+            return false;
+        }
+        return true;
+    }
+
+    public void setKsmPolicyForNuma(Boolean ksmPolicyForNumaFlag) {
+        if (ksmPolicyForNumaFlag == null)
+            return;
+        KsmPolicyForNuma ksmPolicyForNuma = 
KsmPolicyForNuma.shareAcrossNumaNodes;
+        if (ksmPolicyForNumaFlag == false)
+            ksmPolicyForNuma = KsmPolicyForNuma.shareInsideEachNumaNode;
+
+        getKsmPolicyForNumaSelection().setSelectedItem(ksmPolicyForNuma);
+        return;
+    }
+
+    public enum KsmPolicyForNuma {
+
+        
shareAcrossNumaNodes(ConstantsManager.getInstance().getConstants().shareKsmAcrossNumaNodes()),
+        
shareInsideEachNumaNode(ConstantsManager.getInstance().getConstants().shareKsmInsideEachNumaNode());
+
+        private String description;
+
+        private KsmPolicyForNuma(String description) {
+            this.description = description;
+        }
+
+        @Override
+        public String toString() {
+            return description;
+        }
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
index b418507..49db1d5 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
@@ -2289,9 +2289,19 @@
     @DefaultStringValue("Remove Scheduling Policy")
     String removeClusterPolicyTitle();
 
+    // MoM
     @DefaultStringValue("KSM control is only available for Cluster 
compatibility version 3.4 and higher")
     String ksmNotAvailable();
 
+    @DefaultStringValue("KSM with NUMA optimization control is only available 
for Cluster compatibility version 3.6 and higher")
+    String ksmWithNumaAwarnessNotAvailable();
+
+    @DefaultStringValue("Share memory pages across all available memory (best 
KSM effectivness)")
+    String shareKsmAcrossNumaNodes();
+
+    @DefaultStringValue("Share memory pages inside NUMA nodes (best NUMA 
performance)")
+    String shareKsmInsideEachNumaNode();
+
     @DefaultStringValue("Ballooning is only available for Cluster 
compatibility version 3.3 and higher")
     String ballooningNotAvailable();
 
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 41ffe5a..3808af5 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
@@ -118,6 +118,9 @@
     @DefaultStringValue("Destination Volume")
     String volumeSubTabGeoRepSlaveVolumeColumn();
 
+    @DefaultStringValue("User Name")
+    String volumeSubTabGeoRepSlaveUserColumn();
+
     @DefaultStringValue("Status")
     String volumeSubTabGeoRepStatusColumn();
 
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 e07d600..64aaeba 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
@@ -18,6 +18,7 @@
 import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab;
 import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTabPanel;
 import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
+import org.ovirt.engine.ui.common.widget.editor.ListModelRadioGroupEditor;
 import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
 import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxOnlyEditor;
 import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelRadioButtonEditor;
@@ -408,6 +409,11 @@
 
     private final Driver driver = GWT.create(Driver.class);
 
+    @UiField
+    @Path(value = "ksmPolicyForNumaSelection.selectedItem")
+    public ListModelRadioGroupEditor<ClusterModel.KsmPolicyForNuma> 
ksmPolicyForNumaEditor;
+
+
     private final static ApplicationTemplates templates = 
AssetProvider.getTemplates();
     private final static ApplicationResources resources = 
AssetProvider.getResources();
     private final static ApplicationConstants constants = 
AssetProvider.getConstants();
@@ -452,6 +458,8 @@
         
enableHaReservationEditor.setContentWidgetContainerStyleName(style.fullWidth());
         
enableOptionalReasonEditor.setContentWidgetContainerStyleName(style.fullWidth());
         
enableHostMaintenanceReasonEditor.setContentWidgetContainerStyleName(style.fullWidth());
+
+        
ksmPolicyForNumaEditor.setContentWidgetContainerStyleName(style.overrideRadioButtonPanelWidth());
     }
 
     private void localize() {
@@ -806,10 +814,13 @@
         String timeTextBoxEditorWidget();
 
         String optimizationTabPanel();
+
+        String overrideRadioButtonPanelWidth();
     }
 
     @Override
     public DialogTabPanel getTabPanel() {
         return tabPanel;
     }
+
 }
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 166b53d..398a74e 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
@@ -1,311 +1,381 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
 <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
-    xmlns:g="urn:import:com.google.gwt.user.client.ui" 
xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog"
-    xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" 
xmlns:t="urn:import:org.ovirt.engine.ui.common.widget.dialog.tab"
-    xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic"
-    xmlns:w="urn:import:org.ovirt.engine.ui.common.widget" 
xmlns:k="urn:import:org.ovirt.engine.ui.common.widget.form.key_value"
-    xmlns:vm="urn:import:org.ovirt.engine.ui.common.widget.uicommon.popup.vm">
+       xmlns:g="urn:import:com.google.gwt.user.client.ui" 
xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog"
+       xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" 
xmlns:t="urn:import:org.ovirt.engine.ui.common.widget.dialog.tab"
+       xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic"
+       xmlns:w="urn:import:org.ovirt.engine.ui.common.widget" 
xmlns:k="urn:import:org.ovirt.engine.ui.common.widget.form.key_value"
+       
xmlns:vm="urn:import:org.ovirt.engine.ui.common.widget.uicommon.popup.vm">
 
-    <ui:with field='resources' 
type='org.ovirt.engine.ui.webadmin.ApplicationResources' />
-    <ui:with field='constants' 
type='org.ovirt.engine.ui.webadmin.ApplicationConstants' />
+       <ui:with field='resources'
+               type='org.ovirt.engine.ui.webadmin.ApplicationResources' />
+       <ui:with field='constants'
+               type='org.ovirt.engine.ui.webadmin.ApplicationConstants' />
 
-    <ui:style 
type="org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster.ClusterPopupView.WidgetStyle">
-        .generalTabTopDecorator {
-            background-color: #D3D3D3;
-            margin-bottom: 8px;
-            margin-top: 4px;
-            margin-right: 3px;
-            padding-top: 6px;
-            padding-bottom: 6px;
+       <ui:style
+               
type="org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster.ClusterPopupView.WidgetStyle">
+               .generalTabTopDecorator {
+               background-color: #D3D3D3;
+               margin-bottom: 8px;
+               margin-top: 4px;
+               margin-right: 3px;
+               padding-top: 6px;
+               padding-bottom: 6px;
+               }
+
+               .generalTabTopDecoratorEmpty {
+               display: none;
+               }
+
+               .explanationLabel {
+               font-style: italic;
+               margin-left: 40px;
+               margin-bottom: 10px;
+               width: 300px;
+               }
+
+               .label {
+               width: 100%;
+               }
+               .radioButtonLabel {
+               width: 250px;
+               }
+               .radioButtonsTabContent {
+               margin-top: 10px;
+               }
+
+               .messageLabel {
+               color: #FF0000;
+               left: 10px;
+               padding-left: 5px;
+               padding-top: 10px;
+               }
+               .explanationLabel {
+               font-style: italic;
+               margin: 10px 5px;
+               }
+               .fingerprintLabel textarea{
+               height: 35px;
+               }
+               .editorContentWidget{
+               width: 350px;
+               margin-top: 10px;
+               }
+
+               .fullWidth {
+               float: right;
+               width: 460px;
+               padding: 0 5px;
+               line-height: 26px;
+               }
+               .radioButtonPositioning {
+               padding: 0 5px;
+               margin-top: 5px;
+               }
+               .panelTitle {
+               font-size: 14px;
+               padding-left: 3px;
+               padding-bottom: 10px;
+               display: inline-block;
+               }
+               .panelInfo {
+               display: inline-block;
+               margin-left: 5px;
+               }
+               .nestedSubsequentPanel {
+               padding-top: 24px;
+               }
+
+               .button {
+               width: 100px;
+               margin: 10;
+               }
+               .transparent {
+               width: 400px;
+               height: 40px;
+               opacity: .8;
+               }
+               .geryPanel {
+               background-color: grey;
+               height: 20px;
+               width: 160px;
+               }
+               .minLabel {
+               height: 10px;
+               width: 10px;
+               margin-top: 3px;
+               margin-left: 6px;
+               background-color: #AFBF27;
+               }
+               .maxLabel {
+               height: 10px;
+               width: 10px;
+               margin-top: 3px;
+               margin-left: 6px;
+               background-color: #4E9FDD;
+               }
+               .marginPanel {
+               margin: 6px;
+               }
+               .topMarginPanel {
+               margin-top: 10px;
+               }
+               .minMaxPanel {
+               margin-top: 30px;
+               }
+
+               .timeTextBoxEditorWidget {
+               width: 30px;
+               padding: 0px;
+               margin: 0px;
+               vertical-align: top;
+               height: 20px;
+               line-height: 20px;
+               }
+               .labelStyle {
+               margin-top: 3px;
+               margin-left: 6px;
+               }
+               .gerySplitPanel {
+               background-color: grey;
+               height: 20px;
+               width: 8px;
+               }
+               .labelStyle {
+               font-weight: bold;
+               margin-top: 10px;
+               margin-bottom: 5px;
+               }
+
+               .optimizationTabPanel {
+               height: 470px;
+               }
+
+               .optimizationTabPanel label {
+               display: inline;
+               }
+
+        .overrideRadioButtonPanelWidth {
+            width: 90%;
+            margin: 0px 0px 0px 30px;
         }
 
-        .generalTabTopDecoratorEmpty {
-            display: none;
-        }
+               .sectionPanel {
+               margin-bottom: 20px;
+               }
+               
+               .label {
+               padding-left: 5px;
+               }
 
-        .explanationLabel {
-            font-style: italic;
-            margin-left: 40px;
-            margin-bottom: 10px;
-            width: 300px;
-        }
+       </ui:style>
 
-        .label {
-            width: 100%;
-        }
-        .radioButtonLabel {
-            width: 250px;
-        }
-        .radioButtonsTabContent {
-            margin-top: 10px;
-        }
-
-        .messageLabel {
-            color: #FF0000;
-            left: 10px;
-            padding-left: 5px;
-            padding-top: 10px;
-        }
-        .explanationLabel {
-            font-style: italic;
-            margin: 10px 5px;
-        }
-        .fingerprintLabel textarea{
-            height: 35px;
-        }
-        .editorContentWidget{
-            width: 350px;
-            margin-top: 10px;
-        }
-
-        .fullWidth {
-            float: right;
-            width: 460px;
-            padding: 0 5px;
-            line-height: 26px;
-        }
-        .radioButtonPositioning {
-            padding: 0 5px;
-            margin-top: 5px;
-        }
-        .panelTitle {
-            font-size: 14px;
-            padding-left: 3px;
-            padding-bottom: 10px;
-            display: inline-block;
-        }
-        .panelInfo {
-            display: inline-block;
-            margin-left: 5px;
-        }
-        .nestedSubsequentPanel {
-            padding-top: 24px;
-        }
-
-        .button {
-            width: 100px;
-            margin: 10;
-        }
-        .transparent {
-            width: 400px;
-            height: 40px;
-            opacity: .8;
-        }
-        .geryPanel {
-            background-color: grey;
-            height: 20px;
-            width: 160px;
-        }
-        .minLabel {
-            height: 10px;
-            width: 10px;
-            margin-top: 3px;
-            margin-left: 6px;
-            background-color: #AFBF27;
-        }
-        .maxLabel {
-            height: 10px;
-            width: 10px;
-            margin-top: 3px;
-            margin-left: 6px;
-            background-color: #4E9FDD;
-        }
-        .marginPanel {
-            margin: 6px;
-        }
-        .topMarginPanel {
-            margin-top: 10px;
-        }
-        .minMaxPanel {
-            margin-top: 30px;
-        }
-
-        .timeTextBoxEditorWidget {
-            width: 30px;
-            padding: 0px;
-            margin: 0px;
-            vertical-align: top;
-            height: 20px;
-            line-height: 20px;
-        }
-        .labelStyle {
-            margin-top: 3px;
-            margin-left: 6px;
-        }
-        .gerySplitPanel {
-            background-color: grey;
-            height: 20px;
-            width: 8px;
-        }
-        .labelStyle {
-        font-weight: bold;
-        margin-top: 10px;
-        margin-bottom: 5px;
-        }
-
-        .optimizationTabPanel {
-            height: 470px;
-        }
-
-        .optimizationTabPanel label {
-            display: inline;
-        }
-
-        .sectionPanel {
-            margin-bottom: 20px;
-        }
-
-    </ui:style>
-
-    <d:SimpleDialogPanel width="800px" height="560px">
-        <d:content>
-            <t:DialogTabPanel ui:field="tabPanel" height="100%">
-                <t:tab>
-                    <t:DialogTab ui:field="generalTab">
-                        <t:content>
-                            <g:FlowPanel addStyleNames="{style.sectionPanel}">
-                                <g:FlowPanel ui:field="dataCenterPanel" 
addStyleNames="{style.generalTabTopDecorator} generalTabTopDecorator_pfly_fix">
-                                    <e:ListModelListBoxEditor 
ui:field="dataCenterEditor" />
-                                </g:FlowPanel>
-                                <ge:StringEntityModelTextBoxEditor 
ui:field="nameEditor" />
-                                <ge:StringEntityModelTextBoxEditor 
ui:field="descriptionEditor" />
-                                <ge:StringEntityModelTextBoxEditor 
ui:field="commentEditor" />
-                                <e:ListModelListBoxEditor 
ui:field="managementNetworkEditor" />
-                                <e:ListModelListBoxEditor 
ui:field="architectureEditor" />
-                                <e:ListModelListBoxEditor ui:field="cpuEditor" 
/>
-                                <e:ListModelListBoxEditor 
ui:field="versionEditor" />
-                                <g:VerticalPanel 
ui:field="servicesCheckboxPanel">
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="enableOvirtServiceEditor" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="enableGlusterServiceEditor" />
-                                </g:VerticalPanel>
-                                <g:VerticalPanel ui:field="servicesRadioPanel">
-                                    <ge:EntityModelRadioButtonEditor 
ui:field="enableOvirtServiceOptionEditor" />
-                                    <ge:EntityModelRadioButtonEditor 
ui:field="enableGlusterServiceOptionEditor" />
-                                </g:VerticalPanel>
-                                <ge:EntityModelCheckBoxEditor 
ui:field="importGlusterConfigurationEditor"/>
-                                <g:Label 
ui:field="importGlusterExplanationLabel" 
addStyleNames="{style.explanationLabel}"/>
-                                <ge:StringEntityModelTextBoxEditor 
ui:field="glusterHostAddressEditor" />
-                                <ge:StringEntityModelTextAreaLabelEditor 
addStyleNames="{style.fingerprintLabel}" 
ui:field="glusterHostFingerprintEditor" />
-                                <ge:StringEntityModelPasswordBoxEditor 
ui:field="glusterHostPasswordEditor" />
-                                <g:Label ui:field="messageLabel" 
addStyleNames="{style.messageLabel}" />
-                                <ge:EntityModelCheckBoxEditor 
ui:field="enableOptionalReasonEditor" />
-                                <ge:EntityModelCheckBoxEditor 
ui:field="enableHostMaintenanceReasonEditor" />
-                                <g:FlowPanel>
-                                    <g:Label ui:field="rngLabel"  
addStyleNames="{style.panelTitle}" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="rngRandomSourceRequired" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="rngHwrngSourceRequired" />
-                                </g:FlowPanel>
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
-                </t:tab>
-                <t:tab>
-                    <t:DialogTab ui:field="optimizationTab">
-                        <t:content>
-                            <g:FlowPanel 
addStyleNames="{style.optimizationTabPanel}">
-                                <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
-                                    <g:Label 
ui:field="memoryOptimizationPanelTitle" addStyleNames="{style.panelTitle}" />
-                                    <d:InfoIcon 
ui:field="memoryOptimizationInfo" addStyleNames="{style.panelInfo}" />
-                                    <ge:EntityModelRadioButtonEditor 
ui:field="optimizationNoneEditor" 
addStyleNames="{style.radioButtonPositioning}"/>
-                                    <ge:EntityModelRadioButtonEditor 
ui:field="optimizationForServerEditor" 
addStyleNames="{style.radioButtonPositioning}"/>
-                                    <ge:EntityModelRadioButtonEditor 
ui:field="optimizationForDesktopEditor" 
addStyleNames="{style.radioButtonPositioning}"/>
-                                    <ge:EntityModelRadioButtonEditor 
ui:field="optimizationCustomEditor" 
addStyleNames="{style.radioButtonPositioning}"/>
-                                </g:FlowPanel>
-                                <g:FlowPanel ui:field="cpuThreadsPanel" 
addStyleNames="{style.nestedSubsequentPanel}">
-                                    <g:Label ui:field="cpuThreadsPanelTitle" 
addStyleNames="{style.panelTitle}" />
-                                    <d:InfoIcon ui:field="cpuThreadsInfo" 
addStyleNames="{style.panelInfo}" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="countThreadsAsCoresEditor" />
-                                </g:FlowPanel>
-                                <g:FlowPanel 
addStyleNames="{style.nestedSubsequentPanel}">
-                                    <g:Label 
text="{constants.ballooningLabelTitle}" addStyleNames="{style.panelTitle}" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="enableBallooning" />
-                                </g:FlowPanel>
-                                <g:FlowPanel 
addStyleNames="{style.nestedSubsequentPanel}">
-                                    <g:Label text="{constants.ksmLabelTitle}" 
addStyleNames="{style.panelTitle}" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="enableKsm" />
-                                </g:FlowPanel>
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
-                </t:tab>
-                <t:tab>
-                    <t:DialogTab ui:field="resiliencePolicyTab">
-                        <t:content>
-                            <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
-                                <ge:EntityModelRadioButtonEditor 
ui:field="migrateOnErrorOption_YESEditor" addStyleNames="{style.label}" />
-                                <ge:EntityModelRadioButtonEditor 
ui:field="migrateOnErrorOption_HA_ONLYEditor" addStyleNames="{style.label}" />
-                                <ge:EntityModelRadioButtonEditor 
ui:field="migrateOnErrorOption_NOEditor" addStyleNames="{style.label}" />
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
-                </t:tab>
-                <t:tab>
-                    <t:DialogTab ui:field="clusterPolicyTab">
-                        <t:content>
-                            <g:FlowPanel 
addStyleNames="cvp_clusterPolicyContent_pfly_fix">
-                                <e:ListModelListBoxEditor 
ui:field="clusterPolicyEditor" />
-                                <g:Label addStyleNames="{style.labelStyle}" 
text="{constants.clusterPolicyPropertiesLabel}" />
-                                <g:ScrollPanel height="100px">
-                                    <k:KeyValueWidget 
ui:field="customPropertiesSheetEditor" />
-                                </g:ScrollPanel>
-                                <g:FlowPanel>
-                                    <g:Label 
ui:field="schedulerOptimizationPanelTitle" addStyleNames="{style.panelTitle}" />
-                                    <d:InfoIcon 
ui:field="schedulerOptimizationInfoIcon" addStyleNames="{style.panelInfo}" />
-                                    <g:HorizontalPanel>
-                                        <ge:EntityModelRadioButtonEditor 
ui:field="optimizeForUtilizationEditor" 
addStyleNames="{style.radioButtonLabel}" />
-                                        <ge:EntityModelRadioButtonEditor 
ui:field="optimizeForSpeedEditor" addStyleNames="{style.radioButtonLabel}" />
-                                    </g:HorizontalPanel>
-                                    <g:HorizontalPanel 
ui:field="allowOverbookingPanel">
-                                        <ge:EntityModelRadioButtonEditor 
ui:field="guarantyResourcesEditor" addStyleNames="{style.radioButtonLabel}"/>
-                                        <ge:EntityModelRadioButtonEditor 
ui:field="allowOverbookingEditor" addStyleNames="{style.radioButtonLabel}"/>
-                                        <d:InfoIcon 
ui:field="allowOverbookingInfoIcon" addStyleNames="{style.panelInfo}" />
-                                    </g:HorizontalPanel>
-                                </g:FlowPanel>
-                                <g:FlowPanel ui:field="additionPropsPanel" 
addStyleNames="{style.nestedSubsequentPanel}">
-                                    <g:Label 
ui:field="additionPropsPanelTitle" addStyleNames="{style.panelTitle}" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="enableTrustedServiceEditor" />
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="enableHaReservationEditor" />
-                                </g:FlowPanel>
-                                <vm:SerialNumberPolicyWidget 
ui:field="serialNumberPolicyEditor" />
-                                <e:ListModelListBoxEditor 
ui:field="autoConvergeEditor" label="{constants.autoConvergeLabel}" />
-                                <e:ListModelListBoxEditor 
ui:field="migrateCompressedEditor" label="{constants.migrateCompressedLabel}" />
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
-                </t:tab>
-                <t:tab>
-                    <t:DialogTab ui:field="consoleTab">
-                        <t:content>
-                            <g:FlowPanel 
addStyleNames="cvp_consoleContent_pfly_fix">
-                                <w:EntityModelWidgetWithInfo 
ui:field="spiceProxyEnabledCheckboxWithInfoIcon" 
addStyleNames="cpv_spiceProxyEnabledCheckbox_pfly_fix" />
-                                <ge:StringEntityModelTextBoxEditor 
ui:field="spiceProxyEditor"/>
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
-                </t:tab>
-                <t:tab>
-                    <t:DialogTab ui:field="fencingPolicyTab">
-                        <t:content>
-                            <g:FlowPanel 
addStyleNames="cvp_fencingPolicyContent_pfly_fix">
-                                <g:HorizontalPanel>
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="fencingEnabledCheckBox" />
-                                    <d:InfoIcon ui:field="fencingEnabledInfo" 
addStyleNames="cpv_fencingEnabledInfo_pfly_fix" />
-                                </g:HorizontalPanel>
-                                <g:HorizontalPanel 
addStyleNames="cpv_skipFencingIfSDActiveInfo_line_pfly_fix">
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="skipFencingIfSDActiveCheckBox" />
-                                    <d:InfoIcon 
ui:field="skipFencingIfSDActiveInfo" 
addStyleNames="cpv_skipFencingIfSDActiveInfo_pfly_fix" />
-                                </g:HorizontalPanel>
-                                <g:HorizontalPanel 
addStyleNames="cpv_hostsWithBrokenConnectivityThresholdEditor_line_pfly_fix">
-                                    <ge:EntityModelCheckBoxEditor 
ui:field="skipFencingIfConnectivityBrokenCheckBox" />
-                                    <d:InfoIcon 
ui:field="skipFencingIfConnectivityBrokenInfo" />
-                                    <e:ListModelListBoxEditor 
ui:field="hostsWithBrokenConnectivityThresholdEditor" 
addStyleNames="cpv_hostsWithBrokenConnectivityThresholdEditor_pfly_fix" />
-                                </g:HorizontalPanel>
-                            </g:FlowPanel>
-                        </t:content>
-                    </t:DialogTab>
-                </t:tab>
-            </t:DialogTabPanel>
-        </d:content>
-    </d:SimpleDialogPanel>
+       <d:SimpleDialogPanel width="800px" height="560px">
+               <d:content>
+                       <t:DialogTabPanel ui:field="tabPanel" height="100%">
+                               <t:tab>
+                                       <t:DialogTab ui:field="generalTab">
+                                               <t:content>
+                                                       <g:FlowPanel 
addStyleNames="{style.sectionPanel}">
+                                                               <g:FlowPanel 
ui:field="dataCenterPanel"
+                                                                       
addStyleNames="{style.generalTabTopDecorator} generalTabTopDecorator_pfly_fix">
+                                                                       
<e:ListModelListBoxEditor ui:field="dataCenterEditor" />
+                                                               </g:FlowPanel>
+                                                               
<ge:StringEntityModelTextBoxEditor
+                                                                       
ui:field="nameEditor" />
+                                                               
<ge:StringEntityModelTextBoxEditor
+                                                                       
ui:field="descriptionEditor" />
+                                                               
<ge:StringEntityModelTextBoxEditor
+                                                                       
ui:field="commentEditor" />
+                                                               
<e:ListModelListBoxEditor ui:field="managementNetworkEditor" />
+                                                               
<e:ListModelListBoxEditor ui:field="architectureEditor" />
+                                                               
<e:ListModelListBoxEditor ui:field="cpuEditor" />
+                                                               
<e:ListModelListBoxEditor ui:field="versionEditor" />
+                                                               
<g:VerticalPanel ui:field="servicesCheckboxPanel">
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="enableOvirtServiceEditor" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="enableGlusterServiceEditor" />
+                                                               
</g:VerticalPanel>
+                                                               
<g:VerticalPanel ui:field="servicesRadioPanel">
+                                                                       
<ge:EntityModelRadioButtonEditor
+                                                                               
ui:field="enableOvirtServiceOptionEditor" />
+                                                                       
<ge:EntityModelRadioButtonEditor
+                                                                               
ui:field="enableGlusterServiceOptionEditor" />
+                                                               
</g:VerticalPanel>
+                                                               
<ge:EntityModelCheckBoxEditor
+                                                                       
ui:field="importGlusterConfigurationEditor" />
+                                                               <g:Label 
ui:field="importGlusterExplanationLabel"
+                                                                       
addStyleNames="{style.explanationLabel}" />
+                                                               
<ge:StringEntityModelTextBoxEditor
+                                                                       
ui:field="glusterHostAddressEditor" />
+                                                               
<ge:StringEntityModelTextAreaLabelEditor
+                                                                       
addStyleNames="{style.fingerprintLabel}" 
ui:field="glusterHostFingerprintEditor" />
+                                                               
<ge:StringEntityModelPasswordBoxEditor
+                                                                       
ui:field="glusterHostPasswordEditor" />
+                                                               <g:Label 
ui:field="messageLabel" addStyleNames="{style.messageLabel}" />
+                                                               
<ge:EntityModelCheckBoxEditor
+                                                                       
ui:field="enableOptionalReasonEditor" />
+                                                               
<ge:EntityModelCheckBoxEditor
+                                                                       
ui:field="enableHostMaintenanceReasonEditor" />
+                                                               <g:FlowPanel>
+                                                                       
<g:Label ui:field="rngLabel" addStyleNames="{style.panelTitle}" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="rngRandomSourceRequired" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="rngHwrngSourceRequired" />
+                                                               </g:FlowPanel>
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
+                               </t:tab>
+                               <t:tab>
+                                       <t:DialogTab ui:field="optimizationTab">
+                                               <t:content>
+                                                       <g:FlowPanel 
addStyleNames="{style.optimizationTabPanel}">
+                                                               <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
+                                                                       
<g:Label ui:field="memoryOptimizationPanelTitle"
+                                                                               
addStyleNames="{style.panelTitle}" />
+                                                                       
<d:InfoIcon ui:field="memoryOptimizationInfo"
+                                                                               
addStyleNames="{style.panelInfo}" />
+                                                                       
<ge:EntityModelRadioButtonEditor
+                                                                               
ui:field="optimizationNoneEditor" 
addStyleNames="{style.radioButtonPositioning}" />
+                                                                       
<ge:EntityModelRadioButtonEditor
+                                                                               
ui:field="optimizationForServerEditor" 
addStyleNames="{style.radioButtonPositioning}" />
+                                                                       
<ge:EntityModelRadioButtonEditor
+                                                                               
ui:field="optimizationForDesktopEditor" 
addStyleNames="{style.radioButtonPositioning}" />
+                                                                       
<ge:EntityModelRadioButtonEditor
+                                                                               
ui:field="optimizationCustomEditor" 
addStyleNames="{style.radioButtonPositioning}" />
+                                                               </g:FlowPanel>
+                                                               <g:FlowPanel 
ui:field="cpuThreadsPanel"
+                                                                       
addStyleNames="{style.nestedSubsequentPanel}">
+                                                                       
<g:Label ui:field="cpuThreadsPanelTitle" addStyleNames="{style.panelTitle}" />
+                                                                       
<d:InfoIcon ui:field="cpuThreadsInfo" addStyleNames="{style.panelInfo}" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="countThreadsAsCoresEditor" />
+                                                               </g:FlowPanel>
+                                                               <g:FlowPanel 
addStyleNames="{style.nestedSubsequentPanel}">
+                                                                       
<g:Label text="{constants.ballooningLabelTitle}"
+                                                                               
addStyleNames="{style.panelTitle}" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="enableBallooning" />
+                                                               </g:FlowPanel>
+                                                               <g:FlowPanel 
addStyleNames="{style.nestedSubsequentPanel}">
+                                                                       
<g:Label text="{constants.ksmLabelTitle}"
+                                                                               
addStyleNames="{style.panelTitle}" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="enableKsm" />
+                                                                       
<e:ListModelRadioGroupEditor ui:field="ksmPolicyForNumaEditor" />
+                                                               </g:FlowPanel>
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
+                               </t:tab>
+                               <t:tab>
+                                       <t:DialogTab 
ui:field="resiliencePolicyTab">
+                                               <t:content>
+                                                       <g:FlowPanel 
addStyleNames="{style.radioButtonsTabContent}">
+                                                               
<ge:EntityModelRadioButtonEditor
+                                                                       
ui:field="migrateOnErrorOption_YESEditor" addStyleNames="{style.label}" />
+                                                               
<ge:EntityModelRadioButtonEditor
+                                                                       
ui:field="migrateOnErrorOption_HA_ONLYEditor" addStyleNames="{style.label}" />
+                                                               
<ge:EntityModelRadioButtonEditor
+                                                                       
ui:field="migrateOnErrorOption_NOEditor" addStyleNames="{style.label}" />
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
+                               </t:tab>
+                               <t:tab>
+                                       <t:DialogTab 
ui:field="clusterPolicyTab">
+                                               <t:content>
+                                                       <g:FlowPanel 
addStyleNames="cvp_clusterPolicyContent_pfly_fix">
+                                                               
<e:ListModelListBoxEditor ui:field="clusterPolicyEditor" />
+                                                               <g:Label 
addStyleNames="{style.labelStyle}"
+                                                                       
text="{constants.clusterPolicyPropertiesLabel}" />
+                                                               <g:ScrollPanel 
height="100px">
+                                                                       
<k:KeyValueWidget ui:field="customPropertiesSheetEditor" />
+                                                               </g:ScrollPanel>
+                                                               <g:FlowPanel>
+                                                                       
<g:Label ui:field="schedulerOptimizationPanelTitle"
+                                                                               
addStyleNames="{style.panelTitle}" />
+                                                                       
<d:InfoIcon ui:field="schedulerOptimizationInfoIcon"
+                                                                               
addStyleNames="{style.panelInfo}" />
+                                                                       
<g:HorizontalPanel>
+                                                                               
<ge:EntityModelRadioButtonEditor
+                                                                               
        ui:field="optimizeForUtilizationEditor" 
addStyleNames="{style.radioButtonLabel}" />
+                                                                               
<ge:EntityModelRadioButtonEditor
+                                                                               
        ui:field="optimizeForSpeedEditor" 
addStyleNames="{style.radioButtonLabel}" />
+                                                                       
</g:HorizontalPanel>
+                                                                       
<g:HorizontalPanel ui:field="allowOverbookingPanel">
+                                                                               
<ge:EntityModelRadioButtonEditor
+                                                                               
        ui:field="guarantyResourcesEditor" 
addStyleNames="{style.radioButtonLabel}" />
+                                                                               
<ge:EntityModelRadioButtonEditor
+                                                                               
        ui:field="allowOverbookingEditor" 
addStyleNames="{style.radioButtonLabel}" />
+                                                                               
<d:InfoIcon ui:field="allowOverbookingInfoIcon"
+                                                                               
        addStyleNames="{style.panelInfo}" />
+                                                                       
</g:HorizontalPanel>
+                                                               </g:FlowPanel>
+                                                               <g:FlowPanel 
ui:field="additionPropsPanel"
+                                                                       
addStyleNames="{style.nestedSubsequentPanel}">
+                                                                       
<g:Label ui:field="additionPropsPanelTitle"
+                                                                               
addStyleNames="{style.panelTitle}" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="enableTrustedServiceEditor" />
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="enableHaReservationEditor" />
+                                                               </g:FlowPanel>
+                                                               
<vm:SerialNumberPolicyWidget
+                                                                       
ui:field="serialNumberPolicyEditor" />
+                                                               
<e:ListModelListBoxEditor ui:field="autoConvergeEditor"
+                                                                       
label="{constants.autoConvergeLabel}" />
+                                                               
<e:ListModelListBoxEditor ui:field="migrateCompressedEditor"
+                                                                       
label="{constants.migrateCompressedLabel}" />
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
+                               </t:tab>
+                               <t:tab>
+                                       <t:DialogTab ui:field="consoleTab">
+                                               <t:content>
+                                                       <g:FlowPanel 
addStyleNames="cvp_consoleContent_pfly_fix">
+                                                               
<w:EntityModelWidgetWithInfo
+                                                                       
ui:field="spiceProxyEnabledCheckboxWithInfoIcon" 
addStyleNames="cpv_spiceProxyEnabledCheckbox_pfly_fix" />
+                                                               
<ge:StringEntityModelTextBoxEditor
+                                                                       
ui:field="spiceProxyEditor" />
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
+                               </t:tab>
+                               <t:tab>
+                                       <t:DialogTab 
ui:field="fencingPolicyTab">
+                                               <t:content>
+                                                       <g:FlowPanel 
addStyleNames="cvp_fencingPolicyContent_pfly_fix">
+                                                               
<g:HorizontalPanel>
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="fencingEnabledCheckBox" />
+                                                                       
<d:InfoIcon ui:field="fencingEnabledInfo"
+                                                                               
addStyleNames="cpv_fencingEnabledInfo_pfly_fix" />
+                                                               
</g:HorizontalPanel>
+                                                               
<g:HorizontalPanel addStyleNames="cpv_skipFencingIfSDActiveInfo_line_pfly_fix">
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="skipFencingIfSDActiveCheckBox" />
+                                                                       
<d:InfoIcon ui:field="skipFencingIfSDActiveInfo"
+                                                                               
addStyleNames="cpv_skipFencingIfSDActiveInfo_pfly_fix" />
+                                                               
</g:HorizontalPanel>
+                                                               
<g:HorizontalPanel
+                                                                       
addStyleNames="cpv_hostsWithBrokenConnectivityThresholdEditor_line_pfly_fix">
+                                                                       
<ge:EntityModelCheckBoxEditor
+                                                                               
ui:field="skipFencingIfConnectivityBrokenCheckBox" />
+                                                                       
<d:InfoIcon ui:field="skipFencingIfConnectivityBrokenInfo" />
+                                                                       
<e:ListModelListBoxEditor
+                                                                               
ui:field="hostsWithBrokenConnectivityThresholdEditor"
+                                                                               
addStyleNames="cpv_hostsWithBrokenConnectivityThresholdEditor_pfly_fix" />
+                                                               
</g:HorizontalPanel>
+                                                       </g:FlowPanel>
+                                               </t:content>
+                                       </t:DialogTab>
+                               </t:tab>
+                       </t:DialogTabPanel>
+               </d:content>
+       </d:SimpleDialogPanel>
 </ui:UiBinder>
diff --git a/packaging/branding/ovirt.brand/ovirt-patternfly-compat.css 
b/packaging/branding/ovirt.brand/ovirt-patternfly-compat.css
index 9e48a00..21ce0e2 100644
--- a/packaging/branding/ovirt.brand/ovirt-patternfly-compat.css
+++ b/packaging/branding/ovirt.brand/ovirt-patternfly-compat.css
@@ -40,6 +40,7 @@
 
 label {
     font-weight: 500 !important;
+    padding-left: 5px;
 }
 
 
diff --git 
a/packaging/dbscripts/upgrade/03_06_1190_add_ksm_with_numa_awareness.sql 
b/packaging/dbscripts/upgrade/03_06_1190_add_ksm_with_numa_awareness.sql
new file mode 100644
index 0000000..98565de
--- /dev/null
+++ b/packaging/dbscripts/upgrade/03_06_1190_add_ksm_with_numa_awareness.sql
@@ -0,0 +1 @@
+select fn_db_add_column('vds_groups', 'ksm_merge_across_nodes', 'boolean 
default TRUE NULL');
\ No newline at end of file
diff --git a/packaging/dbscripts/vds_groups_sp.sql 
b/packaging/dbscripts/vds_groups_sp.sql
index 397f15f..19372bf 100644
--- a/packaging/dbscripts/vds_groups_sp.sql
+++ b/packaging/dbscripts/vds_groups_sp.sql
@@ -43,7 +43,8 @@
     v_hosts_with_broken_connectivity_threshold SMALLINT,
     v_fencing_enabled BOOLEAN,
     v_is_auto_converge BOOLEAN,
-    v_is_migrate_compressed BOOLEAN
+    v_is_migrate_compressed BOOLEAN,
+    v_ksm_merge_across_nodes BOOLEAN
 )
 RETURNS VOID
    AS $procedure$
@@ -51,11 +52,11 @@
       INSERT INTO vds_groups(vds_group_id,description, name, 
free_text_comment, cpu_name, storage_pool_id,  max_vds_memory_over_commit, 
count_threads_as_cores, compatibility_version,
         transparent_hugepages, migrate_on_error, virt_service, 
gluster_service, tunnel_migration, emulated_machine, detect_emulated_machine, 
trusted_service, ha_reservation, optional_reason, maintenance_reason_required, 
cluster_policy_id,
         cluster_policy_custom_properties, enable_balloon, architecture, 
optimization_type, spice_proxy, enable_ksm, serial_number_policy, 
custom_serial_number, required_rng_sources, skip_fencing_if_sd_active, 
skip_fencing_if_connectivity_broken, hosts_with_broken_connectivity_threshold, 
fencing_enabled,
-        is_auto_converge, is_migrate_compressed)
+        is_auto_converge, is_migrate_compressed, ksm_merge_across_nodes)
     VALUES(v_vds_group_id,v_description, v_name, v_free_text_comment, 
v_cpu_name, v_storage_pool_id,  v_max_vds_memory_over_commit, 
v_count_threads_as_cores, v_compatibility_version,
     v_transparent_hugepages, v_migrate_on_error, v_virt_service, 
v_gluster_service, v_tunnel_migration, v_emulated_machine, 
v_detect_emulated_machine, v_trusted_service, v_ha_reservation, 
v_optional_reason, v_maintenance_reason_required, v_cluster_policy_id, 
v_cluster_policy_custom_properties, v_enable_balloon,
     v_architecture, v_optimization_type, v_spice_proxy, v_enable_ksm, 
v_serial_number_policy, v_custom_serial_number, v_required_rng_sources, 
v_skip_fencing_if_sd_active, v_skip_fencing_if_connectivity_broken, 
v_hosts_with_broken_connectivity_threshold, v_fencing_enabled,
-    v_is_auto_converge, v_is_migrate_compressed);
+    v_is_auto_converge, v_is_migrate_compressed, v_ksm_merge_across_nodes);
 END; $procedure$
 LANGUAGE plpgsql;
 
@@ -98,7 +99,8 @@
     v_hosts_with_broken_connectivity_threshold SMALLINT,
     v_fencing_enabled BOOLEAN,
     v_is_auto_converge BOOLEAN,
-    v_is_migrate_compressed BOOLEAN
+    v_is_migrate_compressed BOOLEAN,
+    v_ksm_merge_across_nodes BOOLEAN
 )
 RETURNS VOID
 
@@ -123,7 +125,8 @@
       hosts_with_broken_connectivity_threshold = 
v_hosts_with_broken_connectivity_threshold,
       fencing_enabled = v_fencing_enabled,
       is_auto_converge = v_is_auto_converge,
-      is_migrate_compressed = v_is_migrate_compressed
+      is_migrate_compressed = v_is_migrate_compressed,
+      ksm_merge_across_nodes = v_ksm_merge_across_nodes 
       WHERE vds_group_id = v_vds_group_id;
 END; $procedure$
 LANGUAGE plpgsql;


-- 
To view, visit https://gerrit.ovirt.org/39777
To unsubscribe, visit https://gerrit.ovirt.org/settings

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

Reply via email to