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

Reply via email to