Gilad Chaplik has uploaded a new change for review.

Change subject: engine: remove disabled external scheduler plugin
......................................................................

engine: remove disabled external scheduler plugin

Added a new command to remove disabled external policy units
Added a new dialog to show all policy units, in this dialog, disabled
external policy units can be removed.

Change-Id: Ia03da19368b75b125aa3ea144b36016feddcb08c
Bug-Url: https://bugzilla.redhat.com/1014700
Signed-off-by: Gilad Chaplik <gchap...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/commands/RemoveExternalPolicyUnitCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/parameters/RemoveExternalPolicyUnitParameters.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ClusterPolicyListModel.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ManagePolicyUnitModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
M 
frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
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/ApplicationResources.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/scheduling/ManagePolicyUnitPopupPresenterWidget.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ClusterPolicyModelProvider.java
M 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
A 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/icn_external_policy.png
M packaging/dbscripts/policy_unit_sp.sql
24 files changed, 508 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/19969/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
index 50ad069..09a3c71 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
@@ -628,4 +628,46 @@
                 .runBalance(policyUnit.getName(), hostIDs, 
cluster.getClusterPolicyProperties());
     }
 
+    /**
+     * returns all cluster policies names containing the specific policy unit.
+     * @param policyUnitId
+     * @return
+     */
+    public List<String> getClusterPoliciesNamesByPolicyUnitId(Guid 
policyUnitId) {
+        List<String> list = new ArrayList<String>();
+        PolicyUnit policyUnit = policyUnits.get(policyUnitId);
+        if (policyUnit != null) {
+            for (ClusterPolicy clusterPolicy : policyMap.values()) {
+                switch (policyUnit.getPolicyUnitType()) {
+                case Filter:
+                    if (clusterPolicy.getFilters().contains(policyUnitId)) {
+                        list.add(clusterPolicy.getName());
+                    }
+                    break;
+                case Weight:
+                    for (Pair<Guid, Integer> pair : 
clusterPolicy.getFunctions()) {
+                        if (pair.getFirst().equals(policyUnitId)) {
+                            list.add(clusterPolicy.getName());
+                            break;
+                        }
+                    }
+                    break;
+                case LoadBalancing:
+                    if (policyUnitId.equals(clusterPolicy.getBalance())) {
+                        list.add(clusterPolicy.getName());
+                    }
+                    break;
+                default:
+                    break;
+                }
+            }
+        }
+        return list;
+    }
+
+    public void removeExternalPolicyUnit(Guid policyUnitId) {
+        getPolicyUnitDao().remove(policyUnitId);
+        policyUnits.remove(policyUnitId);
+    }
+
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/commands/RemoveExternalPolicyUnitCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/commands/RemoveExternalPolicyUnitCommand.java
new file mode 100644
index 0000000..ec720b8
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/commands/RemoveExternalPolicyUnitCommand.java
@@ -0,0 +1,57 @@
+package org.ovirt.engine.core.bll.scheduling.commands;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.bll.CommandBase;
+import org.ovirt.engine.core.bll.scheduling.SchedulingManager;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import 
org.ovirt.engine.core.common.scheduling.parameters.RemoveExternalPolicyUnitParameters;
+import org.ovirt.engine.core.compat.Guid;
+
+public class RemoveExternalPolicyUnitCommand extends 
CommandBase<RemoveExternalPolicyUnitParameters> {
+
+    public RemoveExternalPolicyUnitCommand(RemoveExternalPolicyUnitParameters 
parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        
if(!SchedulingManager.getInstance().getPolicyUnitsMap().containsKey(getPolicyUnitId())){
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_POLICY_UNKNOWN_POLICY_UNIT);
+        }
+        List<String> clusterPoliciesNames =
+                
SchedulingManager.getInstance().getClusterPoliciesNamesByPolicyUnitId(getPolicyUnitId());
+        if (clusterPoliciesNames != null && clusterPoliciesNames.size() > 0) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_CANNOT_REMOVE_POLICY_UNIT_ATTACHED_TO_CLUSTER_POLICY,
+                    String.format("$cpNames %1$s", 
StringUtils.join(clusterPoliciesNames, ',')));
+        }
+        return true;
+    }
+
+    @Override
+    protected void executeCommand() {
+        
SchedulingManager.getInstance().removeExternalPolicyUnit(getPolicyUnitId());
+        setSucceeded(true);
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REMOVE);
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__POLICY_UNIT);
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.singletonList(new PermissionSubject(Guid.SYSTEM,
+                VdcObjectType.System,
+                getActionType().getActionGroup()));
+    }
+
+    private Guid getPolicyUnitId() {
+        return getParameters().getPolicyUnitId();
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index ccb2fbc..676d70d 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -267,6 +267,7 @@
     AddClusterPolicy(1450, ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, false, 
QuotaDependency.NONE),
     EditClusterPolicy(1451, ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, 
false, QuotaDependency.NONE),
     RemoveClusterPolicy(1452, ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, 
false, QuotaDependency.NONE),
+    RemoveExternalPolicyUnit(1453, 
ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, false, QuotaDependency.NONE),
     // External events
     AddExternalEvent(1500, ActionGroup.INJECT_EXTERNAL_EVENTS, 
QuotaDependency.NONE),
     RemoveExternalEvent(1501, ActionGroup.INJECT_EXTERNAL_EVENTS, 
QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 09a0092..ec700a2 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -32,6 +32,7 @@
     VAR__TYPE__NETWORK_QOS,
     VAR__TYPE__SPM,
     VAR__TYPE__CLUSTER_POLICY,
+    VAR__TYPE__POLICY_UNIT,
 
     // Gluster types
     VAR__TYPE__GLUSTER_VOLUME,
@@ -711,6 +712,7 @@
     
ACTION_TYPE_FAILED_CLUSTER_POLICY_ONLY_ONE_FILTER_CAN_BE_FIRST(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_CLUSTER_POLICY_ONLY_ONE_FILTER_CAN_BE_LAST(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_CLUSTER_POLICY_FUNCTION_FACTOR_NEGATIVE(ErrorType.BAD_PARAMETERS),
+    
ACTION_TYPE_FAILED_CANNOT_REMOVE_POLICY_UNIT_ATTACHED_TO_CLUSTER_POLICY(ErrorType.CONFLICT),
     // Gluster Messages
     ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_CLUSTER_DOES_NOT_SUPPORT_GLUSTER(ErrorType.CONFLICT),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/parameters/RemoveExternalPolicyUnitParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/parameters/RemoveExternalPolicyUnitParameters.java
new file mode 100644
index 0000000..43377e3
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/parameters/RemoveExternalPolicyUnitParameters.java
@@ -0,0 +1,26 @@
+package org.ovirt.engine.core.common.scheduling.parameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.compat.Guid;
+
+public class RemoveExternalPolicyUnitParameters extends 
VdcActionParametersBase {
+
+    private static final long serialVersionUID = -2354147436466353253L;
+
+    private Guid policyUnitId;
+
+    public RemoveExternalPolicyUnitParameters() {
+    }
+
+    public RemoveExternalPolicyUnitParameters(Guid policyUnitId) {
+        this.setPolicyUnitId(policyUnitId);
+    }
+
+    public Guid getPolicyUnitId() {
+        return policyUnitId;
+    }
+
+    public void setPolicyUnitId(Guid policyUnitId) {
+        this.policyUnitId = policyUnitId;
+    }
+
+}
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index ea1dbb5..136179a 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -250,6 +250,7 @@
 VAR__TYPE__NETWORK_QOS=$type Network QoS
 VAR__TYPE__SPM=$type SPM
 VAR__TYPE__CLUSTER_POLICY=$type Cluster Policy
+VAR__TYPE__POLICY_UNIT=$type Policy Unit
 VAR__ACTION__RUN=$action run
 VAR__ACTION__REMOVE=$action remove
 VAR__ACTION__ADD=$action add
@@ -997,7 +998,7 @@
 ACTION_TYPE_FAILED_CLUSTER_POLICY_ONLY_ONE_FILTER_CAN_BE_FIRST=Cannot 
${action} ${type}. Only a single filter can be selected as first. 
 ACTION_TYPE_FAILED_CLUSTER_POLICY_ONLY_ONE_FILTER_CAN_BE_LAST=Cannot ${action} 
${type}. Only a single filter can be selected as last. 
 ACTION_TYPE_FAILED_CLUSTER_POLICY_FUNCTION_FACTOR_NEGATIVE=Cannot ${action} 
${type}. Function factor cannot be negative.
-
+ACTION_TYPE_FAILED_CANNOT_REMOVE_POLICY_UNIT_ATTACHED_TO_CLUSTER_POLICY=Cannot 
${action} ${type}. Policy unit is attached to the following cluster policies: 
${cpNames}.
 # External Events Errors Messages
 VAR__TYPE__EXTERNAL_EVENT=$type External Event
 ACTION_TYPE_FAILED_EXTERNAL_EVENT_ILLEGAL_ORIGIN=Cannot ${action} ${type}. 
Illegal Origin for External Event : oVirt
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index 2475c86..1cb765d 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -676,6 +676,9 @@
     @DefaultStringValue("$type Cluster Policy")
     String VAR__TYPE__CLUSTER_POLICY();
 
+    @DefaultStringValue("$type Policy Unit")
+    String VAR__TYPE__POLICY_UNIT();
+
     @DefaultStringValue("$action run")
     String VAR__ACTION__RUN();
 
@@ -2711,6 +2714,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Function factor cannot be 
negative.")
     String ACTION_TYPE_FAILED_CLUSTER_POLICY_FUNCTION_FACTOR_NEGATIVE();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Policy unit is attached to 
the following cluster policies: ${cpNames}.")
+    String 
ACTION_TYPE_FAILED_CANNOT_REMOVE_POLICY_UNIT_ATTACHED_TO_CLUSTER_POLICY();
+
     @DefaultStringValue("Cannot ${action} ${type}. Cloud-Init is only 
supported on cluster compatibility version 3.3 and higher.")
     String ACTION_TYPE_FAILED_CLOUD_INIT_IS_NOT_SUPPORTED();
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
index f6dd11d..43296b5 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
@@ -38,6 +38,8 @@
 import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import org.ovirt.engine.core.common.businessentities.network.VnicProfileView;
 import org.ovirt.engine.core.common.scheduling.ClusterPolicy;
+import org.ovirt.engine.core.common.scheduling.PolicyUnit;
+import org.ovirt.engine.core.common.scheduling.PolicyUnitType;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.StringHelper;
 import org.ovirt.engine.core.compat.Version;
@@ -1243,4 +1245,36 @@
             return lexoNumeric.compare(cp1.getName(), cp2.getName());
         }
     }
+
+    /**
+     * sort policy units by:
+     * first is external?
+     * second is disabled?
+     * third policyUnitType
+     * forth name (lexicography)
+     */
+    public final static class PolicyUnitComparator implements 
Comparator<PolicyUnit>, Serializable {
+        final LexoNumericComparator lexoNumeric = new LexoNumericComparator();
+
+        @Override
+        public int compare(PolicyUnit pu1, PolicyUnit pu2) {
+            if (pu1.isInternal() != pu2.isInternal()) {
+                return !pu1.isInternal() ? -1 : 1;
+            }
+            if (pu1.isEnabled() != pu2.isEnabled()) {
+                return !pu1.isEnabled() ? -1 : 1;
+            }
+            if (pu1.getPolicyUnitType() != pu2.getPolicyUnitType()) {
+                if (pu1.getPolicyUnitType().equals(PolicyUnitType.Filter)
+                        || 
pu2.getPolicyUnitType().equals(PolicyUnitType.LoadBalancing)) {
+                    return -1;
+                }
+                if (pu2.getPolicyUnitType().equals(PolicyUnitType.Filter)
+                        || 
pu1.getPolicyUnitType().equals(PolicyUnitType.LoadBalancing)) {
+                    return 1;
+                }
+            }
+            return lexoNumeric.compare(pu1.getName(), pu2.getName());
+        }
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ClusterPolicyListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ClusterPolicyListModel.java
index ec3e287..223a43a 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ClusterPolicyListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ClusterPolicyListModel.java
@@ -20,19 +20,24 @@
 import org.ovirt.engine.ui.uicommonweb.UICommand;
 import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
 import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
 import org.ovirt.engine.ui.uicommonweb.models.ListWithDetailsModel;
 import 
org.ovirt.engine.ui.uicommonweb.models.configure.roles_ui.RoleListModel.CommandType;
 import org.ovirt.engine.ui.uicompat.ConstantsManager;
+import org.ovirt.engine.ui.uicompat.Event;
+import org.ovirt.engine.ui.uicompat.EventArgs;
+import org.ovirt.engine.ui.uicompat.IEventListener;
 import org.ovirt.engine.ui.uicompat.ObservableCollection;
 
 public class ClusterPolicyListModel extends ListWithDetailsModel {
     public static final String COPY_OF = "Copy_of_"; //$NON-NLS-1$
-
+    private ManagePolicyUnitModel policyUnitModel;
     private ArrayList<PolicyUnit> policyUnits;
     private UICommand newCommand;
     private UICommand editCommand;
     private UICommand removeCommand;
     private UICommand cloneCommand;
+    private UICommand managePolicyUnitCommand;
 
     public ClusterPolicyListModel() {
         
setTitle(ConstantsManager.getInstance().getConstants().clusterPolicyTitle());
@@ -41,6 +46,7 @@
         setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$
         setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
         setCloneCommand(new UICommand("Clone", this)); //$NON-NLS-1$
+        setManagePolicyUnitCommand(new UICommand("ShowPolicyUnit", this)); 
//$NON-NLS-1$
 
         setSearchPageSize(1000);
 
@@ -111,6 +117,9 @@
                                     (ArrayList<PolicyUnit>) 
((VdcQueryReturnValue) returnValue).getReturnValue();
                             clusterPolicyListModel.setPolicyUnits(list);
                             clusterPolicyListModel.fetchClusterPolicies();
+                            if (policyUnitModel != null) {
+                                
policyUnitModel.getPolicyUnits().setItems(sort(policyUnits));
+                            }
                         }
                     }));
 
@@ -179,6 +188,14 @@
         this.cloneCommand = cloneCommand;
     }
 
+    public UICommand getManagePolicyUnitCommand() {
+        return managePolicyUnitCommand;
+    }
+
+    public void setManagePolicyUnitCommand(UICommand showPolicyUnitCommand) {
+        this.managePolicyUnitCommand = showPolicyUnitCommand;
+    }
+
     private void newEntity() {
         initClusterPolicy(CommandType.New, new ClusterPolicy());
     }
@@ -239,8 +256,42 @@
         getSearchCommand().execute();
     }
 
+    private void managePolicyUnits() {
+        if (getWindow() != null) {
+            return;
+        }
+
+        policyUnitModel = new ManagePolicyUnitModel();
+        
policyUnitModel.setTitle(ConstantsManager.getInstance().getConstants().managePolicyUnits());
+        policyUnitModel.setHashName("manage_policy_units"); //$NON-NLS-1$
+
+        policyUnitModel.setPolicyUnits(new ListModel());
+        policyUnitModel.getPolicyUnits().setItems(sort(policyUnits));
+        policyUnitModel.getRefreshPolicyUnitsEvent().addListener(new 
IEventListener() {
+
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                setIsQueryFirstTime(true);
+                syncSearch();
+            }
+        });
+
+        UICommand command = new UICommand("Cancel", this); //$NON-NLS-1$
+        
command.setTitle(ConstantsManager.getInstance().getConstants().close());
+        command.setIsCancel(true);
+        policyUnitModel.getCommands().add(command);
+
+        setWindow(policyUnitModel);
+    }
+
+    private ArrayList<PolicyUnit> sort(ArrayList<PolicyUnit> policyUnits) {
+        Collections.sort(policyUnits, new Linq.PolicyUnitComparator());
+        return policyUnits;
+    }
+
     private void cancel() {
         setWindow(null);
+        policyUnitModel = null;
     }
 
     private void initClusterPolicy(CommandType commandType, ClusterPolicy 
clusterPolicy) {
@@ -281,6 +332,8 @@
             onRemove();
         } else if (command.getName().equals("Cancel")) { //$NON-NLS-1$
             cancel();
+        } else if (command == getManagePolicyUnitCommand()) { //$NON-NLS-1$
+            managePolicyUnits();
         }
     }
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ManagePolicyUnitModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ManagePolicyUnitModel.java
new file mode 100644
index 0000000..ee5a260
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/ManagePolicyUnitModel.java
@@ -0,0 +1,39 @@
+package org.ovirt.engine.ui.uicommonweb.models.configure.scheduling;
+
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.scheduling.PolicyUnit;
+import 
org.ovirt.engine.core.common.scheduling.parameters.RemoveExternalPolicyUnitParameters;
+import org.ovirt.engine.ui.frontend.Frontend;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import org.ovirt.engine.ui.uicommonweb.models.Model;
+import org.ovirt.engine.ui.uicompat.Event;
+import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult;
+import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback;
+
+public class ManagePolicyUnitModel extends Model {
+    private final Event refreshPolicyUnitsEvent = new 
Event("RefreshPolicyUnitsEvent", ManagePolicyUnitModel.class); //$NON-NLS-1$
+    private ListModel PolicyUnits;
+
+    public ListModel getPolicyUnits() {
+        return PolicyUnits;
+    }
+
+    public void setPolicyUnits(ListModel policyUnits) {
+        PolicyUnits = policyUnits;
+    }
+
+    public Event getRefreshPolicyUnitsEvent() {
+        return refreshPolicyUnitsEvent;
+    }
+
+    public void remove(final PolicyUnit policyUnit) {
+        Frontend.RunAction(VdcActionType.RemoveExternalPolicyUnit,
+                new RemoveExternalPolicyUnitParameters(policyUnit.getId()), 
new IFrontendActionAsyncCallback() {
+
+                    @Override
+                    public void executed(FrontendActionAsyncResult result) {
+                        getRefreshPolicyUnitsEvent().raise(this, null);
+                    }
+                });
+    }
+}
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
index 4f310e9..1abb917 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
@@ -847,4 +847,10 @@
 
     String UnitVmModel$CpuSharesAmount___CUSTOM();
 
+    String PolicyUnitType___Filter();
+
+    String PolicyUnitType___Weight();
+
+    String PolicyUnitType___LoadBalancing();
+
 }
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 6c04e3b..aaf041e 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
@@ -2114,5 +2114,8 @@
 
     @DefaultStringValue("Stop Rebalance")
     String stopRebalance();
+
+    @DefaultStringValue("Manage Policy Units")
+    String managePolicyUnits();
 }
 
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
 
b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
index 52de4fb..e823ed8 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
+++ 
b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
@@ -421,3 +421,6 @@
 UnitVmModel$CpuSharesAmount___MEDIUM=Medium
 UnitVmModel$CpuSharesAmount___LOW=Low
 UnitVmModel$CpuSharesAmount___CUSTOM=Custom
+PolicyUnitType___Filter=Filter
+PolicyUnitType___Weight=Weight
+PolicyUnitType___LoadBalancing=Load Balancing
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 3695317..6764424 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
@@ -3282,4 +3282,22 @@
 
     @DefaultStringValue("Rebalance NOT STARTED")
     String rebalanceNotStarted();
+
+    @DefaultStringValue("Manage Policy Units")
+    String managePolicyUnits();
+
+    @DefaultStringValue("Name")
+    String policyUnitName();
+
+    @DefaultStringValue("Type")
+    String policyUnitType();
+
+    @DefaultStringValue("Remove")
+    String removePolicyUnit();
+
+    @DefaultStringValue("Internal Policy Unit")
+    String internalPolicyUnit();
+
+    @DefaultStringValue("External Policy Unit")
+    String externalPolicyUnit();
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java
index e3932b2..eea1693 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java
@@ -94,6 +94,9 @@
     @Source("images/Lock.png")
     ImageResource lockImage();
 
