package org.ovirt.engine.api.restapi.resource; import static org.ovirt.engine.api.restapi.resource.BackendDataCenterResource.getStoragePool; import java.util.List; import javax.ws.rs.core.Response; 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.core.common.action.ManagementNetworkOnClusterOperationParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendClustersResource extends AbstractBackendCollectionResource<org.ovirt.engine.api.model.Cluster, Cluster> implements ClustersResource { static final String[] VIRT_ONLY_MODE_COLLECTIONS_TO_HIDE = {"glustervolumes", "glusterhooks" }; private final ManagementNetworkFinder managementNetworkFinder; public BackendClustersResource() { super(org.ovirt.engine.api.model.Cluster.class, Cluster.class); managementNetworkFinder = new ManagementNetworkFinder(this); } @Override public Clusters list() { ApplicationMode appMode = getCurrent().getApplicationMode(); if (appMode == ApplicationMode.VirtOnly) { return listVirtOnly(); } else { return listAll(); } } private Clusters listVirtOnly() { if (isFiltered()) { return mapVirtOnlyCollection(getBackendCollection(VdcQueryType.GetAllClusters, new VdcQueryParametersBase())); } else { return mapVirtOnlyCollection(getBackendCollection(SearchType.Cluster)); } } private Clusters listAll() { if (isFiltered()) { return mapCollection(getBackendCollection(VdcQueryType.GetAllClusters, new VdcQueryParametersBase())); } else { return mapCollection(getBackendCollection(SearchType.Cluster)); } } @Override public ClusterResource getClusterResource(String id) { return inject(new BackendClusterResource(id, this)); } @Override public Response add(org.ovirt.engine.api.model.Cluster cluster) { validateParameters(cluster, getMandatoryParameters()); StoragePool dataCenter = getDataCenter(cluster); return performCreate(VdcActionType.AddCluster, createAddCommandParams(cluster, dataCenter), new QueryIdResolver<Guid>(VdcQueryType.GetClusterById, IdQueryParameters.class)); } protected String[] getMandatoryParameters() { return new String[] { "name", "dataCenter.name|id" }; } protected StoragePool getDataCenter(org.ovirt.engine.api.model.Cluster cluster) { return getStoragePool(cluster.getDataCenter(), this); } private ManagementNetworkOnClusterOperationParameters createAddCommandParams(org.ovirt.engine.api.model.Cluster cluster, StoragePool dataCenter) { Cluster clusterEntity = map(cluster, map(dataCenter)); if (!(cluster.isSetErrorHandling() && cluster.getErrorHandling().isSetOnError())) { clusterEntity.setMigrateOnError(null); } final Guid managementNetworkId = managementNetworkFinder.getManagementNetworkId(cluster, dataCenter.getId()); return new ManagementNetworkOnClusterOperationParameters(clusterEntity, managementNetworkId); } protected Clusters mapCollection(List<Cluster> entities) { Clusters collection = new Clusters(); for (Cluster entity : entities) { collection.getClusters().add(addLinks(populate(map(entity), entity))); } return collection; } private Clusters mapVirtOnlyCollection(List<Cluster> entities) { Clusters collection = new Clusters(); for (Cluster entity : entities) { collection.getClusters().add(addLinks(populate(map(entity), entity), VIRT_ONLY_MODE_COLLECTIONS_TO_HIDE)); } return collection; } /** * Map the storage pool (i.e. datacenter entity) to a Cluster instance * with the same compatibility version */ protected Cluster map(StoragePool pool) { return getMapper(StoragePool.class, Cluster.class).map(pool, null); } @Override protected org.ovirt.engine.api.model.Cluster doPopulate(org.ovirt.engine.api.model.Cluster cluster, Cluster entity) { final Guid clusterId = entity.getId(); final org.ovirt.engine.core.common.businessentities.network.Network network = getOptionalEntity(org.ovirt.engine.core.common.businessentities.network.Network.class, VdcQueryType.GetManagementNetwork, new IdQueryParameters(clusterId), clusterId.toString(), false); if (network != null) { final Network managementNetwork = new Network(); managementNetwork.setCluster(cluster); managementNetwork.setId(network.getId().toString()); cluster.setManagementNetwork(managementNetwork); } return cluster; } }