/*
* 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 javax.ws.rs.core.UriBuilder;
import com.emc.storageos.model.BulkIdParam;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.auth.ACLAssignmentChanges;
import com.emc.storageos.model.auth.ACLEntry;
import com.emc.storageos.model.pools.StoragePoolList;
import com.emc.storageos.model.pools.StoragePoolRestRep;
import com.emc.storageos.model.quota.QuotaInfo;
import com.emc.storageos.model.quota.QuotaUpdateParam;
import com.emc.storageos.model.vpool.CapacityResponse;
import com.emc.storageos.model.vpool.NamedRelatedVirtualPoolRep;
import com.emc.storageos.model.vpool.ObjectVirtualPoolBulkRep;
import com.emc.storageos.model.vpool.ObjectVirtualPoolParam;
import com.emc.storageos.model.vpool.ObjectVirtualPoolRestRep;
import com.emc.storageos.model.vpool.ObjectVirtualPoolUpdateParam;
import com.emc.storageos.model.vpool.VirtualPoolList;
import com.emc.storageos.model.vpool.VirtualPoolPoolUpdateParam;
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.core.impl.SearchConstants;
import com.emc.vipr.client.core.util.ResourceUtils;
import com.emc.vipr.client.impl.RestClient;
import static com.emc.vipr.client.core.util.VirtualPoolUtils.*;
/**
* Object Virtual Pools resources.
* <p>
* Base URL: <tt>/object/vpools</tt>
*/
public class ObjectVirtualPools extends AbstractCoreBulkResources<ObjectVirtualPoolRestRep> implements
TopLevelResources<ObjectVirtualPoolRestRep>, ACLResources, QuotaResources {
public ObjectVirtualPools(ViPRCoreClient parent, RestClient client) {
super(parent, client, ObjectVirtualPoolRestRep.class, PathConstants.OBJECT_VPOOL_URL);
}
@Override
public ObjectVirtualPools withInactive(boolean inactive) {
return (ObjectVirtualPools) super.withInactive(inactive);
}
@Override
public ObjectVirtualPools withInternal(boolean internal) {
return (ObjectVirtualPools) super.withInternal(internal);
}
@Override
protected List<ObjectVirtualPoolRestRep> getBulkResources(BulkIdParam input) {
ObjectVirtualPoolBulkRep response = client.post(ObjectVirtualPoolBulkRep.class, input, getBulkUrl());
return defaultList(response.getVirtualPools());
}
/**
* Gets a list of virtual pools from the given URL.
*
* @param url
* the URL to get.
* @param args
* the URL arguments.
* @return the list of virtual pool references.
*/
protected List<NamedRelatedVirtualPoolRep> getList(String url, Object... args) {
VirtualPoolList response = client.get(VirtualPoolList.class, url, args);
return ResourceUtils.defaultList(response.getVirtualPool());
}
/**
* Lists all object virtual pools.
* <p>
* API Call: <tt>GET /object/vpools</tt>
*
* @return the list of all object virtual pool references.
*/
@Override
public List<NamedRelatedVirtualPoolRep> list() {
return getList(baseUrl);
}
/**
* Lists all virtual pools in a virtual data center
* <p>
* API Call: <tt>GET /object/vpools</tt>
*
* @return the list of virtual pool references in a virtual data center
*/
public List<NamedRelatedVirtualPoolRep> listByVDC(String shortVdcId) {
UriBuilder builder = client.uriBuilder(baseUrl);
builder.queryParam(SearchConstants.VDC_ID_PARAM, shortVdcId);
VirtualPoolList response = client.getURI(VirtualPoolList.class, builder.build());
return ResourceUtils.defaultList(response.getVirtualPool());
}
/**
* Lists all virtual pools of specific tenant
* <p>
* API Call: <tt>GET /object/vpools</tt>
*
* @return the list of virtual pool references of specific tenant
*/
public List<NamedRelatedVirtualPoolRep> listByTenant(URI tenantId) {
UriBuilder builder = client.uriBuilder(baseUrl);
builder.queryParam(SearchConstants.TENANT_ID_PARAM, tenantId);
VirtualPoolList response = client.getURI(VirtualPoolList.class, builder.build());
return ResourceUtils.defaultList(response.getVirtualPool());
}
public List<ObjectVirtualPoolRestRep> getByTenant(URI tenantId) {
return getByTenant(tenantId, null);
}
public List<ObjectVirtualPoolRestRep> getByTenant(URI tenantId, ResourceFilter<ObjectVirtualPoolRestRep> filter) {
List<NamedRelatedVirtualPoolRep> refs = listByTenant(tenantId);
return getByRefs(refs, filter);
}
/**
* Gets a list of all object virtual pools.
* <p>
* This is a convenience method for: <tt>getByRefs(list())</tt>
*
* @return the list of object virtual pools.
*/
@Override
public List<ObjectVirtualPoolRestRep> getAll() {
return getAll(null);
}
/**
* Gets a list of all object virtual pools, optionally filtering the results.
* <p>
* 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 object virtual pools.
*/
@Override
public List<ObjectVirtualPoolRestRep> getAll(ResourceFilter<ObjectVirtualPoolRestRep> filter) {
List<NamedRelatedVirtualPoolRep> refs = list();
return getByRefs(refs, filter);
}
/**
* Creates a object virtual pool.
* <p>
* API Call: <tt>POST /object/vpools</tt>
*
* @param input
* the virtual pool configuration.
* @return the newly created object virtual pool.
*/
public ObjectVirtualPoolRestRep create(ObjectVirtualPoolParam input) {
return client.post(ObjectVirtualPoolRestRep.class, input, baseUrl);
}
/**
* Updates an object virtual pool.
* <p>
* API Call: <tt>PUT /object/vpools/{id}</tt>
*
* @param id
* the ID of the object virtual pool to update.
* @param input
* @return
*/
public ObjectVirtualPoolRestRep update(URI id, ObjectVirtualPoolUpdateParam input) {
return client.put(ObjectVirtualPoolRestRep.class, input, getIdUrl(), id);
}
/**
* Deactivates a object virtual pool.
* <p>
* API Call: <tt>POST /object/vpools/{id}/deactivate</tt>
*
* @param id
* the ID of the object virtual pool.
*/
public void deactivate(URI id) {
doDeactivate(id);
}
public void deactivate(ObjectVirtualPoolRestRep pool) {
deactivate(ResourceUtils.id(pool));
}
/**
* Lists the virtual pools that are associated with the given virtual array.
* <p>
* API Call: <tt>GET /vdc/varrays/{id}/vpools</tt>
*
* @param varrayId
* the ID of the virtual array.
* @return the list of virtual pool references.
*/
public List<NamedRelatedVirtualPoolRep> listByVirtualArray(URI varrayId) {
VirtualPoolList response = client.get(VirtualPoolList.class, String.format(ID_URL_FORMAT, VARRAY_URL) + "/vpools", varrayId);
return defaultList(response.getVirtualPool());
}
public List<NamedRelatedVirtualPoolRep> listByVirtualArrayAndTenant(URI varrayId, URI tenantId) {
UriBuilder builder = client.uriBuilder(String.format(ID_URL_FORMAT, VARRAY_URL) + "/vpools");
builder.queryParam(SearchConstants.TENANT_ID_PARAM, tenantId);
VirtualPoolList response = client.getURI(VirtualPoolList.class, builder.build(varrayId));
return defaultList(response.getVirtualPool());
}
/**
* Gets the storage pools that are associated with the given block virtual pool.
* Convenience method for calling getByRefs(listByVirtualArray(varrayId)).
*
* @param varrayId
* the ID of the virtual array.
* @return the list of virtual pools.
*
* @see #listByVirtualArray(URI)
* @see #getByRefs(java.util.Collection)
*/
public List<ObjectVirtualPoolRestRep> getByVirtualArray(URI varrayId) {
return getByVirtualArray(varrayId, null);
}
/**
* Gets the storage pools that are associated with the given block virtual pool.
* Convenience method for calling getByRefs(listByVirtualArray(varrayId)).
*
* @param varrayId
* the ID of the virtual array.
* @param filter
* the resource filter to apply to the results as they are returned (optional).
*
* @return the list of virtual pools.
*
* @see #listByVirtualArray(URI)
* @see #getByRefs(java.util.Collection)
*/
public List<ObjectVirtualPoolRestRep> getByVirtualArray(URI varrayId, ResourceFilter<ObjectVirtualPoolRestRep> filter) {
List<NamedRelatedVirtualPoolRep> refs = listByVirtualArray(varrayId);
return getByRefs(objectVpools(refs), filter);
}
public List<ObjectVirtualPoolRestRep> getByVirtualArray(URI varrayId, URI tenantId, ResourceFilter<ObjectVirtualPoolRestRep> filter) {
List<NamedRelatedVirtualPoolRep> refs = listByVirtualArrayAndTenant(varrayId, tenantId);
return getByRefs(objectVpools(refs), filter);
}
/**
* Gets the storage pools that are associated with the given block virtual pool and tenant.
*
* @param varrayId
* the ID of the virtual array.
* @param tenantId
* the ID of tenant
* @return the list of virtual pools.
*
* @see #listByVirtualArray(URI)
* @see #getByRefs(java.util.Collection)
*/
public List<ObjectVirtualPoolRestRep> getByVirtualArrayAndTenant(URI varrayId, URI tenantId) {
return getByVirtualArray(varrayId, tenantId, null);
}
@Override
public List<ACLEntry> getACLs(URI id) {
return doGetACLs(id);
}
@Override
public List<ACLEntry> updateACLs(URI id, ACLAssignmentChanges aclChanges) {
return doUpdateACLs(id, aclChanges);
}
@Override
public QuotaInfo getQuota(URI id) {
return doGetQuota(id);
}
@Override
public QuotaInfo updateQuota(URI id, QuotaUpdateParam quota) {
return doUpdateQuota(id, quota);
}
/**
* Get the capacity of the object virtual pool on the given virtual array.
* <p>
* API Call: <tt>GET /object/vpools/{id}/varrays/{virtualArrayId}/capacity</tt>
*
* @param id
* the ID of the object virtual pool.
* @param virtualArrayId
* the virtual array.
* @return the capacity on the virtual array.
*/
public CapacityResponse getCapacityOnVirtualArray(URI id, URI virtualArrayId) {
return client.get(CapacityResponse.class, getIdUrl() + "/varrays/{varrayId}/capacity", id, virtualArrayId);
}
/**
* Lists the storage pools for the given object virtual pool by ID.
* <p>
* API Call: <tt>GET /object/vpools/{id}/storage-pools</tt>
*
* @param id
* the ID of the object virtual pool.
* @return the list of storage pool references.
*/
public List<NamedRelatedResourceRep> listStoragePools(URI id) {
StoragePoolList response = client.get(StoragePoolList.class, getIdUrl() + "/storage-pools", id);
return defaultList(response.getPools());
}
/**
* Gets the list of storage pools for the given object virtual pool by ID. This is a convenience method for:
* <tt>getByRefs(listStoragePools(id))</tt>.
*
* @param id
* the ID of the object virtual pool.
* @return the list of storage pools.
*/
public List<StoragePoolRestRep> getStoragePools(URI id) {
List<NamedRelatedResourceRep> refs = listStoragePools(id);
return parent.storagePools().getByRefs(refs);
}
/**
* Lists all storage pools that would match the given object virtual pool configuration.
* <p>
* API Call: <tt>POST /object/vpools/matching-pools</tt>
*
* @param input
* the object virtual pool configuration.
* @return the list of matching storage pool references.
*/
public List<NamedRelatedResourceRep> listMatchingStoragePools(ObjectVirtualPoolParam input) {
StoragePoolList response = client.post(StoragePoolList.class, input, baseUrl + "/matching-pools");
return defaultList(response.getPools());
}
/**
* Gets all storage pools that would match the given object virtual pool configuration.
*
* @param input
* the object virtual pool configuration.
* @return the list of matching storage pools.
*/
public List<StoragePoolRestRep> getMatchingStoragePools(ObjectVirtualPoolParam input) {
List<NamedRelatedResourceRep> refs = listMatchingStoragePools(input);
return parent.storagePools().getByRefs(refs);
}
/**
* Refreshes the storage pools that match the given object virtual pool.
* <p>
* API Call: <tt>GET /object/vpools/{id}/refresh-matched-pools</tt>
*
* @param id
* the ID of the object virtual pool.
* @return the list of currently matching storage pool references.
*/
public List<NamedRelatedResourceRep> refreshMatchingStoragePools(URI id) {
StoragePoolList response = client.get(StoragePoolList.class, getIdUrl() + "/refresh-matched-pools", id);
return defaultList(response.getPools());
}
/**
* Manually updates storage pool assignments for a given object virtual pool.
* <p>
* API Call: <tt>PUT /object/vpools/{id}/assign-matched-pools</tt>
*
* @param id
* the ID of the object virtual pool.
* @param input
* the configuration of the storage pool assignments.
* @return the updated object virtual pool.
*/
public ObjectVirtualPoolRestRep assignStoragePools(URI id, VirtualPoolPoolUpdateParam input) {
return client.put(ObjectVirtualPoolRestRep.class, input, getIdUrl() + "/assign-matched-pools", id);
}
}