/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.vipr.client.core;
import static com.emc.vipr.client.core.impl.PathConstants.ID_URL_FORMAT;
import static com.emc.vipr.client.core.impl.PathConstants.VARRAY_URL;
import static com.emc.vipr.client.core.util.ResourceUtils.defaultList;
import java.net.URI;
import java.util.List;
import com.emc.storageos.model.BulkIdParam;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.TypedRelatedResourceRep;
import com.emc.storageos.model.block.RelatedStoragePool;
import com.emc.storageos.model.pools.StoragePoolBulkRep;
import com.emc.storageos.model.pools.StoragePoolList;
import com.emc.storageos.model.pools.StoragePoolResources;
import com.emc.storageos.model.pools.StoragePoolRestRep;
import com.emc.storageos.model.pools.StoragePoolUpdate;
import com.emc.storageos.model.vpool.NamedRelatedVirtualPoolRep;
import com.emc.storageos.model.vpool.VirtualPoolList;
import com.emc.vipr.client.ViPRCoreClient;
import com.emc.vipr.client.core.filters.ResourceFilter;
import com.emc.vipr.client.core.impl.PathConstants;
import com.emc.vipr.client.impl.RestClient;
import com.emc.vipr.client.core.util.ResourceUtils;
/**
* Storage Pools resources.
* <p>
* Base URL: <tt>/vdc/storage-pools</tt>
*/
public class StoragePools extends AbstractCoreBulkResources<StoragePoolRestRep> implements
TopLevelResources<StoragePoolRestRep> {
public StoragePools(ViPRCoreClient parent, RestClient client) {
super(parent, client, StoragePoolRestRep.class, PathConstants.STORAGE_POOL_URL);
}
@Override
public StoragePools withInactive(boolean inactive) {
return (StoragePools) super.withInactive(inactive);
}
@Override
public StoragePools withInternal(boolean internal) {
return (StoragePools) super.withInternal(internal);
}
@Override
protected List<StoragePoolRestRep> getBulkResources(BulkIdParam input) {
StoragePoolBulkRep response = client.post(StoragePoolBulkRep.class, input, getBulkUrl());
return defaultList(response.getStoragePools());
}
/**
* Lists all storage pools.
* <p>
* API Call: <tt>GET /vdc/storage-pools</tt>
*
* @return the list of all storage pool references.
*/
@Override
public List<NamedRelatedResourceRep> list() {
StoragePoolList response = client.get(StoragePoolList.class, baseUrl);
return defaultList(response.getPools());
}
/**
* Gets all storage pools. This is a convenience method for: <tt>getByRefs(list())</tt>
*
* @return the list of all storage pools.
*/
@Override
public List<StoragePoolRestRep> getAll() {
return getAll(null);
}
/**
* Gets all storage pools. This is a convenience method for: <tt>getByRefs(list(), filter)</tt>
*
* @param filter
* the resource filter to apply to the results as they are returned (optional).
* @return the list of all storage pools.
*/
@Override
public List<StoragePoolRestRep> getAll(ResourceFilter<StoragePoolRestRep> filter) {
List<NamedRelatedResourceRep> refs = list();
return getByRefs(refs, filter);
}
/**
* Registers a storage pool with the given storage system.
* <p>
* API Call: <tt>POST /vdc/storage-systems/{storageSystemId}/storage-pools/{poolId}/register</tt>
*
* @param poolId
* the ID of the storage pool.
* @param storageSystemId
* the ID of the storage system.
* @return the storage pool.
*/
public StoragePoolRestRep register(URI poolId, URI storageSystemId) {
String registerUrl = PathConstants.STORAGE_POOL_BY_STORAGE_SYSTEM_URL + "/{poolId}/register";
return client.post(StoragePoolRestRep.class, registerUrl, storageSystemId, poolId);
}
/**
* Deregisters a storage pool.
* <p>
* API Call: <tt>POST /vdc/storage-pools/{id}/deregister</tt>
*
* @param id
* the ID of the storage pool.
*/
public StoragePoolRestRep deregister(URI id) {
return client.post(StoragePoolRestRep.class, getIdUrl() + "/deregister", id);
}
/**
* Updates the given storage pool by ID.
* <p>
* API Call: <tt>PUT /vdc/storage-pools/{id}</tt>
*
* @param id
* the ID of the storage pool.
* @param input
* the update configuration.
* @return the updated storage pool.
*/
public StoragePoolRestRep update(URI id, StoragePoolUpdate input) {
return client.put(StoragePoolRestRep.class, input, getIdUrl(), id);
}
/**
* Lists the storage pools for the given storage system by ID.
* <p>
* API Call: <tt>GET /vdc/storage-systems/{storageSystemId}/storage-pools</tt>
*
* @param storageSystemId
* the ID of the storage system.
* @return the list of storage pool references.
*/
public List<NamedRelatedResourceRep> listByStorageSystem(URI storageSystemId) {
StoragePoolList response = client.get(StoragePoolList.class, PathConstants.STORAGE_POOL_BY_STORAGE_SYSTEM_URL,
storageSystemId);
return ResourceUtils.defaultList(response.getPools());
}
/**
* Gets the list of storage pools for the given storage system by ID.
*
* @param storageSystemId
* the ID of the storage system.
* @return the list of storage pools for the storage system.
*/
public List<StoragePoolRestRep> getByStorageSystem(URI storageSystemId) {
return getByStorageSystem(storageSystemId, null);
}
/**
* Gets the list of storage pools for the given storage system by ID, optionally filtering the results.
*
* @param storageSystemId
* the ID of the storage system.
* @param filter
* the resource filter to apply to the results as they are returned (optional).
* @return the list of storage pools for the storage system.
*/
public List<StoragePoolRestRep> getByStorageSystem(URI storageSystemId, ResourceFilter<StoragePoolRestRep> filter) {
List<NamedRelatedResourceRep> refs = listByStorageSystem(storageSystemId);
return getByRefs(refs, filter);
}
/**
* Lists the storage pools that are associated with the given virtual array.
* <p>
* API Call: <tt>GET /vdc/varrays/{id}/storage-pools</tt>
*
* @param varrayId
* the ID of the virtual array.
* @return the list of storage pool references.
*/
public List<NamedRelatedResourceRep> listByVirtualArray(URI varrayId) {
StoragePoolList response = client.get(StoragePoolList.class, String.format(ID_URL_FORMAT, VARRAY_URL) + "/storage-pools", varrayId);
return defaultList(response.getPools());
}
/**
* Gets the storage pools that are associated with the given virtual array
*
* @param varrayId
* the ID of the virtual array.
* @return the list of storage pools.
*
* @see #listByVirtualArray(URI)
* @see StoragePools#getByRefs(java.util.Collection)
*/
public List<StoragePoolRestRep> getByVirtualArray(URI varrayId) {
List<NamedRelatedResourceRep> refs = listByVirtualArray(varrayId);
return getByRefs(refs);
}
/**
* Lists the resources for the given storage pool by ID.
* <p>
* API Call: <tt>GET /vdc/storage-pools/{id}/resources</tt>
*
* @param id
* the ID of the storage pool.
* @return the list of resource references.
*/
public List<TypedRelatedResourceRep> listResources(URI id) {
StoragePoolResources response = client.get(StoragePoolResources.class, getIdUrl() + "/resources", id);
return defaultList(response.getResources());
}
/**
* Gets the storage pool that contains the given volume by ID.
* <p>
* API Call: <tt>GET /block/volumes/{volumeId}/storage-pool</tt>
*
* @param volumeId
* the ID of the volume.
* @return the storage pool for the volume.
*/
public StoragePoolRestRep getByVolume(URI volumeId) {
RelatedStoragePool response = client.get(RelatedStoragePool.class, PathConstants.BLOCK_VOLUMES_URL
+ "/{volumeId}/storage-pool", volumeId);
if (response.getStoragePool() != null) {
return get(response.getStoragePool());
}
else {
return null;
}
}
/**
* Lists the virtual pools which match the given storage pool by ID.
* <p>
* API Call: <tt>GET /vdc/storage-pools/{id}/matched-vpools</tt>
*
* @param id
* the ID of the storage pool.
* @return the list of virtual pool references.
*/
public List<NamedRelatedVirtualPoolRep> listMatchedVirtualPools(URI id) {
VirtualPoolList response = client.get(VirtualPoolList.class, getIdUrl() + "/matched-vpools", id);
return defaultList(response.getVirtualPool());
}
}