Selvasundaram has uploaded a new change for review. Change subject: engine: Gluster Volume Georeplication Stop ......................................................................
engine: Gluster Volume Georeplication Stop - New Bll action and parameter - New VDS command and parameter - Audit Log Messages and Severities - App Errors - Vdsm Errors Change-Id: I0ea1eff5552f1cc84c12344db67c643ab97f6bc0 Signed-off-by: Selvasundaram <sesub...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterVolumeGeoreplicationStopCommand.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/VdcEventNotificationUtils.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoreplicationIdParameters.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/vdscommands/VDSCommandType.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties M backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoreplicationStopVDSCommand.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 15 files changed, 259 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/22/8922/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterVolumeGeoreplicationStopCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterVolumeGeoreplicationStopCommand.java new file mode 100644 index 0000000..39f86ea --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterVolumeGeoreplicationStopCommand.java @@ -0,0 +1,172 @@ +package org.ovirt.engine.core.bll.gluster; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeGeoreplicationIdParameters; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoreplicationEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeGeoreplicationVDSParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.VdcBllMessages; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.gluster.GlusterGeoreplicationDao; + +/** + * BLL command to Gluster Volume Geo-replication Stop + */ +@NonTransactiveCommandAttribute +public class GlusterVolumeGeoreplicationStopCommand + extends GlusterCommandBase<GlusterVolumeGeoreplicationIdParameters> { + + private static final long serialVersionUID = 8535744691720840682L; + + private GlusterGeoreplicationEntity georepEntity; + + public GlusterVolumeGeoreplicationStopCommand(GlusterVolumeGeoreplicationIdParameters params) { + super(params); + } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__START); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__GLUSTER_VOLUME); + } + + + @Override + protected boolean canDoAction() { + try { + georepEntity = getGeoreplicationEntity(); + } catch (Exception e) { + addCanDoActionMessage(VdcBllMessages.CAN_DO_ACTION_GENERAL_FAILURE); + return false; + } + + if (georepEntity == null) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_NO_GEOREPLICATION_FOUND); + return false; + } + + if (!super.canDoAction()) { + return false; + } + + if (upServer.getstatus() != VDSStatus.Up) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_SERVER_IS_NOT_UP); + return false; + } + + if (getGlusterVolume().getStatus() == GlusterStatus.DOWN) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_DOWN); + return false; + } + + VDSGroup cluster = getVdsGroup(); + if (cluster == null) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID); + return false; + } + + if (!cluster.supportsGlusterService()) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_DOES_NOT_SUPPORT_GLUSTER); + return false; + } + + if (StringUtils.isEmpty(georepEntity.getRemoteServerIpOrHostname())) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_REMOTE_SERVER_REQUIRED); + return false; + } + + if (StringUtils.isEmpty(georepEntity.getFingerprint())) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_INVALID_FINGERPRINT); + return false; + } + + if (StringUtils.isEmpty(georepEntity.getUserName())) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_USERNAME_REQUIRED); + return false; + } + + if (StringUtils.isEmpty(georepEntity.getRemoteVolumeOrDir())) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VOLUME_OR_DIR_REQUIRED); + return false; + } + + return true; + } + + public GlusterGeoreplicationDao getGlusterGeoReplicationDao() { + return DbFacade.getInstance().getGlusterGeoreplicationDao(); + } + + public GlusterGeoreplicationEntity getGeoreplicationEntity() { + return georepEntity = getGlusterGeoReplicationDao().getById(getParameters().getId()); + } + + /** + * GetUpServer return the Server of Server Id passed in the parameter. Overriding this method to reuse the existing + * canDoAction + */ + @Override + protected VDS getUpServer() { + return getVdsDAO().get(georepEntity.getServerId()); + } + + @Override + protected GlusterVolumeEntity getGlusterVolume() { + if (georepEntity.getVolumeId() != null) { + return getGlusterVolumeDao().getById(georepEntity.getVolumeId().getValue()); + } + return null; + } + + /* + * (non-Javadoc) + * + * @see org.ovirt.engine.core.bll.CommandBase#executeCommand() + */ + @Override + protected void executeCommand() { + VDSReturnValue returnValue = runVdsCommand( + VDSCommandType.GlusterVolumeGeoReplicationStop, + new GlusterVolumeGeoreplicationVDSParameters(upServer.getId(), + getGlusterVolume().getName(), + georepEntity.getRemoteServerIpOrHostname(), + georepEntity.getRemoteVolumeOrDir())); + setSucceeded(returnValue.getSucceeded()); + + if (!getSucceeded()) { + handleVdsError(AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_START, + returnValue.getVdsError().getMessage()); + return; + } + removeFromDb(getParameters().getId()); + } + + private void removeFromDb(Guid georepId) { + getDbFacade().getGlusterGeoreplicationDao().removeGeoreplication(georepId); + } + + @Override + public DbFacade getDbFacade() { + return DbFacade.getInstance(); + } + + @Override + public AuditLogType getAuditLogTypeValue() { + if (getSucceeded()) { + return AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_STOP; + } else { + return errorType == null + ? AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_STOP_FAILED + : errorType; + } + } +} 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 b5dd23c..e3d35ba 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 @@ -213,6 +213,8 @@ PASSWORDLESS_SSH_CONFIG_FAILED(4407), GLUSTER_VOLUME_GEO_REPLICATION_START(4022), GLUSTER_VOLUME_GEO_REPLICATION_START_FAILED(4023), + GLUSTER_VOLUME_GEO_REPLICATION_STOP(4024), + GLUSTER_VOLUME_GEO_REPLICATION_STOP_FAILED(4025), USER_VDS_RESTART(41), USER_FAILED_VDS_RESTART(107), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcEventNotificationUtils.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcEventNotificationUtils.java index ad57b05..769cb44 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcEventNotificationUtils.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcEventNotificationUtils.java @@ -64,6 +64,10 @@ AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_START); AddEventNotificationEntry(EventNotificationEntity.GlusterVolume, AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_START_FAILED); + AddEventNotificationEntry(EventNotificationEntity.GlusterVolume, + AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_STOP); + AddEventNotificationEntry(EventNotificationEntity.GlusterVolume, + AuditLogType.GLUSTER_VOLUME_GEO_REPLICATION_STOP_FAILED); // DWH AddEventNotificationEntry(EventNotificationEntity.DWH, AuditLogType.DWH_STOPPED); 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 374857d..2b012d1 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 @@ -257,6 +257,7 @@ AddBricksToGlusterVolume(1409, ActionGroup.MANIPULATE_GLUSTER_VOLUME), ConfigPasswordlessSsh(1410, ActionGroup.CONFIGURE_PASSWORDLESS_SSH), GlusterVolumeGeoreplicationStart(1411, ActionGroup.MANIPULATE_GLUSTER_VOLUME), + GlusterVolumeGeoreplicationStop(1412, ActionGroup.MANIPULATE_GLUSTER_VOLUME), ; private int intValue; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoreplicationIdParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoreplicationIdParameters.java new file mode 100644 index 0000000..c3f79e0 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoreplicationIdParameters.java @@ -0,0 +1,28 @@ +package org.ovirt.engine.core.common.action.gluster; + +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.compat.Guid; + +/** + * Command parameters for Geo-replication stop, status and config actions + */ +public class GlusterVolumeGeoreplicationIdParameters extends VdcActionParametersBase { + + private static final long serialVersionUID = 7803930563846142720L; + + + private Guid id; + + public GlusterVolumeGeoreplicationIdParameters(Guid id) { + setId(id); + } + + public Guid getId() { + return id; + } + + public void setId(Guid id) { + this.id = id; + } + +} 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 621fde4..3d02f9d 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 @@ -348,7 +348,7 @@ SshRsaPubKeyGenerationFailed(4505), SshSetupFailed(4506), GlusterVolumeGeoReplicationStartFailed(4160), - + GlusterVolumeGeoReplicationStopFailed(4161), UnicodeArgumentException(4900), 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 50b6f7d..6857bf5 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 @@ -141,6 +141,7 @@ GetPasswordlessSshStatus("org.ovirt.engine.core.vdsbroker.gluster"), ConfigPasswordlessSsh("org.ovirt.engine.core.vdsbroker.gluster"), GlusterVolumeGeoReplicationStart("org.ovirt.engine.core.vdsbroker.gluster"), + GlusterVolumeGeoReplicationStop("org.ovirt.engine.core.vdsbroker.gluster"), ; String packageName; diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java index 28602a5..9d4b58f 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java @@ -666,6 +666,7 @@ ACTION_TYPE_FAILED_SERVER_IS_NOT_UP, ACTION_TYPE_FAILED_INVALID_REMOTE_HOSTNAME, ACTION_TYPE_FAILED_VOLUME_OR_DIR_REQUIRED, + ACTION_TYPE_FAILED_NO_GEOREPLICATION_FOUND, VM_INTERFACE_NOT_EXIST, ACTION_TYPE_FAILED_CANNOT_REMOVE_ACTIVE_DEVICE, 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 b971315..7cf9160 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -771,6 +771,7 @@ ACTION_TYPE_FAILED_GLUSTER_VOLUME_ALREADY_STOPPED=Cannot ${action} ${type}. Gluster Volume ${volumeName} already stopped. ACTION_TYPE_FAILED_GLUSTER_BRICK_INVALID=Cannot ${action} ${type}. Invalid gluster brick. ACTION_TYPE_FAILED_BRICK_ID_REQUIRED=Cannot ${action} ${type}. Brick ID is required. +ACTION_TYPE_FAILED_NO_GEOREPLICATION_FOUND=Cannot ${action} ${type}. Could not found the Gluster Volume Geo-replication. VMPAYLOAD_INVALID_PAYLOAD_TYPE=VM Payload only supported in CDROM or Floppy devices VMPAYLOAD_SIZE_EXCEEDED=Payload is limited to ${size}K VMPAYLOAD_CDROM_EXCEEDED=Payload CDROM cannot be used when using an additional CDROM diff --git a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties index 89bf576..da396be 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties @@ -71,6 +71,7 @@ job.RemoveSnapshot=Removing Snapshot ${Snapshot} of VM ${VM} job.ConfigPasswordlessSsh=Configuring Passwordless SSH on Server ${VDS}. job.GlusterVolumeGeoReplicationStart=Starting Gluster Volume ${GlusterVolume} Geo-Replication on Server ${VDS}. +job.GlusterVolumeGeoReplicationStart=Stopping Gluster Volume ${GlusterVolume} Geo-Replication on Server ${VDS}. # Step types step.VALIDATING=Validating 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 f157a61..2c123d0 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties @@ -323,6 +323,7 @@ GlusterAddHostFailed=Gluster Server Add Failed GlusterPeerListFailed=Gluster Peer List Failed GlusterVolumeGeoReplicationStartFailed=Gluster Volume Geo-replication Start Failed +GlusterVolumeGeoReplicationStopFailed=Gluster Volume Geo-replication Stop Failed CANT_RECONSTRUCT_WHEN_A_DOMAIN_IN_POOL_IS_LOCKED=Can't reconstruct the Master Domain when the Data Center contains Domains in Locked state.\nPlease wait until the operation for these Domains ends before trying to reconstruct the Master Domain again. NO_IMPLEMENTATION=Not implemented diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoreplicationStopVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoreplicationStopVDSCommand.java new file mode 100644 index 0000000..010aaf7 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoreplicationStopVDSCommand.java @@ -0,0 +1,25 @@ +package org.ovirt.engine.core.vdsbroker.gluster; + +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeGeoreplicationVDSParameters; +import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc; + +public class GlusterVolumeGeoreplicationStopVDSCommand<P extends GlusterVolumeGeoreplicationVDSParameters> extends AbstractGlusterBrokerCommand<P> { + public GlusterVolumeGeoreplicationStopVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected StatusForXmlRpc getReturnStatus() { + return status.mStatus; + } + + @Override + protected void ExecuteVdsBrokerCommand() { + status = + getBroker().glusterVolumeGeoReplicationStop(getParameters().getVolumeName(), + getParameters().getRemoteServer(), + getParameters().getRemoteDir()); + + ProceedProxyReturnValue(); + } +} 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 655bd22..c305cc4 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 @@ -248,4 +248,9 @@ StatusOnlyReturnForXmlRpc glusterVolumeGeoReplicationStart(String volumeName, String remoteServer, String remoteDir); + + StatusOnlyReturnForXmlRpc glusterVolumeGeoReplicationStop(String volumeName, + String remoteServer, + String remoteDir); + } 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 d552695..b2873ba 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 @@ -243,4 +243,8 @@ public Map<String, Object> glusterVolumeGeoReplicationStart(String volumeName, String remoteServer, String remoteDir); + + public Map<String, Object> glusterVolumeGeoReplicationStop(String volumeName, + String remoteServer, + String remoteDir); } 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 e836b09..b336e87 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 @@ -1191,4 +1191,16 @@ } } + @Override + public StatusOnlyReturnForXmlRpc glusterVolumeGeoReplicationStop(String volumeName, + String remoteServer, + String remoteDir) { + try { + return new StatusOnlyReturnForXmlRpc(vdsServer.glusterVolumeGeoReplicationStop(volumeName, + remoteServer, + remoteDir)); + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } + } } -- To view, visit http://gerrit.ovirt.org/8922 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0ea1eff5552f1cc84c12344db67c643ab97f6bc0 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Selvasundaram <sesub...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches