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

Reply via email to