Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: Disable gluster cli based snapshot scheduling ......................................................................
gluster: Disable gluster cli based snapshot scheduling Introduced changes to disable gluster CLI based volume snapshot scheduling if engine is used. It looks for the existence of a meta volume in gluster and if so, disables the CLI based volume snapshot scheduling by setting a required flag. Later gluster refers the same flag and does not allow re-enabling of CLI based volume snapshot shcheduling from command line. Change-Id: I6bc06f246f30769c5edaf981876c2a51ddd4fffd Bug-URL: https://bugzilla.redhat.com/1230342 Bug-URL: https://bugzilla.redhat.com/1215600 Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/DisableGlusterCliSnapshotScheduleInternalCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSnapshotCliScheduleFlagQuery.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJobTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.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/errors/VdcBllMessages.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties M backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.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/OverrideGlusterVolumeSnapshotScheduleVDSCommand.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/AppErrors.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.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/models/gluster/GlusterVolumeSnapshotListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeBrickListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java M frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/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/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.ui.xml M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties A packaging/dbscripts/upgrade/03_05_1510_add_gluster_cli_based_snapshot_scheduled_column_to_vds_groups.sql M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql M packaging/dbscripts/vds_groups_sp.sql 42 files changed, 452 insertions(+), 24 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/42348/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/DisableGlusterCliSnapshotScheduleInternalCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/DisableGlusterCliSnapshotScheduleInternalCommand.java new file mode 100644 index 0000000..4063af8 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/DisableGlusterCliSnapshotScheduleInternalCommand.java @@ -0,0 +1,58 @@ +package org.ovirt.engine.core.bll.gluster; + +import org.ovirt.engine.core.bll.InternalCommandAttribute; +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeActionVDSParameters; + +@InternalCommandAttribute +public class DisableGlusterCliSnapshotScheduleInternalCommand<T extends GlusterVolumeActionParameters> extends GlusterVolumeCommandBase<T> { + + public DisableGlusterCliSnapshotScheduleInternalCommand(T parameters) { + super(parameters, null); + } + + public DisableGlusterCliSnapshotScheduleInternalCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + @Override + protected void executeCommand() { + VDSGroup cluster = getVdsGroup(); + + VDSReturnValue retValue = + runVdsCommand(VDSCommandType.OverrideGlusterVolumeSnapshotSchedule, + new GlusterVolumeActionVDSParameters(getUpServer().getId(), + getGlusterVolumeName(), + getParameters().isForceAction())); + + setSucceeded(retValue.getSucceeded()); + + if (!retValue.getSucceeded()) { + handleVdsError(AuditLogType.GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED, retValue.getVdsError() + .getMessage()); + } else { + // If force is passed as true, then VDSM verb disables the CLI scheduling as well + // else it just sets the scheduler type as ovirt in. If actual schedule disabling + // is of snapshot schedule happens in gluster side, then only we set the flag + // cliBasedSnapshotSchedulingOn=false and persist in engine side + if (getParameters().isForceAction()) { + cluster.setGlusterCliBasedSchedulingOn(false); + getVdsGroupDAO().update(cluster); + } + } + } + + @Override + public AuditLogType getAuditLogTypeValue() { + if (getSucceeded()) { + return AuditLogType.GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLED; + } else { + return errorType == null ? AuditLogType.GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED : errorType; + } + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSnapshotCliScheduleFlagQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSnapshotCliScheduleFlagQuery.java new file mode 100644 index 0000000..58fd96a --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSnapshotCliScheduleFlagQuery.java @@ -0,0 +1,16 @@ +package org.ovirt.engine.core.bll.gluster; + +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.queries.IdQueryParameters; + +public class GetGlusterVolumeSnapshotCliScheduleFlagQuery<P extends IdQueryParameters> extends GlusterQueriesCommandBase<P> { + public GetGlusterVolumeSnapshotCliScheduleFlagQuery(P parameters) { + super(parameters); + } + + @Override + public void executeQueryCommand() { + VDSGroup cluster = getVdsGroupDao().get(getParameters().getId()); + getQueryReturnValue().setReturnValue(cluster.isGlusterCliBasedSchedulingOn()); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java index b207e6d..a9184bd 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java @@ -12,10 +12,13 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.SetNonOperationalVdsParameters; import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters; import org.ovirt.engine.core.common.businessentities.NonOperationalReason; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; @@ -33,6 +36,8 @@ import org.ovirt.engine.core.common.businessentities.gluster.TransportType; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported; import org.ovirt.engine.core.common.utils.ListUtils; @@ -526,6 +531,8 @@ } private void updateExistingAndNewVolumes(Guid clusterId, Map<Guid, GlusterVolumeEntity> volumesMap) { + VDSGroup cluster = getClusterDao().get(clusterId); + for (Entry<Guid, GlusterVolumeEntity> entry : volumesMap.entrySet()) { GlusterVolumeEntity volume = entry.getValue(); log.debugFormat("Analyzing volume {0}", volume.getName()); @@ -537,6 +544,24 @@ } catch (Exception e) { log.errorFormat("Could not save volume {0} in database!", volume.getName(), e); } + + // If meta volume then set the CLI based snapshot scheduling flag accordingly + if (getGlusterUtil().isGlusterSnapshotSupported(cluster.getcompatibility_version(), clusterId) + && cluster.isGlusterCliBasedSchedulingOn() + && (Config.<String> getValue(ConfigValues.GlusterMetaVolumeName)).equalsIgnoreCase(volume.getName())) { + + VdcReturnValueBase returnValue = + getBackend().runInternalAction(VdcActionType.DisableGlusterCliSnapshotScheduleInternal, + new GlusterVolumeActionParameters(volume.getId(), false), + ExecutionHandler.createInternalJobContext()); + + if (!returnValue.getSucceeded()) { + log.warnFormat("Unbale to set volume snapshot scheduling flag to gluster CLI scheduler on cluster {0}", + cluster.getName()); + } else { + logUtil.logVolumeMessage(volume, AuditLogType.GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLED); + } + } } else { try { log.debugFormat("Volume {0} exists in engine. Checking if it needs to be updated.", @@ -549,6 +574,10 @@ } } + public BackendInternal getBackend() { + return Backend.getInstance(); + } + /** * Creates a new volume in engine * diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java index 41c2551..d16cbf8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java @@ -3,8 +3,15 @@ import java.sql.Time; import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters; import org.ovirt.engine.core.common.action.gluster.ScheduleGlusterVolumeSnapshotParameters; +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.GlusterVolumeSnapshotSchedule; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBllMessages; public class ScheduleGlusterVolumeSnapshotCommand extends ScheduleGlusterVolumeSnapshotCommandBase<ScheduleGlusterVolumeSnapshotParameters> { @@ -14,9 +21,15 @@ @Override protected void executeCommand() { + // Check and disable the gluster CLI based snapshot scheduling first + if (!checkAndDisableCliScheduler()) { + setSucceeded(false); + return; + } + + // Keep a copy of the execution time before conversion to engine time zone during scheduling Time originalExecutionTime = getSchedule().getExecutionTime(); - // schedule the snapshot creation task try { String jobId = scheduleJob(); @@ -31,6 +44,25 @@ } } + private boolean checkAndDisableCliScheduler() { + GlusterVolumeEntity metaVolume = + getGlusterVolumeDao().getByName(getVdsGroupId(), + Config.<String> getValue(ConfigValues.GlusterMetaVolumeName)); + VDSGroup cluster = getVdsGroup(); + if (metaVolume != null && cluster.isGlusterCliBasedSchedulingOn()) { + VdcReturnValueBase returnValue = + runInternalAction(VdcActionType.DisableGlusterCliSnapshotScheduleInternal, + new GlusterVolumeActionParameters(getGlusterVolumeId(), true)); + if (!returnValue.getSucceeded()) { + handleVdsErrors(AuditLogType.GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED, + returnValue.getExecuteFailedMessages()); + } + return returnValue.getSucceeded(); + } + + return true; + } + @Override protected boolean canDoAction() { if (!super.canDoAction()) { @@ -43,6 +75,14 @@ return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_ALREADY_SCHEDULED); } + if (!getParameters().getForce()) { + if (getGlusterVolumeDao().getByName(getVdsGroupId(), + Config.<String> getValue(ConfigValues.GlusterMetaVolumeName)) != null + && getVdsGroup().isGlusterCliBasedSchedulingOn()) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_CLI_SCHEDULING_ENABLED); + } + } + return true; } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJobTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJobTest.java index 99a33fe..b64086c 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJobTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJobTest.java @@ -26,9 +26,14 @@ import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.verification.VerificationMode; +import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.ClusterUtils; import org.ovirt.engine.core.bll.utils.GlusterUtil; import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VDSStatus; @@ -90,7 +95,11 @@ mockConfig(ConfigValues.GlusterRefreshHeavyWeight, "3.2", true), mockConfig(ConfigValues.GlusterHostUUIDSupport, "3.1", false), mockConfig(ConfigValues.GlusterHostUUIDSupport, "3.2", false), - mockConfig(ConfigValues.GlusterHostUUIDSupport, "3.3", true)); + mockConfig(ConfigValues.GlusterHostUUIDSupport, "3.3", true), + mockConfig(ConfigValues.GlusterVolumeSnapshotSupported, "3.1", false), + mockConfig(ConfigValues.GlusterVolumeSnapshotSupported, "3.2", false), + mockConfig(ConfigValues.GlusterVolumeSnapshotSupported, "3.3", false), + mockConfig(ConfigValues.GlusterMetaVolumeName, "3.3", "gluster_shared_storage")); @ClassRule public static MockEJBStrategyRule ejbRule = new MockEJBStrategyRule(); @@ -148,6 +157,9 @@ @Mock private NetworkDao networkDao; + @Mock + private Backend backend; + private VDSGroup existingCluster; private VDS existingServer1; private VDS existingServer2; @@ -178,6 +190,7 @@ existingCluster.setGlusterService(true); existingCluster.setVirtService(false); existingCluster.setcompatibility_version(version); + existingCluster.setGlusterCliBasedSchedulingOn(true); createObjects(version); } @@ -275,9 +288,21 @@ .getVolumeAdvancedDetails(existingServer1, CLUSTER_ID, existingReplVol.getName()); doReturn(new VDSReturnValue()).when(glusterManager).runVdsCommand(eq(VDSCommandType.RemoveVds), argThat(isRemovedServer())); + doReturn(mockVdcReturn()).when(backend).runInternalAction(any(VdcActionType.class), + any(VdcActionParametersBase.class), + any(CommandContext.class)); + doReturn(backend).when(glusterManager).getBackend(); + doNothing().when(glusterManager).acquireLock(CLUSTER_ID); doNothing().when(glusterManager).releaseLock(CLUSTER_ID); doReturn(glusterUtil).when(glusterManager).getGlusterUtil(); + } + + private VdcReturnValueBase mockVdcReturn() { + VdcReturnValueBase retValue = new VdcReturnValueBase(); + retValue.setSucceeded(true); + retValue.setActionReturnValue(true); + return retValue; } private ArgumentMatcher<VDSParametersBase> isRemovedServer() { @@ -389,6 +414,7 @@ doReturn(networkDao).when(glusterManager).getNetworkDao(); doReturn(Collections.singletonList(existingCluster)).when(clusterDao).getAll(); + doReturn(existingCluster).when(clusterDao).get(any(Guid.class)); doReturn(existingServers).when(vdsDao).getAllForVdsGroup(CLUSTER_ID); doReturn(existingDistVol).when(volumeDao).getById(EXISTING_VOL_DIST_ID); doReturn(existingReplVol).when(volumeDao).getById(EXISTING_VOL_REPL_ID); @@ -403,6 +429,7 @@ doNothing().when(volumeDao).removeAll(argThat(areRemovedVolumes())); doNothing().when(brickDao).updateBrickStatuses(argThat(hasBricksWithChangedStatus())); doNothing().when(optionDao).saveAll(argThat(areAddedOptions())); + doNothing().when(clusterDao).update(any(VDSGroup.class)); } private ArgumentMatcher<Collection<Guid>> areRemovedVolumes() { diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java index a8ba839..e585857 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java @@ -448,6 +448,8 @@ GLUSTER_VOLUME_SNAPSHOT_CLUSTER_CONFIG_DETECTED_NEW(4154), GLUSTER_VOLUME_SNAPSHOT_VOLUME_CONFIG_DETECTED_NEW(4155), GLUSTER_VOLUME_SNAPSHOT_HARD_LIMIT_REACHED(4156, AuditLogSeverity.ALERT), + GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED(4157, AuditLogSeverity.ERROR), + GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLED(4158), USER_FORCE_SELECTED_SPM(159), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 4920cf7..81db9fc 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -326,6 +326,7 @@ CreateGlusterVolumeGeoRepSession(1445, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), SetupGlusterGeoRepMountBrokerInternal(1446, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), UpdateGlusterHostPubKeyToSlaveInternal(1447, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), + DisableGlusterCliSnapshotScheduleInternal(1448, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), // Cluster Policy AddClusterPolicy(1450, ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, false, QuotaDependency.NONE), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java index 7c4121e..ec2bfe4 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java @@ -68,6 +68,8 @@ private boolean glusterService; + private boolean glusterCliBasedSchedulingOn; + private boolean tunnelMigration; private String emulatedMachine; @@ -244,6 +246,14 @@ public boolean supportsGlusterService() { return glusterService; + } + + public void setGlusterCliBasedSchedulingOn(boolean glusterCliBasedSchedulingOn) { + this.glusterCliBasedSchedulingOn = glusterCliBasedSchedulingOn; + } + + public boolean isGlusterCliBasedSchedulingOn() { + return this.glusterCliBasedSchedulingOn; } public boolean isTunnelMigration() { @@ -424,6 +434,7 @@ result = prime * result + (transparentHugepages ? 1231 : 1237); result = prime * result + (virtService ? 1231 : 1237); result = prime * result + (glusterService ? 1231 : 1237); + result = prime * result + (glusterCliBasedSchedulingOn ? 1231 : 1237); result = prime * result + (tunnelMigration ? 1231 : 1237); result = prime * result + (emulatedMachine == null ? 0 : emulatedMachine.hashCode()); result = prime * result + (trustedService ? 1231 : 1237); @@ -479,6 +490,7 @@ && transparentHugepages == other.transparentHugepages && virtService == other.virtService && glusterService == other.glusterService + && glusterCliBasedSchedulingOn == other.glusterCliBasedSchedulingOn && tunnelMigration == other.tunnelMigration && ObjectUtils.objectsEqual(emulatedMachine, other.emulatedMachine) && trustedService == other.trustedService 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 c779123..07a24c3 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 @@ -1496,6 +1496,10 @@ @DefaultValueAttribute("300") GlusterRefreshRateGeoRepStatusInSecs, + @TypeConverterAttribute(String.class) + @DefaultValueAttribute("gluster_shared_storage") + GlusterMetaVolumeName, + @TypeConverterAttribute(Boolean.class) @DefaultValueAttribute("true") GlusterNetworkRoleSupported, 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 cd79066..bc3ea1f 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 @@ -426,6 +426,8 @@ GlfsInitException(4572), GlfsFiniException(4573), GlusterVolumeEmptyCheckFailed(4574), + GlusterSnapshotScheduleFlagUpdateFailedException(4575), + GlusterDisableSnapshotScheduleFailedException(4576), GlusterVolumeGeoRepStatusDetailFailed(4600), GlusterVolumeGeoRepSyncFailed(4601), GlusterSnapshotException(4700), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 5e0518f..0703b8b 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -991,6 +991,7 @@ GLUSTER_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL(ErrorType.NOT_SUPPORTED), ACTION_TYPE_FAILED_GLUSTER_NO_PUB_KEYS_PASSED(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_VOLUME_ASYNC_OPERATION_IN_PROGRESS(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_GLUSTER_CLI_SCHEDULING_ENABLED(ErrorType.CONFLICT), // OpenStack Glance ACTION_TYPE_FAILED_IMAGE_DOWNLOAD_ERROR(ErrorType.BAD_PARAMETERS), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java index 3255827..5d94e1c 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java @@ -88,6 +88,7 @@ GlusterVolumeOptionOwnerUserVirtValue, GlusterVolumeOptionOwnerGroupVirtValue, GlusterDefaultBrickMountPoint, + GlusterMetaVolumeName, CpuPinningEnabled, CpuPinMigrationEnabled, MigrationSupportForNativeUsb(ConfigAuthType.User), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index b3bd1f7..915f434 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -349,6 +349,7 @@ GetGlusterVolumeSnapshotScheduleByVolumeId, GetUnusedGlusterBricks, GetGlusterTunedProfiles, + GetGlusterVolumeSnapshotCliScheduleFlag, GetDefaultConfigurationVersion(VdcQueryAuthType.User), OsRepository(VdcQueryAuthType.User), 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 370e0d4..5b9b885 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 @@ -184,6 +184,7 @@ SetGlusterVolumeSnapshotConfig("org.ovirt.engine.core.vdsbroker.gluster"), GetStorageDeviceList("org.ovirt.engine.core.vdsbroker.gluster"), CreateBrick("org.ovirt.engine.core.vdsbroker.gluster"), + OverrideGlusterVolumeSnapshotSchedule("org.ovirt.engine.core.vdsbroker.gluster"), SetNumberOfCpus("org.ovirt.engine.core.vdsbroker"), UpdateVmPolicy("org.ovirt.engine.core.vdsbroker"), diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java index 5c559ce..606e707 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java @@ -221,6 +221,7 @@ .addValue("migrate_on_error", group.getMigrateOnError()) .addValue("virt_service", group.supportsVirtService()) .addValue("gluster_service", group.supportsGlusterService()) + .addValue("gluster_cli_based_snapshot_scheduled", group.isGlusterCliBasedSchedulingOn()) .addValue("tunnel_migration", group.isTunnelMigration()) .addValue("required_rng_sources", VmRngDevice.sourcesToCsv(group.getRequiredRngSources())) .addValue("emulated_machine", group.getEmulatedMachine()) @@ -285,6 +286,7 @@ entity.setMigrateOnError(MigrateOnErrorOptions.forValue(rs.getInt("migrate_on_error"))); entity.setVirtService(rs.getBoolean("virt_service")); entity.setGlusterService(rs.getBoolean("gluster_service")); + entity.setGlusterCliBasedSchedulingOn(rs.getBoolean("gluster_cli_based_snapshot_scheduled")); entity.setTunnelMigration(rs.getBoolean("tunnel_migration")); entity.getRequiredRngSources().addAll(VmRngDevice.csvToSourcesSet(rs.getString("required_rng_sources"))); entity.setEmulatedMachine(rs.getString("emulated_machine")); diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index 554ca53..dafdd0e 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1189,6 +1189,7 @@ ACTION_TYPE_FAILED_DIFFERENT_STORAGE_DEVICE_TYPES_SELECTED=Cannot ${action} ${type}. Different types of storage devices are selected. ACTION_TYPE_FAILED_DEVICE_IS_ALREADY_IN_USE=Cannot ${action} ${type}. Storage Device ${storageDevice} is already in use. ACTION_TYPE_FAILED_VOLUME_ASYNC_OPERATION_IN_PROGRESS=Cannot ${action} ${type}. A ${asyncTask} operation is in progress on the volume ${volumeName} in cluster ${vdsGroup}. +ACTION_TYPE_FAILED_GLUSTER_CLI_SCHEDULING_ENABLED=Cannot ${action} ${type}. Gluster CLI based scheduling is enabled. ACTION_TYPE_FAILED_TAG_ID_REQUIRED=Cannot ${action} ${type}. Tag ID is required. ACTION_TYPE_FAILED_QOS_OUT_OF_RANGE_VALUES=Cannot ${action} ${type}. Values are out of range. diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties index 477daf3..ae852cd 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties @@ -888,6 +888,8 @@ GLUSTER_VOLUME_SNAPSHOT_DELETED_FROM_CLI=Detected deletion of gluster volume snapshot ${snapname} for volume ${glusterVolumeName} on cluster ${VdsGroupName}, and deleting it from engine DB." GLUSTER_VOLUME_SNAPSHOT_CLUSTER_CONFIG_DETECTED_NEW=Found new gluster volume snapshot configuration ${snapConfigName} with value ${snapConfigValue} on cluster ${VdsGroupName}, and added it to engine DB." GLUSTER_VOLUME_SNAPSHOT_VOLUME_CONFIG_DETECTED_NEW=Found new gluster volume snapshot configuration ${snapConfigName} with value ${snapConfigValue} for volume ${glusterVolumeName} on cluster ${VdsGroupName}, and added it to engine DB." +GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED=Failed to disable gluster CLI based snapshot schedule on cluster ${vdsGroupName}. +GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLED=Disabled gluster CLI based scheduling successfully on cluster ${vdsGroupName}. VDS_UNTRUSTED=Host ${VdsName} was set to non-operational. Host is not trusted by the attestation service. USER_ADDED_NETWORK_QOS=Network QoS ${QosName} was added. (User: ${UserName}) 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 c24e84ab..67e7131 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties @@ -401,6 +401,8 @@ GlusterSnapshotConfigFailedException=Failed to configure gluster volume snapshot GlusterSnapshotConfigSetFailedException=Failed to set the gluster volume snapshot configuration GlusterSnapshotConfigGetFailedException=Failed to get the gluster volume snapshot configuration +GlusterSnapshotScheduleFlagUpdateFailedException=Failed to set the gluster volume snapshot scheduler flag +GlusterDisableSnapshotScheduleFailedException=Failed to disable CLI based gluster volume snapshot scheduling GlusterGeoRepConfigFailed=Failed to modify geo-replication config 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/VdsGroupDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java index 7a5f557..9739b24 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java @@ -63,6 +63,7 @@ newGroup.setDetectEmulatedMachine(true); newGroup.setEmulatedMachine("rhel6.4.0"); newGroup.setArchitecture(ArchitectureType.x86_64); + newGroup.setGlusterCliBasedSchedulingOn(true); } 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 bcf3cd7..bf677d8 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 @@ -104,6 +104,8 @@ case GlusterHostStorageDevicePVCreateFailedException: case GlusterHostStorageDeviceLVConvertFailedException: case GlusterHostStorageDeviceLVChangeFailedException: + case GlusterSnapshotScheduleFlagUpdateFailedException: + case GlusterDisableSnapshotScheduleFailedException: // Capture error from gluster command and record failure getVDSReturnValue().setVdsError(new VDSError(returnStatus, getReturnStatus().mMessage)); getVDSReturnValue().setSucceeded(false); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/OverrideGlusterVolumeSnapshotScheduleVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/OverrideGlusterVolumeSnapshotScheduleVDSCommand.java new file mode 100644 index 0000000..44c49cd --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/OverrideGlusterVolumeSnapshotScheduleVDSCommand.java @@ -0,0 +1,15 @@ +package org.ovirt.engine.core.vdsbroker.gluster; + +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeActionVDSParameters; + +public class OverrideGlusterVolumeSnapshotScheduleVDSCommand<P extends GlusterVolumeActionVDSParameters> extends AbstractGlusterBrokerCommand<P> { + public OverrideGlusterVolumeSnapshotScheduleVDSCommand(P params) { + super(params); + } + + @Override + protected void executeVdsBrokerCommand() { + status = getBroker().glusterSnapshotScheduleOverride(getParameters().isForceAction()); + proceedProxyReturnValue(); + } +} 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 1088125..538121b 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 @@ -1839,4 +1839,22 @@ Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); return new OneStorageDeviceReturnForXmlRpc(response); } + + @Override + public StatusOnlyReturnForXmlRpc glusterSnapshotScheduleOverride(boolean force) { + JsonRpcRequest request = + new RequestBuilder("GlusterVolume.snapshotScheduleOverride").withParameter("force", force).build(); + + Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); + return new StatusOnlyReturnForXmlRpc(response); + } + + @Override + public StatusOnlyReturnForXmlRpc glusterSnapshotScheduleReset() { + JsonRpcRequest request = + new RequestBuilder("GlusterVolume.snapshotScheduleReset").build(); + + Map<String, Object> response = new FutureMap(this.client, request); + return new StatusOnlyReturnForXmlRpc(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 cf13723..d1d21ef 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 @@ -430,4 +430,8 @@ String[] storageDevices); StorageDeviceListReturnForXmlRpc glusterStorageDeviceList(); + + StatusOnlyReturnForXmlRpc glusterSnapshotScheduleOverride(boolean force); + + StatusOnlyReturnForXmlRpc glusterSnapshotScheduleReset(); } 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 053a181..9ec2ca6 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 @@ -404,4 +404,8 @@ String[] devices, String fsType, Map<String, Object> raidParams); + + public Map<String, Object> glusterSnapshotScheduleOverride(boolean force); + + public Map<String, Object> glusterSnapshotScheduleReset(); } 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 4862912..d9d0528 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 @@ -1823,4 +1823,21 @@ } + @Override + public StatusOnlyReturnForXmlRpc glusterSnapshotScheduleOverride(boolean force) { + try { + return new StatusOnlyReturnForXmlRpc(vdsServer.glusterSnapshotScheduleOverride(force)); + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } + } + + @Override + public StatusOnlyReturnForXmlRpc glusterSnapshotScheduleReset() { + try { + return new StatusOnlyReturnForXmlRpc(vdsServer.glusterSnapshotScheduleReset()); + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } + } } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index 5b264cd..9a9f323 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -3203,6 +3203,9 @@ @DefaultStringValue("Cannot ${action} ${type}. Snapshot ${snapname} is already de-activated.") String ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_ALREADY_DEACTIVATED(); + @DefaultStringValue("Cannot ${action} ${type}. Gluster CLI based scheduling is enabled.") + String ACTION_TYPE_FAILED_GLUSTER_CLI_SCHEDULING_ENABLED(); + @DefaultStringValue("Cannot ${action} ${type}. Gluster task management is not supported in compatibility version ${compatibilityVersion}.") String GLUSTER_TASKS_NOT_SUPPORTED_FOR_CLUSTER_LEVEL(); 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 d0c4e56..20b936c 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 @@ -903,6 +903,12 @@ @DefaultStringValue("Failed to get the gluster volume snapshot configuration") String GlusterSnapshotConfigGetFailedException(); + @DefaultStringValue("Failed to set the gluster volume snapshot scheduler flag") + String GlusterSnapshotScheduleFlagUpdateFailedException(); + + @DefaultStringValue("Failed to disable CLI based gluster volume snapshot scheduling") + String GlusterDisableSnapshotScheduleFailedException(); + @DefaultStringValue("Storage device(s) not found") String GlusterHostStorageDeviceNotFoundException(); 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 1ff4106..2007bad 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 @@ -1637,6 +1637,18 @@ aQuery); } + public static void getIsGlusterVolumeSnapshotCliScheduleEnabled(AsyncQuery aQuery, Guid clusterId) { + aQuery.converterCallback = new IAsyncConverter() { + @Override + public Object Convert(Object source, AsyncQuery asyncQuery) { + return source; + } + }; + Frontend.getInstance().runQuery(VdcQueryType.GetGlusterVolumeSnapshotCliScheduleFlag, + new IdQueryParameters(clusterId), + aQuery); + } + public static void getGlusterVolumeSnapshotsForVolume(AsyncQuery aQuery, Guid volumeId) { aQuery.converterCallback = new IAsyncConverter() { @Override 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 index 46deb49..fa7ea2c 100644 --- 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 @@ -306,7 +306,7 @@ return; } - ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); + final ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); List<VdcActionParametersBase> paramsList = new ArrayList<VdcActionParametersBase>(); for (GlusterVolumeSnapshotEntity snapshot : (List<GlusterVolumeSnapshotEntity>) getSelectedItems()) { @@ -323,8 +323,7 @@ @Override public void executed(FrontendMultipleActionAsyncResult result) { - ConfirmationModel localModel = (ConfirmationModel) getConfirmWindow(); - localModel.stopProgress(); + model.stopProgress(); setConfirmWindow(null); } }, @@ -416,15 +415,14 @@ return; } - ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); + final ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); model.startProgress(null); Frontend.getInstance().runAction(action, param, new IFrontendActionAsyncCallback() { @Override public void executed(FrontendActionAsyncResult result) { - ConfirmationModel localModel = (ConfirmationModel) getConfirmWindow(); - localModel.stopProgress(); + model.stopProgress(); setConfirmWindow(null); } }); @@ -445,7 +443,7 @@ } GlusterVolumeEntity volumeEntity = getEntity(); - GlusterVolumeSnapshotModel snapshotModel = + final GlusterVolumeSnapshotModel snapshotModel = new GlusterVolumeSnapshotModel(true, !volumeEntity.getSnapshotScheduled()); snapshotModel.setHelpTag(HelpTag.new_volume_snapshot); @@ -453,8 +451,19 @@ snapshotModel.setTitle(ConstantsManager.getInstance().getConstants().createScheduleVolumeSnapshotTitle()); setWindow(snapshotModel); + snapshotModel.startProgress(null); + snapshotModel.getClusterName().setEntity(volumeEntity.getVdsGroupName()); snapshotModel.getVolumeName().setEntity(volumeEntity.getName()); + + AsyncDataProvider.getIsGlusterVolumeSnapshotCliScheduleEnabled(new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + Boolean isCliScheduleEnabled = (Boolean) returnValue; + snapshotModel.getDisableCliSchedule().setEntity(isCliScheduleEnabled); + snapshotModel.stopProgress(); + } + }), volumeEntity.getClusterId()); UICommand okCommand = UICommand.createDefaultOkUiCommand("onCreateSnapshot", this); //$NON-NLS-1$ snapshotModel.getCommands().add(okCommand); @@ -533,7 +542,7 @@ } ScheduleGlusterVolumeSnapshotParameters params = - new ScheduleGlusterVolumeSnapshotParameters(schedule, true); + new ScheduleGlusterVolumeSnapshotParameters(schedule, snapshotModel.getDisableCliSchedule().getEntity()); snapshotModel.startProgress(null); VdcActionType actionType = null; @@ -554,7 +563,7 @@ localModel.postSnapshotAction(result.getReturnValue()); } }, - this); + this, snapshotModel.getDisableCliSchedule().getEntity()); } private void createNewSnapshot(final GlusterVolumeSnapshotModel snapshotModel) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotModel.java index 665e390..b5eaa68 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotModel.java @@ -44,11 +44,14 @@ private ListModel<String> daysOfMonth; //Listeners should be registered only once and not initially itself but only after a first validation occurs after user clicks on ok. private boolean listenersRegistered = false; + private EntityModel<Boolean> disableCliSchedule; public GlusterVolumeSnapshotModel(boolean generalTabVisible, boolean scheduleTabVisible) { init(); setGeneralTabVisible(generalTabVisible); setScheduleTabVisible(scheduleTabVisible); + disableCliSchedule.setEntity(false); + disableCliSchedule.setIsAvailable(false); } private void init() { @@ -65,6 +68,7 @@ setStartAt(new EntityModel<Date>(new Date())); setEndDate(new EntityModel<Date>(new Date())); setExecutionTime(new EntityModel<Date>(new Date())); + setDisableCliSchedule(new EntityModel<Boolean>(false)); initIntervals(); initTimeZones(); @@ -297,6 +301,14 @@ this.daysOfMonth = daysOfMonth; } + public EntityModel<Boolean> getDisableCliSchedule() { + return this.disableCliSchedule; + } + + public void setDisableCliSchedule(EntityModel<Boolean> value) { + this.disableCliSchedule = value; + } + public boolean validate(boolean inplaceValidate) { String propName; diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeBrickListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeBrickListModel.java index aff4c43..593842b 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeBrickListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeBrickListModel.java @@ -26,6 +26,8 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType; import org.ovirt.engine.core.common.businessentities.gluster.Mempool; import org.ovirt.engine.core.common.job.JobExecutionStatus; +import org.ovirt.engine.core.common.queries.ConfigurationValues; +import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.ui.frontend.AsyncQuery; @@ -45,6 +47,7 @@ import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; public class VolumeBrickListModel extends SearchableListModel { + private String glusterMetaVolumeName; @Override protected String getListName() { @@ -64,6 +67,20 @@ setReplaceBrickCommand(new UICommand("Replace Brick", this)); //$NON-NLS-1$ setBrickAdvancedDetailsCommand(new UICommand("Brick Advanced Details", this)); //$NON-NLS-1$ getReplaceBrickCommand().setIsAvailable(false); + + // Get the meta volume name + AsyncQuery aQuery = new AsyncQuery(); + aQuery.setModel(this); + aQuery.asyncCallback = new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + glusterMetaVolumeName = (String) returnValue; + } + }; + AsyncDataProvider.getConfigFromCache(new GetConfigurationValueParameters(ConfigurationValues.GlusterMetaVolumeName, + AsyncDataProvider.getDefaultConfigurationVersion()), + aQuery); + } private GlusterVolumeEntity volumeEntity; @@ -600,14 +617,22 @@ if (removeBrickModel.isReduceReplica()) { - removeBrickModel.setMessage(ConstantsManager.getInstance() - .getMessages() - .removeBricksReplicateVolumeMessage(volumeEntity.getReplicaCount(), - volumeEntity.getReplicaCount() - 1)); - removeBrickModel.setMigrationSupported(false); - removeBrickModel.getMigrateData().setEntity(false); - } - else + if (volumeEntity.getName().equals(glusterMetaVolumeName) && volumeEntity.getReplicaCount() <= 3) { + removeBrickModel.setMessage(ConstantsManager.getInstance() + .getConstants() + .removeMetaVolumeBricksMessage()); + removeBrickModel.setNote(ConstantsManager.getInstance() + .getConstants() + .removeMetaVolumeBricksWarning()); + } else { + removeBrickModel.setMessage(ConstantsManager.getInstance() + .getMessages() + .removeBricksReplicateVolumeMessage(volumeEntity.getReplicaCount(), + volumeEntity.getReplicaCount() - 1)); + removeBrickModel.setMigrationSupported(false); + removeBrickModel.getMigrateData().setEntity(false); + } + } else { removeBrickModel.setMessage(ConstantsManager.getInstance().getConstants().removeBricksMessage()); } 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 e4e446d..00deea4 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 @@ -117,6 +117,8 @@ private UICommand editSnapshotScheduleCommand; private UICommand newGeoRepSessionCommand; + private String glusterMetaVolumeName; + public UICommand getNewGeoRepSessionCommand() { return newGeoRepSessionCommand; } @@ -297,6 +299,19 @@ getSearchNextPageCommand().setIsAvailable(true); getSearchPreviousPageCommand().setIsAvailable(true); + + // Get the meta volume name + AsyncQuery aQuery = new AsyncQuery(); + aQuery.setModel(this); + aQuery.asyncCallback = new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + glusterMetaVolumeName = (String) returnValue; + } + }; + AsyncDataProvider.getConfigFromCache(new GetConfigurationValueParameters(ConfigurationValues.GlusterMetaVolumeName, + AsyncDataProvider.getDefaultConfigurationVersion()), + aQuery); } @Override @@ -403,6 +418,15 @@ } + private boolean isMetaVolumeInList(List<GlusterVolumeEntity> volumes) { + for (GlusterVolumeEntity volume : volumes) { + if (volume.getName().equals(glusterMetaVolumeName)) { + return true; + } + } + return false; + } + private void removeVolume() { if (getWindow() != null) { @@ -414,7 +438,11 @@ model.setTitle(ConstantsManager.getInstance().getConstants().removeVolumesTitle()); model.setHelpTag(HelpTag.remove_volume); model.setHashName("remove_volume"); //$NON-NLS-1$ - model.setNote(ConstantsManager.getInstance().getConstants().removeVolumesWarning()); + if (isMetaVolumeInList(Linq.<GlusterVolumeEntity> cast(getSelectedItems()))) { + model.setNote(ConstantsManager.getInstance().getConstants().removeMetaVolumeWarning()); + } else { + model.setNote(ConstantsManager.getInstance().getConstants().removeVolumesWarning()); + } if (getSelectedItems() == null) { return; @@ -1074,7 +1102,11 @@ model.setHelpTag(HelpTag.volume_stop); model.setHashName("volume_stop"); //$NON-NLS-1$ model.setMessage(ConstantsManager.getInstance().getConstants().stopVolumeMessage()); - model.setNote(ConstantsManager.getInstance().getConstants().stopVolumeWarning()); + if (isMetaVolumeInList(Linq.<GlusterVolumeEntity> cast(getSelectedItems()))) { + model.setNote(ConstantsManager.getInstance().getConstants().stopMetaVolumeWarning()); + } else { + model.setNote(ConstantsManager.getInstance().getConstants().stopVolumeWarning()); + } if (getSelectedItems() == null) { return; diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java index 668fabc..5469432 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java @@ -513,11 +513,23 @@ String AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CREATE_FAILED(); + String AuditLogType___GLUSTER_VOLUME_SNAPSHOT_SCHEDULED(); + + String AuditLogType___GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_FAILED(); + + String AuditLogType___GLUSTER_VOLUME_SNAPSHOT_RESCHEDULED(); + + String AuditLogType___GLUSTER_VOLUME_SNAPSHOT_RESCHEDULE_FAILED(); + String AuditLogType___CREATE_GLUSTER_BRICK(); String AuditLogType___CREATE_GLUSTER_BRICK_FAILED(); String AuditLogType___GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_DELETED(); + + String AuditLogType___GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED(); + + String AuditLogType___GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLED(); String VdcActionType___ActivateVds(); @@ -806,6 +818,10 @@ String VdcActionType___CreateGlusterVolumeSnapshot(); + String VdcActionType___ScheduleGlusterVolumeSnapshot(); + + String VdcActionType___RescheduleGlusterVolumeSnapshot(); + String VdcActionType___ReplaceGlusterVolumeBrick(); String VdcActionType___GlusterHostAdd(); diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index 78f54cb..c144815 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -1694,11 +1694,17 @@ @DefaultStringValue("NOTE:\n -Stopping volume will make its data inaccessible.") String stopVolumeWarning(); + @DefaultStringValue("NOTE:\n -Stopping meta volume will impact normal working of features like volume snapshot, geo-replication etc.") + String stopMetaVolumeWarning(); + @DefaultStringValue("Remove Volume") String removeVolumesTitle(); @DefaultStringValue("NOTE:\n -Removing volume will erase all information about the volume.") String removeVolumesWarning(); + + @DefaultStringValue("NOTE:\n - Removing meta volume will impact normal working of features like volume snapshot, geo-replication etc.") + String removeMetaVolumeWarning(); @DefaultStringValue("Remove Bricks") String removeBricksTitle(); @@ -1721,6 +1727,12 @@ @DefaultStringValue("Are you sure you want to remove the following Brick(s)?") String removeBricksMessage(); + @DefaultStringValue("Are you sure you want to remove the following Brick(s) from meta volume?") + String removeMetaVolumeBricksMessage(); + + @DefaultStringValue("NOTE:\n -Removing bricks from meta volume will impact normal working of features like volume snapshot, geo-replication etc.") + String removeMetaVolumeBricksWarning(); + @DefaultStringValue("NOTE:\n -Removing brick(s) can result in data loss.") String removeBricksWarning(); 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 842c35b..a7611e7 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 @@ -251,13 +251,18 @@ AuditLogType___GLUSTER_VOLUME_SNAPSHOT_RESTORE_FAILED=Failed to restore snapshot on the volume AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATED=Gluster volume snapshot configuration updated AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED=Failed to update gluster volume snapshot configuration -AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED_PARTIALLY=Failed to update some gluster volume snapshot configuration +AuditLogType___GLUSTER_VOLUME_SNAPSHOT_SCHEDULED=Snapshots scheduled on volume +AuditLogType___GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_FAILED=Failed to schedule snapshots on the volume +AuditLogType___GLUSTER_VOLUME_SNAPSHOT_RESCHEDULED=Rescheduled snapshots on volume +AuditLogType___GLUSTER_VOLUME_SNAPSHOT_RESCHEDULE_FAILED=Failed to reschedule snapshots on volume AuditLogType___GLUSTER_MASTER_VOLUME_STOP_FAILED_DURING_SNAPSHOT_RESTORE=Could not stop master volume ${glusterVolumeName} during snapshot restore. AuditLogType___GLUSTER_MASTER_VOLUME_SNAPSHOT_RESTORE_FAILED=Could not restore master volume ${glusterVolumeName}. AuditLogType___CREATE_GLUSTER_BRICK=Brick ${brickName} created successfully on host ${vdsName} of cluster ${vdsGroupName}. AuditLogType___CREATE_GLUSTER_BRICK_FAILED=Failed to create brick ${brickName} on host ${vdsName} of cluster ${vdsGroupName}. AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED_PARTIALLY=Failed to update gluster volume snapshot configuration(s) ${failedSnapshotConfigs}. AuditLogType___GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_DELETED=Snapshot schedule deleted for volume ${glusterVolumeName} of ${vdsGroupName} +AuditLogType___GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLE_FAILED=Failed to disable gluster CLI based snapshot schedule on cluster ${vdsGroupName}. +AuditLogType___GLUSTER_CLI_SNAPSHOT_SCHEDULE_DISABLED=Disabled gluster CLI based scheduling successfully on cluster ${vdsGroupName}. VdcActionType___ActivateVds=Activate Host VdcActionType___RecoveryStoragePool=Reinitialize Data Center @@ -402,6 +407,8 @@ VdcActionType___DeactivateGlusterVolumeSnapshot=Deactivate volume snapshot VdcActionType___RestoreGlusterVolumeSnapshot=Restore volume snapshot VdcActionType___UpdateGlusterVolumeSnapshotConfigCommand=Update Gluster volume snapshot configuration +VdcActionType___ScheduleGlusterVolumeSnapshot=Schedule gluster volume snapshots +VdcActionType___RescheduleGlusterVolumeSnapshot=Reschedule gluster volume snapshots VdcActionType___ActivateStorageDomain=Activate Storage Domain VdcActionType___FenceVdsManualy=Fence Host Manually VdcActionType___AddEmptyStoragePool=New Data Center 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 d241cf1..c949ef7 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 @@ -4216,4 +4216,6 @@ @DefaultStringValue("Additional features supported in the Cluster") String addtionalClusterFeaturesTitle(); + @DefaultStringValue("Gluster CLI based snapshot scheduling is enabled. \nIt would be disabled once volume snapshots scheduled from UI.") + String glusterCliSchedulingEnabled(); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.java index 9da2720..43ad87a 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.java @@ -151,7 +151,14 @@ @WithElementId Label scheduleTabErrorMessageLabel; + @UiField + @Ignore + @WithElementId + Label disableCliScheduleMessageLabel; + private final ApplicationConstants constants; + + private final Driver driver = GWT.create(Driver.class); private final Driver driver = GWT.create(Driver.class); @@ -212,17 +219,19 @@ startAtEditor.setLabel(constants.startAtLabel()); endDate.setLabel(constants.endByDateLabel()); executionTimeEditor.setLabel(constants.executionTimeLabel()); - criticalIntervalLabel.setText(constants.criticalSnapshotIntervalNote()); + disableCliScheduleMessageLabel.setText(constants.glusterCliSchedulingEnabled()); } private void setVisibilities() { criticalIntervalLabel.setVisible(false); + disableCliScheduleMessageLabel.setVisible(false); } @Override public void edit(final GlusterVolumeSnapshotModel object) { driver.edit(object); + updateVisibilities(object); updateTabVisibilities(object); } @@ -241,6 +250,8 @@ executionTimeEditor.setVisible(recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.DAILY || recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.WEEKLY || recurrenceOption == GlusterVolumeSnapshotScheduleRecurrence.MONTHLY); + disableCliScheduleMessageLabel.setVisible(object.getDisableCliSchedule().getEntity() + && recurrenceOption != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN); setEndDateVisibility(object); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.ui.xml index a7fbda8..26cc6bb 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/gluster/GlusterVolumeSnapshotCreatePopupView.ui.xml @@ -53,6 +53,18 @@ padding-bottom: 10px; } + .disableCliScheduleMessageLabel { + width: 450px; + height: + 50px; + font-size: 13px; + left: 10px; + padding-left: 15px; + padding-bottom: + 10px; + color: #FF0000; + } + </ui:style> <d:SimpleDialogPanel width="700px" height="500px"> @@ -103,6 +115,7 @@ addStyleNames="{style.criticalIntervalLabel}" /> <g:Label ui:field="scheduleTabErrorMessageLabel" addStyleNames="{style.errMsgLabel}" /> + <g:Label ui:field="disableCliScheduleMessageLabel" addStyleNames="{style.disableCliScheduleMessageLabel}" /> </g:FlowPanel> </t:content> </t:DialogTab> diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index e11abe7..ccc5b1c 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1147,6 +1147,7 @@ ACTION_TYPE_FAILED_DIFFERENT_STORAGE_DEVICE_TYPES_SELECTED=Cannot ${action} ${type}. Different types of storage devices are selected. ACTION_TYPE_FAILED_DEVICE_IS_ALREADY_IN_USE=Cannot ${action} ${type}. Storage Device ${storageDevice} is already in use. ACTION_TYPE_FAILED_VOLUME_ASYNC_OPERATION_IN_PROGRESS=Cannot ${action} ${type}. A ${asyncTask} operation is in progress on the volume ${volumeName} in cluster ${vdsGroup}. +ACTION_TYPE_FAILED_GLUSTER_CLI_SCHEDULING_ENABLED=Cannot ${action} ${type}. Gluster CLI based scheduling is enabled. ACTION_TYPE_FAILED_TAG_ID_REQUIRED=Cannot ${action} ${type}. Tag ID is required. diff --git a/packaging/dbscripts/upgrade/03_05_1510_add_gluster_cli_based_snapshot_scheduled_column_to_vds_groups.sql b/packaging/dbscripts/upgrade/03_05_1510_add_gluster_cli_based_snapshot_scheduled_column_to_vds_groups.sql new file mode 100644 index 0000000..b99bc79 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_05_1510_add_gluster_cli_based_snapshot_scheduled_column_to_vds_groups.sql @@ -0,0 +1,2 @@ +select fn_db_add_column('vds_groups', 'gluster_cli_based_snapshot_scheduled', 'BOOLEAN NOT NULL DEFAULT TRUE'); + diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql index 57503b3..cb4c643 100644 --- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql +++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql @@ -192,6 +192,7 @@ select fn_db_add_config_value('GlusterVolumeSnapshotSupported', 'false', '3.4'); select fn_db_add_config_value('GlusterVolumeSnapshotSupported', 'false', '3.5'); select fn_db_add_config_value('GlusterRefreshRateSnapshotDiscovery', '300', 'general'); +select fn_db_add_config_value('GlusterMetaVolumeName', 'gluster_shared_storage', 'general'); -- Gluster Geo-replication -- select fn_db_add_config_value('GlusterGeoReplicationEnabled', 'false', '3.0'); select fn_db_add_config_value('GlusterGeoReplicationEnabled', 'false', '3.1'); @@ -202,7 +203,6 @@ select fn_db_add_config_value('GlusterRefreshRateGeoRepDiscoveryInSecs', '3600', 'general'); select fn_db_add_config_value('GlusterRefreshRateGeoRepStatusInSecs', '300', 'general'); select fn_db_add_config_value('GlusterTunedProfile', 'rhs-high-throughput,rhs-virtualization', 'general'); - -- Gluster Disk Provisioning -- select fn_db_add_config_value('GlusterBrickProvisioningEnabled', 'false', '3.0'); diff --git a/packaging/dbscripts/vds_groups_sp.sql b/packaging/dbscripts/vds_groups_sp.sql index e8363bb..0a46d01 100644 --- a/packaging/dbscripts/vds_groups_sp.sql +++ b/packaging/dbscripts/vds_groups_sp.sql @@ -72,6 +72,7 @@ v_migrate_on_error INTEGER, v_virt_service BOOLEAN, v_gluster_service BOOLEAN, + v_gluster_cli_based_snapshot_scheduled BOOLEAN, v_tunnel_migration BOOLEAN, v_emulated_machine VARCHAR(40), v_detect_emulated_machine BOOLEAN, @@ -108,6 +109,7 @@ migrate_on_error = v_migrate_on_error, virt_service = v_virt_service, gluster_service = v_gluster_service, tunnel_migration = v_tunnel_migration, emulated_machine = v_emulated_machine, detect_emulated_machine = v_detect_emulated_machine, trusted_service = v_trusted_service, ha_reservation = v_ha_reservation , optional_reason = v_optional_reason, cluster_policy_id = v_cluster_policy_id, + gluster_cli_based_snapshot_scheduled = v_gluster_cli_based_snapshot_scheduled, cluster_policy_custom_properties = v_cluster_policy_custom_properties, enable_balloon = v_enable_balloon, architecture = v_architecture, optimization_type = v_optimization_type, spice_proxy = v_spice_proxy, enable_ksm = v_enable_ksm, serial_number_policy = v_serial_number_policy, custom_serial_number = v_custom_serial_number, -- To view, visit https://gerrit.ovirt.org/42348 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6bc06f246f30769c5edaf981876c2a51ddd4fffd Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5-gluster Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches