Shubhendu Tripathi has uploaded a new change for review. Change subject: webadmin: Listing gluster volume snapshots ......................................................................
webadmin: Listing gluster volume snapshots Introduced sub tab for listing gluster volume snapshots under Volumes main tab. Also added a column for no of snapshots under volumes list and added a field to display the maximum no of allowed snapshots for a volume under General sub tab. Change-Id: Ic1953aad3d013d386719a43b4bfdda82896cc3af Signed-off-by: Shubhendu Tripathi <[email protected]> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java M frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.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/VolumeModule.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java 20 files changed, 450 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/90/39290/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java index edc3907..bde66d4 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java @@ -133,4 +133,9 @@ return true; } + + @Override + public Object getQueryableId() { + return this.snapshotId; + } } 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 a3d386b..68bf03b 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java @@ -38,6 +38,7 @@ import org.ovirt.engine.core.common.businessentities.comparators.LexoNumericComparator; import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkInterface; import org.ovirt.engine.core.common.businessentities.network.NetworkQoS; @@ -124,6 +125,16 @@ } } + + public static class GlusterVolumeSnapshotComparer implements Comparator<GlusterVolumeSnapshotEntity>, Serializable { + private static final long serialVersionUID = -6085272225112945249L; + + @Override + public int compare(GlusterVolumeSnapshotEntity snapshot0, GlusterVolumeSnapshotEntity snapshot1) { + return snapshot0.getSnapshotName().compareTo(snapshot1.getSnapshotName()); + } + } + public static class DiskImageByLastModifiedComparer implements Comparator<DiskImage>, Serializable { 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 13854ca..7ba7841 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 @@ -75,6 +75,7 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerService; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; import org.ovirt.engine.core.common.businessentities.gluster.ServiceType; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkQoS; @@ -1593,6 +1594,16 @@ aQuery); } + public static void getGlusterVolumeSnapshotsForVolume(AsyncQuery aQuery, Guid volumeId) { + aQuery.converterCallback = new IAsyncConverter() { + @Override + public Object Convert(Object source, AsyncQuery asyncQuery) { + return source != null ? source : new ArrayList<GlusterVolumeSnapshotEntity>(); + } + }; + Frontend.getInstance().runQuery(VdcQueryType.GetGlusterVolumeSnapshotsByVolumeId, new IdQueryParameters(volumeId), aQuery); + } + public static void getGlusterHookContent(AsyncQuery aQuery, Guid hookId, Guid serverId) { aQuery.converterCallback = new IAsyncConverter() { 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 97419ca..849278d 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 @@ -470,6 +470,8 @@ volume_stop("volume_stop", HelpTagType.WEBADMIN, "Volumes Tab > Stop Volume"), //$NON-NLS-1$ //$NON-NLS-2$ + volume_snapshots("volume_snapshots", HelpTagType.WEBADMIN), //$NON-NLS-1$ + new_role("new_role", HelpTagType.WEBADMIN), //$NON-NLS-1$ edit_role("edit_role", HelpTagType.WEBADMIN), //$NON-NLS-1$ diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java new file mode 100644 index 0000000..48ef3c1 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java @@ -0,0 +1,79 @@ +package org.ovirt.engine.ui.uicommonweb.models.gluster; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +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.SearchableListModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; + +public class GlusterVolumeSnapshotListModel extends SearchableListModel { + @Override + public String getListName() { + return "GlusterVolumeSnapshotListModel"; //$NON-NLS-1$ + } + + public GlusterVolumeSnapshotListModel() { + setTitle(ConstantsManager.getInstance().getConstants().snapshotsTitle()); + setHelpTag(HelpTag.volume_snapshots); + setHashName("volume_snapshots");//$NON-NLS-1$ + } + + @Override + protected void onEntityChanged() { + super.onEntityChanged(); + getSearchCommand().execute(); + } + + @Override + protected void onSelectedItemChanged() { + super.onSelectedItemChanged(); + } + + @Override + protected void selectedItemsChanged() + { + super.selectedItemsChanged(); + } + + @Override + protected void syncSearch() { + if (getEntity() == null) { + return; + } + + AsyncDataProvider.getGlusterVolumeSnapshotsForVolume(new AsyncQuery(this, + new INewAsyncCallback() { + + @Override + public void onSuccess(Object model, Object returnValue) { + List<GlusterVolumeSnapshotEntity> snapshots = + (ArrayList<GlusterVolumeSnapshotEntity>) returnValue; + Collections.sort(snapshots, new Linq.GlusterVolumeSnapshotComparer()); + setItems(snapshots); + } + }), getEntity().getId()); + } + + @Override + public void executeCommand(UICommand command) { + super.executeCommand(command); + } + + @Override + public GlusterVolumeEntity getEntity() { + return (GlusterVolumeEntity) super.getEntity(); + } + + public void setEntity(GlusterVolumeEntity value) { + super.setEntity(value); + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java index d341419..02ca742 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java @@ -19,6 +19,7 @@ private String glusterMountPoint; private String nfsMountPoint; private Set<TransportType> transportTypes; + private String snapMaxLimit; public String getName() { return name; @@ -89,6 +90,14 @@ this.nfsMountPoint = nfsMountPoint; } + public String getSnapMaxLimit() { + return this.snapMaxLimit; + } + + public void setSnapMaxLimit(String noOfSnaps) { + this.snapMaxLimit = noOfSnaps; + } + public VolumeGeneralModel() { setTitle(ConstantsManager.getInstance().getConstants().generalTitle()); setHelpTag(HelpTag.general); @@ -113,6 +122,7 @@ setStripeCount(entity.getStripeCount() != null ? Integer.toString(entity.getStripeCount()) : null); setNumOfBricks(entity.getBricks() != null ? Integer.toString(entity.getBricks().size()) : null); setTransportTypes(entity.getTransportTypes()); + setSnapMaxLimit(entity.getSnapMaxLimit() != null ? entity.getSnapMaxLimit().toString() : null); } public Set<TransportType> getTransportTypes() { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java index 6f85d0f..b7b91fe 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java @@ -47,6 +47,7 @@ import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType; import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel; +import org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeBrickListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeEventListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeGeneralModel; @@ -160,6 +161,16 @@ this.brickListModel = brickListModel; } + private GlusterVolumeSnapshotListModel snapshotListModel; + + public GlusterVolumeSnapshotListModel getSnapshotListModel() { + return snapshotListModel; + } + + public void setSnapshotListModel(GlusterVolumeSnapshotListModel snapshotListModel) { + this.snapshotListModel = snapshotListModel; + } + public UICommand getStartVolumeProfilingCommand() { return startVolumeProfilingCommand; } @@ -223,6 +234,7 @@ super.initDetailModels(); setBrickListModel(new VolumeBrickListModel()); + setSnapshotListModel(new GlusterVolumeSnapshotListModel()); ObservableCollection<EntityModel> list = new ObservableCollection<EntityModel>(); list.add(new VolumeGeneralModel()); @@ -230,6 +242,7 @@ list.add(getBrickListModel()); list.add(new PermissionListModel()); list.add(new VolumeEventListModel()); + list.add(getSnapshotListModel()); setDetailModels(list); } @@ -403,6 +416,7 @@ super.onSelectedItemChanged(); updateActionAvailability(); getBrickListModel().setVolumeEntity((GlusterVolumeEntity) provideDetailModelEntity(getSelectedItem())); + getSnapshotListModel().setEntity((GlusterVolumeEntity) provideDetailModelEntity(getSelectedItem())); } @Override 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 ab057e5..d719771 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 @@ -306,6 +306,8 @@ public static final String volumeEventSubTabPlace = volumeMainTabPlace + SUB_TAB_PREFIX + "events"; //$NON-NLS-1$ + public static final String volumeSnapshotSubTabPlace = volumeMainTabPlace + SUB_TAB_PREFIX + "volume_snapshots"; //$NON-NLS-1$ + // Disk public static final String diskGeneralSubTabPlace = diskMainTabPlace + SUB_TAB_PREFIX + "general"; //$NON-NLS-1$ @@ -317,7 +319,6 @@ public static final String diskStorageSubTabPlace = diskMainTabPlace + SUB_TAB_PREFIX + "storage"; //$NON-NLS-1$ public static final String diskPermissionSubTabPlace = diskMainTabPlace + SUB_TAB_PREFIX + "permissions"; //$NON-NLS-1$ - // Network public static final String networkGeneralSubTabPlace = networkMainTabPlace + SUB_TAB_PREFIX + "general"; //$NON-NLS-1$ @@ -342,7 +343,6 @@ public static final String networkPermissionSubTabPlace = networkMainTabPlace + SUB_TAB_PREFIX + "permissions"; //$NON-NLS-1$ - // Provider public static final String providerGeneralSubTabPlace = providerMainTabPlace + SUB_TAB_PREFIX + "general"; //$NON-NLS-1$ 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 a66ab14..a17d39f 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 @@ -210,6 +210,8 @@ AuditLogType___GLUSTER_BRICK_STATUS_CHANGED=Detected change in status of brick AuditLogType___GLUSTER_VOLUME_REBALANCE_NOT_FOUND_FROM_CLI=Could not find information for rebalance on volume from CLI. Marking it as unknown. AuditLogType___REMOVE_GLUSTER_VOLUME_BRICKS_NOT_FOUND_FROM_CLI=Could not find information for remove brick on volume from CLI. Marking it as unknown. +AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CREATED=Snapshot created for the volume +AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CREATE_FAILED=Failed create snapshot for the volume VdcActionType___ActivateVds=Activate Host @@ -328,6 +330,7 @@ VdcActionType___GlusterVolumeRemoveBricks=Remove Gluster Volume Bricks VdcActionType___AddBricksToGlusterVolume=Add Brick To Gluster Volume VdcActionType___StartRebalanceGlusterVolume=Start Rebalance Gluster Volume +VdcActionType___CreateGlusterVolumeSnapshot=Create Gluster Volume Snapshot VdcActionType___ReplaceGlusterVolumeBrick=Start Gluster Volume Replace Brick VdcActionType___GlusterHostAdd=Add Gluster server vdcActionType___StartGlusterVolumeProfile=Start Gluster Volume Profile 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 d4723eb..04f8e4c 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 @@ -103,6 +103,9 @@ @DefaultStringValue("Bricks") String volumeBrickSubTabLabel(); + @DefaultStringValue("Snapshots") + String volumeSnapshotSubTabLabel(); + @DefaultStringValue("Permissions") String volumePermissionSubTabLabel(); @@ -780,7 +783,8 @@ @DefaultStringValue("CPU Threads") String clusterPopupCpuThreadsPanelTitle(); - @DefaultStringValue("Allow guests to use host threads as virtual CPU cores, utilizing AMD Clustered MultiThreading or Intel" + + @DefaultStringValue("Allow guests to use host threads as virtual CPU cores, utilizing AMD Clustered MultiThreading or Intel" + + " Hyper-Threading technology on the virtualization host. Enabling this option may be useful for less" + " CPU-intensive workloads, or to run guests with CPU configurations that would otherwise be restricted.") String clusterPopupCpuThreadsInfo(); @@ -2741,6 +2745,9 @@ @DefaultStringValue("Transport Types") String transportTypesVolume(); + @DefaultStringValue("Maximum no of snapshots") + String maxNumberOfSnapshotsVolume(); + @DefaultStringValue("Activities") String activitiesOnVolume(); @@ -3543,7 +3550,7 @@ @DefaultStringValue("Remove brick in progress but status unknown. Unable to fetch the status at the moment.") String removeBrickStatusUnknown(); - //Volume Rebalance Status Table Columns + // Volume Rebalance Status Table Columns @DefaultStringValue("Host") String rebalanceSessionHost(); @@ -3707,11 +3714,10 @@ @DefaultStringValue("Disk Snapshots") String snapshotsLabel(); - @DefaultStringValue("Attached by label") String attachedByLabel(); - //Gluster Volume Profiling + // Gluster Volume Profiling @DefaultStringValue("File operation") String fileOperation(); @@ -3861,4 +3867,35 @@ @DefaultStringValue("NUMA Support") String numaSupport(); + + // Volume snapshots + @DefaultStringValue("Name") + String volumeSnapshotName(); + + @DefaultStringValue("Description") + String volumeSnapshotDescription(); + + @DefaultStringValue("Creation Time") + String volumeSnapshotCreationTime(); + + @DefaultStringValue("No of snapshots") + String noOfSnapshotsLabel(); + + @DefaultStringValue("Options - Cluster") + String configureClusterSnapshotOptions(); + + @DefaultStringValue("Options - Volume") + String configureVolumeSnapshotOptions(); + + @DefaultStringValue("Option") + String volumeSnapshotConfigName(); + + @DefaultStringValue("Cluster Value") + String clusterSnapshotConfigValue(); + + @DefaultStringValue("Value") + String volumeSnapshotConfigValue(); + + @DefaultStringValue("Snapshot Options") + String snapshotConfigHeaderLabel(); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java index 23d6bdc..392e349 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java @@ -139,6 +139,9 @@ "</tr> </table>") SafeHtml volumeBrickStatusTemplate(SafeHtml upImage, int upCount, SafeHtml downImage, int downCount); + @Template("<div style='line-height: 100%; text-align: center; vertical-align: middle;'>{0}</div>") + SafeHtml volumeSnapshotsStatusTemplate(int snapshotCount); + @Template("<div style='line-height: 100%; text-align: center; vertical-align: middle; border: solid 1px transparent; '>{0}</div>") SafeHtml volumeActivityMenu(SafeHtml statusImage); 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 fbb2bd8..6c0960b 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 @@ -25,6 +25,7 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerService; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; import org.ovirt.engine.core.common.businessentities.network.ExternalSubnet; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; @@ -74,6 +75,7 @@ import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeEventListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeParameterListModel; +import org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostBricksListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostEventListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostGeneralModel; @@ -381,6 +383,8 @@ SearchableDetailModelProvider<AuditLog, VolumeListModel, VolumeEventListModel> getSubTabVolumeEventModelProvider(); + SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel> getSubTabVolumeSnapshotModelProvider(); + // Disk DetailModelProvider<DiskListModel, DiskGeneralModel> getSubTabDiskGeneralModelProvider(); 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 3d97a3c..8c188f1 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 @@ -163,6 +163,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabVolumeGeneralPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabVolumeParameterPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabVolumePermissionPresenter; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabGlusterVolumeSnapshotPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.VolumeSubTabPanelPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.host.HostSubTabPanelPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.host.SubTabHostBrickPresenter; @@ -402,6 +403,7 @@ import org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabVolumeGeneralView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabVolumeParameterView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabVolumePermissionView; +import org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabGlusterVolumeSnapshotView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.VolumeSubTabPanelView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.host.HostSubTabPanelView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.host.SubTabHostBrickView; @@ -847,7 +849,6 @@ SubTabVirtualMachineEventPresenter.ViewDef.class, SubTabVirtualMachineEventView.class, SubTabVirtualMachineEventPresenter.ProxyDef.class); - // Pool bindPresenter(PoolSubTabPanelPresenter.class, @@ -1371,7 +1372,7 @@ QuotaPopupPresenterWidget.ViewDef.class, QuotaPopupView.class); - //Network QoS + // Network QoS bindPresenterWidget(NetworkQoSPopupPresenterWidget.class, NetworkQoSPopupPresenterWidget.ViewDef.class, NetworkQoSPopupView.class); @@ -1424,6 +1425,11 @@ SubTabVolumeEventView.class, SubTabVolumeEventPresenter.ProxyDef.class); + bindPresenter(SubTabGlusterVolumeSnapshotPresenter.class, + SubTabGlusterVolumeSnapshotPresenter.ViewDef.class, + SubTabGlusterVolumeSnapshotView.class, + SubTabGlusterVolumeSnapshotPresenter.ProxyDef.class); + bindPresenterWidget(AddBrickPopupPresenterWidget.class, AddBrickPopupPresenterWidget.ViewDef.class, AddBrickPopupView.class); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java index f8a2c66..be3422c 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java @@ -5,6 +5,7 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; 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; @@ -19,6 +20,7 @@ import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel; +import org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeBrickListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeEventListModel; import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeGeneralModel; @@ -145,6 +147,31 @@ @Provides @Singleton + public SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel> getVolumeSnapshotListProvider(EventBus eventBus, + Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, + final Provider<VolumeListModel> mainModelProvider, + final Provider<GlusterVolumeSnapshotListModel> modelProvider) { + return new SearchableDetailTabModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel>(eventBus, + defaultConfirmPopupProvider, + VolumeListModel.class, + GlusterVolumeSnapshotListModel.class) { + @Override + public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(GlusterVolumeSnapshotListModel source, + UICommand lastExecutedCommand, + Model windowModel) { + return super.getModelPopup(source, lastExecutedCommand, windowModel); + } + + @Override + public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(GlusterVolumeSnapshotListModel source, + UICommand lastExecutedCommand) { + return super.getConfirmModelPopup(source, lastExecutedCommand); + } + }; + } + + @Provides + @Singleton public SearchableDetailModelProvider<GlusterVolumeOptionEntity, VolumeListModel, VolumeParameterListModel> getVolumeParameterListProvider(EventBus eventBus, Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, final Provider<VolumeParameterPopupPresenterWidget> addParameterPopupProvider, @@ -225,6 +252,7 @@ @Override protected void configure() { + bind(GlusterVolumeSnapshotListModel.class).in(Singleton.class); } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java new file mode 100644 index 0000000..9b43fa0 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java @@ -0,0 +1,58 @@ +package org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +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.gluster.GlusterVolumeSnapshotListModel; +import org.ovirt.engine.ui.uicommonweb.models.volumes.VolumeListModel; +import org.ovirt.engine.ui.uicommonweb.place.WebAdminApplicationPlaces; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.VolumeSelectionChangeEvent; + +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.PlaceRequest; +import com.gwtplatform.mvp.client.proxy.TabContentProxyPlace; + +public class SubTabGlusterVolumeSnapshotPresenter extends AbstractSubTabPresenter<GlusterVolumeEntity, VolumeListModel, GlusterVolumeSnapshotListModel, SubTabGlusterVolumeSnapshotPresenter.ViewDef, SubTabGlusterVolumeSnapshotPresenter.ProxyDef> { + @TabInfo(container = VolumeSubTabPanelPresenter.class) + static TabData getTabData(ApplicationConstants applicationConstants, + SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel> modelProvider) { + return new ModelBoundTabData(applicationConstants.volumeSnapshotSubTabLabel(), 5, modelProvider); + } + + @Inject + public SubTabGlusterVolumeSnapshotPresenter(EventBus eventBus, ViewDef view, ProxyDef proxy, + PlaceManager placeManager, + SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel> modelProvider) { + super(eventBus, view, proxy, placeManager, modelProvider, + VolumeSubTabPanelPresenter.TYPE_SetTabContent); + } + + @ProxyCodeSplit + @NameToken(WebAdminApplicationPlaces.volumeSnapshotSubTabPlace) + public interface ProxyDef extends TabContentProxyPlace<SubTabGlusterVolumeSnapshotPresenter> { + } + + public interface ViewDef extends AbstractSubTabPresenter.ViewDef<GlusterVolumeEntity> { + } + + @Override + protected PlaceRequest getMainTabRequest() { + return PlaceRequestFactory.get(WebAdminApplicationPlaces.volumeMainTabPlace); + } + + @ProxyEvent + public void onVolumeSelectionChange(VolumeSelectionChangeEvent event) { + updateMainTabSelection(event.getSelectedItems()); + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java index eee7f12..9335f85 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java @@ -155,6 +155,16 @@ constants.activitiesOnVolume(), "100px"); //$NON-NLS-1$ + TextColumnWithTooltip<GlusterVolumeEntity> snapshotCountColumn = + new TextColumnWithTooltip<GlusterVolumeEntity>() { + @Override + public String getValue(GlusterVolumeEntity object) { + return object.getSnapshotsCount().toString(); + } + }; + snapshotCountColumn.makeSortable(); + getTable().addColumn(snapshotCountColumn, constants.noOfSnapshotsLabel(), "100px"); //$NON-NLS-1$ + getTable().addActionButton(new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.newVolume()) { @Override protected UICommand resolveCommand() { diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java new file mode 100644 index 0000000..7358eb7 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java @@ -0,0 +1,71 @@ +package org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +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.TextColumnWithTooltip; +import org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel; +import org.ovirt.engine.ui.uicommonweb.models.volumes.VolumeListModel; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabGlusterVolumeSnapshotPresenter; +import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView; +import org.ovirt.engine.ui.webadmin.widget.table.column.GlusterVolumeSnapshotStatusColumn; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.inject.Inject; + +public class SubTabGlusterVolumeSnapshotView extends AbstractSubTabTableView<GlusterVolumeEntity, GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel> implements SubTabGlusterVolumeSnapshotPresenter.ViewDef { + + interface ViewIdHandler extends ElementIdHandler<SubTabGlusterVolumeSnapshotView> { + ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); + } + + @Inject + public SubTabGlusterVolumeSnapshotView(SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, GlusterVolumeSnapshotListModel> modelProvider, + ApplicationConstants constants) { + super(modelProvider); + initTable(constants); + initWidget(getTable()); + } + + void initTable(ApplicationConstants constants) { + getTable().enableColumnResizing(); + + GlusterVolumeSnapshotStatusColumn snapshotStatusColumn = new GlusterVolumeSnapshotStatusColumn(); + snapshotStatusColumn.makeSortable(); + getTable().addColumn(snapshotStatusColumn, constants.empty(), "30px"); //$NON-NLS-1$ + + TextColumnWithTooltip<GlusterVolumeSnapshotEntity> snapshotNameColumn = + new TextColumnWithTooltip<GlusterVolumeSnapshotEntity>() { + @Override + public String getValue(GlusterVolumeSnapshotEntity snapshot) { + return snapshot.getSnapshotName(); + } + }; + snapshotNameColumn.makeSortable(); + getTable().addColumn(snapshotNameColumn, constants.volumeSnapshotName(), "300px"); //$NON-NLS-1$ + + TextColumnWithTooltip<GlusterVolumeSnapshotEntity> descriptionColumn = + new TextColumnWithTooltip<GlusterVolumeSnapshotEntity>() { + @Override + public String getValue(GlusterVolumeSnapshotEntity snapshot) { + return snapshot.getDescription(); + } + }; + descriptionColumn.makeSortable(); + getTable().addColumn(descriptionColumn, constants.volumeSnapshotDescription(), "400px"); //$NON-NLS-1$ + + TextColumnWithTooltip<GlusterVolumeSnapshotEntity> creationTimeColumn = + new TextColumnWithTooltip<GlusterVolumeSnapshotEntity>() { + @Override + public String getValue(GlusterVolumeSnapshotEntity snapshot) { + DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd, HH:mm:ss"); //$NON-NLS-1$ + return df.format(snapshot.getCreatedAt()); + } + }; + creationTimeColumn.makeSortable(); + getTable().addColumn(creationTimeColumn, constants.volumeSnapshotCreationTime(), "400px"); //$NON-NLS-1$ + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java index ebecbf4..975d5ef 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java @@ -42,6 +42,7 @@ TextBoxLabel stripeCount = new TextBoxLabel(); TextBoxLabel numOfBricks = new TextBoxLabel(); VolumeTransportTypeLabel transportTypes = new VolumeTransportTypeLabel(); + TextBoxLabel snapMaxLimit = new TextBoxLabel(); FormBuilder formBuilder; @@ -61,7 +62,7 @@ driver.initialize(this); // Build a form using the FormBuilder - formBuilder = new FormBuilder(formPanel, 1, 7); + formBuilder = new FormBuilder(formPanel, 1, 8); formBuilder.addFormItem(new FormItem(constants.NameVolume(), name, 0, 0)); formBuilder.addFormItem(new FormItem(constants.volumeIdVolume(), volumeId, 1, 0)); @@ -75,6 +76,7 @@ formBuilder.addFormItem(new FormItem(constants.numberOfBricksVolume(), numOfBricks, 5, 0)); formBuilder.addFormItem(new FormItem(constants.transportTypesVolume(), transportTypes, 6, 0)); + formBuilder.addFormItem(new FormItem(constants.maxNumberOfSnapshotsVolume(), snapMaxLimit, 7, 0)); getDetailModel().getPropertyChangedEvent().addListener(new IEventListener() { @Override diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java new file mode 100644 index 0000000..1560a3c --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java @@ -0,0 +1,60 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterSnapshotStatus; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.ApplicationResources; +import org.ovirt.engine.ui.webadmin.ApplicationTemplates; +import org.ovirt.engine.ui.webadmin.gin.ClientGinjectorProvider; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +public class GlusterVolumeSnapshotStatusCell extends AbstractCell<GlusterVolumeSnapshotEntity> { + + private static final ApplicationResources resources = ClientGinjectorProvider.getApplicationResources(); + + private static final ApplicationConstants constants = ClientGinjectorProvider.getApplicationConstants(); + + private static final ApplicationTemplates applicationTemplates = ClientGinjectorProvider.getApplicationTemplates(); + + @Override + public void render(Context context, GlusterVolumeSnapshotEntity snapshot, SafeHtmlBuilder sb) { + // Nothing to render if no snapshot is provided: + if (snapshot == null) { + return; + } + + // Find the image corresponding to the status of the brick: + GlusterSnapshotStatus status = snapshot.getStatus(); + ImageResource statusImage = null; + String tooltip; + + switch (status) { + case STARTED: + statusImage = resources.upImage(); + tooltip = constants.up(); + break; + case STOPPED: + statusImage = resources.downImage(); + tooltip = constants.down(); + break; + case UNKNOWN: + statusImage = resources.questionMarkImage(); + tooltip = constants.unknown(); + break; + default: + statusImage = resources.downImage(); + tooltip = constants.down(); + } + + // Generate the HTML for the image: + SafeHtml statusImageHtml = + SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(statusImage).getHTML()); + sb.append(applicationTemplates.statusTemplate(statusImageHtml, tooltip)); + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java new file mode 100644 index 0000000..add4a7d --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java @@ -0,0 +1,27 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import java.util.Comparator; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +import org.ovirt.engine.ui.common.widget.table.column.SortableColumn; + +public class GlusterVolumeSnapshotStatusColumn extends SortableColumn<GlusterVolumeSnapshotEntity, GlusterVolumeSnapshotEntity> { + + public GlusterVolumeSnapshotStatusColumn() { + super(new GlusterVolumeSnapshotStatusCell()); + } + + @Override + public GlusterVolumeSnapshotEntity getValue(GlusterVolumeSnapshotEntity object) { + return object; + } + + public void makeSortable() { + makeSortable(new Comparator<GlusterVolumeSnapshotEntity>() { + @Override + public int compare(GlusterVolumeSnapshotEntity o1, GlusterVolumeSnapshotEntity o2) { + return o1.getStatus().ordinal() - o2.getStatus().ordinal(); + } + }); + } +} -- To view, visit https://gerrit.ovirt.org/39290 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic1953aad3d013d386719a43b4bfdda82896cc3af Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5-gluster Gerrit-Owner: Shubhendu Tripathi <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
