Gilad Chaplik has uploaded a new change for review. Change subject: engine: cluster policy: adding description and info icons ......................................................................
engine: cluster policy: adding description and info icons * A description field is added to each pre-defined policy unit. * A description will be shown in a tool-tip foreach policy unit in cluster policy dialog, as well as info icon explaining the various section in the dialog. Change-Id: Ib51cf7f15b7d73c87e0c728953171584216e1d00 Signed-off-by: Gilad Chaplik <gchap...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/scheduling/PolicyUnitDaoImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/PolicyUnitDaoTest.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/ApplicationTemplates.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java A packaging/dbscripts/upgrade/03_03_0680_add_description_to_policy_unit.sql 10 files changed, 175 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/17629/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java index 3158093..6cbd1b6 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java @@ -102,6 +102,16 @@ } @Override + public String getDescription() { + return policyUnit.getDescription(); + } + + @Override + public void setDescription(String description) { + policyUnit.setDescription(description); + } + + @Override public final boolean isInternal() { return policyUnit.isInternal(); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java index f3d8ca8..b6a588f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java @@ -22,6 +22,10 @@ */ private String name; /** + * policy unit description. + */ + private String description; + /** * policy unit that is implemented in the system, or loaded externally. */ private boolean internal = true; @@ -61,6 +65,14 @@ return internal; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + public void setInternal(boolean internal) { this.internal = internal; } @@ -86,6 +98,7 @@ final int prime = 31; int result = 1; result = prime * result + ((policyUnitType == null) ? 0 : policyUnitType.hashCode()); + result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + (internal ? 1231 : 1237); result = prime * result + ((name == null) ? 0 : name.hashCode()); @@ -102,6 +115,11 @@ if (getClass() != obj.getClass()) return false; PolicyUnit other = (PolicyUnit) obj; + if (description == null) { + if (other.description != null) + return false; + } else if (!description.equals(other.description)) + return false; if (id == null) { if (other.id != null) return false; diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/scheduling/PolicyUnitDaoImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/scheduling/PolicyUnitDaoImpl.java index f6195e2..812ebd2 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/scheduling/PolicyUnitDaoImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/scheduling/PolicyUnitDaoImpl.java @@ -24,6 +24,7 @@ .addValue("name", entity.getName()) .addValue("is_internal", entity.isInternal()) .addValue("type", entity.getPolicyUnitType().getValue()) + .addValue("description", entity.getDescription()) .addValue("custom_properties_regex", SerializationFactory.getSerializer().serialize(entity.getParameterRegExMap())); } @@ -44,6 +45,7 @@ policyUnit.setName(rs.getString("name")); policyUnit.setInternal(rs.getBoolean("is_internal")); policyUnit.setPolicyUnitType(PolicyUnitType.forValue(rs.getInt("type"))); + policyUnit.setDescription(rs.getString("description")); policyUnit.setParameterRegExMap(SerializationFactory.getDeserializer() .deserializeOrCreateNew(rs.getString("custom_properties_regex"), LinkedHashMap.class)); return policyUnit; diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/PolicyUnitDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/PolicyUnitDaoTest.java index 4b83eca..5fee38b 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/PolicyUnitDaoTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/PolicyUnitDaoTest.java @@ -52,6 +52,7 @@ dummyPolicyUnit = new PolicyUnit(); dummyPolicyUnit.setId(Guid.newGuid()); dummyPolicyUnit.setName("Dummy policy unit"); + dummyPolicyUnit.setDescription("Description"); } } 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 51c7883..6d540e6 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 @@ -3056,4 +3056,33 @@ @DefaultStringValue("Action Items") String actionItems(); + + @DefaultStringValue("Filters represents hard constraints for running a VM. " + + "Each filter implements logic which validates a minimum requirements in order to run a VM. " + + "For example, minimum RAM, CPU, designated host, etc. Hosts who fail this validation " + + "are filtered out from the current request.") + String clusterPolicyFilterInfo(); + + @DefaultStringValue("Weights represent soft constraints for running a VM. " + + "Note: in a weighting system, lower score is considered better. So a host with the " + + "lowest score (weight) is the one the scheduler will choose. " + + "Each weight module scores any given host based on an optimization logic the module " + + "implements. For example, if we want to optimize for CPU load, the module will score " + + "each host based on its known CPU load. " + + "Weight modules scores are being summed, so it is possible to have more than one " + + "weight module. The way to prioritize modules is by increasing / decreasing a factor.") + String clusterPolicyWeightFunctionInfo(); + + @DefaultStringValue("Load balancing is a logic that determines which hosts are over-utilized and which " + + "are under-utilized. Then, the balancing mechanism calls the scheduler trying to " + + "migrate a VM from an over-utilized to an under-utilized host. " + + "Note that it is important to choose a balancing module that does not conflict with " + + "the weight module. Such a policy may destabilize this cluster. " + + "Only a single load-balancing module is supported.") + String clusterPolicyLoadBalancingInfo(); + + @DefaultStringValue("These properties are needed for one of the above modules, so they will appear when " + + "needed. Setting it when creating a policy generates the default values, which may " + + "be overridden in each specific cluster using this policy.") + String clusterPolicyPropertiesInfo(); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java index 77120e8..3ccd75b 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java @@ -142,4 +142,7 @@ "</table>" + "</div>") SafeHtml vmCountWithMigrating(String vmCountStr, String vmMigratingStr, String title, SafeHtml image); + + @Template("<div style='max-width: 500px; word-wrap:break-word; font-style: italic;'>{0}</div>") + SafeHtml italicWordWrapMaxWidth(String text); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java index c3864ad..816002a 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java @@ -8,6 +8,7 @@ import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.idhandler.WithElementId; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; +import org.ovirt.engine.ui.common.widget.dialog.InfoIcon; import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.common.widget.editor.EntityModelTextBoxEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxOnlyEditor; @@ -19,6 +20,7 @@ import org.ovirt.engine.ui.uicompat.IEventListener; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; +import org.ovirt.engine.ui.webadmin.ApplicationTemplates; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling.ClusterPolicyPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.FunctionPolicyUnitPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitListPanel; @@ -81,11 +83,27 @@ @UiField WidgetStyle style; + @UiField(provided = true) + InfoIcon filterInfoIcon; + + @UiField(provided = true) + InfoIcon functionInfoIcon; + + @UiField(provided = true) + InfoIcon loadBalancingInfoIcon; + + @UiField(provided = true) + InfoIcon propertiesInfoIcon; + @Inject - public ClusterPolicyPopupView(EventBus eventBus, ApplicationResources resources, ApplicationConstants constants) { + public ClusterPolicyPopupView(EventBus eventBus, + ApplicationResources resources, + ApplicationConstants constants, + ApplicationTemplates templates) { super(eventBus, resources); initListBoxEditors(); initPanels(); + initInfoIcons(resources, constants, templates); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); ViewIdHandler.idHandler.generateAndSetIds(this); driver.initialize(this); @@ -152,6 +170,39 @@ customPropertiesSheetEditor.edit(model.getCustomPropertySheet()); } }); + updateTooltips(model); + model.getLoadBalanceList().getSelectedItemChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + updateTooltips(model); + } + }); + } + + private void initInfoIcons(ApplicationResources resources, ApplicationConstants constants, ApplicationTemplates templates) { + filterInfoIcon = + new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyFilterInfo()), + resources); + + functionInfoIcon = + new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyWeightFunctionInfo()), + resources); + + loadBalancingInfoIcon = + new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyLoadBalancingInfo()), + resources); + + propertiesInfoIcon = + new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyPropertiesInfo()), + resources); + + } + + private void updateTooltips(NewClusterPolicyModel model) { + PolicyUnit selectedItem = (PolicyUnit) model.getLoadBalanceList().getSelectedItem(); + if (selectedItem != null) { + loadBalanceListEditor.getElement().setTitle(selectedItem.getDescription()); + } } private void updateFunctions(NewClusterPolicyModel model) { diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml index 3a3d2c1..d43f3ea 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml @@ -72,6 +72,9 @@ width: 50px; margin: 4px; } + .iconInfoStyle { + margin-left: 10px; + } </ui:style> <d:SimpleDialogPanel width="700px" height="650px"> @@ -87,6 +90,7 @@ text="{constants.clusterPolicyFilterLabel}" /> <g:Label addStyleNames="{style.labelStyle}" text="{constants.clusterPolicyExplanationMessage}" /> + <d:InfoIcon ui:field="filterInfoIcon" addStyleNames="{style.iconInfoStyle}"/> </g:HorizontalPanel> <g:HTML> <hr style="width:100%;" /> @@ -118,6 +122,7 @@ text="{constants.clusterPolicyFunctionLabel}" /> <g:Label addStyleNames="{style.labelStyle}" text="{constants.clusterPolicyExplanationMessage}" /> + <d:InfoIcon ui:field="functionInfoIcon" addStyleNames="{style.iconInfoStyle}"/> </g:HorizontalPanel> <g:HTML> <hr style="width:100%;" /> @@ -144,16 +149,22 @@ </g:VerticalPanel> </g:Cell> </g:HorizontalPanel> - <g:Label addStyleNames="{style.sectionLabel}" - text="{constants.clusterPolicyLoadBalancerLabel}" /> + <g:HorizontalPanel> + <g:Label addStyleNames="{style.sectionLabel}" + text="{constants.clusterPolicyLoadBalancerLabel}" /> + <d:InfoIcon ui:field="loadBalancingInfoIcon" addStyleNames="{style.iconInfoStyle}"/> + </g:HorizontalPanel> <g:HTML> <hr style="width:100%;" /> </g:HTML> <e:ListModelListBoxOnlyEditor ui:field="loadBalanceListEditor" /> </g:FlowPanel> - <g:Label addStyleNames="{style.sectionLabel}" - text="{constants.clusterPolicyPropertiesLabel}" /> + <g:HorizontalPanel> + <g:Label addStyleNames="{style.sectionLabel}" + text="{constants.clusterPolicyPropertiesLabel}" /> + <d:InfoIcon ui:field="propertiesInfoIcon" addStyleNames="{style.iconInfoStyle}"/> + </g:HorizontalPanel> <g:HTML> <hr style="width:100%;" /> </g:HTML> diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java index f46ff31..1b3dd52 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java @@ -45,6 +45,7 @@ this.used = used; this.locked = locked; this.style = style; + getElement().setTitle(policyUnit.getDescription()); if (!locked) { addDomHandler(new ContextMenuHandler() { diff --git a/packaging/dbscripts/upgrade/03_03_0680_add_description_to_policy_unit.sql b/packaging/dbscripts/upgrade/03_03_0680_add_description_to_policy_unit.sql new file mode 100644 index 0000000..e7a0937 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_03_0680_add_description_to_policy_unit.sql @@ -0,0 +1,44 @@ +-- adding description column to policy unit +SELECT fn_db_add_column('policy_units', 'description', 'text'); +-- updating current policy units with descriptions +UPDATE policy_units +SET description='While migrating a VM, filters out the VM''s running host' +WHERE name = 'Migration'; +UPDATE policy_units +SET description='Filters out hosts from different VM''s migration domain, and all non-UP state hosts' +WHERE name = 'MigrationDomain'; +UPDATE policy_units +SET description='Filters out all hosts that VM is not pinned to' +WHERE name = 'PinToHost'; +UPDATE policy_units +SET description='Filters out hosts with less CPUs than VM''s CPUs' +WHERE name = 'CPU'; +UPDATE policy_units +SET description='Filters out hosts that have insufficient memory to run the VM' +WHERE name = 'Memory'; +UPDATE policy_units +SET description='Filters out hosts that are missing networks required by VM NICs, or missing cluster''s display network' +WHERE name = 'Network'; +UPDATE policy_units +SET description='No scheduling operation' +WHERE name = 'None'; +-- Power saving +-- load balancing logic +UPDATE policy_units +SET description='Load balancing VMs in cluster according to hosts CPU load, striving cluster''s hosts CPU load to be over ''LowUtilization'' and under ''HighUtilization''' +WHERE id = '736999d0-1023-46a4-9a75-1316ed50e151'; +-- weight function +UPDATE policy_units +SET description='Gives hosts with higher CPU usage, higher weight (means that hosts with lower CPU usage are more likely to be selected)' +WHERE id = '736999d0-1023-46a4-9a75-1316ed50e15b'; +-- Even distribution +-- load balancing logic +UPDATE policy_units +SET description='Load balancing VMs in cluster according to hosts CPU load, striving cluster''s hosts CPU load to be under ''HighUtilization''' +WHERE id = '7db4ab05-81ab-42e8-868a-aee2df483ed2'; +-- weight function +UPDATE policy_units +SET description='Gives hosts with lower CPU usage, higher weight (means that hosts with higher CPU usage are more likely to be selected)' +WHERE id = '7db4ab05-81ab-42e8-868a-aee2df483edb'; + + -- To view, visit http://gerrit.ovirt.org/17629 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib51cf7f15b7d73c87e0c728953171584216e1d00 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches