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

Reply via email to