Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: WIP-Sync job for gluster volume snapshots ......................................................................
gluster: WIP-Sync job for gluster volume snapshots Sync job for gluster volume snapshots Change-Id: I7b7bf79b72fc5680dab301b290e7aa860d5c714d Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java M backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties M packaging/dbscripts/gluster_volume_snapshot_sp.sql 24 files changed, 600 insertions(+), 84 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/04/35904/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java index 1e95086..d22c6b0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java @@ -68,7 +68,7 @@ createdSnapshot.setDescription(snapshot.getDescription()); createdSnapshot.setSnapshotName(snapshot.getSnapshotName()); createdSnapshot.setCreatedAt(new Date()); - createdSnapshot.setStatus(GlusterSnapshotStatus.ACTIVATED); + createdSnapshot.setStatus(GlusterSnapshotStatus.STARTED); getDbFacade().getGlusterVolumeSnapshotDao().save(createdSnapshot); } addCustomValue(GlusterConstants.VOLUME_SNAPSHOT_NAME, getParameters().getSnapshot().getSnapshotName()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java index cd20f43..91fe2fa 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java @@ -72,6 +72,14 @@ getRefreshRate(ConfigValues.GlusterRefreshRateGeoRepDiscovery), TimeUnit.SECONDS); + scheduler.scheduleAFixedDelayJob(GlusterSnapshotSyncJob.getInstance(), + "gluster_snapshot_poll_event", + new Class[0], + new Class[0], + getRefreshRate(ConfigValues.GlusterRefreshRateSnapshotDiscovery), + getRefreshRate(ConfigValues.GlusterRefreshRateSnapshotDiscovery), + TimeUnit.SECONDS); + } private static boolean glusterModeSupported() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java new file mode 100644 index 0000000..fcf8abb --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java @@ -0,0 +1,176 @@ +package org.ovirt.engine.core.bll.gluster; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcBllErrors; +import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeSnapshotInfoVDSParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotDao; +import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; +import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GlusterSnapshotSyncJob extends GlusterJob { + private static final Logger log = LoggerFactory.getLogger(GlusterSnapshotSyncJob.class); + private static final GlusterSnapshotSyncJob instance = new GlusterSnapshotSyncJob(); + + public void init() { + log.info("Gluster snapshot monitoring has been initialized"); + } + + public static GlusterSnapshotSyncJob getInstance() { + return instance; + } + + @OnTimerMethodAnnotation("gluster_snapshot_poll_event") + public void refreshSnapshotData() { + // get all clusters + List<VDSGroup> clusters = getClusterDao().getAll(); + + for (VDSGroup cluster : clusters) { + refreshSnapshotsInCluster(cluster, false); + } + } + + private void refreshSnapshotsInCluster(VDSGroup cluster, boolean throwError) { + if (!supportsGlusterSnapshotFeature(cluster)) { + return; + } + + final VDS upServer = getClusterUtils().getUpServer(cluster.getId()); + List<GlusterVolumeEntity> volumes = getGlusterVolumeDao().getByClusterId(cluster.getId()); + + if (volumes != null && volumes.size() > 0) { + List<Callable<Pair<GlusterVolumeEntity, VDSReturnValue>>> taskList = + new ArrayList<Callable<Pair<GlusterVolumeEntity, VDSReturnValue>>>(); + for (final GlusterVolumeEntity volume : volumes) { + taskList.add(new Callable<Pair<GlusterVolumeEntity, VDSReturnValue>>() { + @Override + public Pair<GlusterVolumeEntity, VDSReturnValue> call() throws Exception { + VDSReturnValue returnValue = + runVdsCommand(VDSCommandType.GetGlusterVolumeSnapshotInfo, + new GlusterVolumeSnapshotInfoVDSParameters(volume.getClusterId(), + upServer.getId(), + volume.getName(), + null)); + return new Pair<GlusterVolumeEntity, VDSReturnValue>(volume, returnValue); + } + }); + } + List<Pair<GlusterVolumeEntity, VDSReturnValue>> pairResults = ThreadPoolUtil.invokeAll(taskList); + try { + addOrUpdateSnapshots(cluster.getId(), pairResults); + } catch (VdcBLLException e) { + if (throwError) { + throw e; + } + } + } + } + + private void addOrUpdateSnapshots(Guid clusterId, List<Pair<GlusterVolumeEntity, VDSReturnValue>> pairResults) { + try { + for (Pair<GlusterVolumeEntity, VDSReturnValue> entry : pairResults) { + GlusterVolumeEntity volume = entry.getFirst(); + List<GlusterVolumeSnapshotEntity> existingSnapshots = + getGlusterVolumeSnapshotDao().getAllByVolumeId(volume.getId()); + List<GlusterVolumeSnapshotEntity> fetchedSnapshots = + (ArrayList<GlusterVolumeSnapshotEntity>) entry.getSecond().getReturnValue(); + + // form the maps for fetched and existing snapshots + Map<Guid, GlusterVolumeSnapshotEntity> existingSnapshotsMap = + new HashMap<Guid, GlusterVolumeSnapshotEntity>(); + for (final GlusterVolumeSnapshotEntity existingSnapshot : existingSnapshots) { + existingSnapshotsMap.put(existingSnapshot.getSnapshotId(), existingSnapshot); + } + Map<Guid, GlusterVolumeSnapshotEntity> fetchedSnapshotsMap = + new HashMap<Guid, GlusterVolumeSnapshotEntity>(); + for (final GlusterVolumeSnapshotEntity fetchedSnapshot : fetchedSnapshots) { + fetchedSnapshotsMap.put(fetchedSnapshot.getId(), fetchedSnapshot); + } + + List<GlusterVolumeSnapshotEntity> updatedSnapshots = new ArrayList<GlusterVolumeSnapshotEntity>(); + List<GlusterVolumeSnapshotEntity> newlyAddedSnapshots = new ArrayList<GlusterVolumeSnapshotEntity>(); + List<GlusterVolumeSnapshotEntity> deletedSnapshots = new ArrayList<GlusterVolumeSnapshotEntity>(); + + for (final GlusterVolumeSnapshotEntity fetchedSnapshot : fetchedSnapshots) { + GlusterVolumeSnapshotEntity existingSnapshot = existingSnapshotsMap.get(fetchedSnapshot.getId()); + + if (existingSnapshot != null) { + existingSnapshot.setStatus(fetchedSnapshot.getStatus()); + updatedSnapshots.add(existingSnapshot); + } else { + newlyAddedSnapshots.add(fetchedSnapshot); + } + } + + for (final GlusterVolumeSnapshotEntity existingSnapshot : existingSnapshots) { + if (fetchedSnapshotsMap.get(existingSnapshot.getId()) == null) { + deletedSnapshots.add(existingSnapshot); + } + } + + // update snapshot details + try { + acquireLock(volume.getId()); + + saveNewSnapshots(newlyAddedSnapshots); + updateSnapshots(updatedSnapshots); + deleteSnapshots(deletedSnapshots); + } finally { + releaseLock(volume.getId()); + } + } + } catch (Exception e) { + log.error("Exception in sync", e); + throw new VdcBLLException(VdcBllErrors.GlusterSnapshotInfoFailedException, e.getLocalizedMessage()); + } + } + + private void saveNewSnapshots(List<GlusterVolumeSnapshotEntity> snaphosts) { + for (GlusterVolumeSnapshotEntity snapshot : snaphosts) { + getGlusterVolumeSnapshotDao().save(snapshot); + } + } + + private void updateSnapshots(List<GlusterVolumeSnapshotEntity> snapshots) { + for (GlusterVolumeSnapshotEntity snapshot : snapshots) { + getGlusterVolumeSnapshotDao().updateSnapshotStatus(snapshot.getId(), snapshot.getStatus()); + } + } + + private void deleteSnapshots(List<GlusterVolumeSnapshotEntity> snaphosts) { + for (GlusterVolumeSnapshotEntity snapshot : snaphosts) { + getGlusterVolumeSnapshotDao().remove(snapshot.getId()); + } + } + + private boolean supportsGlusterSnapshotFeature(VDSGroup cluster) { + return cluster.supportsGlusterService() + && GlusterFeatureSupported.glusterSnapshot(cluster.getcompatibility_version()); + } + + private GlusterVolumeDao getGlusterVolumeDao() { + return DbFacade.getInstance().getGlusterVolumeDao(); + } + + private GlusterVolumeSnapshotDao getGlusterVolumeSnapshotDao() { + return DbFacade.getInstance().getGlusterVolumeSnapshotDao(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java index 0c92536..3a171dc 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java @@ -1,13 +1,13 @@ package org.ovirt.engine.core.common.businessentities.gluster; public enum GlusterSnapshotStatus { - ACTIVATED, - DEACTIVATED, + STARTED, + STOPPED, UNKNOWN; public static GlusterSnapshotStatus from(String status) { for (GlusterSnapshotStatus snapshotStatus : values()) { - if (snapshotStatus.name().equals(status)) { + if (snapshotStatus.name().equalsIgnoreCase(status)) { return snapshotStatus; } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java new file mode 100644 index 0000000..c21f007 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java @@ -0,0 +1,57 @@ +package org.ovirt.engine.core.common.businessentities.gluster; + +import java.io.Serializable; +import java.util.List; + +import org.ovirt.engine.core.common.utils.ObjectUtils; +import org.ovirt.engine.core.compat.Guid; + +public class GlusterVolumeSnapshotInfo implements Serializable { + private static final long serialVersionUID = -768822766895441199L; + + private Guid volumeId; + private List<GlusterVolumeSnapshotEntity> snapshots; + + public GlusterVolumeSnapshotInfo() { + } + + public Guid getVolumeId() { + return this.volumeId; + } + + public void setVolumeId(Guid volumeId) { + this.volumeId = volumeId; + } + + public List<GlusterVolumeSnapshotEntity> getSnapshots() { + return this.snapshots; + } + + public void setSnapshots(List<GlusterVolumeSnapshotEntity> snapshots) { + this.snapshots = snapshots; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof GlusterVolumeSnapshotInfo)) { + return false; + } + GlusterVolumeSnapshotInfo snapshotInfo = (GlusterVolumeSnapshotInfo) obj; + if (!ObjectUtils.objectsEqual(getVolumeId(), snapshotInfo.getVolumeId())) { + return false; + } + if (!ObjectUtils.objectsEqual(getSnapshots(), snapshotInfo.getSnapshots())) { + return false; + } + return true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getVolumeId() == null) ? 0 : getVolumeId().hashCode()); + result = prime * result + ((getSnapshots() == null) ? 0 : getSnapshots().hashCode()); + return result; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java index 8c6c3f6..9715a23 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java @@ -1384,10 +1384,18 @@ @DefaultValueAttribute("true") GlusterGeoReplicationEnabled, + @TypeConverterAttribute(Boolean.class) + @DefaultValueAttribute("true") + GlusterVolumeSnapshotSupported, + @TypeConverterAttribute(Integer.class) @DefaultValueAttribute("3600") GlusterRefreshRateGeoRepDiscovery, + @TypeConverterAttribute(Integer.class) + @DefaultValueAttribute("5") + GlusterRefreshRateSnapshotDiscovery, + @TypeConverterAttribute(String.class) @DefaultValueAttribute("AttestationService/resources/PollHosts") PollUri, diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java index 7f52ff6..c24b560 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java @@ -407,6 +407,7 @@ GlusterVolumeGeoRepStatusDetailFailed(4600), GlusterSnapshotException(4700), GlusterSnapshotCreateFailedException(4701), + GlusterSnapshotInfoFailedException(4708), UnicodeArgumentException(4900), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java index 2b2a529..96a98cd 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java @@ -91,4 +91,15 @@ public static boolean glusterGeoReplication(Version version) { return supportedInConfig(ConfigValues.GlusterGeoReplicationEnabled, version); } + + /** + * + * @param version + * Compatibility version to check for. + * @return <code>true</code> if gluster snapshot management feature is enabled, + * <code>false</code> if it's not. + */ + public static boolean glusterSnapshot(Version version) { + return supportedInConfig(ConfigValues.GlusterVolumeSnapshotSupported, version); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java index 9b39eaa..86c5c03 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java @@ -162,6 +162,7 @@ StopGlusterVolumeGeoRepSession("org.ovirt.engine.core.vdsbroker.gluster"), DeleteGlusterVolumeGeoRepSession("org.ovirt.engine.core.vdsbroker.gluster"), CreateGlusterVolumeSnapshot("org.ovirt.engine.core.vdsbroker.gluster"), + GetGlusterVolumeSnapshotInfo("org.ovirt.engine.core.vdsbroker.gluster"), SetNumberOfCpus("org.ovirt.engine.core.vdsbroker"), UpdateVmPolicy("org.ovirt.engine.core.vdsbroker"), List("org.ovirt.engine.core.vdsbroker.vdsbroker"), // get a list of VMs with status only diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java new file mode 100644 index 0000000..a03c2b6 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java @@ -0,0 +1,23 @@ +package org.ovirt.engine.core.common.vdscommands.gluster; + +import org.ovirt.engine.core.compat.Guid; + +public class GlusterVolumeSnapshotInfoVDSParameters extends GlusterVolumeSnapshotVDSParameters { + private Guid clusterId; + + public GlusterVolumeSnapshotInfoVDSParameters() { + } + + public GlusterVolumeSnapshotInfoVDSParameters(Guid clusterId, Guid serverId, String volumeName, String snapshotName) { + super(serverId, volumeName, snapshotName); + this.clusterId = clusterId; + } + + public Guid getClusterId() { + return this.clusterId; + } + + public void setClusterId(Guid clusterId) { + this.clusterId = clusterId; + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java index da04249..46b7277 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java @@ -131,7 +131,8 @@ .addValue("snapshot_name", snapshot.getSnapshotName()) .addValue("volume_id", snapshot.getVolumeId()) .addValue("description", snapshot.getDescription()) - .addValue("status", EnumUtils.nameOrNull(snapshot.getStatus())); + .addValue("status", EnumUtils.nameOrNull(snapshot.getStatus())) + .addValue("_create_date", snapshot.getCreatedAt()); } private MapSqlParameterSource createSnapshotIdParams(Guid id) { diff --git a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties index fdaa03b..1d35961 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties @@ -380,6 +380,7 @@ GlusterVolumeGeoRepStopFailedException=Failed to stop geo-replication session GlusterSnapshotException=Gluster Snapshot Exception GlusterSnapshotCreateFailedException=Gluster snapshot create failed +GlusterSnapshotInfoFailedException=Gluster snapshot info failed CANT_RECONSTRUCT_WHEN_A_DOMAIN_IN_POOL_IS_LOCKED=Can't reconstruct the Master Domain when the Data Center contains Domains in Locked state.\nPlease wait until the operation for these Domains ends before trying to reconstruct the Master Domain again. NO_IMPLEMENTATION=Not implemented diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java index 1aeca81..976694c 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java @@ -114,13 +114,13 @@ @Test public void testUpdateVolumeStatus() { - dao.updateSnapshotStatus(existingSnapshot.getSnapshotId(), GlusterSnapshotStatus.DEACTIVATED); + dao.updateSnapshotStatus(existingSnapshot.getSnapshotId(), GlusterSnapshotStatus.STOPPED); GlusterVolumeSnapshotEntity snapshot = dao.getById(existingSnapshot.getSnapshotId()); assertNotNull(snapshot); assertFalse(snapshot.equals(existingSnapshot)); - existingSnapshot.setStatus(GlusterSnapshotStatus.DEACTIVATED); + existingSnapshot.setStatus(GlusterSnapshotStatus.STOPPED); assertEquals(existingSnapshot, snapshot); } @@ -128,13 +128,13 @@ public void testUpdateSnapshotStatusByName() { dao.updateSnapshotStatusByName(existingSnapshot.getVolumeId(), existingSnapshot.getSnapshotName(), - GlusterSnapshotStatus.DEACTIVATED); + GlusterSnapshotStatus.STOPPED); GlusterVolumeSnapshotEntity snapshot = dao.getById(existingSnapshot.getSnapshotId()); assertNotNull(snapshot); assertFalse(snapshot.equals(existingSnapshot)); - existingSnapshot.setStatus(GlusterSnapshotStatus.DEACTIVATED); + existingSnapshot.setStatus(GlusterSnapshotStatus.STOPPED); assertEquals(existingSnapshot, snapshot); } @@ -147,7 +147,7 @@ snapshot.setSnapshotName(NEW_SNAPSHOT_NAME); snapshot.setVolumeId(VOLUME_ID); snapshot.setDescription("test-description"); - snapshot.setStatus(GlusterSnapshotStatus.ACTIVATED); + snapshot.setStatus(GlusterSnapshotStatus.STARTED); dao.save(snapshot); return snapshot; diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java index e860239..92db1e4 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java @@ -76,6 +76,7 @@ case GlusterVolumeGeoRepStopFailedException: case GlusterSnapshotException: case GlusterSnapshotCreateFailedException: + case GlusterSnapshotInfoFailedException: // Capture error from gluster command and record failure getVDSReturnValue().setVdsError(new VDSError(returnStatus, getReturnStatus().mMessage)); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java new file mode 100644 index 0000000..add1e7f --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java @@ -0,0 +1,38 @@ +package org.ovirt.engine.core.vdsbroker.gluster; + +import java.util.ArrayList; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeSnapshotInfoVDSParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc; + +public class GetGlusterVolumeSnapshotInfoVDSCommand<P extends GlusterVolumeSnapshotInfoVDSParameters> extends AbstractGlusterBrokerCommand<P> { + private GlusterVolumeSnapshotInfoReturnForXmlRpc infoReturn; + + public GetGlusterVolumeSnapshotInfoVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected StatusForXmlRpc getReturnStatus() { + return infoReturn.mStatus; + } + + @Override + protected void executeVdsBrokerCommand() { + List<GlusterVolumeSnapshotEntity> snapshots = new ArrayList<GlusterVolumeSnapshotEntity>(); + + Guid clusterId = getParameters().getClusterId(); + String volumeName = getParameters().getVolumeName(); + String snapshotName = getParameters().getSnapshotName(); + infoReturn = getBroker().glusterSnapshotInfo(clusterId, volumeName, snapshotName); + proceedProxyReturnValue(); + + if (getVDSReturnValue().getSucceeded()) { + snapshots = infoReturn.getGlusterVolumeSnapshotInfo().getSnapshots(); + setReturnValue(snapshots); + } + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java new file mode 100644 index 0000000..30b8db0 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java @@ -0,0 +1,107 @@ +package org.ovirt.engine.core.vdsbroker.gluster; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterSnapshotStatus; +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.GlusterVolumeSnapshotInfo; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotDao; +import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@SuppressWarnings("unchecked") +public final class GlusterVolumeSnapshotInfoReturnForXmlRpc extends StatusReturnForXmlRpc { + private static final String STATUS = "status"; + private static final String SNAPSHOTS = "snapshots"; + private static final String NAME = "name"; + private static final String SNAPVOLUMES = "snapVolumes"; + private static final String CREATETIME = "createTime"; + private static final String UUID = "uuid"; + + private StatusForXmlRpc status; + private static final Logger log = LoggerFactory.getLogger(GlusterVolumesListReturnForXmlRpc.class); + private GlusterVolumeSnapshotInfo glusterVolumeSnapshotInfo = new GlusterVolumeSnapshotInfo(); + + public GlusterVolumeSnapshotInfo getGlusterVolumeSnapshotInfo() { + return glusterVolumeSnapshotInfo; + } + + public GlusterVolumeSnapshotInfoReturnForXmlRpc(Guid clusterId, String volumeName, Map<String, Object> innerMap) { + super(innerMap); + status = new StatusForXmlRpc((Map<String, Object>) innerMap.get(STATUS)); + + Object[] snapshotsList = (Object[]) innerMap.get(SNAPSHOTS); + + GlusterVolumeEntity volume = getGlusterVolumeDao().getByName(clusterId, volumeName); + glusterVolumeSnapshotInfo.setVolumeId(volume.getId()); + glusterVolumeSnapshotInfo.setSnapshots(prepareVolumeSnapshotsList(volume, snapshotsList)); + } + + private List<GlusterVolumeSnapshotEntity> prepareVolumeSnapshotsList(GlusterVolumeEntity volume, + Object[] snapshotInfoDetails) { + + List<GlusterVolumeSnapshotEntity> newSnapshotsList = new ArrayList<GlusterVolumeSnapshotEntity>(); + + for (Object obj : snapshotInfoDetails) { + Map<String, Object> snapshotInfo = (Map<String, Object>) obj; + + Object[] snapVolumes = (Object[]) (snapshotInfo.get(SNAPVOLUMES)); + Map<String, Object> snapVolume = (Map<String, Object>) snapVolumes[0]; + GlusterVolumeSnapshotEntity newSnapshot = new GlusterVolumeSnapshotEntity(); + newSnapshot.setClusterId(volume.getClusterId()); + newSnapshot.setVolumeId(volume.getId()); + try { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + newSnapshot.setCreatedAt(df.parse((String) snapshotInfo.get(CREATETIME))); + } catch (Exception e) { + log.error("Could not populate snapshots of volume '{}' on cluster '{}': {}", + volume.getName(), + volume.getClusterId(), + e.getMessage()); + log.debug("Exception", e); + } + newSnapshot.setSnapshotId(Guid.createGuidFromString((String) snapshotInfo.get(UUID))); + newSnapshot.setSnapshotName((String) snapshotInfo.get(NAME)); + newSnapshot.setStatus(GlusterSnapshotStatus.from((String) snapVolume.get(STATUS))); + newSnapshotsList.add(newSnapshot); + } + + return newSnapshotsList; + } + + private GlusterVolumeSnapshotEntity getSnapshotByName(List<GlusterVolumeSnapshotEntity> list, String name) { + for (GlusterVolumeSnapshotEntity entry : list) { + if (entry.getSnapshotName().equals(name)) { + return entry; + } + } + + return null; + } + + private GlusterVolumeSnapshotDao getGlusterVolumeSnapshotDao() { + return DbFacade.getInstance().getGlusterVolumeSnapshotDao(); + } + + private GlusterVolumeDao getGlusterVolumeDao() { + return DbFacade.getInstance().getGlusterVolumeDao(); + } + + public StatusForXmlRpc getStatus() { + return status; + } + + public void setStatus(StatusForXmlRpc status) { + this.status = status; + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java index d5cbe82..ba0a662 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java @@ -22,6 +22,7 @@ import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeSnapshotInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeTaskReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumesListReturnForXmlRpc; @@ -59,11 +60,9 @@ import org.ovirt.vdsm.jsonrpc.client.utils.retry.RetryPolicy; /** - * Implementation of <code>IVdsServer</code> interface which provides JSONRPC by - * using {@link JsonRpcClient}. - * Each method uses {@link RequestBuilder} to build request object and sends it - * using client. The response is represented as {@link FutureMap} which is lazy - * evaluated. + * Implementation of <code>IVdsServer</code> interface which provides JSONRPC by using {@link JsonRpcClient}. Each + * method uses {@link RequestBuilder} to build request object and sends it using client. The response is represented as + * {@link FutureMap} which is lazy evaluated. * */ public class JsonRpcVdsServer implements IVdsServer { @@ -437,15 +436,15 @@ }); FutureTask<Map<String, Object>> future = new FutureTask<Map<String, Object>>(callable) { - @Override - public boolean isDone() { - if (callable.isDone()) { - updateHeartbeatPolicy(true); - return true; - } - return false; - } - }; + @Override + public boolean isDone() { + if (callable.isDone()) { + updateHeartbeatPolicy(true); + return true; + } + return false; + } + }; ThreadPoolUtil.execute(future); return future; } @@ -931,11 +930,11 @@ FutureTask<Map<String, Object>> future = new FutureTask<Map<String, Object>>(callable) { - @Override - public boolean isDone() { - return callable.isDone(); - } - }; + @Override + public boolean isDone() { + return callable.isDone(); + } + }; ThreadPoolUtil.execute(future); return future; @@ -1219,24 +1218,29 @@ } @Override - public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionDelete(String volumeName, String remoteHost, String remoteVolumeName) { + public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionDelete(String volumeName, + String remoteHost, + String remoteVolumeName) { JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepSessionDelete") - .withParameter("volumeName", volumeName) - .withParameter("remoteHost", remoteHost) - .withParameter("remoteVolumeName", remoteVolumeName) - .build(); + .withParameter("volumeName", volumeName) + .withParameter("remoteHost", remoteHost) + .withParameter("remoteVolumeName", remoteVolumeName) + .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturnForXmlRpc(response); } @Override - public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionStop(String volumeName, String remoteHost, String remoteVolumeName, Boolean force) { + public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionStop(String volumeName, + String remoteHost, + String remoteVolumeName, + Boolean force) { JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepSessionStop") - .withParameter("volumeName", volumeName) - .withParameter("remoteHost", remoteHost) - .withParameter("remoteVolumeName", remoteVolumeName) - .withParameter("force", force) - .build(); + .withParameter("volumeName", volumeName) + .withParameter("remoteHost", remoteHost) + .withParameter("remoteVolumeName", remoteVolumeName) + .withParameter("force", force) + .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturnForXmlRpc(response); } @@ -1313,10 +1317,12 @@ } @Override - public GlusterVolumeProfileInfoReturnForXmlRpc glusterVolumeProfileInfo(Guid clusterId, String volumeName, boolean nfs) { + public GlusterVolumeProfileInfoReturnForXmlRpc glusterVolumeProfileInfo(Guid clusterId, + String volumeName, + boolean nfs) { JsonRpcRequest request = new RequestBuilder("GlusterVolume.profileInfo").withParameter("volumeName", volumeName) - .withParameter("nfs", nfs).build(); + .withParameter("nfs", nfs).build(); Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); return new GlusterVolumeProfileInfoReturnForXmlRpc(clusterId, response); @@ -1477,14 +1483,16 @@ @Override public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String volumeName) { JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepStatus") - .withParameter("volName", volumeName) - .build(); + .withParameter("volName", volumeName) + .build(); Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); return new GlusterVolumeGeoRepStatusForXmlRpc(response); } @Override - public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String volumeName, String slaveHost, String slaveVolumeName) { + public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String volumeName, + String slaveHost, + String slaveVolumeName) { JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepStatus").withParameter("volName", volumeName) .withParameter("remoteHost", slaveHost) .withParameter("remoteVolName", slaveVolumeName).build(); @@ -1493,10 +1501,13 @@ } @Override - public GlusterVolumeGeoRepStatusDetailForXmlRpc glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String slaveVolumeName) { - JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepStatusDetail").withParameter("volName", volumeName) - .withParameter("remoteHost", slaveHost) - .withParameter("remoteVolName", slaveVolumeName).build(); + public GlusterVolumeGeoRepStatusDetailForXmlRpc glusterVolumeGeoRepStatusDetail(String volumeName, + String slaveHost, + String slaveVolumeName) { + JsonRpcRequest request = + new RequestBuilder("GlusterVolume.geoRepStatusDetail").withParameter("volName", volumeName) + .withParameter("remoteHost", slaveHost) + .withParameter("remoteVolName", slaveVolumeName).build(); Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); return new GlusterVolumeGeoRepStatusDetailForXmlRpc(response); } @@ -1547,15 +1558,30 @@ } @Override - public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, String snapshotName, String description, boolean force) { + public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, + String snapshotName, + String description, + boolean force) { JsonRpcRequest request = - new RequestBuilder("GlusterSnapshot.create").withOptionalParameter("volumeName", volumeName) + new RequestBuilder("GlusterSnapshot.create").withParameter("volumeName", volumeName) .withParameter("snapName", snapshotName) - .withParameter("description", description) + .withOptionalParameter("description", description) .withParameter("force", force) .build(); Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); return new OneUuidReturnForXmlRpc(response); } + + @Override + public GlusterVolumeSnapshotInfoReturnForXmlRpc glusterSnapshotInfo(Guid clusterId, + String volumeName, + String snapshotName) { + JsonRpcRequest request = + new RequestBuilder("GlusterSnapshot.info").withOptionalParameter("snapName", snapshotName) + .withOptionalParameter("volumeName", volumeName) + .build(); + Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); + return new GlusterVolumeSnapshotInfoReturnForXmlRpc(clusterId, volumeName, response); + } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java index 8db932c..649f27b 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java @@ -13,10 +13,11 @@ import org.ovirt.engine.core.vdsbroker.gluster.GlusterServicesReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterTaskInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterTasksListReturnForXmlRpc; -import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusDetailForXmlRpc; +import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeSnapshotInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeTaskReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumesListReturnForXmlRpc; @@ -329,4 +330,6 @@ StatusOnlyReturnForXmlRpc updateVmPolicy(Map info); OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, String snapshotName, String description, boolean force); + + GlusterVolumeSnapshotInfoReturnForXmlRpc glusterSnapshotInfo(Guid clusterId, String snapshotName, String volumeName); } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java index a230498..add3d22 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java @@ -308,4 +308,6 @@ public Map<String, Object> updateVmPolicy(Map info); public Map<String, Object> glusterSnapshotCreate(String volumeName, String snapshotName, String description, boolean force); + + public Map<String, Object> glusterSnapshotInfo(String snapshotName, String volumeName); } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java index c4167db..92ec5b9 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java @@ -18,6 +18,7 @@ import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeSnapshotInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeTaskReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumesListReturnForXmlRpc; @@ -27,7 +28,7 @@ import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException; import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcUtils; -@SuppressWarnings({"rawtypes", "unchecked"}) +@SuppressWarnings({ "rawtypes", "unchecked" }) public class VdsServerWrapper implements IVdsServer { private final VdsServerConnector vdsServer; @@ -329,7 +330,11 @@ } @Override - public StatusOnlyReturnForXmlRpc setVmTicket(String vmId, String otp64, String sec, String connectionAction, Map<String, String> params) { + public StatusOnlyReturnForXmlRpc setVmTicket(String vmId, + String otp64, + String sec, + String connectionAction, + Map<String, String> params) { try { Map<String, Object> xmlRpcReturnValue = vdsServer.setVmTicket(vmId, otp64, sec, connectionAction, params); StatusOnlyReturnForXmlRpc wrapper = new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue); @@ -405,7 +410,7 @@ @Override public FenceStatusReturnForXmlRpc fenceNode(String ip, String port, String type, String user, String password, - String action, String secured, String options, Map<String, Object> fencingPolicy) { + String action, String secured, String options, Map<String, Object> fencingPolicy) { try { Map<String, Object> xmlRpcReturnValue; if (fencingPolicy == null) { @@ -1095,9 +1100,13 @@ } @Override - public GlusterTaskInfoReturnForXmlRpc glusterVolumeRebalanceStart(String volumeName, Boolean fixLayoutOnly, Boolean force) { + public GlusterTaskInfoReturnForXmlRpc glusterVolumeRebalanceStart(String volumeName, + Boolean fixLayoutOnly, + Boolean force) { try { - return new GlusterTaskInfoReturnForXmlRpc(vdsServer.glusterVolumeRebalanceStart(volumeName, fixLayoutOnly, force)); + return new GlusterTaskInfoReturnForXmlRpc(vdsServer.glusterVolumeRebalanceStart(volumeName, + fixLayoutOnly, + force)); } catch (UndeclaredThrowableException ute) { throw new XmlRpcRunTimeException(ute); } @@ -1226,7 +1235,9 @@ } @Override - public GlusterVolumeProfileInfoReturnForXmlRpc glusterVolumeProfileInfo(Guid clusterId, String volumeName, boolean nfs) { + public GlusterVolumeProfileInfoReturnForXmlRpc glusterVolumeProfileInfo(Guid clusterId, + String volumeName, + boolean nfs) { try { Map<String, Object> xmlRpcReturnValue = vdsServer.glusterVolumeProfileInfo(volumeName, nfs); GlusterVolumeProfileInfoReturnForXmlRpc wrapper = @@ -1288,7 +1299,7 @@ try { Map<String, Object> xmlRpcReturnValue = vdsServer.glusterHostUUIDGet(); OneUuidReturnForXmlRpc wrapper = new OneUuidReturnForXmlRpc(xmlRpcReturnValue); - return wrapper; + return wrapper; } catch (UndeclaredThrowableException ute) { throw new XmlRpcRunTimeException(ute); } @@ -1318,9 +1329,14 @@ } @Override - public StatusOnlyReturnForXmlRpc glusterHookUpdate(String glusterCommand, String stage, String hookName, String content, String checksum) { + public StatusOnlyReturnForXmlRpc glusterHookUpdate(String glusterCommand, + String stage, + String hookName, + String content, + String checksum) { try { - Map<String, Object> xmlRpcReturnValue = vdsServer.glusterHookUpdate(glusterCommand, stage, hookName, content, checksum); + Map<String, Object> xmlRpcReturnValue = + vdsServer.glusterHookUpdate(glusterCommand, stage, hookName, content, checksum); StatusOnlyReturnForXmlRpc wrapper = new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue); return wrapper; } catch (UndeclaredThrowableException ute) { @@ -1328,16 +1344,17 @@ } } - @Override + @Override public StatusOnlyReturnForXmlRpc glusterHookAdd(String glusterCommand, String stage, String hookName, String content, String checksum, Boolean enabled) { - try { - Map<String, Object> xmlRpcReturnValue = vdsServer.glusterHookAdd(glusterCommand, stage, hookName, content, checksum, enabled); - StatusOnlyReturnForXmlRpc wrapper = new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue); - return wrapper; - } catch (UndeclaredThrowableException ute) { - throw new XmlRpcRunTimeException(ute); - } + try { + Map<String, Object> xmlRpcReturnValue = + vdsServer.glusterHookAdd(glusterCommand, stage, hookName, content, checksum, enabled); + StatusOnlyReturnForXmlRpc wrapper = new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue); + return wrapper; + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } } @Override @@ -1352,11 +1369,11 @@ } @Override - public GlusterServicesReturnForXmlRpc glusterServicesAction(Guid serverId, String [] serviceList, String actionType) { + public GlusterServicesReturnForXmlRpc glusterServicesAction(Guid serverId, String[] serviceList, String actionType) { try { - Map<String, Object> xmlRpcReturnValue = vdsServer.glusterServicesAction(serviceList, actionType); - GlusterServicesReturnForXmlRpc wrapper = new GlusterServicesReturnForXmlRpc(serverId, xmlRpcReturnValue); - return wrapper; + Map<String, Object> xmlRpcReturnValue = vdsServer.glusterServicesAction(serviceList, actionType); + GlusterServicesReturnForXmlRpc wrapper = new GlusterServicesReturnForXmlRpc(serverId, xmlRpcReturnValue); + return wrapper; } catch (UndeclaredThrowableException ute) { throw new XmlRpcRunTimeException(ute); } @@ -1395,7 +1412,9 @@ } @Override - public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String volumeName, String slaveHost, String slaveVolumeName) { + public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String volumeName, + String slaveHost, + String slaveVolumeName) { try { Map<String, Object> response; response = vdsServer.glusterVolumeGeoRepStatus(volumeName, slaveHost, slaveVolumeName); @@ -1406,9 +1425,12 @@ } @Override - public GlusterVolumeGeoRepStatusDetailForXmlRpc glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String slaveVolumeName) { + public GlusterVolumeGeoRepStatusDetailForXmlRpc glusterVolumeGeoRepStatusDetail(String volumeName, + String slaveHost, + String slaveVolumeName) { try { - Map<String, Object> response = vdsServer.glusterVolumeGeoRepStatusDetail(volumeName, slaveHost, slaveVolumeName); + Map<String, Object> response = + vdsServer.glusterVolumeGeoRepStatusDetail(volumeName, slaveHost, slaveVolumeName); return new GlusterVolumeGeoRepStatusDetailForXmlRpc(response); } catch (UndeclaredThrowableException ute) { throw new XmlRpcRunTimeException(ute); @@ -1512,9 +1534,34 @@ } @Override - public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, String snapshotName, String description, boolean force) { + public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, + String snapshotName, + String description, + boolean force) { try { - return new OneUuidReturnForXmlRpc(vdsServer.glusterSnapshotCreate(volumeName, snapshotName, description, force)); + return new OneUuidReturnForXmlRpc(vdsServer.glusterSnapshotCreate(volumeName, + snapshotName, + description, + force)); + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } + } + + @Override + public GlusterVolumeSnapshotInfoReturnForXmlRpc glusterSnapshotInfo(Guid clusterId, + String volumeName, + String snapshotName) { + try { + Map<String, Object> xmlRpcReturnValue; + if (snapshotName == null) { + xmlRpcReturnValue = vdsServer.glusterSnapshotInfo("", volumeName); + } else { + xmlRpcReturnValue = vdsServer.glusterSnapshotInfo(snapshotName, volumeName); + } + GlusterVolumeSnapshotInfoReturnForXmlRpc wrapper = + new GlusterVolumeSnapshotInfoReturnForXmlRpc(clusterId, volumeName, xmlRpcReturnValue); + return wrapper; } catch (UndeclaredThrowableException ute) { throw new XmlRpcRunTimeException(ute); } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java index b69488b..bcff534 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java @@ -839,4 +839,7 @@ @DefaultStringValue("Gluster snapshot create failed") String GlusterSnapshotCreateFailedException(); + + @DefaultStringValue("Gluster snapshot info failed") + String GlusterSnapshotInfoFailedException(); } 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 index b86e13e..1560a3c 100644 --- 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 @@ -35,11 +35,11 @@ String tooltip; switch (status) { - case ACTIVATED: + case STARTED: statusImage = resources.upImage(); tooltip = constants.up(); break; - case DEACTIVATED: + case STOPPED: statusImage = resources.downImage(); tooltip = constants.down(); break; diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties index 0e671c5..fc5bf02 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties @@ -383,3 +383,4 @@ GlusterVolumeRemoveBrickStatusFailed=Failed to get status of gluster volume remove bricks GlusterSnapshotException=Gluster Snapshot Exception GlusterSnapshotCreateFailedException=Gluster snapshot create failed +GlusterSnapshotInfoFailedException=Gluster snapshot info failed diff --git a/packaging/dbscripts/gluster_volume_snapshot_sp.sql b/packaging/dbscripts/gluster_volume_snapshot_sp.sql index d261a19..4632422 100644 --- a/packaging/dbscripts/gluster_volume_snapshot_sp.sql +++ b/packaging/dbscripts/gluster_volume_snapshot_sp.sql @@ -9,14 +9,15 @@ v_snapshot_name VARCHAR(1000), v_volume_id UUID, v_description VARCHAR(1024), - v_status VARCHAR(32)) + v_status VARCHAR(32), + v__create_date TIMESTAMP WITH TIME ZONE) RETURNS VOID AS $procedure$ BEGIN INSERT INTO gluster_volume_snapshots (snapshot_id, snapshot_name, volume_id, - description, status) + description, status, _create_date) VALUES (v_snapshot_id, v_snapshot_name, v_volume_id, - v_description, v_status); + v_description, v_status, v__create_date); END; $procedure$ LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/35904 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7b7bf79b72fc5680dab301b290e7aa860d5c714d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches