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 <[email protected]>
---
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 <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches