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