Martin Mucha has uploaded a new change for review. Change subject: webadmin: gui for adding macPool permissions. ......................................................................
webadmin: gui for adding macPool permissions. Change-Id: Idb6b442e7eebce367b9008f4b9c1df9ade84745f Signed-off-by: Martin Mucha <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllMacPoolRolesQuery.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetPermissionsForObjectQuery.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/PermissionDAO.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/CommonModel.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/MacPoolPermissionsListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/SharedMacPoolListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModel.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModelForMacPoolRoles.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/UiCommonModule.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/configure/ConfigurePopupPresenterWidget.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/MacPoolPermissionModelProvider.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/SharedMacPoolView.java 15 files changed, 574 insertions(+), 17 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/32211/12 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllMacPoolRolesQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllMacPoolRolesQuery.java new file mode 100644 index 0000000..0b374c6 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetAllMacPoolRolesQuery.java @@ -0,0 +1,53 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.Role; +import org.ovirt.engine.core.common.queries.MultilevelAdministrationsQueriesParameters; +import org.ovirt.engine.core.compat.Guid; + +public class GetAllMacPoolRolesQuery<P extends MultilevelAdministrationsQueriesParameters> extends QueriesCommandBase<P> { + + private static final List<Guid> SIGNIFICANT_ROLE_IDS = getSignificantRoleIds(); + + public GetAllMacPoolRolesQuery(P parameters) { + super(parameters); + } + + @Override + protected void executeQueryCommand() { + getQueryReturnValue().setReturnValue(calculateMacPoolRelatedRoles()); + } + + private List<Role> calculateMacPoolRelatedRoles() { + final List<Role> allRoles = getDbFacade().getRoleDao().getAll(); + + dropUnrelatedRoles(allRoles, SIGNIFICANT_ROLE_IDS); + return allRoles; + } + + public static List<Guid> getRoleIds(PredefinedRoles... macPoolRelatedRoles) { + final List<Guid> result = new ArrayList<>(macPoolRelatedRoles.length); + + for (PredefinedRoles macPoolRelatedRole : macPoolRelatedRoles) { + result.add(macPoolRelatedRole.getId()); + } + + return result; + } + + private void dropUnrelatedRoles(List<Role> allRoles, List<Guid> idsOrRolesRelatedToMacPool) { + for (Iterator<Role> iterator = allRoles.iterator(); iterator.hasNext(); ) { + if (!idsOrRolesRelatedToMacPool.contains(iterator.next().getId())) { + iterator.remove(); + } + } + } + + private static List<Guid> getSignificantRoleIds() { + return getRoleIds(PredefinedRoles.MAC_POOL_ADMIN, + PredefinedRoles.MAC_POOL_USER); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetPermissionsForObjectQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetPermissionsForObjectQuery.java index 8b1b1c7..d5e00a4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetPermissionsForObjectQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetPermissionsForObjectQuery.java @@ -4,7 +4,6 @@ import org.ovirt.engine.core.common.businessentities.Permissions; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; -import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.PermissionDAO; public class GetPermissionsForObjectQuery<P extends GetPermissionsForObjectParameters> extends QueriesCommandBase<P> { @@ -15,17 +14,22 @@ @Override protected void executeQueryCommand() { - Guid objectId = getParameters().getObjectId(); + getQueryReturnValue().setReturnValue(queryPermissions()); + } + + private List<Permissions> queryPermissions() { PermissionDAO dao = getDbFacade().getPermissionDao(); - List<Permissions> perms; + if (getParameters().getDirectOnly()) { - perms = dao.getAllForEntity(objectId, getUserID(), getParameters().isFiltered(), getParameters().getAllUsersWithPermission()); + return dao.getAllForEntity(getParameters().getObjectId(), + getUserID(), + getParameters().isFiltered(), + getParameters().getAllUsersWithPermission()); } else { - perms = dao.getTreeForEntity(objectId, + return dao.getTreeForEntity(getParameters().getObjectId(), getParameters().getVdcObjectType(), getUserID(), getParameters().isFiltered()); } - getQueryReturnValue().setReturnValue(perms); } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index 3a26d5d..059aaa2 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -224,6 +224,7 @@ // Multi Level Administration queries GetAllRoles(VdcQueryAuthType.User), + GetAllMacPoolRoles(VdcQueryAuthType.Admin), GetRoleById(VdcQueryAuthType.User), GetRoleByName, GetPermissionById(VdcQueryAuthType.User), diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/PermissionDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/PermissionDAO.java index 62c5dd3..2cc665b 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/PermissionDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/PermissionDAO.java @@ -136,7 +136,7 @@ List<Permissions> getAllForEntity(Guid id, Guid userID, boolean isFiltered); - public List<Permissions> getAllForEntity(Guid id, Guid userID, boolean isFiltered, boolean allUsersWithPermission); + List<Permissions> getAllForEntity(Guid id, Guid userID, boolean isFiltered, boolean allUsersWithPermission); List<Permissions> getAllForEntity(Guid id, Guid userID, boolean isFiltered, boolean allUsersWithPermission, int appMode); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java index 5591771..a76d5d0 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java @@ -276,6 +276,9 @@ remove_shared_mac_pools("remove_shared_mac_pools", HelpTagType.WEBADMIN, "Configure > MAC Address Pools > Remove"), //$NON-NLS-1$ $NON-NLS-2$ + //TODO MM: is this correct comment? + remove_shared_mac_pool_permissions("remove_shared_mac_pool_permissions", HelpTagType.WEBADMIN, "Configure > MAC Address Pools > Remove"), //$NON-NLS-1$ $NON-NLS-2$ + new_domain("new_domain", HelpTagType.WEBADMIN, "Storage Tab > New Domain"), //$NON-NLS-1$ //$NON-NLS-2$ new_external_subnet("new_external_subnet", HelpTagType.WEBADMIN, "Networks main tab -> External Subnet sub tab -> New"), //$NON-NLS-1$ //$NON-NLS-2$ diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/CommonModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/CommonModel.java index 889f267..46c1e94 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/CommonModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/CommonModel.java @@ -31,6 +31,7 @@ import org.ovirt.engine.ui.uicommonweb.models.events.EventListModel; import org.ovirt.engine.ui.uicommonweb.models.events.TaskListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostListModel; +import org.ovirt.engine.ui.uicommonweb.models.macpool.MacPoolPermissionsListModel; import org.ovirt.engine.ui.uicommonweb.models.macpool.SharedMacPoolListModel; import org.ovirt.engine.ui.uicommonweb.models.networks.NetworkListModel; import org.ovirt.engine.ui.uicommonweb.models.pools.PoolListModel; @@ -84,6 +85,7 @@ private ClusterPolicyListModel clusterPolicyListModel; private InstanceTypeListModel instanceTypeListModel; private SharedMacPoolListModel sharedMacPoolListModel; + private MacPoolPermissionsListModel macPoolPermissionsListModel; // NOTE: when adding a new ListModel here, be sure to add it to the list in initItems() private ListWithDetailsAndReportsModel dataCenterList; @@ -208,6 +210,7 @@ systemPermissionListModel = new SystemPermissionListModel(); clusterPolicyListModel = new ClusterPolicyListModel(); sharedMacPoolListModel = new SharedMacPoolListModel(); + macPoolPermissionsListModel = new MacPoolPermissionsListModel(); // Activate the default list model. setSelectedItem(getDefaultItem()); @@ -546,7 +549,8 @@ model.setTitle(ConstantsManager.getInstance().getConstants().ConfigureTitle()); model.setHelpTag(HelpTag.configure); model.setHashName("configure"); //$NON-NLS-1$ - model.setEntity(new Model[] { roleListModel, systemPermissionListModel, clusterPolicyListModel, sharedMacPoolListModel }); + //TODO MM: what is this for? + model.setEntity(new Model[] { roleListModel, systemPermissionListModel, clusterPolicyListModel, sharedMacPoolListModel, macPoolPermissionsListModel }); UICommand tempVar = new UICommand("Cancel", this); //$NON-NLS-1$ tempVar.setTitle(ConstantsManager.getInstance().getConstants().close()); @@ -1054,6 +1058,10 @@ return sharedMacPoolListModel; } + public MacPoolPermissionsListModel getMacPoolPermissionsListModel() { + return macPoolPermissionsListModel; + } + public Event getSignedOutEvent() { return privateSignedOutEvent; diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/MacPoolPermissionsListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/MacPoolPermissionsListModel.java new file mode 100644 index 0000000..55c5864 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/MacPoolPermissionsListModel.java @@ -0,0 +1,264 @@ +package org.ovirt.engine.ui.uicommonweb.models.macpool; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.Permissions; +import org.ovirt.engine.core.common.businessentities.Role; +import org.ovirt.engine.core.common.businessentities.aaa.DbUser; +import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.help.HelpTag; +import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListWithDetailsModel; +import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionsOperationsParametersBuilder; +import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModelForMacPoolRoles; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; + +public class MacPoolPermissionsListModel extends ListWithDetailsModel { + + private final UICommand removeConfirmedUiCommand; + private final UICommand removeCanceledUiCommand; + + private UICommand addPermissionCommand; + private UICommand removePermissionCommand; + private final UICommand attachPermissionsConfirmedUiCommand; + private final UICommand attachPermissionsCancelledUiCommand; + + private Guid selectedMacPoolId; + + + public MacPoolPermissionsListModel() { + this.addPermissionCommand = new UICommand("AddPermission", this); //$NON-NLS-1$ + this.removePermissionCommand = new UICommand("RemovePermission", this); //$NON-NLS-1$ + + removeConfirmedUiCommand = createRemoveConfirmedUiCommand(); + removeCanceledUiCommand = createRemoveCancelledUiCommand(); + attachPermissionsConfirmedUiCommand = createAttachPermissionsConfirmedUiCommand(); + attachPermissionsCancelledUiCommand = createAttachPermissionCancelledUiCommand(); + + updateActionAvailability(); + } + + private void updateActionAvailability() { + addPermissionCommand.setIsExecutionAllowed(true); + /*TODO MM: getSelectedItems() is called prior to being set. which escalates need for non-null checking. + This is of course wrong, field should be initialized by model, it's not business of external classes. + On top of it, implementation of setSelectedItems is insanely fragile, producing side effect. + Setter generates 'selection changed' events only when changing reference to collection but keeps silent + when this collection is externally changed. Proper approach is to do a copy of input parameter. + + Performance drop is insignificant compared to gotcha fix(no on changed event fired) and + removal of numerous code duplicates ie. nullity checking. + * */ + List selectedItems = getSelectedItems(); + boolean somethingIsSelected = selectedItems != null && selectedItems.size() > 0; + removePermissionCommand.setIsExecutionAllowed(somethingIsSelected); + } + + @Override + public void executeCommand(UICommand command) { + super.executeCommand(command); + + if (command == getAddPermissionCommand()) { + addPermission(); + } else if (command == getRemovePermissionCommand()) { + requestPermissionRemoval(); + } else if (command == removeCanceledUiCommand) { + cancelConfirmation(); + } else if (command == removeConfirmedUiCommand) { + removePermissionConfirmed(); + } else if (command == attachPermissionsConfirmedUiCommand) { + attachPermissionsConfirmed(); + } else if (command == attachPermissionsCancelledUiCommand) { + attachPermissionsCancelled(); + }else { + throw new IllegalArgumentException("Unsupported command: "+command.getMessage()); //$NON-NLS-1$ + } + } + + private void attachPermissionsConfirmed() { + AdElementListModelForMacPoolRoles model = (AdElementListModelForMacPoolRoles) getWindow(); + + @SuppressWarnings("unchecked") + List<EntityModel<DbUser>> selectedItems = model.getSelectedItems(); + if (selectedItems == null ) { + attachPermissionsCancelled(); + return; + } + + //TODO MM: ask about fixing shitty org.ovirt.engine.ui.uicommonweb.models.configure.SystemPermissionListModel.onAttach() + //TODO MM: duplicates? This vs SystemPermissionListModel vs PermissionListModel + List<DbUser> dbUsers = new ArrayList<DbUser>(selectedItems.size()); + for (EntityModel<DbUser> selectedItem : selectedItems) { + dbUsers.add(selectedItem.getEntity()); + } + + Role roleToAssign = (Role) model.getRole().getSelectedItem(); + + PermissionsOperationsParametersBuilder builder = new PermissionsOperationsParametersBuilder(); + builder.setRole(roleToAssign); + builder.setObjectType(VdcObjectType.MacPool); + builder.setObjectId(selectedMacPoolId); + ArrayList<VdcActionParametersBase> list = builder.build(dbUsers); + + Frontend.getInstance().runMultipleAction(VdcActionType.AddPermission, list, + new IFrontendMultipleActionAsyncCallback() { + @Override + public void executed(FrontendMultipleActionAsyncResult result) { + syncSearch(); + setWindow(null); + } + }, model); + + + + } + + private void removePermissionConfirmed() { + setConfirmWindow(null); + + @SuppressWarnings("unchecked") + List<Permissions> selectedItems = getSelectedItems(); + ArrayList<VdcActionParametersBase> permissionsToRemove = new ArrayList<VdcActionParametersBase>(selectedItems.size()); + for (Permissions permissions : selectedItems) { + permissionsToRemove.add(new org.ovirt.engine.core.common.action.PermissionsOperationsParameters(permissions)); + } + + //TODO MM: why there's not Frontend.runMultipleAction(..., ArrayList<? extends VdcActionParametersBase>)???? + Frontend.getInstance().runMultipleAction(VdcActionType.RemovePermission, permissionsToRemove); + } + + @SuppressWarnings("unchecked") + private void requestPermissionRemoval() { + ConfirmationModel model = new ConfirmationModel(); + model.setTitle(ConstantsManager.getInstance().getConstants().removeSharedMacPoolsTitle()); + //TODO MM: what is this? + model.setHashName("remove_shared_mac_pool_permissions"); //$NON-NLS-1$ + model.setHelpTag(HelpTag.remove_shared_mac_pools); + + model.getCommands().add(removeConfirmedUiCommand); + model.getCommands().add(removeCanceledUiCommand); + + List<String> permissionsList = new ArrayList<String>(); + for (Permissions permissions : (Iterable<Permissions>) getSelectedItems()) { + permissionsList.add(permissions.getOwnerName()); + } + model.setItems(permissionsList); + + setConfirmWindow(model); + } + + private void cancelConfirmation() { + setConfirmWindow(null); + } + + public void attachPermissionsCancelled() { + setWindow(null); + } + + private UICommand createRemoveConfirmedUiCommand() { + return createDefaultOkUiCommand("RemovePermission"); //$NON-NLS-1$ + } + + private UICommand createAttachPermissionsConfirmedUiCommand() { + return createDefaultOkUiCommand("AttachPermissions"); //$NON-NLS-1$ + } + + private UICommand createRemoveCancelledUiCommand() { + return createCancelUiCommand("CancelPermissionRemoval"); //$NON-NLS-1$ + } + + private UICommand createAttachPermissionCancelledUiCommand() { + return createCancelUiCommand("CancelPermissionAttach"); //$NON-NLS-1$ + } + + //TODO MM: is this 'name' parameter of UICommand good for anything? + //TODO MM: move to UICommand class or create UICommandFactory and replace gazillion of code duplicites. + private UICommand createDefaultOkUiCommand(String name) { + UICommand command = new UICommand(name, this); + command.setTitle(ConstantsManager.getInstance().getConstants().ok()); + command.setIsDefault(true); + return command; + } + + private UICommand createCancelUiCommand(String name) { + UICommand command = new UICommand(name, this); //$NON-NLS-1$ + command.setTitle(ConstantsManager.getInstance().getConstants().cancel()); + command.setIsCancel(true); + return command; + } + + //TODO MM: remove duplicity with: org.ovirt.engine.ui.uicommonweb.models.configure.SystemPermissionListModel.add() + @SuppressWarnings("unchecked") + private void addPermission() { + + if (getWindow() != null) { + return; + } + + AdElementListModelForMacPoolRoles model = new AdElementListModelForMacPoolRoles(); + model.getIsEveryoneSelectionHidden().setEntity(true); + + model.setTitle(ConstantsManager.getInstance().getConstants().addSystemPermissionToUserTitle()); + model.setHelpTag(HelpTag.add_system_permission_to_user); + model.setHashName("add_system_permission_to_user"); //$NON-NLS-1$ + model.getCommands().add(attachPermissionsConfirmedUiCommand); + model.getCommands().add(attachPermissionsCancelledUiCommand); + + setWindow(model); + } + + @Override + protected void selectedItemsChanged() { + super.selectedItemsChanged(); + updateActionAvailability(); + } + + @Override + protected String getListName() { + return "MacPoolPermissionListModel"; //$NON-NLS-1$ + } + + @SuppressWarnings("unchecked") + @Override + protected void syncSearch() { + if (selectedMacPoolId != null) { + super.syncSearch(VdcQueryType.GetPermissionsForObject, new GetPermissionsForObjectParameters(selectedMacPoolId)); + } else { + setItems(Collections.emptyList()); + } + } + + public UICommand getAddPermissionCommand() { + return addPermissionCommand; + } + + public UICommand getRemovePermissionCommand() { + return removePermissionCommand; + } + + public Guid getSelectedMacPoolId() { + return selectedMacPoolId; + } + + //TODO MM: setter method with side effect, but I think this is actually ok. + public void setSelectedMacPoolIdAndSync(Guid selectedMacPoolId) { + this.selectedMacPoolId = selectedMacPoolId; + syncSearch(); + } + + public UICommand getAttachPermissionsConfirmedUiCommand() { + return attachPermissionsConfirmedUiCommand; + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/SharedMacPoolListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/SharedMacPoolListModel.java index 8213b8b..a7feee6 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/SharedMacPoolListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/macpool/SharedMacPoolListModel.java @@ -123,7 +123,7 @@ } private void onRemove() { - cancel(); + setConfirmWindow(null); ArrayList<VdcActionParametersBase> params = new ArrayList<VdcActionParametersBase>(); for (MacPool macPool : (Iterable<MacPool>) getSelectedItems()) { params.add(new RemoveMacPoolByIdParameters(macPool.getId())); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModel.java index 16e1061..0d2e530 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModel.java @@ -207,8 +207,10 @@ })); + queryRoleList(); + } - + protected void queryRoleList() { AsyncDataProvider.getInstance().getRoleList(new AsyncQuery(this, new INewAsyncCallback() { @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModelForMacPoolRoles.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModelForMacPoolRoles.java new file mode 100644 index 0000000..5e71547 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/users/AdElementListModelForMacPoolRoles.java @@ -0,0 +1,44 @@ +package org.ovirt.engine.ui.uicommonweb.models.users; + +import java.util.ArrayList; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.Role; +import org.ovirt.engine.core.common.queries.MultilevelAdministrationsQueriesParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.IAsyncConverter; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; + +public class AdElementListModelForMacPoolRoles extends AdElementListModel { + @Override + protected void queryRoleList() { + Frontend.getInstance().runQuery(VdcQueryType.GetAllMacPoolRoles, + new MultilevelAdministrationsQueriesParameters(), + createQuery()); + } + + private AsyncQuery createQuery() { + AsyncQuery aQuery = new AsyncQuery(this, new INewAsyncCallback() { + + @Override + public void onSuccess(Object model, Object result) { + populateRoles((List<Role>) result); + + } + }); + aQuery.converterCallback = createConverterCallBack(); + return aQuery; + } + + private IAsyncConverter createConverterCallBack() { + return new IAsyncConverter() { + @Override + public Object Convert(Object source, AsyncQuery _asyncQuery) { + //TODO MM: just to stick with other similar code, but it's wrong: a) it cannot be null b) all that generics are useless. I.e. this converter is in this, and lot of other cases, completely fruitless. + return source != null ? (ArrayList<Role>) source : new ArrayList<Role>(); + } + }; + } +} 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 53acfad..7f98a23 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 @@ -67,6 +67,9 @@ @DefaultStringValue("Clusters") String clustersTitle(); + @DefaultStringValue("MAC Pool Permissions") + String macPoolPermissionsTitle(); + @DefaultStringValue("Profiles") String networkProfilesTitle(); @@ -200,6 +203,9 @@ @DefaultStringValue("Remove MAC Address Pool(s)") String removeSharedMacPoolsTitle(); + @DefaultStringValue("Remove MAC Address Pool Permission(s)") + String removeSharedMacPoolPermissions(); + @DefaultStringValue("Logical Networks") String logicalNetworksTitle(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/UiCommonModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/UiCommonModule.java index 095f85c..b42e3b7 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/UiCommonModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/UiCommonModule.java @@ -18,6 +18,7 @@ import org.ovirt.engine.ui.webadmin.gin.uicommon.VirtualMachineModule; import org.ovirt.engine.ui.webadmin.gin.uicommon.VnicProfileModule; import org.ovirt.engine.ui.webadmin.gin.uicommon.VolumeModule; +import org.ovirt.engine.ui.webadmin.section.main.view.popup.macpool.MacPoolPermissionModelProvider; import org.ovirt.engine.ui.webadmin.uicommon.WebAdminConfigurator; import org.ovirt.engine.ui.webadmin.uicommon.model.AlertFirstRowModelProvider; import org.ovirt.engine.ui.webadmin.uicommon.model.AlertModelProvider; @@ -114,6 +115,9 @@ // SharedMacPoolListModel bind(SharedMacPoolModelProvider.class).asEagerSingleton(); + // MacPoolPermissionModelProvider + bind(MacPoolPermissionModelProvider.class).asEagerSingleton(); + // disk profiles permissions bind(DiskProfilePermissionModelProvider.class).asEagerSingleton(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/configure/ConfigurePopupPresenterWidget.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/configure/ConfigurePopupPresenterWidget.java index 349005a..4097d4e 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/configure/ConfigurePopupPresenterWidget.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/configure/ConfigurePopupPresenterWidget.java @@ -3,6 +3,7 @@ import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.ui.common.presenter.AbstractPopupPresenterWidget; import org.ovirt.engine.ui.uicommonweb.models.ApplicationModeHelper; +import org.ovirt.engine.ui.webadmin.section.main.view.popup.macpool.MacPoolPermissionModelProvider; import org.ovirt.engine.ui.webadmin.uicommon.model.ClusterPolicyClusterModelProvider; import org.ovirt.engine.ui.webadmin.uicommon.model.ClusterPolicyModelProvider; import org.ovirt.engine.ui.webadmin.uicommon.model.InstanceTypeModelProvider; @@ -30,6 +31,7 @@ private ClusterPolicyClusterModelProvider clusterPolicyClusterModelProvider; private InstanceTypeModelProvider instanceTypeModelProvider; private SharedMacPoolModelProvider sharedMacPoolModelProvider; + private MacPoolPermissionModelProvider macPoolPermissionModelProvider; @Inject public ConfigurePopupPresenterWidget(EventBus eventBus, ViewDef view, @@ -39,7 +41,8 @@ ClusterPolicyModelProvider clusterPolicyModelProvider, ClusterPolicyClusterModelProvider clusterPolicyClusterModelProvider, InstanceTypeModelProvider instanceTypeModelProvider, - SharedMacPoolModelProvider sharedMacPoolModelProvider) { + SharedMacPoolModelProvider sharedMacPoolModelProvider, + MacPoolPermissionModelProvider macPoolPermissionModelProvider) { super(eventBus, view); this.roleModelProvider = roleModelProvider; this.permissionModelProvider = permissionModelProvider; @@ -48,6 +51,7 @@ this.clusterPolicyClusterModelProvider = clusterPolicyClusterModelProvider; this.instanceTypeModelProvider = instanceTypeModelProvider; this.sharedMacPoolModelProvider = sharedMacPoolModelProvider; + this.macPoolPermissionModelProvider = macPoolPermissionModelProvider; } @Override @@ -63,6 +67,7 @@ } instanceTypeModelProvider.getModel().search(); sharedMacPoolModelProvider.getModel().search(); + macPoolPermissionModelProvider.getModel().search(); } @Override @@ -75,6 +80,7 @@ clusterPolicyClusterModelProvider.getModel().stopRefresh(); instanceTypeModelProvider.getModel().stopRefresh(); sharedMacPoolModelProvider.getModel().stopRefresh(); + macPoolPermissionModelProvider.getModel().stopRefresh(); } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/MacPoolPermissionModelProvider.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/MacPoolPermissionModelProvider.java new file mode 100644 index 0000000..75260bb --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/MacPoolPermissionModelProvider.java @@ -0,0 +1,57 @@ +package org.ovirt.engine.ui.webadmin.section.main.view.popup.macpool; + +import org.ovirt.engine.core.common.businessentities.Permissions; +import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget; +import org.ovirt.engine.ui.common.presenter.popup.DefaultConfirmationPopupPresenterWidget; +import org.ovirt.engine.ui.common.presenter.popup.RemoveConfirmationPopupPresenterWidget; +import org.ovirt.engine.ui.common.uicommon.model.SearchableTabModelProvider; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; +import org.ovirt.engine.ui.uicommonweb.models.Model; +import org.ovirt.engine.ui.uicommonweb.models.macpool.MacPoolPermissionsListModel; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.PermissionsPopupPresenterWidget; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class MacPoolPermissionModelProvider extends SearchableTabModelProvider<Permissions, MacPoolPermissionsListModel> { + + private final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider; + private final Provider<PermissionsPopupPresenterWidget> permissionPopupProvider; + + @Inject + public MacPoolPermissionModelProvider(EventBus eventBus, + Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, + Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider, + Provider<PermissionsPopupPresenterWidget> permissionPopupProvider) { + super(eventBus, defaultConfirmPopupProvider); + this.removeConfirmPopupProvider = removeConfirmPopupProvider; + this.permissionPopupProvider = permissionPopupProvider; + } + + @Override + public MacPoolPermissionsListModel getModel() { + return getCommonModel().getMacPoolPermissionsListModel(); + } + + @Override + public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(MacPoolPermissionsListModel source, + UICommand lastExecutedCommand) { + if (lastExecutedCommand == getModel().getRemovePermissionCommand()) { + return removeConfirmPopupProvider.get(); + } else { + return super.getConfirmModelPopup(source, lastExecutedCommand); + } + } + + @Override + public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(MacPoolPermissionsListModel source, + UICommand lastExecutedCommand, Model windowModel) { + if (lastExecutedCommand == getModel().getAddPermissionCommand()) { + return permissionPopupProvider.get(); + } else { + return super.getModelPopup(source, lastExecutedCommand, windowModel); + } + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/SharedMacPoolView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/SharedMacPoolView.java index 4462bba..5b611d2 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/SharedMacPoolView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/macpool/SharedMacPoolView.java @@ -1,10 +1,15 @@ package org.ovirt.engine.ui.webadmin.section.main.view.popup.macpool; +import java.util.List; + import org.ovirt.engine.core.common.businessentities.MacPool; +import org.ovirt.engine.core.common.businessentities.Permissions; +import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.MainTableHeaderlessResources; import org.ovirt.engine.ui.common.MainTableResources; import org.ovirt.engine.ui.common.system.ClientStorage; import org.ovirt.engine.ui.common.widget.table.SimpleActionTable; +import org.ovirt.engine.ui.common.widget.table.column.PermissionTypeColumn; import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.webadmin.ApplicationConstants; @@ -22,10 +27,15 @@ public class SharedMacPoolView extends Composite { + private final MacPoolPermissionModelProvider macPoolPermissionModelProvider; + private final SharedMacPoolModelProvider sharedMacPoolModelProvider; + private final SimpleActionTable<MacPool> macPoolTable; + private final SimpleActionTable<Permissions> authorizationTable; @Inject public SharedMacPoolView(final SharedMacPoolModelProvider sharedMacPoolModelProvider, + final MacPoolPermissionModelProvider macPoolPermissionModelProvider, final EventBus eventBus, final ClientStorage clientStorage, final MainTableHeaderlessResources headerlessResources, @@ -33,12 +43,27 @@ final ApplicationConstants constants, final ApplicationResources resources) { - SplitLayoutPanel rootPanel = createRootPanel(); - macPoolTable = createMacPoolTable(sharedMacPoolModelProvider, eventBus, clientStorage, headerlessResources, + this.sharedMacPoolModelProvider = sharedMacPoolModelProvider; + this.macPoolPermissionModelProvider = macPoolPermissionModelProvider; + + macPoolTable = createMacPoolTable(eventBus, clientStorage, headerlessResources, tableResources, constants, resources); + authorizationTable = createAuthorizationTable(eventBus, clientStorage, headerlessResources, + tableResources, constants, resources); + + SplitLayoutPanel rootPanel = createRootPanel(); + rootPanel.addSouth(authorizationTable, 150); rootPanel.add(macPoolTable); + + setupAuthorizationTableVisibility(); + initWidget(rootPanel); + } + + private void setupAuthorizationTableVisibility() { + final boolean isExactlyOnePoolSelected = macPoolTable.getSelectionModel().getSelectedList().size() == 1; + authorizationTable.setVisible(isExactlyOnePoolSelected); } protected SplitLayoutPanel createRootPanel() { @@ -48,8 +73,7 @@ return rootPanel; } - private SimpleActionTable<MacPool> createMacPoolTable(final SharedMacPoolModelProvider sharedMacPoolModelProvider, - final EventBus eventBus, + private SimpleActionTable<MacPool> createMacPoolTable(final EventBus eventBus, final ClientStorage clientStorage, final MainTableHeaderlessResources headerlessResources, final MainTableResources tableResources, @@ -83,6 +107,8 @@ return macPool.getDescription(); } }, constants.configureMacPoolDescriptionColumn(), "300px"); //$NON-NLS-1$ + + macPoolTable.addActionButton(new WebAdminButtonDefinition<MacPool>(constants.configureMacPoolAddButton()) { @Override @@ -105,15 +131,94 @@ return sharedMacPoolModelProvider.getModel().getRemoveCommand(); } }); - macPoolTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { + + macPoolTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { - sharedMacPoolModelProvider.setSelectedItems(macPoolTable.getSelectedItems()); + setupAuthorizationTableVisibility(); + + final List<MacPool> selectedItems = macPoolTable.getSelectedItems(); + sharedMacPoolModelProvider.setSelectedItems(selectedItems); + + Guid soleSelectedMacPoolId = selectedItems.size() == 1 ? selectedItems.get(0).getId() : null; + macPoolPermissionModelProvider.getModel().setSelectedMacPoolIdAndSync(soleSelectedMacPoolId); } }); return macPoolTable; } + //TODO MM: remove duplicity with org.ovirt.engine.ui.webadmin.section.main.view.popup.configure.SystemPermissionView.initTable() + private SimpleActionTable<Permissions> createAuthorizationTable(final EventBus eventBus, + final ClientStorage clientStorage, + final MainTableHeaderlessResources headerlessResources, + final MainTableResources tableResources, + final ApplicationConstants constants, + final ApplicationResources resources) { + + SimpleActionTable<Permissions> permissionsTable = new SimpleActionTable<Permissions>(macPoolPermissionModelProvider, + headerlessResources, + tableResources, + eventBus, + clientStorage); + permissionsTable.addColumn(new PermissionTypeColumn(), constants.empty(), "30px"); //$NON-NLS-1$ + + TextColumnWithTooltip<Permissions> userColumn = new TextColumnWithTooltip<Permissions>() { + @Override + public String getValue(Permissions object) { + return object.getOwnerName(); + } + }; + permissionsTable.addColumn(userColumn, constants.userPermission(), "300px"); //$NON-NLS-1$ + + TextColumnWithTooltip<Permissions> namespaceColumn = new TextColumnWithTooltip<Permissions>() { + @Override + public String getValue(Permissions object) { + return object.getNamespace(); + } + }; + permissionsTable.addColumn(namespaceColumn, constants.namespace(), "200px"); //$NON-NLS-1$ + + TextColumnWithTooltip<Permissions> authzColumn = new TextColumnWithTooltip<Permissions>() { + @Override + public String getValue(Permissions object) { + return object.getAuthz(); + } + }; + permissionsTable.addColumn(authzColumn, constants.authz(), "200px"); //$NON-NLS-1$ + + TextColumnWithTooltip<Permissions> roleColumn = new TextColumnWithTooltip<Permissions>() { + @Override + public String getValue(Permissions object) { + return object.getRoleName(); + } + }; + permissionsTable.addColumn(roleColumn, constants.rolePermission()); + + permissionsTable.addActionButton(new WebAdminButtonDefinition<Permissions>(constants.addPermission()) { + @Override + protected UICommand resolveCommand() { + return macPoolPermissionModelProvider.getModel().getAddPermissionCommand(); + } + }); + + permissionsTable.addActionButton(new WebAdminButtonDefinition<Permissions>(constants.removePermission()) { + @Override + protected UICommand resolveCommand() { + return macPoolPermissionModelProvider.getModel().getRemovePermissionCommand(); + } + }); + + permissionsTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { + + @Override + public void onSelectionChange(SelectionChangeEvent event) { + macPoolPermissionModelProvider.setSelectedItems(authorizationTable.getSelectedItems()); + } + }); + + return permissionsTable; + } + } -- To view, visit http://gerrit.ovirt.org/32211 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Idb6b442e7eebce367b9008f4b9c1df9ade84745f Gerrit-PatchSet: 12 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Mucha <[email protected]> Gerrit-Reviewer: [email protected] Gerrit-Reviewer: oVirt Jenkins CI Server _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
