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

Reply via email to