Liron Ar has uploaded a new change for review.

Change subject: core: introudcing domain ovf handling commands
......................................................................

core: introudcing domain ovf handling commands

*CreateOvfVolumeForStorageDomainCommand
*ProccessOvfUpdateForStorageDomainCommand

Change-Id: Ifea111e6732ec0b6953d54ef03c29eb0dff6f837
Signed-off-by: Liron Aravot <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.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/constants/StorageConstants.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
M 
backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
8 files changed, 285 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/23529/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
new file mode 100644
index 0000000..f391a96
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
@@ -0,0 +1,125 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+
+import org.ovirt.engine.core.bll.job.ExecutionHandler;
+import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.AddDiskParameters;
+import org.ovirt.engine.core.common.action.AddImageFromScratchParameters;
+import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
+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.DiskImage;
+import org.ovirt.engine.core.common.businessentities.DiskInterface;
+import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo;
+import org.ovirt.engine.core.common.businessentities.VolumeFormat;
+import org.ovirt.engine.core.common.businessentities.VolumeType;
+import org.ovirt.engine.core.common.utils.SizeConverter;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
+import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute
+public class CreateOvfVolumeForStorageDomainCommand<T extends 
StorageDomainParametersBase> extends StorageDomainCommandBase<T> {
+    public CreateOvfVolumeForStorageDomainCommand(T parameters) {
+        super(parameters);
+        setStorageDomainId(getParameters().getStorageDomainId());
+        setStoragePoolId(getParameters().getStoragePoolId());
+    }
+
+    public CreateOvfVolumeForStorageDomainCommand(Guid commandId) {
+        super(commandId);
+    }
+
+    @Override
+
+    protected void executeCommand() {
+        DiskImage createdDisk = createDisk(getStorageDomainId());
+        AddDiskParameters diskParameters = new AddDiskParameters(null, 
createDisk(getStorageDomainId()));
+        diskParameters.setStorageDomainId(getStorageDomainId());
+        
diskParameters.setParentCommand(VdcActionType.CreateOvfVolumeForStorageDomain);
+        diskParameters.setParentParameters(getParameters());
+        diskParameters.setShouldRemainIllegalOnFailedExecution(true);
+        VdcReturnValueBase vdcReturnValueBase = 
Backend.getInstance().runInternalAction(VdcActionType.AddDisk, diskParameters,
+                
ExecutionHandler.createDefaultContexForTasks(getExecutionContext()));
+        Guid createdId = (Guid)vdcReturnValueBase.getActionReturnValue();
+
+        if (createdId != null) {
+            addStorageDomainOvfInfoToDbIfNeeded(createdId);
+        }
+
+        if (!vdcReturnValueBase.getSucceeded()) {
+            addCustomValue("DiskAlias", createdDisk.getDiskAlias());
+            if (createdId != null) {
+                AuditLogDirector.log(this, 
AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED);
+            } else {
+                AuditLogDirector.log(this, 
AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED);
+            }
+            setSucceeded(false);
+        }
+
+        setSucceeded(true);
+    }
+
+    public DiskImage createDisk(Guid domainId) {
+        DiskImage mNewCreatedDiskImage = new DiskImage();
+        mNewCreatedDiskImage.setDiskInterface(DiskInterface.IDE);
+        mNewCreatedDiskImage.setWipeAfterDelete(true);
+        mNewCreatedDiskImage.setDiskAlias("OVF_STORE");
+        mNewCreatedDiskImage.setDiskDescription("OVF_STORE_FOR_DOMAIN " + 
domainId);
+        mNewCreatedDiskImage.setShareable(true);
+        mNewCreatedDiskImage.setStorageIds(new 
ArrayList<>(Arrays.asList(domainId)));
+        mNewCreatedDiskImage.setSize(SizeConverter.BYTES_IN_GB);
+        mNewCreatedDiskImage.setvolumeFormat(VolumeFormat.RAW);
+        mNewCreatedDiskImage.setVolumeType(VolumeType.Sparse);
+        mNewCreatedDiskImage.setDescription("OVF_DISK_FOR_DOMAIN " + domainId);
+        mNewCreatedDiskImage.setCreationDate(new Date());
+        mNewCreatedDiskImage.setLastModified(new Date());
+        return mNewCreatedDiskImage;
+    }
+
+    private void addStorageDomainOvfInfoToDbIfNeeded(Guid diskId) {
+        StorageDomainOvfInfo storageDomainOvfInfoDb =
+                getStorageDomainOvfInfoDao()
+                        
.loadStorageDomainsInfoByDomainId(getStorageDomainId());
+
+        if (storageDomainOvfInfoDb == null) {
+            StorageDomainOvfInfo storageDomainOvfInfo =
+                    new StorageDomainOvfInfo(getStorageDomainId(), null, 
diskId, getStorageDomain().getStoragePoolId(), false);
+            getStorageDomainOvfInfoDao().save(storageDomainOvfInfo);
+
+        }
+    }
+
+    @Override
+    protected void endSuccessfully() {
+        endChildCommands();
+        // TODO: replace
+        addStorageDomainOvfInfoToDbIfNeeded(((AddImageFromScratchParameters) 
getParameters().getImagesParameters()
+                .get(0)).getDiskInfo().getId());
+        
Backend.getInstance().runInternalAction(VdcActionType.ProccessOvfUpdateForStorageDomain,
 getParameters());
+        setSucceeded(true);
+    }
+
+    protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() {
+        return getDbFacade().getStorageDomainOvfInfoDao();
+    }
+
+    private void endChildCommands() {
+        for (VdcActionParametersBase p : 
getParameters().getImagesParameters()) {
+            getBackend().endAction(p.getCommandType(), p);
+        }
+    }
+
+    @Override
+    protected void endWithFailure() {
+        endChildCommands();
+        AuditLogDirector.log(this, 
AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED);
+        setSucceeded(true);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java
new file mode 100644
index 0000000..a56466d
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProccessOvfUpdateForStorageDomainCommand.java
@@ -0,0 +1,144 @@
+package org.ovirt.engine.core.bll;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.ImageStatus;
+import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo;
+import org.ovirt.engine.core.common.constants.StorageConstants;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.locks.LockingGroup;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao;
+import org.ovirt.engine.core.dao.VmAndTemplatesGenerationsDAO;
+import org.ovirt.engine.core.utils.archivers.tar.InMemoryTar;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute
+@LockIdNameAttribute
+public class ProccessOvfUpdateForStorageDomainCommand<T extends 
StorageDomainParametersBase> extends StorageDomainCommandBase<T> {
+    private StorageDomainOvfInfo storageDomainOvfInfo;
+
+    public ProccessOvfUpdateForStorageDomainCommand(T parameters) {
+        super(parameters);
+        setStorageDomainId(parameters.getStorageDomainId());
+        setStoragePoolId(parameters.getStoragePoolId());
+    }
+
+    protected ProccessOvfUpdateForStorageDomainCommand(Guid commandId) {
+        super(commandId);
+    }
+
+    private StorageDomainOvfInfo getStorageDomainOvfData() {
+        if (storageDomainOvfInfo == null) {
+            storageDomainOvfInfo = DbFacade.getInstance()
+                    .getStorageDomainOvfInfoDao()
+                    .loadStorageDomainsInfoByDomainId(getStorageDomainId());
+        }
+        return storageDomainOvfInfo;
+    }
+
+    protected void updateOvfStoreContent() {
+        if (storageDomainOvfInfo.getOvfDiskId() != null) {
+            DiskImage image = 
(DiskImage)getDbFacade().getDiskDao().get(storageDomainOvfInfo.getOvfDiskId());
+            if (image.getImageStatus() == ImageStatus.OK) {
+                List<Guid> vmAndTemplatesIds =
+                        
getStorageDomainDAO().getVmAndTemplatesIdsByStorageDomainId(getParameters().getStorageDomainId());
+                int i = 0;
+                ByteArrayOutputStream bufferedOutputStream = new 
ByteArrayOutputStream();
+                InMemoryTar inMemoryTar = new 
InMemoryTar(bufferedOutputStream);
+                while (i < vmAndTemplatesIds.size()) {
+                    int size =
+                            
Math.min(StorageConstants.OVF_MAX_ITEMS_PER_SQL_STATEMENT, 
vmAndTemplatesIds.size() - i);
+                    List<Guid> idsToProcess = vmAndTemplatesIds.subList(i, i + 
size);
+                    i += size;
+
+                    List<Pair<Guid, String>> ovfs =
+                            
getVmAndTemplatesGenerationsDao().loadOvfDataForIds(idsToProcess);
+                    if (!ovfs.isEmpty()) {
+                        buildFilesForOvfs(ovfs, inMemoryTar);
+                    }
+                    inMemoryTar.closeTar();
+                }
+
+                ByteArrayInputStream byteArrayInputStream =
+                        new 
ByteArrayInputStream(bufferedOutputStream.toByteArray());
+                UploadStreamParameters uploadStreamParameters = new 
UploadStreamParameters(image.getStoragePoolId(), image.getStorageIds().get(0),
+                        image.getId(), image.getImageId(), 
byteArrayInputStream, "",
+                        Long.valueOf(bufferedOutputStream.size()));
+                uploadStreamParameters.setParentCommand(getActionType());
+                uploadStreamParameters.setParentParameters(getParameters());
+                if 
(Backend.getInstance().runInternalAction(VdcActionType.UploadStream, 
uploadStreamParameters
+                        ).getSucceeded()) {
+                    
getStorageDomainOvfInfoDao().updateOvfUpdatedInfo(Arrays.asList(getParameters().getStorageDomainId()),
+                            true);
+                    setSucceeded(true);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void executeCommand() {
+        StorageDomainOvfInfo storageDomainOvfInfo = getStorageDomainOvfData();
+
+        if (storageDomainOvfInfo != null) {
+            updateOvfStoreContent();
+        } else {
+            LinkedList<Guid> list = new LinkedList<>();
+            list.add(getParameters().getStorageDomainId());
+            
Backend.getInstance().runInternalAction(VdcActionType.CreateOvfVolumeForStorageDomain,
+                    getParameters());
+        }
+    }
+
+    protected Guid getImageId() {
+        return null;
+    }
+
+    protected void buildFilesForOvfs(List<Pair<Guid, String>> ovfs, 
InMemoryTar inMemoryTar) {
+            for (Pair<Guid, String> pair : ovfs) {
+                inMemoryTar.addTarEntry(pair.getSecond().getBytes(), 
pair.getFirst() + ".ovf");
+            }
+    }
+
+    protected VmAndTemplatesGenerationsDAO getVmAndTemplatesGenerationsDao() {
+        return DbFacade.getInstance().getVmAndTemplatesGenerationsDao();
+    }
+
+    protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() {
+        return DbFacade.getInstance().getStorageDomainOvfInfoDao();
+    }
+
+    @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        Map<String, Pair<String, String>> lockMap = new HashMap<>();
+        lockMap.put(getParameters().getStorageDomainId().toString(),
+                LockMessagesMatchUtil.makeLockingPair(LockingGroup.STORAGE, 
VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED));        StorageDomainOvfInfo 
domainOvfInfo = getStorageDomainOvfData();
+        if (domainOvfInfo != null && domainOvfInfo.getOvfDiskId() != null) {
+            lockMap.put(domainOvfInfo.getOvfDiskId().toString(), 
LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK, 
VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED));
+        }
+        return lockMap;
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        if (getActionState() == CommandActionState.EXECUTE && !getSucceeded()) 
{
+            return AuditLogType.UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED;
+        }
+
+        return super.getAuditLogTypeValue();
+    }
+}
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 71d5865..609d5b1 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
@@ -715,6 +715,10 @@
     RELOAD_CONFIGURATIONS_SUCCESS(1010),
     RELOAD_CONFIGURATIONS_FAILURE(1011),
 
+    UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED(1012),
+    CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED(1013),
+    CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED(1014),
+
     // Authentication
     USER_ACCOUNT_DISABLED_OR_LOCKED(1100, 
AuditLogTimeInterval.HOUR.getValue()),
     USER_ACCOUNT_PASSWORD_EXPIRED(1101, AuditLogTimeInterval.HOUR.getValue()),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java
new file mode 100644
index 0000000..06b2044
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateOvfForStorageDomainParameters.java
@@ -0,0 +1,4 @@
+package org.ovirt.engine.core.common.action;
+
+public class UpdateOvfForStorageDomainParameters extends 
StoragePoolParametersBase {
+}
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 19c7b2f..089ffb0 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
@@ -305,6 +305,8 @@
 
     UpdateMomPolicy(1900, ActionGroup.MANIPUTLATE_HOST, false, 
QuotaDependency.NONE),
     UploadStream(1901, QuotaDependency.NONE),
+    ProccessOvfUpdateForStorageDomain(1902, QuotaDependency.NONE),
+    CreateOvfVolumeForStorageDomain(1902, QuotaDependency.NONE);
 
     private int intValue;
     private ActionGroup actionGroup;
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java
index 4d1c694..58c1932 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/StorageConstants.java
@@ -3,5 +3,4 @@
 public class StorageConstants {
     public static final int SIZE_IS_NOT_AVAILABLE = -1;
     public static final int OVF_MAX_ITEMS_PER_SQL_STATEMENT = 100;
-    public static final int UPLOAD_SOCKET_TIMEOUT = 60;
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
index fca7342..5b1f0ee 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
@@ -456,6 +456,9 @@
         severities.put(AuditLogType.USER_ACTIVATE_STORAGE_DOMAIN_FAILED_ASYNC, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.STORAGE_DOMAIN_TASKS_ERROR, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.UPDATE_OVF_FOR_STORAGE_POOL_FAILED, 
AuditLogSeverity.WARNING);
+        severities.put(AuditLogType.UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED, 
AuditLogSeverity.WARNING);
+        
severities.put(AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED, 
AuditLogSeverity.WARNING);
+        
severities.put(AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED,
 AuditLogSeverity.WARNING);
         severities.put(AuditLogType.UPGRADE_STORAGE_POOL_ENCOUNTERED_PROBLEMS, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.DISK_ALIGNMENT_SCAN_START, 
AuditLogSeverity.NORMAL);
         severities.put(AuditLogType.DISK_ALIGNMENT_SCAN_FAILURE, 
AuditLogSeverity.WARNING);
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 7f44182..ea195a8 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
@@ -576,6 +576,9 @@
 VDS_HIGH_SWAP_USE=Used swap memory of host ${HostName} [${UsedSwap}%] exceeded 
defined threshold [${Threshold}%].
 VDS_LOW_SWAP=Available swap memory of host ${HostName} [${AvailableSwapMemory} 
MB] is under defined threshold [${Threshold} MB].
 UPDATE_OVF_FOR_STORAGE_POOL_FAILED=Failed to update VMs/Templates OVF data in 
Data Center ${StoragePoolName}.
+UPDATE_OVF_FOR_STORAGE_DOMAIN_FAILED=Failed to update VMs/Templates OVF data 
for Storage Domain ${StorageDomainName} in Data Center ${StoragePoolName}.
+CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED=Failed to create OVF store disk for 
Storage Domain ${StorageDomainName}.\n The Disk with the alias %{DiskAlias} 
might be removed manually for automatic attempt to create new one. \n OVF 
updates won't be attempted on the created disk.
+CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_INITIATE_FAILED=Failed to create OVF store 
disk for Storage Domain ${StorageDomainName}. \n OVF data won't be updated 
meanwhile for that domain.
 IMPORTEXPORT_FAILED_TO_IMPORT_VM=Failed to read VM '${ImportedVmName}' OVF, it 
may be corrupted
 IMPORTEXPORT_FAILED_TO_IMPORT_TEMPLATE=Failed to read Template '${Template}' 
OVF, it may be corrupted
 CANNOT_HIBERNATE_RUNNING_VMS_AFTER_CLUSTER_CPU_UPGRADE=Hibernation of VMs 
after CPU upgrade of Cluster ${VdsGroup} is not supported. Please stop and 
restart those VMs in case you wish to hibernate them


-- 
To view, visit http://gerrit.ovirt.org/23529
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifea111e6732ec0b6953d54ef03c29eb0dff6f837
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Ar <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to