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