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

Reply via email to