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