package org.ovirt.engine.api.restapi.resource.gluster; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.model.GlusterBrick; import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.model.GlusterVolumes; import org.ovirt.engine.api.resource.ClusterResource; import org.ovirt.engine.api.resource.gluster.GlusterVolumeResource; import org.ovirt.engine.api.resource.gluster.GlusterVolumesResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResource; import org.ovirt.engine.api.restapi.util.QueryHelper; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.gluster.CreateGlusterVolumeParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; /** * Implementation of the "glustervolumes" resource */ public class BackendGlusterVolumesResource extends AbstractBackendCollectionResource<GlusterVolume, GlusterVolumeEntity> implements GlusterVolumesResource { private ClusterResource parent; private String clusterId; public BackendGlusterVolumesResource() { super(GlusterVolume.class, GlusterVolumeEntity.class); } public BackendGlusterVolumesResource(ClusterResource parent) { this(); setParent(parent); } public BackendGlusterVolumesResource(ClusterResource parent, String clusterId) { this(); setParent(parent); this.clusterId = clusterId; } public ClusterResource getParent() { return parent; } public void setParent(ClusterResource parent) { this.parent = parent; } @Override public GlusterVolumes list() { String constraint = QueryHelper.getConstraint(httpHeaders, uriInfo, "cluster = " + parent.get().getName(), GlusterVolume.class); return mapCollection(getBackendCollection(SearchType.GlusterVolume, constraint)); } private GlusterVolumes mapCollection(List<GlusterVolumeEntity> entities) { GlusterVolumes collection = new GlusterVolumes(); for (GlusterVolumeEntity entity : entities) { collection.getGlusterVolumes().add(addLinks(populate(map(entity), entity))); } return collection; } @Override protected GlusterVolume addParents(GlusterVolume volume) { volume.setCluster(new Cluster()); volume.getCluster().setId(clusterId); return volume; } @Override public Response add(GlusterVolume volume) { validateParameters(volume, "name", "volumeType", "bricks"); GlusterVolumeEntity volumeEntity = getMapper(GlusterVolume.class, GlusterVolumeEntity.class).map(volume, null); volumeEntity.setClusterId(asGuid(parent.get().getId())); mapBricks(volume, volumeEntity); return performCreate(VdcActionType.CreateGlusterVolume, new CreateGlusterVolumeParameters(volumeEntity, isForce()), new QueryIdResolver<Guid>(VdcQueryType.GetGlusterVolumeById, IdQueryParameters.class), true); } private void mapBricks(GlusterVolume volume, GlusterVolumeEntity volumeEntity) { List<GlusterBrickEntity> bricks = new ArrayList<>(); for(GlusterBrick brick : volume.getBricks().getGlusterBricks()) { bricks.add(getMapper(GlusterBrick.class, GlusterBrickEntity.class).map(brick, null)); } volumeEntity.setBricks(bricks); } @Override public GlusterVolumeResource getVolumeResource(String id) { return inject(new BackendGlusterVolumeResource(id, this)); } }