Federico Simoncelli has uploaded a new change for review. Change subject: restapi: [wip] image entity and import from glance ......................................................................
restapi: [wip] image entity and import from glance Change-Id: Ief9104ff0eba175c90b42bc5651ada0f688eeb00 Signed-off-by: Federico Simoncelli <[email protected]> --- M backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImageResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImagesResource.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImagesResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java A backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ImageMapper.java 12 files changed, 297 insertions(+), 6 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/17348/1 diff --git a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java index a7f7da1..a6411ba 100644 --- a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java +++ b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java @@ -45,6 +45,7 @@ import org.ovirt.engine.api.model.Hook; import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.HostNIC; +import org.ovirt.engine.api.model.Image; import org.ovirt.engine.api.model.Job; import org.ovirt.engine.api.model.Link; import org.ovirt.engine.api.model.LinkCapabilities; @@ -108,6 +109,8 @@ import org.ovirt.engine.api.resource.HostResource; import org.ovirt.engine.api.resource.HostStorageResource; import org.ovirt.engine.api.resource.HostsResource; +import org.ovirt.engine.api.resource.ImageResource; +import org.ovirt.engine.api.resource.ImagesResource; import org.ovirt.engine.api.resource.JobResource; import org.ovirt.engine.api.resource.JobsResource; import org.ovirt.engine.api.resource.NetworkResource; @@ -234,6 +237,10 @@ map = new ParentToCollectionMap(FileResource.class, FilesResource.class, StorageDomain.class); TYPES.put(File.class, map); + map = new ParentToCollectionMap(ImageResource.class, ImagesResource.class); + map.add(ImageResource.class, ImagesResource.class, StorageDomain.class); + TYPES.put(Image.class, map); + map = new ParentToCollectionMap(GroupResource.class, GroupsResource.class); map.add(DomainGroupResource.class, DomainGroupsResource.class, Domain.class); TYPES.put(Group.class, map); diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImageResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImageResource.java new file mode 100644 index 0000000..aa5853e --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImageResource.java @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2010 Red Hat, Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.ovirt.engine.api.resource; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.Action; +import org.ovirt.engine.api.model.Actionable; +import org.ovirt.engine.api.model.Image; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) +public interface ImageResource extends ReadOnlyResource<Image> { + + @Path("{action: (import)}/{oid}") + public ActionResource getActionSubresource(@PathParam("action") String action, @PathParam("oid") String oid); + + @POST + @Formatted + @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) + @Actionable + @Path("import") + public Response doImport(Action action); + +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImagesResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImagesResource.java new file mode 100644 index 0000000..9ce8e99 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ImagesResource.java @@ -0,0 +1,13 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import org.ovirt.engine.api.model.Image; +import org.ovirt.engine.api.model.Images; + +@Path("/images") +@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) +public interface ImagesResource extends ReadOnlyResources<Image, Images> { + +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java index 9244d09..1424fb7 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainResource.java @@ -42,4 +42,7 @@ @Path("disks") public DisksResource getDisksResource(); + + @Path("images") + public ImagesResource getImagesResource(); } diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index 2a1c526..3d945f1 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -1741,6 +1741,36 @@ </xs:complexContent> </xs:complexType> + <!-- Images --> + + <xs:element name="image" type="Image"/> + + <xs:element name="images" type="Images"/> + + <xs:complexType name="Image"> + <xs:complexContent> + <xs:extension base="BaseResource"> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="Images"> + <xs:complexContent> + <xs:extension base="BaseResources"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="Images"/> + </xs:appinfo> + </xs:annotation> + <xs:element ref="image" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <!-- Hooks --> + <xs:element name="hook" type="Hook"/> <xs:element name="hooks" type="Hooks"/> diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml index ed9529a..e0046f1 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml @@ -959,6 +959,31 @@ signatures: [] urlparams: {} headers: {} +- name: /api/storagedomains/{storagedomain:id}/images|rel=get + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /api/storagedomains/{storagedomain:id}/images/{images:id}|rel=get + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} +- name: /api/storagedomains/{storagedomain:id}/images/{images:id}/import|rel=import + request: + body: + parameterType: Action + signatures: + - mandatoryArguments: {} + optionalArguments: {} + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Correlation-Id: {value: 'any string', required: false} - name: /api/storagedomains/{storagedomain:id}/permissions|rel=get request: body: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java index e342653..1123937 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendActionableResource.java @@ -18,12 +18,15 @@ 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.StoragePool; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.NameQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; + +import static org.ovirt.engine.api.restapi.resource.BackendDataCenterResource.getStoragePools; public abstract class AbstractBackendActionableResource <R extends BaseResource, Q /* extends IVdcQueryable */ > @@ -229,4 +232,9 @@ return null; } } + + public Guid getDataCenterId(Guid storageDomainId) { + List<StoragePool> storagepools = getStoragePools(storageDomainId, this); + return storagepools.size() > 0 ? storagepools.get(0).getId() : null; + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java new file mode 100644 index 0000000..efb2be0 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImageResource.java @@ -0,0 +1,77 @@ +package org.ovirt.engine.api.restapi.resource; + +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +import org.ovirt.engine.api.model.Action; +import org.ovirt.engine.api.model.Image; +import org.ovirt.engine.api.resource.ActionResource; +import org.ovirt.engine.api.resource.CreationResource; +import org.ovirt.engine.api.resource.ImageResource; +import org.ovirt.engine.core.common.action.ImportRepoImageParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.RepoImage; +import org.ovirt.engine.core.common.queries.GetImageByIdParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + + +public class BackendStorageDomainImageResource + extends AbstractBackendActionableResource<Image, org.ovirt.engine.core.common.businessentities.RepoImage> + implements ImageResource { + + final private Guid storageDomainId; + final private BackendStorageDomainImagesResource parent; + + protected BackendStorageDomainImageResource(String id, BackendStorageDomainImagesResource parent) { + super(id, Image.class, org.ovirt.engine.core.common.businessentities.RepoImage.class); + this.storageDomainId = parent.getStorageDomainId(); + this.parent = parent; + } + + public Guid getStorageDomainId() { + return storageDomainId; + } + + @Override + public Response doImport(Action action) { + validateParameters(action, "storageDomain.id|name"); + + ImportRepoImageParameters importParameters = new ImportRepoImageParameters(); + + importParameters.setSourceRepoImageId(id); + importParameters.setSourceStorageDomainId(getStorageDomainId()); + + importParameters.setStoragePoolId(getDataCenterId(getStorageDomainId(action))); + importParameters.setStorageDomainId(getStorageDomainId(action)); + +/* TODO: + Quota selectedQuota = (Quota) getQuota().getSelectedItem(); + + if (selectedQuota != null) { + importParameters.setQuotaId(selectedQuota.getId()); + } +*/ + return doAction(VdcActionType.ImportRepoImage, importParameters, action); + } + + @Override + public CreationResource getCreationSubresource(@PathParam("oid") String oid) { + return null; + } + + @Override + public ActionResource getActionSubresource(String action, String ids) { + return inject(new BackendActionResource(action, ids)); + } + + @Override + protected Image doPopulate(Image model, RepoImage entity) { + return model; + } + + @Override + public Image get() { + return performGet(VdcQueryType.GetImageById, new GetImageByIdParameters(getStorageDomainId(), id)); + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImagesResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImagesResource.java new file mode 100644 index 0000000..38c652d --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainImagesResource.java @@ -0,0 +1,61 @@ +package org.ovirt.engine.api.restapi.resource; + +import javax.ws.rs.core.Response; + +import org.ovirt.engine.api.model.Image; +import org.ovirt.engine.api.model.Images; +import org.ovirt.engine.api.resource.ImageResource; +import org.ovirt.engine.api.resource.ImagesResource; +import org.ovirt.engine.core.common.businessentities.ImageFileType; +import org.ovirt.engine.core.common.queries.GetImagesListParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +import java.util.List; + + +public class BackendStorageDomainImagesResource + extends AbstractBackendCollectionResource<Image, org.ovirt.engine.core.common.businessentities.RepoImage> + implements ImagesResource { + + Guid storageDomainId; + + public BackendStorageDomainImagesResource(Guid storageDomainId, String... subCollections) { + super(Image.class, org.ovirt.engine.core.common.businessentities.RepoImage.class); + this.storageDomainId = storageDomainId; + } + + @Override + public Images list() { + GetImagesListParameters getImagesListParams = new GetImagesListParameters(storageDomainId, ImageFileType.All); + getImagesListParams.setForceRefresh(true); + return mapCollection(getBackendCollection(VdcQueryType.GetImagesList, getImagesListParams)); + } + + @Override + public ImageResource getDeviceSubResource(String id) { + return inject(new BackendStorageDomainImageResource(id, this)); + } + + protected Guid getStorageDomainId() { + return storageDomainId; + } + + @Override + protected Response performRemove(String id) { + return Response.serverError().build(); // TODO: removal is not implemented yet + } + + @Override + protected Image doPopulate(Image model, org.ovirt.engine.core.common.businessentities.RepoImage entity) { + return model; + } + + protected Images mapCollection(List<org.ovirt.engine.core.common.businessentities.RepoImage> entities) { + Images collection = new Images(); + for (org.ovirt.engine.core.common.businessentities.RepoImage image : entities) { + collection.getImages().add(addLinks(populate(map(image), image))); + } + return collection; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java index 3edb851..0bcebef 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResource.java @@ -16,6 +16,7 @@ import org.ovirt.engine.api.model.VMs; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.DisksResource; +import org.ovirt.engine.api.resource.ImagesResource; import org.ovirt.engine.api.resource.RemovableStorageDomainContentsResource; import org.ovirt.engine.api.resource.FilesResource; import org.ovirt.engine.api.resource.StorageDomainResource; @@ -108,12 +109,16 @@ return type != null && type == StorageDomainType.EXPORT ? true : false; } + public static synchronized boolean isImageDomain(StorageDomain storageDomain) { + StorageDomainType type = StorageDomainType.fromValue(storageDomain.getType()); + return type != null && type == StorageDomainType.IMAGE; + } + public static synchronized String[] getLinksToExclude(StorageDomain storageDomain) { - return isIsoDomain(storageDomain) ? new String[] { "templates", "vms", "disks" } - : - isExportDomain(storageDomain) ? new String[]{"files"} - : - new String[]{"templates", "vms", "files"}; + return isIsoDomain(storageDomain) ? new String[] { "templates", "vms", "disks", "images" } + : isExportDomain(storageDomain) ? new String[] { "files", "images" } + : isImageDomain(storageDomain) ? new String[] { "templates", "vms", "files", "disks" } + : new String[] { "templates", "vms", "files", "images" }; } /** @@ -267,4 +272,9 @@ public DisksResource getDisksResource() { return inject(new BackendStorageDomainDisksResource(guid)); } + + @Override + public ImagesResource getImagesResource() { + return inject(new BackendStorageDomainImagesResource(guid)); + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java index 3f748ee..1e244ff 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResource.java @@ -48,7 +48,7 @@ extends AbstractBackendCollectionResource<StorageDomain, org.ovirt.engine.core.common.businessentities.StorageDomain> implements StorageDomainsResource { - static final String[] SUB_COLLECTIONS = { "permissions", "files", "templates", "vms", "disks" }; + static final String[] SUB_COLLECTIONS = { "permissions", "files", "templates", "vms", "disks", "images" }; private StorageDomain storageDomain = null; //utility variable; used in the context of a single activation of remove() diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ImageMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ImageMapper.java new file mode 100644 index 0000000..bf4d9d6 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ImageMapper.java @@ -0,0 +1,14 @@ +package org.ovirt.engine.api.restapi.types; + +import org.ovirt.engine.api.model.Image; +import org.ovirt.engine.core.common.businessentities.RepoImage; + +public class ImageMapper { + @Mapping(from = RepoImage.class, to = Image.class) + public static Image map(RepoImage entity, Image template) { + Image model = template != null ? template : new Image(); + model.setId(entity.getRepoImageId()); + model.setName(entity.getRepoImageName()); + return model; + } +} -- To view, visit http://gerrit.ovirt.org/17348 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ief9104ff0eba175c90b42bc5651ada0f688eeb00 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Federico Simoncelli <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
