package org.ovirt.engine.api.restapi.resource;
import java.util.List;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.ovirt.engine.api.common.util.DetailHelper;
import org.ovirt.engine.api.common.util.LinkHelper;
import org.ovirt.engine.api.model.Host;
import org.ovirt.engine.api.model.Hosts;
import org.ovirt.engine.api.model.Statistic;
import org.ovirt.engine.api.model.Statistics;
import org.ovirt.engine.api.resource.HostResource;
import org.ovirt.engine.api.resource.HostsResource;
import org.ovirt.engine.core.common.action.AddVdsActionParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdsActionParameters;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSGroup;
import org.ovirt.engine.core.common.businessentities.VdsStatic;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.queries.GetVdsByVdsIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendHostsResource extends AbstractBackendCollectionResource<Host, VDS> implements
HostsResource {
static final String[] SUB_COLLECTIONS = { /*"storage",*/ "nics", "tags", "permissions", "statistics" };
public BackendHostsResource() {
super(Host.class, VDS.class, SUB_COLLECTIONS);
}
@Override
public Hosts list() {
return mapCollection(getBackendCollection(SearchType.VDS));
}
@Override
@SingleEntityResource
public HostResource getHostSubResource(String id) {
return inject(new BackendHostResource(id, this));
}
@Override
public Response add(Host host) {
validateParameters(host, "name", "address", "rootPassword");
VdsStatic staticHost = getMapper(Host.class, VdsStatic.class).map(host, null);
staticHost.setvds_group_id(getClusterId(host));
AddVdsActionParameters addParams = new AddVdsActionParameters(staticHost, host.getRootPassword());
if (host.isSetOverrideIptables()) {
addParams.setOverrideFirewall(host.isOverrideIptables());
}
return performCreation(VdcActionType.AddVds,
addParams,
new QueryIdResolver(VdcQueryType.GetVdsByVdsId, GetVdsByVdsIdParameters.class));
}
@Override
public Response performRemove(String id) {
return performAction(VdcActionType.RemoveVds, new VdsActionParameters(asGuid(id)));
}
@Override
protected Host populate(Host model, VDS entity) {
return addStatistics(model, entity, uriInfo, httpHeaders);
}
Host addStatistics(Host model, VDS entity, UriInfo ui, HttpHeaders httpHeaders) {
if (DetailHelper.include(httpHeaders, "statistics")) {
model.setStatistics(new Statistics());
HostStatisticalQuery query = new HostStatisticalQuery(newModel(model.getId()));
List<Statistic> statistics = query.getStatistics(entity);
for (Statistic statistic : statistics) {
LinkHelper.addLinks(ui, statistic, query.getParentType());
}
model.getStatistics().getStatistics().addAll(statistics);
}
return model;
}
private Hosts mapCollection(List<VDS> entities) {
Hosts collection = new Hosts();
for (VDS entity : entities) {
collection.getHosts().add(addLinks(populate(map(entity), entity)));
}
return collection;
}
private Guid getClusterId(Host host) {
return host.isSetCluster() && host.getCluster().isSetId()
? new Guid(host.getCluster().getId())
: getEntity(VDSGroup.class,
SearchType.Cluster,
"Cluster: name="
+ (host.isSetCluster() && host.getCluster().isSetName()
? host.getCluster().getName()
: "Default")).getID();
}
}