Hello Sahina Bose, I'd like you to do a code review. Please visit
https://gerrit.ovirt.org/40409 to review the following change. Change subject: engine,webadmin: Add an indicator if geo-replication is enabled ...................................................................... engine,webadmin: Add an indicator if geo-replication is enabled Added an indicator column to Volume tab, to indicate if a volume is a geo-replication master or slave Change-Id: I28178b8ef03ea7cc83097cb99bc2d2be90061434 Signed-off-by: Sahina Bose <sab...@redhat.com> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java A frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_master.png A frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_slave.png 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/ApplicationMessages.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/widget/table/cell/VolumeInfoCell.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeInfoColumn.java M packaging/dbscripts/create_views.sql 11 files changed, 136 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/09/40409/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java index 25f85da..ad27058 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java @@ -89,6 +89,10 @@ private GlusterVolumeAdvancedDetails advancedDetails; + private Boolean isGeoRepMaster; + + private String geoRepMasterVolAndClusterName; + public GlusterVolumeEntity() { options = new LinkedHashMap<String, GlusterVolumeOptionEntity>(); bricks = new ArrayList<GlusterBrickEntity>(); @@ -354,6 +358,26 @@ this.snapshotScheduled = snapshotScheduled; } + public Boolean getIsGeoRepMaster() { + return isGeoRepMaster; + } + + public void setIsGeoRepMaster(Boolean isGeoRepMaster) { + this.isGeoRepMaster = isGeoRepMaster; + } + + public Boolean getIsGeoRepSlave() { + return getGeoRepMasterVolAndClusterName() != null; + } + + public String getGeoRepMasterVolAndClusterName() { + return geoRepMasterVolAndClusterName; + } + + public void setGeoRepMasterVolAndClusterName(String masterVolAndClusterName) { + this.geoRepMasterVolAndClusterName = masterVolAndClusterName; + } + public void removeBrick(GlusterBrickEntity GlusterBrick) { bricks.remove(GlusterBrick); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java index 465e403..6b56424 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java @@ -380,6 +380,8 @@ entity.setRedundancyCount(rs.getInt("redundancy_count")); entity.setSnapshotsCount(rs.getInt("snapshot_count")); entity.setSnapshotScheduled(rs.getBoolean("snapshot_scheduled")); + entity.setIsGeoRepMaster(rs.getBoolean("is_master")); + entity.setGeoRepMasterVolAndClusterName(rs.getString("master_vol_cluster")); return entity; } } diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java index bc07283..a422233 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java @@ -173,6 +173,12 @@ @Source("images/volume_all_bricks_down_warning.png") ImageResource volumeAllBricksDownWarning(); + @Source("images/volume_georep_master.png") + ImageResource volumeGeoRepMaster(); + + @Source("images/volume_georep_slave.png") + ImageResource volumeGeoRepSlave(); + // Model-bound widgets @Source("images/snapshot.png") diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_master.png b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_master.png new file mode 100644 index 0000000..884c048 --- /dev/null +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_master.png Binary files differ diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_slave.png b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_slave.png new file mode 100644 index 0000000..47019b5 --- /dev/null +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/volume_georep_slave.png Binary files differ 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 a1a5719..8d30b67 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 @@ -148,6 +148,12 @@ @DefaultStringValue("Snapshots") String volumeSnapshotSubTabLabel(); + @DefaultStringValue("Volume data is being geo-replicated.") + String geoRepMasterVolumeToolTip(); + + @DefaultStringValue("Volume is destination for geo-replication.") + String geoRepSlaveVolumeToolTip(); + @DefaultStringValue("Permissions") String volumePermissionSubTabLabel(); @@ -2800,6 +2806,9 @@ @DefaultStringValue("Bricks") String bricksStatusVolume(); + @DefaultStringValue("Info") + String volumeInfoVolume(); + @DefaultStringValue("Number of Bricks") String numberOfBricksVolume(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java index 8a5e8a9..864db7c 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java @@ -110,4 +110,10 @@ @DefaultMessage("Default ({0})") String defaultMtu(int mtu); + @DefaultMessage("Free {0}\nUsed {1} of total available {2}") + String glusterCapacityInfo(String freeSize, String usedSize, String totalSize); + + @DefaultMessage("Volume data from {0} of cluster {1} is replicated to this volume.") + String geoRepSlaveVolumeToolTip(String mastervolName, String clusterName); + } 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 60fa8d9..bf93603 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 @@ -33,6 +33,7 @@ import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeBrickStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeCapacityCell; +import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeInfoColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeTaskWaitingCell; @@ -101,9 +102,11 @@ getTable().addColumn(volumeTypeColumn, constants.volumeTypeVolume(), "150px"); //$NON-NLS-1$ getTable().addColumn(new VolumeBrickStatusColumn(), constants.bricksStatusVolume(), "150px"); //$NON-NLS-1$ + getTable().addColumn(new VolumeInfoColumn(), constants.volumeInfoVolume(), "100px"); //$NON-NLS-1$ MenuCell<GlusterTaskSupport> rebalanceMenuCell = getRebalanceActivityMenu(constants); MenuCell<GlusterTaskSupport> removeBricksMenuCell = getRemoveBrickActivityMenu(constants); + List<HasCell<GlusterTaskSupport, ?>> list = new ArrayList<HasCell<GlusterTaskSupport, ?>>(); list.add(new VolumeActivityStatusColumn<GlusterTaskSupport>()); list.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(new VolumeActivitySeperatorCell<GlusterTaskSupport>()) { diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/cell/VolumeInfoCell.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/cell/VolumeInfoCell.java new file mode 100644 index 0000000..dbf6e91 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/cell/VolumeInfoCell.java @@ -0,0 +1,56 @@ +package org.ovirt.engine.ui.webadmin.widget.table.cell; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.ApplicationMessages; +import org.ovirt.engine.ui.webadmin.ApplicationResources; +import org.ovirt.engine.ui.webadmin.ApplicationTemplates; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.shared.GWT; +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 VolumeInfoCell extends AbstractCell<GlusterVolumeEntity> { + + private static final ApplicationResources resources = GWT.create(ApplicationResources.class); + private static final ApplicationConstants constants = GWT.create(ApplicationConstants.class); + private static final ApplicationTemplates applicationTemplates = GWT.create(ApplicationTemplates.class); + private static final ApplicationMessages messages = GWT.create(ApplicationMessages.class); + + protected ImageResource geoRepMasterImage = resources.volumeGeoRepMaster(); + protected ImageResource geoRepSlaveImage = resources.volumeGeoRepSlave(); + + @Override + public void render(Context context, GlusterVolumeEntity volume, SafeHtmlBuilder sb) { + // Nothing to render if no volume is provided: + if (volume == null) { + return; + } + if (volume.getIsGeoRepMaster()) { + SafeHtml geoRepMasterHtml = + SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(geoRepMasterImage).getHTML()); + sb.append(applicationTemplates.statusTemplate(geoRepMasterHtml, constants.geoRepMasterVolumeToolTip())); + } + if (volume.getIsGeoRepSlave()) { + SafeHtml geoRepSlaveHtml = + SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(geoRepSlaveImage).getHTML()); + String[] volClusterNames = formatVolClusterName(volume.getGeoRepMasterVolAndClusterName()); + String volName = volClusterNames[0]; + String clusterName = volClusterNames.length == 2 ? volClusterNames[1] : "UNKNOWN"; //$NON-NLS-1$ + sb.append(applicationTemplates.statusTemplate(geoRepSlaveHtml, + messages.geoRepSlaveVolumeToolTip(volName, clusterName))); + } + } + + private String[] formatVolClusterName(String volClusterName) { + if (volClusterName == null) { + return null; + } + String[] names = volClusterName.split("\\|"); //$NON-NLS-1$ + return names; + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeInfoColumn.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeInfoColumn.java new file mode 100644 index 0000000..f2a2c41 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeInfoColumn.java @@ -0,0 +1,17 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.ui.common.widget.table.column.SortableColumn; +import org.ovirt.engine.ui.webadmin.widget.table.cell.VolumeInfoCell; + +public class VolumeInfoColumn extends SortableColumn<GlusterVolumeEntity, GlusterVolumeEntity> { + + public VolumeInfoColumn() { + super(new VolumeInfoCell()); + } + + @Override + public GlusterVolumeEntity getValue(GlusterVolumeEntity object) { + return object; + } +} diff --git a/packaging/dbscripts/create_views.sql b/packaging/dbscripts/create_views.sql index 00be84d..341c7fa 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -1718,15 +1718,25 @@ CREATE OR REPLACE VIEW gluster_volumes_view AS SELECT gluster_volumes.*, - vds_groups.name AS vds_group_name + vds_groups.name AS vds_group_name, + CASE WHEN EXISTS (SELECT session_id FROM gluster_georep_session + WHERE master_volume_id = gluster_volumes.id) + THEN true + ELSE false END + as is_master, + (SELECT vol.vol_name || '|' || cluster.name + FROM gluster_georep_session + INNER JOIN gluster_volumes vol ON master_volume_id = vol.id + INNER JOIN vds_groups cluster ON cluster.vds_group_id = vol.cluster_id + WHERE slave_volume_id = gluster_volumes.id) as master_vol_cluster FROM gluster_volumes INNER JOIN vds_groups ON gluster_volumes.cluster_id = vds_groups.vds_group_id; CREATE OR REPLACE VIEW gluster_volume_snapshots_view AS SELECT gluster_volume_snapshots.*, - gluster_volumes.cluster_id AS cluster_id, - gluster_volumes.vol_name as volume_name + gluster_volumes.cluster_id AS cluster_id, + gluster_volumes.vol_name AS volume_name FROM gluster_volume_snapshots INNER JOIN gluster_volumes ON gluster_volume_snapshots.volume_id = gluster_volumes.id; -- To view, visit https://gerrit.ovirt.org/40409 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I28178b8ef03ea7cc83097cb99bc2d2be90061434 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5-gluster Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com> Gerrit-Reviewer: Sahina Bose <sab...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches