Sergey Gotliv has uploaded a new change for review.

Change subject: restapi: [WIP] Add REST API support for iSCSI multipathing
......................................................................

restapi: [WIP] Add REST API support for iSCSI multipathing

Enable adding, updating and removing iSCSI Bonds through REST API.

Change-Id: Id8881110cbeb163e9fc09e98bf4497d894f40490
Signed-off-by: Sergey Gotliv <[email protected]>
---
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DataCenterResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondsResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterIscsiBondsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCentersResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendIscsiBondResource.java
A 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/IscsiBondMapper.java
10 files changed, 252 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/25/26225/1

diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DataCenterResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DataCenterResource.java
index bb0970d..45275da 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DataCenterResource.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/DataCenterResource.java
@@ -38,4 +38,7 @@
 
     @Path("quotas")
     public QuotasResource getQuotasResource();
+
+    @Path("iscsibonds")
+    public IscsiBondsResource getIscsiBondsResource();
 }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondResource.java
new file mode 100644
index 0000000..4315dbf
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondResource.java
@@ -0,0 +1,17 @@
+package org.ovirt.engine.api.resource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Produces;
+
+import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
+import org.ovirt.engine.api.model.IscsiBond;
+
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface IscsiBondResource {
+
+    @PUT
+    @Formatted
+    @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+    public IscsiBond update(IscsiBond iscsiBond);
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondsResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondsResource.java
new file mode 100644
index 0000000..96e967f
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/IscsiBondsResource.java
@@ -0,0 +1,35 @@
+package org.ovirt.engine.api.resource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+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;
+
+import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
+import org.ovirt.engine.api.model.IscsiBond;
+import org.ovirt.engine.api.model.IscsiBonds;
+
+@Path("/iscsibonds")
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface IscsiBondsResource {
+
+    @GET
+    @Formatted
+    public IscsiBonds list();
+
+    @POST
+    @Formatted
+    @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+    public Response add(IscsiBond iscsiBond);
+
+    @DELETE
+    @Path("{id}")
+    public Response remove(@PathParam("id") String id);
+
+    @Path("{id}")
+    public IscsiBondResource getIscsiBondSubResource(@PathParam("id") String 
id);
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
index e9ff142..3389ff1 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
@@ -48,6 +48,7 @@
 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.IscsiBond;
 import org.ovirt.engine.api.model.Job;
 import org.ovirt.engine.api.model.Label;
 import org.ovirt.engine.api.model.Link;
@@ -119,6 +120,8 @@
 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.IscsiBondResource;
+import org.ovirt.engine.api.resource.IscsiBondsResource;
 import org.ovirt.engine.api.resource.JobResource;
 import org.ovirt.engine.api.resource.JobsResource;
 import org.ovirt.engine.api.resource.LabelResource;
@@ -384,6 +387,10 @@
 
         map = new ParentToCollectionMap(VmSessionResource.class, 
VmSessionsResource.class, VM.class);
         TYPES.put(Session.class, map);
+
+        map = new ParentToCollectionMap(IscsiBondResource.class, 
IscsiBondsResource.class);
+        map.add(IscsiBondResource.class, IscsiBondsResource.class, 
DataCenter.class);
+        TYPES.put(IscsiBond.class, map);
     }
 
     /**
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 746b8b0..2213db8 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
@@ -4028,4 +4028,36 @@
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
+
+  <xs:complexType name="IscsiBond">
+    <xs:complexContent>
+        <xs:extension base="BaseResource">
+            <xs:sequence>
+                <xs:element name="connectionId" type="xs:string" minOccurs="1" 
maxOccurs="unbounded" />
+                <xs:element name="networkId" type="xs:string" minOccurs="1" 
maxOccurs="unbounded" />
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="IscsiBonds">
+    <xs:complexContent>
+        <xs:extension base="BaseResources">
+            <xs:sequence>
+                <xs:annotation>
+                    <xs:appinfo>
+                        <jaxb:property name="IscsiBonds" />
+                    </xs:appinfo>
+                </xs:annotation>
+                <xs:element ref="iscsi_bond" minOccurs="0" 
maxOccurs="unbounded" />
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="iscsi_bond" type="IscsiBond"/>
+
+  <xs:element name="iscsi_bonds" type="IscsiBonds"/>
+
+
 </xs:schema>
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterIscsiBondsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterIscsiBondsResource.java
new file mode 100644
index 0000000..b89a7bf
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterIscsiBondsResource.java
@@ -0,0 +1,71 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import java.util.List;
+
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+
+import org.ovirt.engine.api.model.IscsiBond;
+import org.ovirt.engine.api.model.IscsiBonds;
+import org.ovirt.engine.api.resource.IscsiBondResource;
+import org.ovirt.engine.api.resource.IscsiBondsResource;
+import org.ovirt.engine.api.restapi.types.IscsiBondMapper;
+import org.ovirt.engine.core.common.action.AddIscsiBondParameters;
+import org.ovirt.engine.core.common.action.RemoveIscsiBondParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+
+public class BackendDataCenterIscsiBondsResource extends 
AbstractBackendCollectionResource<IscsiBond, 
org.ovirt.engine.core.common.businessentities.IscsiBond>
+        implements IscsiBondsResource {
+
+    protected Guid dataCenterId;
+
+    protected BackendDataCenterIscsiBondsResource(String datacenterId) {
+        super(IscsiBond.class, 
org.ovirt.engine.core.common.businessentities.IscsiBond.class);
+        this.dataCenterId = asGuid(datacenterId);
+    }
+
+    @Override
+    public IscsiBonds list() {
+        List<org.ovirt.engine.core.common.businessentities.IscsiBond> 
iscsiBonds =
+                
getBackendCollection(VdcQueryType.GetIscsiBondsByStoragePoolId, new 
IdQueryParameters(dataCenterId));
+
+        return mapCollection(iscsiBonds);
+    }
+
+
+    protected IscsiBonds 
mapCollection(List<org.ovirt.engine.core.common.businessentities.IscsiBond> 
entities) {
+        IscsiBonds iscsiBonds = new IscsiBonds();
+
+        for (org.ovirt.engine.core.common.businessentities.IscsiBond entity : 
entities) {
+            IscsiBond iscsiBond = IscsiBondMapper.map(entity, null);
+            iscsiBonds.getIscsiBonds().add(addLinks(populate(iscsiBond, 
entity)));
+        }
+
+        return iscsiBonds;
+    }
+
+    @Override
+    public Response add(IscsiBond entity) {
+        // TODO
+        return null;
+    }
+
+    @Override
+    protected Response performRemove(String id) {
+        return performAction(VdcActionType.RemoveIscsiBond, new 
RemoveIscsiBondParameters(asGuid(id)));
+    }
+
+    @Override
+    @SingleEntityResource
+    public IscsiBondResource getIscsiBondSubResource(@PathParam("id") String 
id) {
+        return inject(new BackendIscsiBondResource(id));
+    }
+
+    @Override
+    protected IscsiBond doPopulate(IscsiBond model, 
org.ovirt.engine.core.common.businessentities.IscsiBond entity) {
+        return model;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterResource.java
index d75fb5a..1d49357 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCenterResource.java
@@ -11,6 +11,7 @@
 import org.ovirt.engine.api.resource.AttachedStorageDomainsResource;
 import org.ovirt.engine.api.resource.ClustersResource;
 import org.ovirt.engine.api.resource.DataCenterResource;
+import org.ovirt.engine.api.resource.IscsiBondsResource;
 import org.ovirt.engine.api.resource.NetworksResource;
 import org.ovirt.engine.api.resource.QuotasResource;
 import org.ovirt.engine.core.common.VdcObjectType;
@@ -76,6 +77,11 @@
          return inject(new BackendQuotasResource(id));
     }
 
+    @Override
+    public IscsiBondsResource getIscsiBondsResource() {
+        return inject(new BackendDataCenterIscsiBondsResource(id));
+    }
+
     public BackendDataCentersResource getParent() {
         return parent;
     }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCentersResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCentersResource.java
index ae12deb..b9c6029 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCentersResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendDataCentersResource.java
@@ -24,7 +24,7 @@
 public class BackendDataCentersResource extends
         AbstractBackendCollectionResource<DataCenter, StoragePool> implements 
DataCentersResource {
 
-    static final String[] SUB_COLLECTIONS = {"storagedomains", "clusters", 
"networks", "permissions", "quotas"};
+    static final String[] SUB_COLLECTIONS = {"storagedomains", "clusters", 
"networks", "permissions", "quotas", "iscsibonds"};
 
     public BackendDataCentersResource() {
         super(DataCenter.class, StoragePool.class, SUB_COLLECTIONS);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendIscsiBondResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendIscsiBondResource.java
new file mode 100644
index 0000000..74f0a91
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendIscsiBondResource.java
@@ -0,0 +1,23 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import org.ovirt.engine.api.model.IscsiBond;
+import org.ovirt.engine.api.resource.IscsiBondResource;
+
+public class BackendIscsiBondResource extends 
AbstractBackendActionableResource<IscsiBond, 
org.ovirt.engine.core.common.businessentities.IscsiBond>
+        implements IscsiBondResource {
+
+    public  BackendIscsiBondResource(String id) {
+        super(id, IscsiBond.class, 
org.ovirt.engine.core.common.businessentities.IscsiBond.class);
+    }
+
+    @Override
+    public IscsiBond update(IscsiBond iscsiBond) {
+        // TODO
+        return null;
+    }
+
+    @Override
+    protected IscsiBond doPopulate(IscsiBond model, 
org.ovirt.engine.core.common.businessentities.IscsiBond entity) {
+        return model;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/IscsiBondMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/IscsiBondMapper.java
new file mode 100644
index 0000000..c8da6c9
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/IscsiBondMapper.java
@@ -0,0 +1,57 @@
+package org.ovirt.engine.api.restapi.types;
+
+import org.ovirt.engine.api.model.IscsiBond;
+import org.ovirt.engine.core.compat.Guid;
+
+public class IscsiBondMapper {
+
+    @Mapping(from = IscsiBond.class, to = 
org.ovirt.engine.core.common.businessentities.IscsiBond.class)
+    public static org.ovirt.engine.core.common.businessentities.IscsiBond 
map(IscsiBond from,
+                                                                              
org.ovirt.engine.core.common.businessentities.IscsiBond to) {
+        org.ovirt.engine.core.common.businessentities.IscsiBond iscsiBond = 
(to != null) ?
+                to : new 
org.ovirt.engine.core.common.businessentities.IscsiBond();
+
+        if (from.isSetName()) {
+            iscsiBond.setName(from.getName());
+        }
+
+        if (from.isSetDescription()) {
+            iscsiBond.setDescription(from.getDescription());
+        }
+
+        if (from.isSetConnectionId()) {
+            iscsiBond.setStorageConnectionIds(from.getConnectionId());
+        }
+
+        if (from.isSetNetworkId()) {
+            for (String id : from.getNetworkId()) {
+                iscsiBond.getNetworkIds().add(Guid.createGuidFromString(id));
+            }
+        }
+
+        return iscsiBond;
+    }
+
+    @Mapping(from = 
org.ovirt.engine.core.common.businessentities.IscsiBond.class, to = 
IscsiBond.class)
+    public static IscsiBond 
map(org.ovirt.engine.core.common.businessentities.IscsiBond from, IscsiBond to) 
{
+
+        IscsiBond iscsiBond = (to != null) ? to : new IscsiBond();
+
+        iscsiBond.setName(from.getName());
+        iscsiBond.setDescription(from.getDescription());
+
+        if (from.getId() != null) {
+            iscsiBond.setId(from.getId().toString());
+        }
+
+        for (String connectionId : from.getStorageConnectionIds()) {
+            iscsiBond.getConnectionId().add(connectionId);
+        }
+
+        for (Guid networkId : from.getNetworkIds()) {
+            iscsiBond.getNetworkId().add(networkId.toString());
+        }
+
+        return iscsiBond;
+    }
+}


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

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

Reply via email to