package org.ovirt.engine.api.restapi.resource; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.resource.AffinityGroupsResource; import org.ovirt.engine.api.resource.AssignedCpuProfilesResource; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.ClusterNetworksResource; import org.ovirt.engine.api.resource.ClusterResource; import org.ovirt.engine.api.resource.NetworkFiltersResource; import org.ovirt.engine.api.resource.gluster.GlusterHooksResource; import org.ovirt.engine.api.resource.gluster.GlusterVolumesResource; import org.ovirt.engine.api.restapi.resource.gluster.BackendGlusterHooksResource; import org.ovirt.engine.api.restapi.resource.gluster.BackendGlusterVolumesResource; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.ClusterParametersBase; import org.ovirt.engine.core.common.action.ManagementNetworkOnClusterOperationParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendClusterResource<P extends BackendClustersResource> extends AbstractBackendActionableResource<org.ovirt.engine.api.model.Cluster, Cluster> implements ClusterResource { protected final P parent; private final ManagementNetworkFinder managementNetworkFinder; public BackendClusterResource(String id, P parent) { super(id, org.ovirt.engine.api.model.Cluster.class, Cluster.class); this.parent = parent; managementNetworkFinder = new ManagementNetworkFinder(this); } @Override public org.ovirt.engine.api.model.Cluster get() { return performGet(VdcQueryType.GetClusterById, new IdQueryParameters(guid)); } @Override public org.ovirt.engine.api.model.Cluster update(org.ovirt.engine.api.model.Cluster incoming) { return performUpdate(incoming, new QueryIdResolver<>(VdcQueryType.GetClusterById, IdQueryParameters.class), VdcActionType.UpdateCluster, new UpdateParametersProvider()); } @Override public ClusterNetworksResource getNetworksResource() { return inject(new BackendClusterNetworksResource(id)); } @Override public AssignedPermissionsResource getPermissionsResource() { return inject(new BackendAssignedPermissionsResource(guid, VdcQueryType.GetPermissionsForObject, new GetPermissionsForObjectParameters(guid), org.ovirt.engine.api.model.Cluster.class, VdcObjectType.Cluster)); } private class UpdateParametersProvider implements ParametersProvider<org.ovirt.engine.api.model.Cluster, Cluster> { @Override public VdcActionParametersBase getParameters(org.ovirt.engine.api.model.Cluster incoming, Cluster entity) { final Cluster cluster = map(incoming, entity); final ManagementNetworkOnClusterOperationParameters managementNetworkOnClusterOperationParameters; final Guid dcId = getDataCenterId(cluster); if (dcId == null) { managementNetworkOnClusterOperationParameters = new ManagementNetworkOnClusterOperationParameters(cluster); } else { final Guid managementNetworkId = managementNetworkFinder.getManagementNetworkId(incoming, dcId); managementNetworkOnClusterOperationParameters = new ManagementNetworkOnClusterOperationParameters(cluster, managementNetworkId); } return managementNetworkOnClusterOperationParameters; } } @Override public GlusterVolumesResource getGlusterVolumesResource() { return inject(new BackendGlusterVolumesResource(this, id)); } @Override protected org.ovirt.engine.api.model.Cluster doPopulate(org.ovirt.engine.api.model.Cluster cluster, Cluster entity) { return parent.doPopulate(cluster, entity); } @Override public GlusterHooksResource getGlusterHooksResource() { return inject(new BackendGlusterHooksResource(this)); } @Override public AffinityGroupsResource getAffinityGroupsResource() { return inject(new BackendAffinityGroupsResource(id)); } @Override public AssignedCpuProfilesResource getCpuProfilesResource() { return inject(new BackendAssignedCpuProfilesResource(id)); } @Override public NetworkFiltersResource getNetworkFiltersResource() { return null; } protected Guid getDataCenterId(Cluster cluster) { return cluster.getStoragePoolId(); } @Override public Response resetEmulatedMachine(Action action) { VdcQueryReturnValue result = runQuery(VdcQueryType.GetClusterById, new IdQueryParameters(guid)); if (result != null && result.getSucceeded() && result.getReturnValue() != null) { ManagementNetworkOnClusterOperationParameters param = new ManagementNetworkOnClusterOperationParameters(result.getReturnValue()); param.setForceResetEmulatedMachine(true); return doAction(VdcActionType.UpdateCluster, param, action); } else { throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND).build()); } } @Override public Response remove() { get(); return performAction(VdcActionType.RemoveCluster, new ClusterParametersBase(asGuid(id))); } }