package org.ovirt.engine.api.restapi.resource;
import java.util.List;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Cluster;
import org.ovirt.engine.api.model.Network;
import org.ovirt.engine.api.resource.AssignedNetworkResource;
import org.ovirt.engine.api.resource.AssignedNetworksResource;
import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.network;
import org.ovirt.engine.core.common.businessentities.VDSGroup;
import org.ovirt.engine.core.common.queries.GetAllNetworkQueryParamenters;
import org.ovirt.engine.core.common.queries.GetVdsGroupByIdParameters;
import org.ovirt.engine.core.common.queries.GetVdsGroupByVdsGroupIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdsGroupQueryParamenters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.NGuid;
public class BackendClusterNetworksResource
extends AbstractBackendNetworksResource
implements AssignedNetworksResource {
private String clusterId;
public BackendClusterNetworksResource(String clusterId) {
super(VdcQueryType.GetAllNetworksByClusterId,
VdcActionType.AttachNetworkToVdsGroup,
VdcActionType.DetachNetworkToVdsGroup);
this.clusterId = clusterId;
}
@Override
public Response add(Network network) {
validateParameters(network, "name"); //right now, name is mandatory (future - id alone will be enough)
if (!network.isSetId()) {
network.setId(getNetworkId(network.getName(), clusterId));
}
network entity = map(network);
return performCreation(addAction,
getActionParameters(network, entity),
new NetworkIdResolver(network.getName()));
}
@Override
protected VdcQueryParametersBase getQueryParameters() {
return new VdsGroupQueryParamenters(asGuid(clusterId));
}
@Override
protected VdcActionParametersBase getActionParameters(Network network, network entity) {
return new AttachNetworkToVdsGroupParameter(getVDSGroup(), entity);
}
protected String[] getRequiredAddFields() {
return new String[] { "id" };
}
@Override
public Network addParents(Network network) {
network.setCluster(new Cluster());
network.getCluster().setId(clusterId);
return network;
}
protected VDSGroup getVDSGroup() {
return getEntity(VDSGroup.class,
VdcQueryType.GetVdsGroupByVdsGroupId,
new GetVdsGroupByVdsGroupIdParameters(asGuid(clusterId)),
clusterId);
}
@Override
@SingleEntityResource
public AssignedNetworkResource getAssignedNetworkSubResource(String id) {
return inject(new BackendClusterNetworkResource(id, this));
}
private String getNetworkId(String networkName, String clusterId) {
NGuid dataCenterId = getEntity(VDSGroup.class, VdcQueryType.GetVdsGroupById, new GetVdsGroupByIdParameters(asGuid(clusterId)), null).getstorage_pool_id();
GetAllNetworkQueryParamenters params = new GetAllNetworkQueryParamenters(asGuid(dataCenterId));
List<network> networks = getBackendCollection(VdcQueryType.GetAllNetworks, params);
for (network nw: networks) {
if (nw.getname().equals(networkName)) {
return nw.getId().toString();
}
}
return null;
}
}