package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.HostNic; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.resource.HostNicResource; import org.ovirt.engine.api.resource.NetworkAttachmentsResource; import org.ovirt.engine.api.resource.NetworkLabelsResource; import org.ovirt.engine.api.resource.StatisticsResource; import org.ovirt.engine.api.resource.VirtualFunctionAllowedNetworksResource; import org.ovirt.engine.api.restapi.logging.Messages; import org.ovirt.engine.api.restapi.types.Mapper; import org.ovirt.engine.core.common.action.UpdateHostNicVfsConfigParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.queries.InterfaceAndIdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendHostNicResource extends AbstractBackendActionableResource<HostNic, VdsNetworkInterface> implements HostNicResource { private BackendHostNicsResource parent; public BackendHostNicResource(String id, BackendHostNicsResource parent) { super(id, HostNic.class, VdsNetworkInterface.class); this.parent = parent; } public BackendHostNicsResource getParent() { return parent; } @Override public HostNic get() { return parent.lookupNic(id, false); } @Override protected HostNic addParents(HostNic nic) { return parent.addParents(nic); } @Override public Response updateVirtualFunctionsConfiguration(Action action) { validateParameters(action, "virtualFunctionsConfiguration.numberOfVirtualFunctions|allNetworksAllowed"); final HostNicVfsConfig vfsConfig = parent.findVfsConfig(guid); if (vfsConfig == null) { return notAllowed(localize(Messages.INVALID_OPERATION_ON_NON_SRIOV_NIC), guid.toString()); } UpdateHostNicVfsConfigParameters params = prepareUpdateHostNicVfsConfigParameters(action, vfsConfig); return doAction(VdcActionType.UpdateHostNicVfsConfig, params, action); } private UpdateHostNicVfsConfigParameters prepareUpdateHostNicVfsConfigParameters(Action action, HostNicVfsConfig vfsConfig) { final Mapper<HostNicVfsConfig, UpdateHostNicVfsConfigParameters> entityMapper = getMapper(HostNicVfsConfig.class, UpdateHostNicVfsConfigParameters.class); UpdateHostNicVfsConfigParameters params = entityMapper.map(vfsConfig, new UpdateHostNicVfsConfigParameters()); final Mapper<org.ovirt.engine.api.model.HostNicVirtualFunctionsConfiguration, UpdateHostNicVfsConfigParameters> userInputMapper = getMapper(org.ovirt.engine.api.model.HostNicVirtualFunctionsConfiguration.class, UpdateHostNicVfsConfigParameters.class); userInputMapper.map(action.getVirtualFunctionsConfiguration(), params); return params; } private Response notAllowed(String reason, String detail) { return Response.status(405).entity(fault(reason, detail)).build(); } @Override public StatisticsResource getStatisticsResource() { EntityIdResolver<Guid> resolver = new EntityIdResolver<Guid>() { @Override public VdsNetworkInterface lookupEntity(Guid guid) throws BackendFailureException { return parent.lookupInterface(id); } }; HostNicStatisticalQuery query = new HostNicStatisticalQuery(resolver, newModel(id)); return inject(new BackendStatisticsResource<>(entityType, guid, query)); } @Override protected HostNic doPopulate(HostNic model, VdsNetworkInterface entity) { return parent.doPopulate(model, entity); } @Override protected HostNic deprecatedPopulate(HostNic model, VdsNetworkInterface entity) { return parent.deprecatedPopulate(model, entity); } private org.ovirt.engine.core.common.businessentities.network.Network getNewNetwork(HostNic nic) { org.ovirt.engine.core.common.businessentities.network.Network newNetwork = null; if(nic.isSetNetwork()){ newNetwork = map(nic.getNetwork(), parent.lookupClusterNetwork(nic.getNetwork())); } return newNetwork; } private org.ovirt.engine.core.common.businessentities.network.Network getOldNetwork(VdsNetworkInterface originalInter) { String oldNetworkName = originalInter.getNetworkName(); if (!StringUtils.isEmpty(oldNetworkName)) { return lookupAtachedNetwork(originalInter.getNetworkName()); } else { InterfaceAndIdQueryParameters params = new InterfaceAndIdQueryParameters( originalInter.getVdsId(), originalInter); List<VdsNetworkInterface> vlans = getBackendCollection(VdsNetworkInterface.class, VdcQueryType.GetAllChildVlanInterfaces, params); if (vlans!=null && !vlans.isEmpty()) { return lookupAtachedNetwork(vlans.get(0).getNetworkName()); } else { return null; } } } private org.ovirt.engine.core.common.businessentities.network.Network lookupAtachedNetwork(String networkName) { if(!StringUtils.isEmpty(networkName)){ for(org.ovirt.engine.core.common.businessentities.network.Network nwk : parent.getClusterNetworks()){ if(nwk.getName().equals(networkName)) { return nwk; } } } return null; } private org.ovirt.engine.core.common.businessentities.network.Network map(Network network, org.ovirt.engine.core.common.businessentities.network.Network template) { return getMapper(Network.class, org.ovirt.engine.core.common.businessentities.network.Network.class).map(network, template); } @Override public NetworkLabelsResource getNetworkLabelsResource() { return inject(new BackendHostNicLabelsResource(asGuid(id), parent.getHostId())); } @Override public NetworkAttachmentsResource getNetworkAttachmentsResource() { return inject(new BackendHostNicNetworkAttachmentsResource(asGuid(id), asGuid(parent.getHostId()))); } @Override public NetworkLabelsResource getVirtualFunctionAllowedLabelsResource() { return inject(new BackendVirtualFunctionAllowedLabelsResource(guid, parent.getHostId())); } @Override public VirtualFunctionAllowedNetworksResource getVirtualFunctionAllowedNetworksResource() { return inject(new BackendVirtualFunctionAllowedNetworksResource(guid, parent.getHostId())); } }