package org.ovirt.engine.api.restapi.resource;
import java.util.List;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.DataCenter;
import org.ovirt.engine.api.resource.AssignedPermissionsResource;
import org.ovirt.engine.api.resource.AttachedStorageDomainsResource;
import org.ovirt.engine.api.resource.ClustersResource;
import org.ovirt.engine.api.resource.DataCenterNetworksResource;
import org.ovirt.engine.api.resource.DataCenterResource;
import org.ovirt.engine.api.resource.IscsiBondsResource;
import org.ovirt.engine.api.resource.QossResource;
import org.ovirt.engine.api.resource.QuotasResource;
import org.ovirt.engine.api.restapi.util.ParametersHelper;
import org.ovirt.engine.api.restapi.utils.MalformedIdException;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.StoragePoolManagementParameter;
import org.ovirt.engine.core.common.action.StoragePoolParametersBase;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.NameQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendDataCenterResource extends AbstractBackendSubResource<DataCenter, StoragePool>
implements DataCenterResource {
public static final String FORCE = "force";
private final BackendDataCentersResource parent;
public BackendDataCenterResource(String id, BackendDataCentersResource parent) {
super(id, DataCenter.class, StoragePool.class);
this.parent = parent;
}
@Override
public DataCenter get() {
return performGet(VdcQueryType.GetStoragePoolById, new IdQueryParameters(guid));
}
@Override
public DataCenter update(DataCenter incoming) {
return performUpdate(incoming,
new QueryIdResolver<>(VdcQueryType.GetStoragePoolById, IdQueryParameters.class),
VdcActionType.UpdateStoragePool,
new UpdateParametersProvider());
}
@Override
public AssignedPermissionsResource getPermissionsResource() {
return inject(new BackendAssignedPermissionsResource(guid,
VdcQueryType.GetPermissionsForObject,
new GetPermissionsForObjectParameters(guid),
DataCenter.class,
VdcObjectType.StoragePool));
}
@Override
public AttachedStorageDomainsResource getStorageDomainsResource() {
return inject(new BackendAttachedStorageDomainsResource(id));
}
@Override
public DataCenterNetworksResource getNetworksResource() {
return inject(new BackendDataCenterNetworksResource(id));
}
@Override
public ClustersResource getClustersResource() {
return inject(new BackendDataCenterClustersResource(id));
}
@Override
public QuotasResource getQuotasResource() {
return inject(new BackendQuotasResource(id));
}
@Override
public IscsiBondsResource getIscsiBondsResource() {
return inject(new BackendIscsiBondsResource(id));
}
public BackendDataCentersResource getParent() {
return parent;
}
@Override
protected DataCenter doPopulate(DataCenter model, StoragePool entity) {
return parent.doPopulate(model, entity);
}
@Override
protected DataCenter deprecatedPopulate(DataCenter model, StoragePool entity) {
return parent.deprecatedPopulate(model, entity);
}
protected class UpdateParametersProvider implements
ParametersProvider<DataCenter, StoragePool> {
@Override
public VdcActionParametersBase getParameters(DataCenter incoming, StoragePool entity) {
return new StoragePoolManagementParameter(map(incoming, entity));
}
}
/**
* Get the storage pool (i.e. datacenter entity) associated with the given
* cluster.
*/
@SuppressWarnings("unchecked")
public static StoragePool getStoragePool(DataCenter dataCenter, AbstractBackendResource parent) {
StoragePool pool = null;
if (dataCenter.isSetId()) {
String id = dataCenter.getId();
Guid guid;
try {
guid = new Guid(id); // can't use asGuid() because the method is static.
} catch (IllegalArgumentException e) {
throw new MalformedIdException(e);
}
pool = parent.getEntity(StoragePool.class, VdcQueryType.GetStoragePoolById,
new IdQueryParameters(guid), "Datacenter: id=" + id);
} else {
String clusterName = dataCenter.getName();
pool = parent.getEntity(StoragePool.class, VdcQueryType.GetStoragePoolByDatacenterName,
new NameQueryParameters(clusterName), "Datacenter: name="
+ clusterName);
dataCenter.setId(pool.getId().toString());
}
return pool;
}
/**
* Get the storage pools (i.e. datacenter entity) associated with the given
* storagedomain.
*/
@SuppressWarnings("unchecked")
public static List<StoragePool> getStoragePools(Guid storageDomainId, AbstractBackendResource parent) {
return parent.getEntity(List.class,
VdcQueryType.GetStoragePoolsByStorageDomainId,
new IdQueryParameters(storageDomainId),
"Datacenters",
true);
}
@Override
public QossResource getQossResource() {
return inject(new BackendQossResource(id));
}
@Override
public Response remove() {
get();
StoragePoolParametersBase params = new StoragePoolParametersBase(asGuid(id));
boolean force = ParametersHelper.getBooleanParameter(httpHeaders, uriInfo, FORCE, true, false);
if (force) {
params.setForceDelete(force);
}
return performAction(VdcActionType.RemoveStoragePool, params);
}
}