package org.ovirt.engine.api.restapi.resource; import static org.ovirt.engine.api.restapi.resource.BackendStorageDomainResource.isIsoDomain; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.DataCenter; import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.api.model.StorageDomains; 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.VdcActionType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.NameQueryParameters; import org.ovirt.engine.core.common.queries.StorageDomainAndPoolQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendAttachedStorageDomainsResource extends AbstractBackendCollectionResource<StorageDomain, org.ovirt.engine.core.common.businessentities.StorageDomain> implements AttachedStorageDomainsResource { protected Guid dataCenterId; public BackendAttachedStorageDomainsResource(String dataCenterId) { super(StorageDomain.class, org.ovirt.engine.core.common.businessentities.StorageDomain.class); this.dataCenterId = asGuid(dataCenterId); } @Override public StorageDomains list() { StorageDomains storageDomains = new StorageDomains(); for (org.ovirt.engine.core.common.businessentities.StorageDomain entity : getBackendCollection(org.ovirt.engine.core.common.businessentities.StorageDomain.class, VdcQueryType.GetStorageDomainsByStoragePoolId, new IdQueryParameters(dataCenterId))) { storageDomains.getStorageDomains().add(addLinks(map(entity), getLinksToExclude(entity))); } return storageDomains; } @Override public AttachedStorageDomainResource getStorageDomainResource(String id) { return inject(new BackendAttachedStorageDomainResource(id, dataCenterId)); } @Override public Response add(StorageDomain storageDomain) { validateParameters(storageDomain, "id|name"); Guid storageDomainId; if (storageDomain.isSetId()) { storageDomainId = asGuid(storageDomain.getId()); } else { storageDomainId = lookupStorageDomainIdByName(storageDomain.getName()); } return performCreate(VdcActionType.AttachStorageDomainToPool, new AttachStorageDomainToPoolParameters(storageDomainId, dataCenterId), new StorageDomainIdResolver(storageDomainId)); } @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: StorageDomainHelper.addAttachedDataCenterReferences(this, storageDomain); return storageDomain; } protected Guid lookupStorageDomainIdByName(String name) { return getEntity(org.ovirt.engine.core.common.businessentities.StorageDomainStatic.class, VdcQueryType.GetStorageDomainByName, new NameQueryParameters(name), "Storage: name=" + name).getId(); } protected org.ovirt.engine.core.common.businessentities.StorageDomain lookupStorageDomainById(Guid storageDomainId) { return getEntity(org.ovirt.engine.core.common.businessentities.StorageDomain.class, VdcQueryType.GetStorageDomainByIdAndStoragePoolId, new StorageDomainAndPoolQueryParameters(storageDomainId, dataCenterId), storageDomainId.toString()); } protected class StorageDomainIdResolver extends EntityIdResolver<Guid> { private Guid storageDomainId; public StorageDomainIdResolver(Guid storageDomainId) { this.storageDomainId = storageDomainId; } @Override public org.ovirt.engine.core.common.businessentities.StorageDomain lookupEntity(Guid nullId) { assert nullId == null; // attach action return nothing, lookup original id instead return lookupStorageDomainById(storageDomainId); } } @Override protected StorageDomain map(org.ovirt.engine.core.common.businessentities.StorageDomain entity, StorageDomain template) { BackendStorageDomainsResource resource = new BackendStorageDomainsResource(); inject(resource); return resource.map(entity, template); } public String[] getLinksToExclude(org.ovirt.engine.core.common.businessentities.StorageDomain storageDomain) { return isIsoDomain(storageDomain) ? new String[] { "disks" } : new String[] {}; } }