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
