Juan Hernandez has uploaded a new change for review. Change subject: restapi: Support multiple links to DC from SD ......................................................................
restapi: Support multiple links to DC from SD Currently the Storage Domains available in the top level /storagedomains collection don't have a reference to the Data Centers that they are attached to. Only the /datacenters/{datacenter:id}/storagedomains collection provides this information, but in the context of particular Data Center, so there is no way to easily find out to which Data Centers a Storage Domain is attached to. In general a Storage Domain may be attached to multiple Data Centers simultaneously (an ISO Storage Domain in particular). To simplify finding the Data Centers this patch adds a new "data_centers" attribute to all the Storage Domain collections. This will contain a set of links to the Data Centers. For example: GET /storagedomains/{storagedomain:id} <storage_domain id="..." href="..."> <name>mydata</name> <data_centers> <data_center id="..." href="..."/> <data_center id="..." href="..."/> ... </data_centers> </storage_domain> The previously existing "data_center" (capable of holding one Data Center only) will be preserved for backwards compatibility, but it will removed in the next major release. Change-Id: I55c52309645f73d7a790c07135c21acf91feb824 Bug-Url: https://bugzilla.redhat.com/1132499 Signed-off-by: Juan Hernandez <juan.hernan...@redhat.com> --- M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.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 M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/StorageDomainHelper.java 6 files changed, 127 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/06/35406/1 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 8613678..b244d80 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 @@ -2679,7 +2679,17 @@ <xs:complexContent> <xs:extension base="BaseResource"> <xs:sequence> + <!-- This is used to link to the Data Center that the Storage Domain + is attached to. It is preserved for backwards compatibility, as + the Storage Domain may be attached to multiple Data Centers (if + it is an ISO domain). Use the "data_centers" element + instead. --> <xs:element ref="data_center" minOccurs="0"/> + + <!-- This is a set of links to the data centers that the Storage + Domain is attached to. --> + <xs:element ref="data_centers" minOccurs="0" maxOccurs="1"/> + <xs:element name="type" type="xs:string" minOccurs="0"/> <xs:element ref="status" minOccurs="0" maxOccurs="1"/> <xs:element name="master" type="xs:boolean" minOccurs="0"/> diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainResource.java index 2597964..4c8b706 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainResource.java @@ -2,18 +2,23 @@ import javax.ws.rs.core.Response; +import org.apache.commons.collections.CollectionUtils; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.DataCenter; +import org.ovirt.engine.api.model.DataCenters; import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.AttachedStorageDomainResource; import org.ovirt.engine.api.resource.DisksResource; +import org.ovirt.engine.api.restapi.util.StorageDomainHelper; import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase; import org.ovirt.engine.core.common.queries.StorageDomainAndPoolQueryParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; + +import java.util.List; public class BackendAttachedStorageDomainResource extends AbstractBackendActionableResource<StorageDomain, org.ovirt.engine.core.common.businessentities.StorageDomain> @@ -53,8 +58,22 @@ @Override protected StorageDomain addParents(StorageDomain storageDomain) { + // This is for backwards compatibility and will be removed in the future: storageDomain.setDataCenter(new DataCenter()); storageDomain.getDataCenter().setId(dataCenterId.toString()); + + // Find all the data centers that this storage domain is attached to and add references to them: + List<Guid> dataCenterIds = StorageDomainHelper.getAttachedDataCenters(this, guid); + if (!CollectionUtils.isEmpty(dataCenterIds)) { + DataCenters dataCenters = new DataCenters(); + for (Guid dataCenterId : dataCenterIds) { + DataCenter dataCenter = new DataCenter(); + dataCenter.setId(dataCenterId.toString()); + dataCenters.getDataCenters().add(dataCenter); + } + storageDomain.setDataCenters(dataCenters); + } + return storageDomain; } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java index 9d3568f..f63eed9 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java @@ -4,12 +4,15 @@ import javax.ws.rs.core.Response; +import org.apache.commons.collections.CollectionUtils; import org.ovirt.engine.api.model.DataCenter; +import org.ovirt.engine.api.model.DataCenters; import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.api.model.StorageDomains; import org.ovirt.engine.api.model.StorageType; import org.ovirt.engine.api.resource.AttachedStorageDomainResource; import org.ovirt.engine.api.resource.AttachedStorageDomainsResource; +import org.ovirt.engine.api.restapi.util.StorageDomainHelper; import org.ovirt.engine.core.common.action.AttachStorageDomainToPoolParameters; import org.ovirt.engine.core.common.action.DetachStorageDomainFromPoolParameters; import org.ovirt.engine.core.common.action.RemoveStorageDomainParameters; @@ -19,6 +22,8 @@ import org.ovirt.engine.core.common.queries.StorageDomainAndPoolQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; + +import java.util.List; public class BackendAttachedStorageDomainsResource extends AbstractBackendCollectionResource<StorageDomain, org.ovirt.engine.core.common.businessentities.StorageDomain> @@ -83,8 +88,23 @@ @Override protected StorageDomain addParents(StorageDomain storageDomain) { + // This is for backwards compatibility and will be removed in the future: storageDomain.setDataCenter(new DataCenter()); storageDomain.getDataCenter().setId(dataCenterId.toString()); + + // Find all the data centers that this storage domain is attached to and add references to them: + Guid storageDomainId = Guid.createGuidFromString(storageDomain.getId()); + List<Guid> dataCenterIds = StorageDomainHelper.getAttachedDataCenters(this, storageDomainId); + if (!CollectionUtils.isEmpty(dataCenterIds)) { + DataCenters dataCenters = new DataCenters(); + for (Guid dataCenterId : dataCenterIds) { + DataCenter dataCenter = new DataCenter(); + dataCenter.setId(dataCenterId.toString()); + dataCenters.getDataCenters().add(dataCenter); + } + storageDomain.setDataCenters(dataCenters); + } + return storageDomain; } 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 05fef92..9b1f952 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 @@ -6,7 +6,10 @@ import java.util.LinkedList; import java.util.List; +import org.apache.commons.collections.CollectionUtils; import org.ovirt.engine.api.common.util.StatusUtils; +import org.ovirt.engine.api.model.DataCenter; +import org.ovirt.engine.api.model.DataCenters; import org.ovirt.engine.api.model.LogicalUnit; import org.ovirt.engine.api.model.Storage; import org.ovirt.engine.api.model.StorageDomain; @@ -337,4 +340,19 @@ return inject(new BackendAssignedDiskProfilesResource(id)); } + @Override + protected StorageDomain addParents(StorageDomain model) { + // Find all the data centers that this storage domain is attached to and add references to them: + List<Guid> dataCenterIds = StorageDomainHelper.getAttachedDataCenters(this, guid); + if (!CollectionUtils.isEmpty(dataCenterIds)) { + DataCenters dataCenters = new DataCenters(); + for (Guid dataCenterId : dataCenterIds) { + DataCenter dataCenter = new DataCenter(); + dataCenter.setId(dataCenterId.toString()); + dataCenters.getDataCenters().add(dataCenter); + } + model.setDataCenters(dataCenters); + } + return model; + } } 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 53b6901..58f9038 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 @@ -9,8 +9,11 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.api.common.util.StatusUtils; +import org.ovirt.engine.api.model.DataCenter; +import org.ovirt.engine.api.model.DataCenters; import org.ovirt.engine.api.model.Fault; import org.ovirt.engine.api.model.LogicalUnit; import org.ovirt.engine.api.model.Storage; @@ -466,4 +469,21 @@ org.ovirt.engine.core.common.businessentities.StorageDomain entity) { return model; } + + @Override + protected StorageDomain addParents(StorageDomain model) { + // Find all the data centers that this storage domain is attached to and add references to them: + Guid storageDomainId = Guid.createGuidFromString(model.getId()); + List<Guid> dataCenterIds = StorageDomainHelper.getAttachedDataCenters(this, storageDomainId); + if (!CollectionUtils.isEmpty(dataCenterIds)) { + DataCenters dataCenters = new DataCenters(); + for (Guid dataCenterId : dataCenterIds) { + DataCenter dataCenter = new DataCenter(); + dataCenter.setId(dataCenterId.toString()); + dataCenters.getDataCenters().add(dataCenter); + } + model.setDataCenters(dataCenters); + } + return model; + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/StorageDomainHelper.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/StorageDomainHelper.java index 9394409..1da4121 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/StorageDomainHelper.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/util/StorageDomainHelper.java @@ -1,19 +1,51 @@ package org.ovirt.engine.api.restapi.util; +import org.ovirt.engine.api.restapi.resource.BackendResource; +import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +import java.util.ArrayList; +import java.util.List; public class StorageDomainHelper { - public static StorageServerConnections getConnection(StorageType storageType, String address, String target, String userName, String password, Integer port) { return new StorageServerConnections(address, - null, - target, - password, - storageType, - userName, - port==null ? null : Integer.toString(port), - StorageServerConnections.DEFAULT_TPGT); + null, + target, + password, + storageType, + userName, + port == null ? null : Integer.toString(port), + StorageServerConnections.DEFAULT_TPGT); + } + + /** + * Returns the identifiers of the Data Centers that the given Storage Domain is attached to. + * + * @param id the identifier of the Storage Domain + * @return a list containing the identifiers of the Data Centers that the Storage Domain is attached to, or an + * empty list if it isn't attached to any Data Center + */ + public static List<Guid> getAttachedDataCenters(BackendResource resource, Guid id) { + // Note that this implementation is far from efficient, as we are retrieving all the content of the Storage + // Domains and immediately discarding everything but the identifiers of the Data Centers. It would be better to + // have a query that returns only the identifiers. + List<Guid> ids = new ArrayList<>(1); + VdcQueryReturnValue result = resource.runQuery(VdcQueryType.GetStorageDomainListById, new IdQueryParameters(id)); + if (result != null && result.getSucceeded()) { + List<StorageDomain> storageDomains = result.getReturnValue(); + if (storageDomains != null) { + for (StorageDomain storageDomain : storageDomains) { + ids.add(storageDomain.getStoragePoolId()); + } + } + } + return ids; } } -- To view, visit http://gerrit.ovirt.org/35406 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I55c52309645f73d7a790c07135c21acf91feb824 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Juan Hernandez <juan.hernan...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches