package com.emc.vipr.client.core;
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.host.cluster.ClusterBulkRep;
import com.emc.storageos.model.host.cluster.ClusterCreateParam;
import com.emc.storageos.model.host.cluster.ClusterList;
import com.emc.storageos.model.host.cluster.ClusterRestRep;
import com.emc.storageos.model.host.cluster.ClusterUpdateParam;
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;
/**
* Cluster resources.
* <p>
* Base URL: <tt>/compute/clusters</tt>
*/
public class Clusters extends AbstractBulkResources<ClusterRestRep> implements TenantResources<ClusterRestRep> {
public Clusters(ViPRCoreClient parent, RestClient client) {
super(parent, client, ClusterRestRep.class, PathConstants.CLUSTER_URL);
}
@Override
public Clusters withInactive(boolean inactive) {
return (Clusters) super.withInactive(inactive);
}
@Override
protected List<ClusterRestRep> getBulkResources(BulkIdParam input) {
ClusterBulkRep response = client.post(ClusterBulkRep.class, input, getBulkUrl());
return defaultList(response.getClusters());
}
/**
* Gets a list of cluster references from the given path.
*
* @param path
* the URL path.
* @param args
* the path arguments.
* @return the list of cluster references.
*/
protected List<NamedRelatedResourceRep> getList(String path, Object... args) {
ClusterList response = client.get(ClusterList.class, path, args);
return defaultList(response.getClusters());
}
/**
* Lists the clusters for the given tenant.
* <p>
* API Call: <tt>GET /tenants/{tenantId}/clusters</tt>
*
* @param tenantId
* the ID of the tenant.
* @return the list of cluster references.
*/
@Override
public List<NamedRelatedResourceRep> listByTenant(URI tenantId) {
return getList(PathConstants.CLUSTER_BY_TENANT_URL, tenantId);
}
@Override
public List<NamedRelatedResourceRep> listByUserTenant() {
return listByTenant(parent.getUserTenantId());
}
@Override
public List<ClusterRestRep> getByUserTenant() {
return getByTenant(parent.getUserTenantId(), null);
}
@Override
public List<ClusterRestRep> getByUserTenant(ResourceFilter<ClusterRestRep> filter) {
return getByTenant(parent.getUserTenantId(), filter);
}
@Override
public List<ClusterRestRep> getByTenant(URI tenantId) {
return getByTenant(tenantId, null);
}
@Override
public List<ClusterRestRep> getByTenant(URI tenantId, ResourceFilter<ClusterRestRep> filter) {
List<NamedRelatedResourceRep> refs = listByTenant(tenantId);
return getByRefs(refs, filter);
}
/**
* Lists the clusters for the given datacenter by ID.
* <p>
* API Call: <tt>GET /compute/vcenter-data-centers/{dataCenterId}/clusters</tt>
*
* @param dataCenterId
* the ID of the datacenter.
* @return the list of cluster references.
*/
public List<NamedRelatedResourceRep> listByDataCenter(URI dataCenterId) {
return getList(PathConstants.CLUSTER_BY_DATACENTER_URL, dataCenterId);
}
/**
* Gets the list of clusters for the given datacenter by ID.
* <p>
* Convenience method for <tt>getByRefs(listByDataCenter(dataCenterId))</tt>.
*
* @param dataCenterId
* the ID of the datacenter.
* @return the list of clusters.
*
* @see #listByDataCenter(URI)
* @see #getByRefs(java.util.Collection)
*/
public List<ClusterRestRep> getByDataCenter(URI dataCenterId) {
List<NamedRelatedResourceRep> refs = listByDataCenter(dataCenterId);
return getByRefs(refs);
}
/**
* Lists the clusters for the given vCenter by ID.
* <p>
* API Call: <tt>GET /compute/vcenters/{vCenterId}/clusters</tt>
*
* @param vCenterId
* the ID of the vCenter.
* @return the list of cluster references.
*/
public List<NamedRelatedResourceRep> listByVCenter(URI vCenterId) {
return getList(PathConstants.CLUSTER_BY_VCENTER_URL, vCenterId);
}
/**
* Gets the list of clusters for the given vCenter by ID.
* <p>
* Convenience method for <tt>getByRefs(listByVCenter(vCenterId))</tt>.
*
* @param vCenterId
* the ID of the vCenter.
* @return the list of clusters.
*
* @see #listByDataCenter(URI)
* @see #getByRefs(java.util.Collection)
*/
public List<ClusterRestRep> getByVCenter(URI vCenterId) {
List<NamedRelatedResourceRep> refs = listByDataCenter(vCenterId);
return getByRefs(refs);
}
/**
* Creates a cluster for the given tenant.
* <p>
* API Call: <tt>POST /tenants/{tenantId}/clusters</tt>
*
* @param tenantId
* the ID of the tenant.
* @param input
* the create configuration.
* @return the newly created cluster.
*/
public ClusterRestRep create(URI tenantId, ClusterCreateParam input) {
return client.post(ClusterRestRep.class, input, PathConstants.CLUSTER_BY_TENANT_URL, tenantId);
}
/**
* Updates a cluster by ID.
* <p>
* API Call: <tt>PUT /compute/clusters/{id}</tt>
*
* @param id
* the ID of the cluster to update.
* @param input
* the update configuration.
* @return the updated cluster.
*/
public ClusterRestRep update(URI id, ClusterUpdateParam input) {
return client.put(ClusterRestRep.class, input, getIdUrl(), id);
}
/**
* Deactivates a cluster by ID.
* <p>
* API Call: <tt>POST /compute/clusters/{id}/deactivate</tt>
*
* @param id
* the ID of the cluster to deactivate.
*/
public void deactivate(URI id) {
doDeactivate(id);
}
}