Federico Simoncelli has uploaded a new change for review.

Change subject: [wip] backend: add the export glance image support
......................................................................

[wip] backend: add the export glance image support

Change-Id: Id93d40ebb812e4be8669ad14f6ba92aab4de28ac
Signed-off-by: Federico Simoncelli <fsimo...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportRepoImageCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/OpenstackImageProviderProxy.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
4 files changed, 176 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/19/16419/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportRepoImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportRepoImageCommand.java
new file mode 100644
index 0000000..2b8d167
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportRepoImageCommand.java
@@ -0,0 +1,132 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.bll.provider.OpenstackImageProviderProxy;
+import org.ovirt.engine.core.bll.provider.ProviderProxyFactory;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.ExportRepoImageParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.asynctasks.EntityInfo;
+import org.ovirt.engine.core.common.businessentities.ActionGroup;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.HttpLocationInfo;
+import org.ovirt.engine.core.common.businessentities.Provider;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import 
org.ovirt.engine.core.common.vdscommands.UploadImageVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+@SuppressWarnings("unused")
+public class ExportRepoImageCommand<T extends ExportRepoImageParameters> 
extends CommandBase<T> {
+
+    private DiskImage diskImage;
+
+    private OpenstackImageProviderProxy providerProxy;
+
+    public ExportRepoImageCommand(T parameters) {
+        super(parameters);
+        getParameters().setCommandType(getActionType());
+    }
+
+    protected OpenstackImageProviderProxy getProviderProxy() {
+        if (providerProxy == null) {
+            StorageDomain storageDomain = 
getStorageDomainDAO().get(getParameters().getDestinationDomainId());
+            Provider provider = getDbFacade().getProviderDao().get(new 
Guid(storageDomain.getStorage()));
+            providerProxy = 
ProviderProxyFactory.getInstance().create(provider);
+        }
+        return providerProxy;
+    }
+
+    @Override
+    protected AsyncTaskType getTaskType() {
+        return AsyncTaskType.copyImage;
+    }
+
+    @Override
+    protected void executeCommand() {
+        DiskImage diskImage = getDiskImage();
+        OpenstackImageProviderProxy proxy = getProviderProxy();
+
+        String newImageId = proxy.createImageFromDiskImage(diskImage);
+
+        HashMap<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/octet-stream");
+
+        if (proxy.getXAuthToken() != null) {
+            headers.put("X-Auth-Token", proxy.getXAuthToken());
+        }
+
+        getParameters().setParentCommand(VdcActionType.ExportRepoImage);
+
+        Guid taskId = getAsyncTaskId();// 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        getParameters().setEntityInfo(new EntityInfo(VdcObjectType.Disk, 
getParameters().getImageGroupID()));
+
+        VDSReturnValue vdsReturnValue = runVdsCommand(
+                VDSCommandType.UploadImage, new 
UploadImageVDSCommandParameters(
+                        getParameters().getStoragePoolId(),
+                        getParameters().getStorageDomainId(),
+                        getParameters().getImageGroupID(),
+                        getParameters().getImageId(),
+                        new HttpLocationInfo(proxy.getImageUrl(newImageId), 
headers)
+                ));
+
+        if (vdsReturnValue.getSucceeded()) {
+            getReturnValue().getInternalVdsmTaskIdList().add(
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
+                            getParameters().getParentCommand(),
+                            VdcObjectType.Disk,
+                            getParameters().getImageGroupID()));
+        }
+/*
+        if (vdsReturnValue.getSucceeded()) {
+            getReturnValue().getInternalVdsmTaskIdList().add(
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
+                            getParameters().getParentCommand(),
+                            VdcObjectType.Disk,
+                            getParameters().getImageGroupID()));
+        }
+*/
+        getReturnValue().setActionReturnValue(newImageId);
+        setSucceeded(true);
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        List<PermissionSubject> permissionSubjects = new ArrayList<>();
+        permissionSubjects.add(new PermissionSubject(
+                getDiskImage().getId(), VdcObjectType.Disk, 
ActionGroup.ATTACH_DISK));
+        return permissionSubjects;
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__MOVE);
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_DISK);
+    }
+
+    @Override
+    public Guid getStorageDomainId() {
+        return getParameters().getStorageDomainId();
+    }
+
+    protected DiskImage getDiskImage() {
+        if (diskImage == null) {
+            diskImage = 
getDbFacade().getDiskImageDao().get(getParameters().getImageId());
+        }
+        return diskImage;
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        return true;
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/OpenstackImageProviderProxy.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/OpenstackImageProviderProxy.java
index edfe060..5612305 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/OpenstackImageProviderProxy.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/OpenstackImageProviderProxy.java
@@ -219,6 +219,26 @@
         return diskImage;
     }
 
+    public String createImageFromDiskImage(DiskImage diskImage) {
+        Image glanceImage = new Image();
+
+        glanceImage.setName(diskImage.getDiskAlias());
+
+        if (diskImage.getVolumeFormat() == VolumeFormat.RAW) {
+            glanceImage.setDiskFormat(GlanceImageFormat.RAW.getValue());
+        } else if (diskImage.getVolumeFormat() == VolumeFormat.COW) {
+            glanceImage.setDiskFormat(GlanceImageFormat.COW.getValue());
+        } else {
+            throw new RuntimeException("Unknown disk format: " + 
diskImage.getVolumeFormat());
+        }
+
+        glanceImage.setContainerFormat(GlanceImageContainer.BARE.getValue());
+
+        Image retGlanceImage = 
getGlanceClient().images().create(glanceImage).execute();
+
+        return retGlanceImage.getId();
+    }
+
     private long getCowVirtualSize(String id) throws IOException {
         // For the qcow2 format we need to download the image header and read 
the virtual size from there
         byte[] imgContent = new byte[72];
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java
new file mode 100644
index 0000000..6c74c5b
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExportRepoImageParameters.java
@@ -0,0 +1,23 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class ExportRepoImageParameters extends ImagesActionsParametersBase {
+
+    private static final long serialVersionUID = 8168949491104775480L;
+
+    private Guid destinationDomainId;
+
+    public ExportRepoImageParameters(Guid imageId) {
+        super(imageId);
+    }
+
+    public Guid getDestinationDomainId() {
+        return destinationDomainId;
+    }
+
+    public void setDestinationDomainId(Guid destinationDomainId) {
+        this.destinationDomainId = destinationDomainId;
+    }
+
+}
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 56ce31a..7ab4bc2 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
@@ -217,6 +217,7 @@
     LiveMigrateVmDisks(1011, false, QuotaDependency.STORAGE),
     MoveDisks(1012, false, QuotaDependency.NONE),
     ImportRepoImage(1013, ActionGroup.CREATE_DISK, QuotaDependency.STORAGE),
+    ExportRepoImage(1014, QuotaDependency.NONE),
 
     // Event Notification
     AddEventSubscription(1100, false, QuotaDependency.NONE),


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id93d40ebb812e4be8669ad14f6ba92aab4de28ac
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimo...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to