Daniel Erez has uploaded a new change for review. Change subject: webadmin: introduce Authentication Keys sub-tab under Providers ......................................................................
webadmin: introduce Authentication Keys sub-tab under Providers Added 'Authentication Keys' sub-tab under OpenStack Volume Provider main-tab. The sub-tab exposes new/edit/remove actions (and invokes a new/edit 'Authentication Key' dialog accordingly). For more details see feature page. Feature Page: http://www.ovirt.org/Features/Cinder_Integration Change-Id: I477f57edfaa211a6b030269d4c3d52bcb3d5915f Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Daniel Erez <[email protected]> --- M frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml 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/dataprovider/AsyncDataProvider.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/providers/ProviderListModel.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderSecretListModel.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LibvirtSecretModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Enums.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/Enums.properties 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/gin/ClientGinjectorExtension.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/ProviderModule.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/provider/ProviderSecretPopupPresenterWidget.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/provider/SubTabProviderSecretPresenter.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.ui.xml M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/provider/SubTabProviderSecretView.java 23 files changed, 872 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/70/41970/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml index 13986ec..7e29b0c 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml @@ -243,6 +243,7 @@ <include name="common/businessentities/storage/CinderConnectionInfo.java" /> <include name="common/businessentities/storage/LibvirtSecretUsageType.java" /> <include name="common/businessentities/storage/LibvirtSecret.java" /> + <include name="common/businessentities/storage/LibvirtSecretUsageType.java" /> <!-- Misc --> <include name="common/AuditLogType.java" /> 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 dd38a88..e2cf51b 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 @@ -50,6 +50,7 @@ import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.scheduling.ClusterPolicy; @@ -1616,6 +1617,13 @@ } } + public final static class SecretComparator implements Comparator<LibvirtSecret>, Serializable { + @Override + public int compare(LibvirtSecret s1, LibvirtSecret s2) { + return LexoNumericComparator.comp(s1.getId().toString(), s2.getId().toString()); + } + } + public final static Collection<StorageDomain> filterStorageDomainsByStorageType( Collection<StorageDomain> source, final StorageType storageType) { return where(source, new IPredicate<StorageDomain>() { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java index 31c1f98..9136570 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java @@ -82,6 +82,7 @@ import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.network.VnicProfileView; import org.ovirt.engine.core.common.businessentities.qos.QosType; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecretUsageType; import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; @@ -4227,4 +4228,20 @@ aQuery); } + public ArrayList<LibvirtSecretUsageType> getLibvirtSecretUsageTypeList() { + return new ArrayList<>(Arrays.asList(LibvirtSecretUsageType.values())); + } + + public void getNewGuid(AsyncQuery aQuery) { + aQuery.converterCallback = new IAsyncConverter() { + @Override + public Object Convert(Object source, AsyncQuery _asyncQuery) { + return source; + } + }; + Frontend.getInstance().runQuery(VdcQueryType.GetNewGuid, + new VdcQueryParametersBase(), + aQuery); + } + } 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 411856b..837c31d 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 @@ -268,6 +268,14 @@ move_disks("move_disks", HelpTagType.WEBADMIN, "Disks Tab > Move Disk(s)"), //$NON-NLS-1$ //$NON-NLS-2$ + libvirt_secrets("libvirt_secrets", HelpTagType.WEBADMIN), //$NON-NLS-1$ + + create_secret("create_secret", HelpTagType.WEBADMIN, "Providers main-tab > Authentication Keys sub-tab > New"), //$NON-NLS-1$ //$NON-NLS-2$ + + edit_secret("create_secret", HelpTagType.WEBADMIN, "Providers main-tab > Authentication Keys sub-tab > Edit"), //$NON-NLS-1$ //$NON-NLS-2$ + + remove_secret("remove_secret", HelpTagType.WEBADMIN, "Providers main-tab > Authentication Keys sub-tab > Remove"), //$NON-NLS-1$ //$NON-NLS-2$ + multiple_archs_dialog("multiple_archs_dialog", HelpTagType.WEBADMIN, "Storage main tab -> VM Import sub-tab -> Import -> warning dialog for VMs with non-mathcing architectures"), //$NON-NLS-1$ //$NON-NLS-2$ network_interfaces("network_interfaces", HelpTagType.UNKNOWN), //$NON-NLS-1$ diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderListModel.java index a3f4513..c81599c 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderListModel.java @@ -6,6 +6,7 @@ import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.businessentities.Provider; +import org.ovirt.engine.core.common.businessentities.ProviderType; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.queries.SearchParameters; @@ -34,14 +35,17 @@ private UICommand removeCommand; private final ProviderNetworkListModel providerNetworkListModel; + private final ProviderSecretListModel providerSecretListModel; private SystemTreeItemModel systemTreeSelectedItem; @Inject public ProviderListModel(final ProviderGeneralModel providerGeneralModel, - ProviderNetworkListModel providerNetworkListModel) { + ProviderNetworkListModel providerNetworkListModel, + ProviderSecretListModel providerSecretListModel) { this.providerNetworkListModel = providerNetworkListModel; - setModelList(providerGeneralModel, providerNetworkListModel); + this.providerSecretListModel = providerSecretListModel; + setModelList(providerGeneralModel, providerNetworkListModel, providerSecretListModel); setTitle(ConstantsManager.getInstance().getConstants().providersTitle()); setHelpTag(HelpTag.providers); @@ -64,10 +68,12 @@ } private void setModelList(final ProviderGeneralModel providerGeneralModel, - final ProviderNetworkListModel providerNetworkListModel) { + final ProviderNetworkListModel providerNetworkListModel, + final ProviderSecretListModel providerSecretListModel) { List<HasEntity<Provider>> list = new ArrayList<>(); list.add(providerGeneralModel); list.add(providerNetworkListModel); + list.add(providerSecretListModel); setDetailModels(list); } @@ -104,6 +110,7 @@ providerNetworkListModel.setIsAvailable(provider.getType() .getProvidedTypes() .contains(VdcObjectType.Network)); + providerSecretListModel.setIsAvailable(provider.getType() == ProviderType.OPENSTACK_VOLUME); } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderSecretListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderSecretListModel.java new file mode 100644 index 0000000..e893d07 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderSecretListModel.java @@ -0,0 +1,217 @@ +package org.ovirt.engine.ui.uicommonweb.models.providers; + +import java.util.ArrayList; + +import org.ovirt.engine.core.common.action.LibvirtSecretParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.Provider; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.ICommandTarget; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.help.HelpTag; +import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; +import org.ovirt.engine.ui.uicommonweb.models.Model; +import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.LibvirtSecretModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; + +import com.google.inject.Inject; + +public class ProviderSecretListModel extends SearchableListModel<Provider, LibvirtSecret> { + + private UICommand newCommand; + private UICommand editCommand; + private UICommand removeCommand; + + @Inject + public ProviderSecretListModel() { + setTitle(ConstantsManager.getInstance().getConstants().providerNetworksTitle()); + setHelpTag(HelpTag.libvirt_secrets); + setHashName("libvirt_secrets"); //$NON-NLS-1$ + + setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ + setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$ + setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ + } + + @Override + protected String getListName() { + return "ProviderSecretListModel"; //$NON-NLS-1$ + } + + @Override + protected void onEntityChanged() { + super.onEntityChanged(); + + if (getEntity() != null) { + getSearchCommand().execute(); + } + } + + @Override + protected void syncSearch() { + Provider provider = getEntity(); + if (provider == null) { + return; + } + super.syncSearch(VdcQueryType.GetAllLibvirtSecretsByProviderId, new IdQueryParameters(provider.getId())); + } + + @Override + public void executeCommand(UICommand command) { + super.executeCommand(command); + + if (command == getNewCommand()) { + newSecret(); + } else if (command == getEditCommand()) { + editSecret(); + } else if (command == getRemoveCommand()) { + removeSecret(); + } else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$ + onRemoveSecret(); + } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ + cancel(); + } + } + + private void newSecret() { + if (getWindow() != null) { + return; + } + final LibvirtSecretModel secretModel = createSecretModel( + ConstantsManager.getInstance().getConstants().createSecretTitle(), + HelpTag.create_secret, "create_secret"); //$NON-NLS-1$ + setWindow(secretModel); + AsyncDataProvider.getInstance().getNewGuid(new AsyncQuery(secretModel, new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + Guid randomGuid = (Guid) returnValue; + secretModel.getUuid().setEntity(randomGuid.toString()); + } + })); + } + + private void editSecret() { + if (getWindow() != null) { + return; + } + LibvirtSecretModel secretModel = createSecretModel( + ConstantsManager.getInstance().getConstants().editSecretTitle(), + HelpTag.edit_secret, "edit_secret"); //$NON-NLS-1$ + secretModel.getUuid().setIsChangeable(false); + secretModel.edit(getSelectedItem()); + setWindow(secretModel); + } + + private void removeSecret() { + if (getWindow() != null) { + return; + } + ConfirmationModel model = new ConfirmationModel(); + addDialogCommands(model, this, "OnRemove"); //$NON-NLS-1$ + setConfirmWindow(model); + model.setTitle(ConstantsManager.getInstance().getConstants().removeSecretTitle()); + model.setHelpTag(HelpTag.remove_secret); + model.setHashName("remove_secret"); //$NON-NLS-1$ + ArrayList<String> secretsToRemove = new ArrayList<String>(); + for (LibvirtSecret libvirtSecret : Linq.<LibvirtSecret> cast(getSelectedItems())) { + secretsToRemove.add(libvirtSecret.getId().toString()); + } + model.setItems(secretsToRemove); + } + + private void onRemoveSecret() { + ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); + if (model.getProgress() != null) { + return; + } + ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); + for (LibvirtSecret libvirtSecret : getSelectedItems()) { + LibvirtSecretParameters param = new LibvirtSecretParameters(libvirtSecret); + parameters.add(param); + } + Frontend.getInstance().runMultipleAction(VdcActionType.RemoveLibvirtSecret, parameters, + new IFrontendMultipleActionAsyncCallback() { + @Override + public void executed(FrontendMultipleActionAsyncResult result) { + cancel(); + } + }); + } + + private LibvirtSecretModel createSecretModel(String title, HelpTag helpTag, String hashName) { + LibvirtSecretModel secretModel = new LibvirtSecretModel(); + secretModel.setTitle(title); + secretModel.setHelpTag(helpTag); + secretModel.setHashName(hashName); + secretModel.getProviderId().setEntity(getEntity().getId().toString()); + addDialogCommands(secretModel, secretModel, "OnSave"); //$NON-NLS-1$ + return secretModel; + } + + private void addDialogCommands(Model model, ICommandTarget okTarget, String okCommandName) { + model.getCommands().add(UICommand.createDefaultOkUiCommand(okCommandName, okTarget)); + model.getCommands().add(UICommand.createCancelUiCommand("Cancel", this)); //$NON-NLS-1$ + } + + @Override + protected void onSelectedItemChanged() { + super.onSelectedItemChanged(); + updateActionAvailability(); + } + + @Override + protected void selectedItemsChanged() { + super.selectedItemsChanged(); + updateActionAvailability(); + } + + private void updateActionAvailability() { + ArrayList<LibvirtSecretModel> secrets = getSelectedItems() != null ? + Linq.<LibvirtSecretModel> cast(getSelectedItems()) : new ArrayList<LibvirtSecretModel>(); + + getEditCommand().setIsExecutionAllowed(secrets.size() > 0); + getRemoveCommand().setIsExecutionAllowed(secrets.size() > 0); + } + + private void cancel() { + setWindow(null); + setConfirmWindow(null); + } + + public UICommand getNewCommand() { + return newCommand; + } + + public void setNewCommand(UICommand newCommand) { + this.newCommand = newCommand; + } + + @Override + public UICommand getEditCommand() { + return editCommand; + } + + public void setEditCommand(UICommand editCommand) { + this.editCommand = editCommand; + } + + public UICommand getRemoveCommand() { + return removeCommand; + } + + public void setRemoveCommand(UICommand removeCommand) { + this.removeCommand = removeCommand; + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LibvirtSecretModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LibvirtSecretModel.java new file mode 100644 index 0000000..24b4b00 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LibvirtSecretModel.java @@ -0,0 +1,154 @@ +package org.ovirt.engine.ui.uicommonweb.models.storage; + +import java.util.ArrayList; +import java.util.Collections; + +import org.ovirt.engine.core.common.action.LibvirtSecretParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecretUsageType; +import org.ovirt.engine.core.common.utils.ValidationUtils; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; +import org.ovirt.engine.ui.uicommonweb.validation.GuidValidation; +import org.ovirt.engine.ui.uicommonweb.validation.IValidation; +import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; +import org.ovirt.engine.ui.uicommonweb.validation.RegexValidation; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; +import org.ovirt.engine.ui.uicompat.external.StringUtils; + +public class LibvirtSecretModel extends EntityModel<LibvirtSecret> { + + private EntityModel<String> uuid; + private EntityModel<String> value; + private ListModel<LibvirtSecretUsageType> usageType; + private EntityModel<String> description; + private EntityModel<String> providerId; + + public LibvirtSecretModel() { + setUuid(new EntityModel<String>()); + setValue(new EntityModel<String>()); + setUsageType(new ListModel<LibvirtSecretUsageType>()); + setDescription(new EntityModel<String>()); + setProviderId(new EntityModel<String>()); + + ArrayList<LibvirtSecretUsageType> libvirtSecretUsageTypeList = + AsyncDataProvider.getInstance().getLibvirtSecretUsageTypeList(); + getUsageType().setItems(libvirtSecretUsageTypeList, Linq.firstOrDefault(libvirtSecretUsageTypeList)); + } + + @Override + public void executeCommand(UICommand command) { + super.executeCommand(command); + + if ("OnSave".equals(command.getName())) { //$NON-NLS-1$ + onSave(); + } + } + + private void onSave() { + if (!validate()) { + return; + } + + VdcActionType actionType = isNew() ? + VdcActionType.AddLibvirtSecret : VdcActionType.UpdateLibvirtSecret; + flush(); + Frontend.getInstance().runAction(actionType, new LibvirtSecretParameters(getEntity()), + new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { + VdcReturnValueBase res = result.getReturnValue(); + if (res.getSucceeded()) { + getCancelCommand().execute(); + } + } + }, this); + } + + public boolean validate() { + getUsageType().validateSelectedItem(new IValidation[] { new NotEmptyValidation() }); + getUuid().validateEntity(new IValidation[] { new NotEmptyValidation(), new GuidValidation() }); + + ArrayList<IValidation> valueValidations = new ArrayList<IValidation>( + Collections.singletonList(new RegexValidation(ValidationUtils.BASE_64_PATTERN, + ConstantsManager.getInstance().getConstants().secretValueMustBeInBase64()))); + if (isNew()) { + valueValidations.add(new NotEmptyValidation()); + getValue().validateEntity(valueValidations.toArray(new IValidation[valueValidations.size()])); + } + + return getUsageType().getIsValid() && getUuid().getIsValid() && getValue().getIsValid(); + } + + private void flush() { + LibvirtSecret secret = isNew() ? new LibvirtSecret() : getEntity(); + secret.setUsageType(getUsageType().getSelectedItem()); + secret.setDescription(getDescription().getEntity()); + secret.setProviderId(Guid.createGuidFromString(getProviderId().getEntity())); + secret.setId(Guid.createGuidFromString(uuid.getEntity())); + if (StringUtils.isNotEmpty(getValue().getEntity())) { + secret.setValue(getValue().getEntity()); + } + setEntity(secret); + } + + public void edit(LibvirtSecret secret) { + setEntity(secret); + getUsageType().setSelectedItem(secret.getUsageType()); + getUuid().setEntity(secret.getId().toString()); + getDescription().setEntity(secret.getDescription()); + } + + private boolean isNew() { + return getEntity() == null; + } + + public EntityModel<String> getUuid() { + return uuid; + } + + public void setUuid(EntityModel<String> uuid) { + this.uuid = uuid; + } + + public EntityModel<String> getValue() { + return value; + } + + public void setValue(EntityModel<String> value) { + this.value = value; + } + + public ListModel<LibvirtSecretUsageType> getUsageType() { + return usageType; + } + + public void setUsageType(ListModel<LibvirtSecretUsageType> usageType) { + this.usageType = usageType; + } + + public EntityModel<String> getDescription() { + return description; + } + + public void setDescription(EntityModel<String> description) { + this.description = description; + } + + public EntityModel<String> getProviderId() { + return providerId; + } + + public void setProviderId(EntityModel<String> providerId) { + this.providerId = providerId; + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java index e54d8c1..307c2a2 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java @@ -378,6 +378,9 @@ public static final String providerNetworkSubTabPlace = providerMainTabPlace + SUB_TAB_PREFIX + "networks"; //$NON-NLS-1$ + public static final String providerSecretSubTabPlace = providerMainTabPlace + SUB_TAB_PREFIX + + "secrets"; //$NON-NLS-1$ + // Vnic Profile public static final String vnicProfilePermissionSubTabPlace = vnicProfileMainTabPlace + SUB_TAB_PREFIX + "permissions"; //$NON-NLS-1$ diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Enums.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Enums.java index b15d374..5a45752 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Enums.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Enums.java @@ -360,4 +360,6 @@ String OpenstackNetworkProviderProperties$BrokerType___QPID(); String OpenstackNetworkProviderProperties$BrokerType___RABBIT_MQ(); + + String LibvirtSecretUsageType___CEPH(); } 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 ae4c9c8..dafae39 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 @@ -930,6 +930,10 @@ String VdcObjectType___DiskProfile(); + String VdcActionType___AddLibvirtSecret(); + + String VdcActionType___UpdateLibvirtSecret(); + String VdsSelectionAlgorithm___None(); String VdsSelectionAlgorithm___EvenlyDistribute(); 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 0e7b883..390aaf0 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 @@ -2762,9 +2762,21 @@ @DefaultStringValue("Register Disks") String registerDisksTitle(); + @DefaultStringValue("Create Authentication Key") + String createSecretTitle(); + + @DefaultStringValue("Edit Authentication Key") + String editSecretTitle(); + + @DefaultStringValue("Remove Authentication Key(s)") + String removeSecretTitle(); + @DefaultStringValue("Icon file is not parsable.") String iconIsNotParsable(); + @DefaultStringValue("Authentication Key value must be encoded in Base64.") + String secretValueMustBeInBase64(); + @DefaultStringValue("Please select a storage device to create brick.") String selectStorageDevice(); diff --git a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/Enums.properties b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/Enums.properties index b8c11cd..5d30a82 100644 --- a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/Enums.properties +++ b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/Enums.properties @@ -198,4 +198,5 @@ SerialNumberPolicy___VM_ID=Vm ID SerialNumberPolicy___CUSTOM=Custom serial number OpenstackNetworkProviderProperties$BrokerType___QPID=Qpid -OpenstackNetworkProviderProperties$BrokerType___RABBIT_MQ=RabbitMQ \ No newline at end of file +OpenstackNetworkProviderProperties$BrokerType___RABBIT_MQ=RabbitMQ +LibvirtSecretUsageType___CEPH=ceph \ No newline at end of file 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 be7e1aa..bffa39b 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 @@ -446,6 +446,8 @@ VdcActionType___AddSubnetToProvider=Add Subnet to Provider VdcActionType___RemoveSubnetFromProvider=Remove Subnet from Provider VdcObjectType___AdElements=Active Directory Users and Groups +VdcActionType___AddLibvirtSecret=Add Libvirt Secret +VdcActionType___UpdateLibvirtSecret=Update Libvirt Secret VdcObjectType___System=System VdcObjectType___StoragePool=Data Center VdcObjectType___Bookmarks=Bookmarks 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 ddb6040..3cdcefa 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 @@ -2998,6 +2998,30 @@ @DefaultStringValue("Register") String registerDisk(); + @DefaultStringValue("New") + String newLibvirtSecret(); + + @DefaultStringValue("Edit") + String editLibvirtSecret(); + + @DefaultStringValue("Remove") + String removeLibvirtSecret(); + + @DefaultStringValue("UUID") + String idLibvirtSecret(); + + @DefaultStringValue("Value") + String valueLibvirtSecret(); + + @DefaultStringValue("Type") + String usageTypeLibvirtSecret(); + + @DefaultStringValue("Description") + String descriptionLibvirtSecret(); + + @DefaultStringValue("Creation Date") + String creationDateLibvirtSecret(); + // Setup network @DefaultStringValue("Drag to make changes") String dragToMakeChangesSetupNetwork(); @@ -3462,6 +3486,9 @@ @DefaultStringValue("Networks") String providerNetworksSubTabLabel(); + @DefaultStringValue("Authentication Keys") + String providerSecretsSubTabLabel(); + @DefaultStringValue("Messaging Broker Configuration") String messagingConfiguration(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java index 8c167a2..245df33 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java @@ -43,6 +43,7 @@ import org.ovirt.engine.core.common.businessentities.qos.CpuQos; import org.ovirt.engine.core.common.businessentities.qos.StorageQos; import org.ovirt.engine.core.common.businessentities.storage.Disk; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; import org.ovirt.engine.core.common.businessentities.storage.RepoImage; import org.ovirt.engine.core.common.scheduling.AffinityGroup; import org.ovirt.engine.core.common.utils.PairQueryable; @@ -114,6 +115,7 @@ import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderListModel; import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderNetworkListModel; +import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderSecretListModel; import org.ovirt.engine.ui.uicommonweb.models.quota.QuotaClusterListModel; import org.ovirt.engine.ui.uicommonweb.models.quota.QuotaEventListModel; import org.ovirt.engine.ui.uicommonweb.models.quota.QuotaListModel; @@ -452,6 +454,8 @@ SearchableDetailModelProvider<NetworkView, ProviderListModel, ProviderNetworkListModel> getSubTabProviderNetworkModelProvider(); + SearchableDetailModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel> getSubTabProviderSecretModelProvider(); + // Profile SearchableDetailModelProvider<VM, VnicProfileListModel, VnicProfileVmListModel> getSubTabVnicProfileVmModelProvider(); 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 644934c..0d85531 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 @@ -87,6 +87,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ExternalSubnetPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ImportNetworksPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ProviderPopupPresenterWidget; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ProviderSecretPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.quota.ChangeQuotaPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.quota.EditQuotaClusterPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.quota.EditQuotaStoragePopupPresenterWidget; @@ -218,6 +219,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.provider.ProviderSubTabPanelPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.provider.SubTabProviderGeneralPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.provider.SubTabProviderNetworkPresenter; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.provider.SubTabProviderSecretPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.quota.QuotaSubTabPanelPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.quota.SubTabQuotaClusterPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.quota.SubTabQuotaEventPresenter; @@ -348,6 +350,7 @@ import org.ovirt.engine.ui.webadmin.section.main.view.popup.provider.ExternalSubnetPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.provider.ImportNetworksPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.provider.ProviderPopupView; +import org.ovirt.engine.ui.webadmin.section.main.view.popup.provider.ProviderSecretPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.qos.CpuQosPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.qos.HostNetworkQosPopupView; import org.ovirt.engine.ui.webadmin.section.main.view.popup.qos.StorageQosPopupView; @@ -486,6 +489,7 @@ import org.ovirt.engine.ui.webadmin.section.main.view.tab.provider.ProviderSubTabPanelView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.provider.SubTabProviderGeneralView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.provider.SubTabProviderNetworkView; +import org.ovirt.engine.ui.webadmin.section.main.view.tab.provider.SubTabProviderSecretView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.quota.QuotaSubTabPanelView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.quota.SubTabQuotaClusterView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.quota.SubTabQuotaEventView; @@ -1151,6 +1155,10 @@ SubTabProviderNetworkPresenter.ViewDef.class, SubTabProviderNetworkView.class, SubTabProviderNetworkPresenter.ProxyDef.class); + bindPresenter(SubTabProviderSecretPresenter.class, + SubTabProviderSecretPresenter.ViewDef.class, + SubTabProviderSecretView.class, + SubTabProviderSecretPresenter.ProxyDef.class); // Profile bindPresenter(VnicProfileSubTabPanelPresenter.class, @@ -1634,6 +1642,10 @@ ImportNetworksPopupPresenterWidget.ViewDef.class, ImportNetworksPopupView.class); + bindPresenterWidget(ProviderSecretPopupPresenterWidget.class, + ProviderSecretPopupPresenterWidget.ViewDef.class, + ProviderSecretPopupView.class); + // Profile bindPresenterWidget(VnicProfilePopupPresenterWidget.class, VnicProfilePopupPresenterWidget.ViewDef.class, diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/ProviderModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/ProviderModule.java index 904326b..19dfbab 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/ProviderModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/ProviderModule.java @@ -1,6 +1,7 @@ package org.ovirt.engine.ui.webadmin.gin.uicommon; import org.ovirt.engine.core.common.businessentities.network.NetworkView; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; 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; @@ -17,8 +18,10 @@ import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderListModel; import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderNetworkListModel; +import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderSecretListModel; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ImportNetworksPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ProviderPopupPresenterWidget; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ProviderSecretPopupPresenterWidget; import com.google.gwt.event.shared.EventBus; import com.google.gwt.inject.client.AbstractGinModule; @@ -44,7 +47,8 @@ eventBus, defaultConfirmPopupProvider, commonModelProvider) { @Override public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(ProviderListModel source, - UICommand lastExecutedCommand, Model windowModel) { + UICommand lastExecutedCommand, + Model windowModel) { if (lastExecutedCommand == getModel().getAddCommand() || lastExecutedCommand == getModel().getEditCommand()) { @@ -60,7 +64,8 @@ if (lastExecutedCommand == getModel().getRemoveCommand()) { return removeConfirmPopupProvider.get(); - } else if (lastExecutedCommand == getModel().getAddCommand() || lastExecutedCommand == getModel().getEditCommand()) { + } else if (lastExecutedCommand == getModel().getAddCommand() + || lastExecutedCommand == getModel().getEditCommand()) { return defaultConfirmPopupProvider.get(); } else { return super.getConfirmModelPopup(source, lastExecutedCommand); @@ -100,15 +105,56 @@ return result; } + @Provides + @Singleton + public SearchableDetailModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel> getProviderSecretListProvider(EventBus eventBus, + Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, + final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider, + final Provider<ProviderSecretPopupPresenterWidget> popupProvider, + final Provider<ProviderListModel> mainModelProvider, + final Provider<ProviderSecretListModel> modelProvider) { + SearchableDetailTabModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel> result = + new SearchableDetailTabModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel>( + eventBus, defaultConfirmPopupProvider) { + @Override + public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(ProviderSecretListModel source, + UICommand lastExecutedCommand, + Model windowModel) { + if (lastExecutedCommand == getModel().getNewCommand() || + lastExecutedCommand == getModel().getEditCommand()) { + return popupProvider.get(); + } else { + return super.getModelPopup(source, lastExecutedCommand, windowModel); + } + } + + @Override + public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup( + ProviderSecretListModel source, UICommand lastExecutedCommand) { + if (lastExecutedCommand == getModel().getRemoveCommand()) { + return removeConfirmPopupProvider.get(); + } else { + return super.getConfirmModelPopup(source, lastExecutedCommand); + } + } + }; + result.setMainModelProvider(mainModelProvider); + result.setModelProvider(modelProvider); + return result; + } + @Override protected void configure() { bind(ProviderListModel.class).in(Singleton.class); bind(ProviderGeneralModel.class).in(Singleton.class); bind(ProviderNetworkListModel.class).in(Singleton.class); + bind(ProviderSecretListModel.class).in(Singleton.class); // Form Detail Models - bind(new TypeLiteral<DetailModelProvider<ProviderListModel, ProviderGeneralModel>>(){}) - .to(new TypeLiteral<DetailTabModelProvider<ProviderListModel, ProviderGeneralModel>>(){}).in(Singleton.class); + bind(new TypeLiteral<DetailModelProvider<ProviderListModel, ProviderGeneralModel>>() { + }) + .to(new TypeLiteral<DetailTabModelProvider<ProviderListModel, ProviderGeneralModel>>() { + }).in(Singleton.class); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/provider/ProviderSecretPopupPresenterWidget.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/provider/ProviderSecretPopupPresenterWidget.java new file mode 100644 index 0000000..3b7891b --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/provider/ProviderSecretPopupPresenterWidget.java @@ -0,0 +1,19 @@ +package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider; + +import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget; +import org.ovirt.engine.ui.uicommonweb.models.storage.LibvirtSecretModel; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; + +public class ProviderSecretPopupPresenterWidget extends AbstractModelBoundPopupPresenterWidget<LibvirtSecretModel, ProviderSecretPopupPresenterWidget.ViewDef> { + + public interface ViewDef extends AbstractModelBoundPopupPresenterWidget.ViewDef<LibvirtSecretModel> { + } + + @Inject + public ProviderSecretPopupPresenterWidget(EventBus eventBus, ViewDef view) { + super(eventBus, view); + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/provider/SubTabProviderSecretPresenter.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/provider/SubTabProviderSecretPresenter.java new file mode 100644 index 0000000..fcec8a8 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/provider/SubTabProviderSecretPresenter.java @@ -0,0 +1,72 @@ +package org.ovirt.engine.ui.webadmin.section.main.presenter.tab.provider; + +import org.ovirt.engine.core.common.businessentities.Provider; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; +import org.ovirt.engine.ui.common.place.PlaceRequestFactory; +import org.ovirt.engine.ui.common.presenter.AbstractSubTabPresenter; +import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider; +import org.ovirt.engine.ui.common.widget.tab.ModelBoundTabData; +import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderListModel; +import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderSecretListModel; +import org.ovirt.engine.ui.uicommonweb.place.WebAdminApplicationPlaces; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.gin.AssetProvider; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.ProviderSelectionChangeEvent; +import org.ovirt.engine.ui.webadmin.uicommon.model.SystemTreeModelProvider; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; +import com.gwtplatform.mvp.client.TabData; +import com.gwtplatform.mvp.client.annotations.NameToken; +import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit; +import com.gwtplatform.mvp.client.annotations.ProxyEvent; +import com.gwtplatform.mvp.client.annotations.TabInfo; +import com.gwtplatform.mvp.client.proxy.PlaceManager; +import com.gwtplatform.mvp.client.proxy.TabContentProxyPlace; +import com.gwtplatform.mvp.shared.proxy.PlaceRequest; + +public class SubTabProviderSecretPresenter extends AbstractSubTabPresenter<Provider, ProviderListModel, ProviderSecretListModel, SubTabProviderSecretPresenter.ViewDef, SubTabProviderSecretPresenter.ProxyDef> { + + private final static ApplicationConstants constants = AssetProvider.getConstants(); + + @ProxyCodeSplit + @NameToken(WebAdminApplicationPlaces.providerSecretSubTabPlace) + public interface ProxyDef extends TabContentProxyPlace<SubTabProviderSecretPresenter> { + } + + public interface ViewDef extends AbstractSubTabPresenter.ViewDef<Provider> { + } + + @TabInfo(container = ProviderSubTabPanelPresenter.class) + static TabData getTabData( + SearchableDetailModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel> modelProvider) { + return new ModelBoundTabData(constants.providerSecretsSubTabLabel(), 2, modelProvider); + } + + @Inject + public SubTabProviderSecretPresenter(EventBus eventBus, + ViewDef view, + ProxyDef proxy, + PlaceManager placeManager, + SearchableDetailModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel> modelProvider, + SystemTreeModelProvider systemTreeModelProvider) { + super(eventBus, view, proxy, placeManager, modelProvider, + ProviderSubTabPanelPresenter.TYPE_SetTabContent); + } + + @Override + protected PlaceRequest getMainTabRequest() { + return PlaceRequestFactory.get(WebAdminApplicationPlaces.providerMainTabPlace); + } + + @ProxyEvent + public void onProviderSelectionChange(ProviderSelectionChangeEvent event) { + updateMainTabSelection(event.getSelectedItems()); + } + + @Override + protected void onBind() { + super.onBind(); + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.java new file mode 100644 index 0000000..c0fd5f9 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.java @@ -0,0 +1,108 @@ +package org.ovirt.engine.ui.webadmin.section.main.view.popup.provider; + +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecretUsageType; +import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; +import org.ovirt.engine.ui.common.idhandler.WithElementId; +import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; +import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; +import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor; +import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelPasswordBoxEditor; +import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor; +import org.ovirt.engine.ui.common.widget.renderer.EnumRenderer; +import org.ovirt.engine.ui.uicommonweb.models.storage.LibvirtSecretModel; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.gin.AssetProvider; +import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.provider.ProviderSecretPopupPresenterWidget; + +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.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.inject.Inject; + +public class ProviderSecretPopupView extends AbstractModelBoundPopupView<LibvirtSecretModel> implements ProviderSecretPopupPresenterWidget.ViewDef { + + interface Driver extends SimpleBeanEditorDriver<LibvirtSecretModel, ProviderSecretPopupView> { + } + + private final Driver driver = GWT.create(Driver.class); + + interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ProviderSecretPopupView> { + ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); + } + + interface ViewIdHandler extends ElementIdHandler<ProviderSecretPopupView> { + ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); + } + + @UiField(provided = true) + @Path(value = "usageType.selectedItem") + @WithElementId + ListModelListBoxEditor<LibvirtSecretUsageType> usageTypeEditor; + + @UiField + @Path(value = "uuid.entity") + @WithElementId + StringEntityModelTextBoxEditor uuidEditor; + + @UiField + @Path(value = "value.entity") + @WithElementId + StringEntityModelPasswordBoxEditor valueEditor; + + @UiField + @Path(value = "description.entity") + @WithElementId + StringEntityModelTextBoxEditor descriptionEditor; + + private final static ApplicationConstants constants = AssetProvider.getConstants(); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Inject + public ProviderSecretPopupView(EventBus eventBus) { + super(eventBus); + initManualWidgets(); + initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); + ViewIdHandler.idHandler.generateAndSetIds(this); + localize(); + driver.initialize(this); + } + + @SuppressWarnings({ "unchecked" }) + private void initManualWidgets() { + usageTypeEditor = new ListModelListBoxEditor<>(new EnumRenderer()); + } + + void localize() { + usageTypeEditor.setLabel(constants.usageTypeLibvirtSecret()); + descriptionEditor.setLabel(constants.descriptionLabel()); + uuidEditor.setLabel(constants.idLibvirtSecret()); + valueEditor.setLabel(constants.valueLibvirtSecret()); + } + + @Override + public void edit(LibvirtSecretModel model) { + driver.edit(model); + } + + @Override + public LibvirtSecretModel flush() { + return driver.flush(); + } + + @Override + public void focusInput() { + uuidEditor.setFocus(true); + } + + @Override + public int setTabIndexes(int nextTabIndex) { + usageTypeEditor.setTabIndex(nextTabIndex++); + uuidEditor.setTabIndex(nextTabIndex++); + valueEditor.setTabIndex(nextTabIndex++); + descriptionEditor.setTabIndex(nextTabIndex++); + return nextTabIndex; + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.ui.xml new file mode 100644 index 0000000..2e0af39 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/provider/ProviderSecretPopupView.ui.xml @@ -0,0 +1,18 @@ +<?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:w="urn:import:org.ovirt.engine.ui.common.widget" + xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic"> + + <d:SimpleDialogPanel width="450px" height="250px"> + <d:content> + <g:FlowPanel> + <e:ListModelListBoxEditor ui:field="usageTypeEditor" /> + <ge:StringEntityModelTextBoxEditor ui:field="uuidEditor" /> + <ge:StringEntityModelPasswordBoxEditor ui:field="valueEditor" /> + <ge:StringEntityModelTextBoxEditor ui:field="descriptionEditor" /> + </g:FlowPanel> + </d:content> + </d:SimpleDialogPanel> +</ui:UiBinder> diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java index 339b266..8cd9d9f 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/ImportExportImagePopupView.java @@ -25,6 +25,7 @@ import org.ovirt.engine.ui.uicompat.IEventListener; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.ApplicationTemplates; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget; @@ -86,6 +87,7 @@ private final Driver driver = GWT.create(Driver.class); private final static ApplicationConstants constants = AssetProvider.getConstants(); + private final static ApplicationTemplates templates = AssetProvider.getTemplates(); @Inject public ImportExportImagePopupView(EventBus eventBus) { @@ -107,8 +109,8 @@ importAsTemplateEditor.setLabel(constants.importAsTemplate()); imageListPanel = new SimplePanel(); - imageList = new EntityModelCellTable<>(SelectionMode.NONE, true); + imageList.enableColumnResizing(); imageList.addColumn(new AbstractEntityModelTextColumn<Object>() { @Override public String getText(Object image) { @@ -124,6 +126,17 @@ @Override public String getText(Object image) { if (image instanceof RepoImage) { + return ((RepoImage) image).getRepoImageTitle(); + } else if (image instanceof DiskImage) { + return ((DiskImage) image).getDiskAlias(); + } + return constants.unknown(); + } + }, templates.sub("Disk Alias", "(Click to Edit)")); //$NON-NLS-1$ //$NON-NLS-2$ + imageList.addColumn(new AbstractEntityModelTextColumn<Object>() { + @Override + public String getText(Object image) { + if (image instanceof RepoImage) { return ((RepoImage) image).getFileType().toString(); } else if (image instanceof DiskImage) { return ImageFileType.Disk.toString(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/provider/SubTabProviderSecretView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/provider/SubTabProviderSecretView.java new file mode 100644 index 0000000..2ca159e --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/provider/SubTabProviderSecretView.java @@ -0,0 +1,108 @@ +package org.ovirt.engine.ui.webadmin.section.main.view.tab.provider; + +import javax.inject.Inject; + +import org.ovirt.engine.core.common.businessentities.Provider; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret; +import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecretUsageType; +import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; +import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider; +import org.ovirt.engine.ui.common.widget.table.column.AbstractEnumColumn; +import org.ovirt.engine.ui.common.widget.table.column.AbstractFullDateTimeColumn; +import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderListModel; +import org.ovirt.engine.ui.uicommonweb.models.providers.ProviderSecretListModel; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.gin.AssetProvider; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.provider.SubTabProviderSecretPresenter; +import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView; +import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition; + +import com.google.gwt.core.client.GWT; + +import java.util.Date; + +public class SubTabProviderSecretView extends AbstractSubTabTableView<Provider, LibvirtSecret, ProviderListModel, ProviderSecretListModel> + implements SubTabProviderSecretPresenter.ViewDef { + + interface ViewIdHandler extends ElementIdHandler<SubTabProviderSecretView> { + ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); + } + + private final static ApplicationConstants constants = AssetProvider.getConstants(); + + @Inject + public SubTabProviderSecretView(SearchableDetailModelProvider<LibvirtSecret, ProviderListModel, ProviderSecretListModel> modelProvider) { + super(modelProvider); + initTable(); + initWidget(getTable()); + } + + @Override + protected void generateIds() { + ViewIdHandler.idHandler.generateAndSetIds(this); + } + + void initTable() { + getTable().enableColumnResizing(); + + AbstractTextColumn<LibvirtSecret> idColumn = new AbstractTextColumn<LibvirtSecret>() { + @Override + public String getValue(LibvirtSecret object) { + return object.getId().toString(); + } + }; + idColumn.makeSortable(); + getTable().addColumn(idColumn, constants.idLibvirtSecret(), "300px"); //$NON-NLS-1$ + + AbstractTextColumn<LibvirtSecret> usageTypeColumn = + new AbstractEnumColumn<LibvirtSecret, LibvirtSecretUsageType>() { + @Override + public LibvirtSecretUsageType getRawValue(LibvirtSecret object) { + return object.getUsageType(); + } + }; + usageTypeColumn.makeSortable(); + getTable().addColumn(usageTypeColumn, constants.usageTypeLibvirtSecret(), "150px"); //$NON-NLS-1$ + + AbstractTextColumn<LibvirtSecret> descriptionColumn = new AbstractTextColumn<LibvirtSecret>() { + @Override + public String getValue(LibvirtSecret object) { + return object.getDescription(); + } + }; + descriptionColumn.makeSortable(); + getTable().addColumn(descriptionColumn, constants.descriptionLibvirtSecret(), "200px"); //$NON-NLS-1$ + + + AbstractFullDateTimeColumn<LibvirtSecret> creationDateColumn = new AbstractFullDateTimeColumn<LibvirtSecret>() { + @Override + public Date getRawValue(LibvirtSecret object) { + return object.getCreationDate(); + } + }; + creationDateColumn.makeSortable(); + getTable().addColumn(creationDateColumn, constants.creationDateLibvirtSecret(), "200px"); //$NON-NLS-1$ + + getTable().addActionButton(new WebAdminButtonDefinition<LibvirtSecret>(constants.newLibvirtSecret()) { + @Override + protected UICommand resolveCommand() { + return getDetailModel().getNewCommand(); + } + }); + getTable().addActionButton(new WebAdminButtonDefinition<LibvirtSecret>(constants.editLibvirtSecret()) { + @Override + protected UICommand resolveCommand() { + return getDetailModel().getEditCommand(); + } + }); + getTable().addActionButton(new WebAdminButtonDefinition<LibvirtSecret>(constants.removeLibvirtSecret()) { + @Override + protected UICommand resolveCommand() { + return getDetailModel().getRemoveCommand(); + } + }); + } + +} -- To view, visit https://gerrit.ovirt.org/41970 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I477f57edfaa211a6b030269d4c3d52bcb3d5915f Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