+    @Source("images/icn_external_policy.png")
+    ImageResource exteranlPolicyUnitImage();
+
     @Source("images/logo.png")
     ImageResource logoImage();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
index 461aef3..6ce2f580 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
@@ -68,6 +68,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.quota.EditQuotaStoragePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.quota.QuotaPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling.ClusterPolicyPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling.ManagePolicyUnitPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.DisksAllocationPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindMultiDcPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.FindSingleDcPopupPresenterWidget;
@@ -274,6 +275,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.quota.EditQuotaStoragePopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.quota.QuotaPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.ClusterPolicyPopupView;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.ManagePolicyUnitPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.DisksAllocationPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.FindMultiDcPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.FindSingleDcPopupView;
@@ -466,6 +468,9 @@
         bindPresenterWidget(ClusterPolicyPopupPresenterWidget.class,
                 ClusterPolicyPopupPresenterWidget.ViewDef.class,
                 ClusterPolicyPopupView.class);
+        bindPresenterWidget(ManagePolicyUnitPopupPresenterWidget.class,
+                ManagePolicyUnitPopupPresenterWidget.ViewDef.class,
+                ManagePolicyUnitPopupView.class);
 
         // Main section: main tabs
         bindPresenter(MainTabPanelPresenter.class,
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/scheduling/ManagePolicyUnitPopupPresenterWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/scheduling/ManagePolicyUnitPopupPresenterWidget.java
new file mode 100644
index 0000000..eade2f2
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/scheduling/ManagePolicyUnitPopupPresenterWidget.java
@@ -0,0 +1,19 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling;
+
+import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
+import 
org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.ManagePolicyUnitModel;
+
+import com.google.gwt.event.shared.EventBus;
+import com.google.inject.Inject;
+
+public class ManagePolicyUnitPopupPresenterWidget extends 
AbstractModelBoundPopupPresenterWidget<ManagePolicyUnitModel, 
ManagePolicyUnitPopupPresenterWidget.ViewDef> {
+
+    public interface ViewDef extends 
AbstractModelBoundPopupPresenterWidget.ViewDef<ManagePolicyUnitModel> {
+    }
+
+    @Inject
+    public ManagePolicyUnitPopupPresenterWidget(EventBus eventBus, ViewDef 
view) {
+        super(eventBus, view);
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyView.java
index 4289242..e727291 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyView.java
@@ -146,6 +146,13 @@
             }
         });
 
+        table.addActionButton(new 
WebAdminButtonDefinition<ClusterPolicy>(constants.managePolicyUnits()) {
+            @Override
+            protected UICommand resolveCommand() {
+                return 
clusterPolicyModelProvider.getModel().getManagePolicyUnitCommand();
+            }
+        });
+
         splitLayoutPanel.add(table);
 
         table.getSelectionModel().addSelectionChangeHandler(new 
SelectionChangeEvent.Handler() {
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.java
new file mode 100644
index 0000000..5bc21a5
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.java
@@ -0,0 +1,141 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling;
+
+import org.ovirt.engine.core.common.scheduling.PolicyUnit;
+import org.ovirt.engine.ui.common.CommonApplicationResources;
+import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
+import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
+import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
+import org.ovirt.engine.ui.common.widget.editor.ListModelObjectCellTable;
+import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.ManagePolicyUnitModel;
+import org.ovirt.engine.ui.uicompat.EnumTranslator;
+import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import org.ovirt.engine.ui.webadmin.ApplicationMessages;
+import org.ovirt.engine.ui.webadmin.ApplicationResources;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling.ManagePolicyUnitPopupPresenterWidget;
+import org.ovirt.engine.ui.webadmin.widget.table.column.NullableButtonCell;
+import 
org.ovirt.engine.ui.webadmin.widget.table.column.WebAdminImageResourceColumn;
+
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.client.ui.ScrollPanel;
+import com.google.inject.Inject;
+
+public class ManagePolicyUnitPopupView extends 
AbstractModelBoundPopupView<ManagePolicyUnitModel> implements 
ManagePolicyUnitPopupPresenterWidget.ViewDef {
+
+    interface Driver extends SimpleBeanEditorDriver<ManagePolicyUnitModel, 
ManagePolicyUnitPopupView> {
+    }
+
+    interface ViewUiBinder extends UiBinder<SimpleDialogPanel, 
ManagePolicyUnitPopupView> {
+        ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+    }
+
+    interface ViewIdHandler extends 
ElementIdHandler<ManagePolicyUnitPopupView> {
+        ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
+    }
+
+    private final Driver driver = GWT.create(Driver.class);
+
+    @UiField
+    @Ignore
+    ScrollPanel policyUnitTableContainer;
+
+    @Ignore
+    private ListModelObjectCellTable<PolicyUnit, ListModel> policyUnitTable;
+
+    private ManagePolicyUnitModel model;
+
+    @Inject
+    public ManagePolicyUnitPopupView(EventBus eventBus,
+            CommonApplicationResources commonResources,
+            ApplicationResources resources,
+            ApplicationConstants constants,
+            ApplicationMessages messages) {
+        super(eventBus, commonResources);
+        initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
+        ViewIdHandler.idHandler.generateAndSetIds(this);
+        driver.initialize(this);
+        initTable(resources, constants, messages);
+    }
+
+    private void initTable(final ApplicationResources resources,
+            final ApplicationConstants constants,
+            ApplicationMessages messages) {
+        policyUnitTable = new ListModelObjectCellTable<PolicyUnit, 
ListModel>();
+        policyUnitTable.enableColumnResizing();
+        policyUnitTableContainer.add(policyUnitTable);
+
+        policyUnitTable.addColumn(new 
WebAdminImageResourceColumn<PolicyUnit>() {
+            @Override
+            public ImageResource getValue(PolicyUnit object) {
+                if (object.isInternal()) {
+                    setTitle(constants.internalPolicyUnit());
+                    return resources.lockImage();
+                }
+                setTitle(constants.externalPolicyUnit());
+                return resources.exteranlPolicyUnitImage();
+            }
+        }, constants.empty(), "20px"); //$NON-NLS-1$
+        policyUnitTable.addColumn(new TextColumnWithTooltip<PolicyUnit>() {
+            @Override
+            public String getValue(PolicyUnit object) {
+                return object.getName();
+            }
+        }, constants.policyUnitName(), "180px"); //$NON-NLS-1$
+
+        policyUnitTable.addColumn(new TextColumnWithTooltip<PolicyUnit>() {
+            @Override
+            public String getValue(PolicyUnit object) {
+                return 
EnumTranslator.createAndTranslate(object.getPolicyUnitType());
+            }
+        }, constants.policyUnitType(), "100px"); //$NON-NLS-1$
+
+        policyUnitTable.addColumn(new TextColumnWithTooltip<PolicyUnit>() {
+            @Override
+            public String getValue(PolicyUnit object) {
+                if (!object.isEnabled()) {
+                    return constants.disabledPolicyUnit();
+                }
+                return constants.empty();
+            }
+        }, constants.empty(), "75px"); //$NON-NLS-1$
+
+        Column<PolicyUnit, String> removeButtonColumn = new Column<PolicyUnit, 
String>(new NullableButtonCell()) {
+            @Override
+            public String getValue(PolicyUnit object) {
+                if (!object.isEnabled()) {
+                    return constants.removePolicyUnit();
+                }
+                return null;
+            }
+        };
+
+        policyUnitTable.addColumn(removeButtonColumn, constants.empty(), 
"80px"); //$NON-NLS-1$
+        removeButtonColumn.setFieldUpdater(new FieldUpdater<PolicyUnit, 
String>() {
+            @Override
+            public void update(int index, PolicyUnit object, String value) {
+                model.remove(object);
+            }
+        });
+    }
+
+    @Override
+    public void edit(ManagePolicyUnitModel model) {
+        this.model = model;
+        policyUnitTable.asEditor().edit(model.getPolicyUnits());
+        driver.edit(model);
+    }
+
+    @Override
+    public ManagePolicyUnitModel flush() {
+        return driver.flush();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.ui.xml
new file mode 100644
index 0000000..9ea4e05
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ManagePolicyUnitPopupView.ui.xml
@@ -0,0 +1,22 @@
+<?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:we="urn:import:org.ovirt.engine.ui.webadmin.widget.editor">
+
+    <ui:style>
+        .containerStyle {
+            height: 350px;
+        }
+    </ui:style>
+
+    <d:SimpleDialogPanel width="500px" height="450px">
+        <d:content>
+            <g:VerticalPanel>
+                <g:ScrollPanel ui:field="policyUnitTableContainer"
+                    addStyleNames="{style.containerStyle}" />
+            </g:VerticalPanel>
+        </d:content>
+    </d:SimpleDialogPanel>
+
+</ui:UiBinder>
\ No newline at end of file
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ClusterPolicyModelProvider.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ClusterPolicyModelProvider.java
index 8fe6cd8..8262a2a 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ClusterPolicyModelProvider.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ClusterPolicyModelProvider.java
@@ -10,6 +10,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.Model;
 import 
org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.ClusterPolicyListModel;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling.ClusterPolicyPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.scheduling.ManagePolicyUnitPopupPresenterWidget;
 
 import com.google.gwt.event.shared.EventBus;
 import com.google.inject.Inject;
@@ -19,15 +20,18 @@
 
     private final Provider<ClusterPolicyPopupPresenterWidget> 
clusterPolicyPopupProvider;
     private final Provider<RemoveConfirmationPopupPresenterWidget> 
removeConfirmPopupProvider;
+    private final Provider<ManagePolicyUnitPopupPresenterWidget> 
policyUnitPopupProvider;
 
     @Inject
     public ClusterPolicyModelProvider(EventBus eventBus,
             Provider<DefaultConfirmationPopupPresenterWidget> 
defaultConfirmPopupProvider,
             final Provider<ClusterPolicyPopupPresenterWidget> 
clusterPolicyPopupProvider,
-            final Provider<RemoveConfirmationPopupPresenterWidget> 
removeConfirmPopupProvider) {
+            final Provider<RemoveConfirmationPopupPresenterWidget> 
removeConfirmPopupProvider,
+            final Provider<ManagePolicyUnitPopupPresenterWidget> 
policyUnitPopupProvider) {
         super(eventBus, defaultConfirmPopupProvider);
         this.clusterPolicyPopupProvider = clusterPolicyPopupProvider;
         this.removeConfirmPopupProvider = removeConfirmPopupProvider;
+        this.policyUnitPopupProvider = policyUnitPopupProvider;
     }
 
     @Override
@@ -42,6 +46,8 @@
                 || lastExecutedCommand.equals(getModel().getEditCommand())
                 || lastExecutedCommand.equals(getModel().getCloneCommand())) {
             return clusterPolicyPopupProvider.get();
+        } else if 
(lastExecutedCommand.equals(getModel().getManagePolicyUnitCommand())) {
+            return policyUnitPopupProvider.get();
         } else {
             return super.getModelPopup(source, lastExecutedCommand, 
windowModel);
         }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
index 9944185..4f5cb03 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
+++ 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
@@ -246,6 +246,7 @@
 VAR__TYPE__PERMISSION=$type Permission
 VAR__TYPE__HOST_CAPABILITIES=$type Host capabilities
 VAR__TYPE__CLUSTER_POLICY=$type Cluster Policy
+VAR__TYPE__POLICY_UNIT=$type Policy Unit
 VAR__TYPE__GLUSTER_VOLUME=$type Gluster Volume
 VAR__TYPE__GLUSTER_VOLUME_OPTION=$type Gluster Volume Option
 VAR__TYPE__GLUSTER_VOLUME_REBALANCE=$type Gluster Volume Rebalance
@@ -975,7 +976,7 @@
 ACTION_TYPE_FAILED_CLUSTER_POLICY_ONLY_ONE_FILTER_CAN_BE_FIRST=Cannot 
${action} ${type}. Only a single filter can be selected as first. 
 ACTION_TYPE_FAILED_CLUSTER_POLICY_ONLY_ONE_FILTER_CAN_BE_LAST=Cannot ${action} 
${type}. Only a single filter can be selected as last. 
 ACTION_TYPE_FAILED_CLUSTER_POLICY_FUNCTION_FACTOR_NEGATIVE=Cannot ${action} 
${type}. Function factor cannot be negative.
-
+ACTION_TYPE_FAILED_CANNOT_REMOVE_POLICY_UNIT_ATTACHED_TO_CLUSTER_POLICY=Cannot 
${action} ${type}. Policy unit is attached to the following cluster policies: 
${cpNames}.
 # External Events Errors Messages
 VAR__TYPE__EXTERNAL_EVENT=$type External Event
 ACTION_TYPE_FAILED_EXTERNAL_EVENT_ILLEGAL_ORIGIN=Cannot ${action} ${type}. 
Illegal Origin for External Event : oVirt
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/icn_external_policy.png
 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/icn_external_policy.png
new file mode 100644
index 0000000..73a36ce
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/icn_external_policy.png
Binary files differ
diff --git a/packaging/dbscripts/policy_unit_sp.sql 
b/packaging/dbscripts/policy_unit_sp.sql
index c1faf3b..2079e6c 100644
--- a/packaging/dbscripts/policy_unit_sp.sql
+++ b/packaging/dbscripts/policy_unit_sp.sql
@@ -67,3 +67,12 @@
     WHERE  id = v_id;
 END; $procedure$
 LANGUAGE plpgsql;
+
+Create or replace FUNCTION DeletePolicyUnit(v_id UUID)
+RETURNS VOID
+   AS $procedure$
+BEGIN
+   DELETE FROM policy_units
+   WHERE id = v_id;
+END; $procedure$
+LANGUAGE plpgsql;


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia03da19368b75b125aa3ea144b36016feddcb08c
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.3
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