diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java index 6ea66d89901..dbec0a7643c 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClusterResource.java @@ -4,6 +4,7 @@ import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Action; +import org.ovirt.engine.api.model.ActionableResource; import org.ovirt.engine.api.resource.AffinityGroupsResource; import org.ovirt.engine.api.resource.AssignedCpuProfilesResource; import org.ovirt.engine.api.resource.AssignedPermissionsResource; @@ -16,6 +17,7 @@ import org.ovirt.engine.api.resource.gluster.GlusterVolumesResource; import org.ovirt.engine.api.restapi.resource.gluster.BackendGlusterHooksResource; import org.ovirt.engine.api.restapi.resource.gluster.BackendGlusterVolumesResource; +import org.ovirt.engine.api.restapi.resource.utils.LinksTreeNode; import org.ovirt.engine.api.restapi.util.LinkHelper; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.ActionParametersBase; @@ -182,4 +184,26 @@ public ClusterEnabledFeaturesResource getEnabledFeaturesResource() { public ClusterExternalProvidersResource getExternalNetworkProvidersResource() { return inject(new BackendClusterExternalNetworkProvidersResource(guid)); } + + @Override + public void follow(ActionableResource entity, LinksTreeNode linksTree) { + org.ovirt.engine.api.model.Cluster cluster = (org.ovirt.engine.api.model.Cluster)entity; + removeGlusterVolumesFromFollowTree(linksTree, cluster); + } + + /** + * specific case: + * + * if this cluster does not have gluster-service (meaning it's virt-only), but + * the user has requested to follow it's gluster_volumes link, silently ignore + * this request. It doesn't make sense to the Engine and if it reaches it, an + * exception will be thrown (see: https://bugzilla.redhat.com/2079361) + */ + static void removeGlusterVolumesFromFollowTree(LinksTreeNode linksTree, org.ovirt.engine.api.model.Cluster cluster) { + final String GLUSTER_VOLUMES = "gluster_volumes"; + if ((!cluster.isSetGlusterService() || !cluster.isGlusterService()) + && linksTree.pathExists(GLUSTER_VOLUMES)) { + linksTree.markAsFollowed(GLUSTER_VOLUMES); + } + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java index f947d618f4d..f3c029fca15 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendClustersResource.java @@ -6,10 +6,12 @@ import javax.ws.rs.core.Response; +import org.ovirt.engine.api.model.ActionableResource; import org.ovirt.engine.api.model.Clusters; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.resource.ClusterResource; import org.ovirt.engine.api.resource.ClustersResource; +import org.ovirt.engine.api.restapi.resource.utils.LinksTreeNode; import org.ovirt.engine.api.restapi.util.LinkHelper; import org.ovirt.engine.core.common.action.ActionType; import org.ovirt.engine.core.common.action.ClusterOperationParameters; @@ -148,4 +150,12 @@ protected org.ovirt.engine.api.model.Cluster doPopulate(org.ovirt.engine.api.mod return cluster; } + + @Override + public void follow(ActionableResource entity, LinksTreeNode linksTree) { + Clusters clusters = (Clusters)entity; + for (org.ovirt.engine.api.model.Cluster cluster : clusters.getClusters()) { + BackendClusterResource.removeGlusterVolumesFromFollowTree(linksTree, cluster); + } + } }