Alona Kaplan has uploaded a new change for review. Change subject: restapi: Adding Network Linking ......................................................................
restapi: Adding Network Linking - Adding new properties under VM NIC: * plugged * link_state ("up"/ "down") - Deprecating the active property under VM NIC - Deprecating activate/deactivate actions - plug/unplug and changing link_state (up/down) on a vnic, will be done via PUT action on the VM NIC /api/vms/{vm:id}/nics/{nic:id}/ - Add support to no network ("<network/>") on the NIC. There is no reason to have dedicated actions for plug/unplug or changing link_state. The original reason for having them was that edit VM nic while the VM was up used to be blocked and now we'll enable doing these actions. Change-Id: I14394c47284364c87b0304451c1cb6c4504e83a0 Signed-off-by: Alona Kaplan <alkap...@redhat.com> --- M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNicResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicsResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendNicsResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResourceTest.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NicMapper.java M backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/NicMapperTest.java 15 files changed, 242 insertions(+), 144 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/65/10165/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNicResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNicResource.java index dd2bfac..da559b8 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNicResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmNicResource.java @@ -14,12 +14,15 @@ import org.ovirt.engine.api.model.Actionable; import org.ovirt.engine.api.model.NIC; + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML }) public interface VmNicResource extends NicResource { @Path("{action: (activate|deactivate)}/{oid}") public ActionResource getActionSubresource(@PathParam("action") String action, @PathParam("oid") String oid); + // TODO remove on 4.1 + @Deprecated @POST @Formatted @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML }) @@ -27,6 +30,8 @@ @Path("activate") public Response activate(Action action); + // TODO remove on 4.1 + @Deprecated @POST @Formatted @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML }) diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index aaa6559..15873d6 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -2255,10 +2255,12 @@ <xs:extension base="BaseDevice"> <xs:sequence> <xs:element ref="network" minOccurs="0" maxOccurs="1"/> + <xs:element name="linkActive" type="xs:boolean" minOccurs="0"/> <xs:element name="interface" type="xs:string" minOccurs="0"/> <xs:element ref="mac" minOccurs="0"/> <xs:element name="statistics" type="Statistics" minOccurs="0" maxOccurs="1"/> - <xs:element name="active" type="xs:boolean" minOccurs="0"/> + <xs:element name="active" type="xs:boolean" minOccurs="0"/> <!-- Deprecated, replaced by 'plugged' --> + <xs:element name="plugged" type="xs:boolean" minOccurs="0"/> <xs:element ref="port_mirroring" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:extension> diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml index 550e6c4..a80437f 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml @@ -389,12 +389,12 @@ parameterType: NIC signatures: - mandatoryArguments: {} - optionalArguments: {nic.network.id|name: 'xs:string', nic.name: 'xs:string', nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} + optionalArguments: {nic.network.id|name: 'xs:string', nic.linkActive: 'xs:boolean', nic.name: 'xs:string', nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} urlparams: {} headers: Content-Type: {value: application/xml|json, required: true} Correlation-Id: {value: 'any string', required: false} -- name: /api/vms/{vm:id}/nics/{nic:id}/activate|rel=activate +- name: /api/vms/{vm:id}/nics/{nic:id}/activate|rel=activate #deprecated, replaced by 'add/edit' request: body: parameterType: Action @@ -403,7 +403,7 @@ headers: Content-Type: {value: application/xml|json, required: true} Correlation-Id: {value: 'any string', required: false} -- name: /api/vms/{vm:id}/nics/{nic:id}/deactivate|rel=deactivate +- name: /api/vms/{vm:id}/nics/{nic:id}/deactivate|rel=deactivate #deprecated, replaced by 'add/edit' request: body: parameterType: Action @@ -417,8 +417,8 @@ body: parameterType: NIC signatures: - - mandatoryArguments: {nic.network.id|name: 'xs:string', nic.name: 'xs:string'} - optionalArguments: {nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} + - mandatoryArguments: {nic.name: 'xs:string'} + optionalArguments: {nic.network.id|name: 'xs:string', nic.linkActive: 'xs:boolean', nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} urlparams: {} headers: Content-Type: {value: application/xml|json, required: true} @@ -2153,7 +2153,7 @@ parameterType: NIC signatures: - mandatoryArguments: {nic.network.id|name: 'xs:string', nic.name: 'xs:string'} - optionalArguments: {nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} + optionalArguments: {nic.linkActive: 'xs:boolean', nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} urlparams: {} headers: Content-Type: {value: application/xml|json, required: true} @@ -2181,7 +2181,7 @@ parameterType: NIC signatures: - mandatoryArguments: {} - optionalArguments: {nic.network.id|name: 'xs:string', nic.name: 'xs:string', nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} + optionalArguments: {nic.network.id|name: 'xs:string', nic.linkActive: 'xs:boolean', nic.name: 'xs:string', nic.mac.address: 'xs:string', nic.interface: 'xs:string', nic.port_mirroring.networks.network--COLLECTION: {network.id: 'xs:string'}} urlparams: {} headers: Content-Type: {value: application/xml|json, required: true} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicResource.java index 4decc56..2a30bf5 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicResource.java @@ -7,8 +7,8 @@ import org.ovirt.engine.api.resource.NicResource; import org.ovirt.engine.api.resource.StatisticsResource; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.Network; +import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.compat.Guid; @@ -54,10 +54,13 @@ } protected Network findNetwork(NIC resource) { - if (resource.isSetNetwork()) { - BackendNicsResource parent = (BackendNicsResource)collection; + if (resource.isSetNetwork() && (resource.getNetwork().isSetName() || resource.getNetwork().isSetId())) { + BackendNicsResource parent = (BackendNicsResource) collection; Guid clusterId = parent.getClusterId(); - Network network = parent.lookupClusterNetwork(clusterId, resource.getNetwork().isSetId() ? asGuid(resource.getNetwork().getId()) : null, resource.getNetwork().getName()); + Network network = + parent.lookupClusterNetwork(clusterId, + resource.getNetwork().isSetId() ? asGuid(resource.getNetwork().getId()) : null, + resource.getNetwork().getName()); return network; } else { return null; diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicsResource.java index 05f66a4..b67459d 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendNicsResource.java @@ -6,9 +6,9 @@ import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.NIC; -import org.ovirt.engine.api.model.Nics; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.model.Networks; +import org.ovirt.engine.api.model.Nics; import org.ovirt.engine.api.model.PortMirroring; import org.ovirt.engine.api.resource.DevicesResource; import org.ovirt.engine.core.common.action.VdcActionType; @@ -51,12 +51,17 @@ VdcQueryType.GetAllNetworksByClusterId, new VdsGroupQueryParamenters(clusterId)); for (VmNetworkInterface entity : entities) { - org.ovirt.engine.core.common.businessentities.Network network = lookupClusterNetwork(clusterId, null, entity.getNetworkName(), networks); + org.ovirt.engine.core.common.businessentities.Network network = null; + if (entity.getNetworkName() != null) { + network = lookupClusterNetwork(clusterId, null, entity.getNetworkName(), networks); + } + NIC nic = populate(map(entity), entity); - if (network!=null && network.getId()!=null) { + if (network != null && network.getId() != null) { if (entity.isPortMirroring()) { PortMirroring portMirroring = new PortMirroring(); Networks nets = new Networks(); + Network net = new Network(); net.setId(network.getId().toString()); portMirroring.setNetworks(nets); @@ -92,7 +97,7 @@ @Override protected String[] getRequiredAddFields() { - return new String[] { "name", "network.name|id" }; + return new String[] { "name" }; } protected org.ovirt.engine.core.common.businessentities.Network lookupClusterNetwork(Guid clusterId, Guid id, String name, List<org.ovirt.engine.core.common.businessentities.Network> networks) { @@ -142,7 +147,7 @@ } protected void setNetworkId(NIC nic) { - if ( (nic.isSetNetwork()) && (!nic.getNetwork().isSetId())) { + if (nic.isSetNetwork() && !nic.getNetwork().isSetId() && nic.getNetwork().isSetName()) { Guid clusterId = getClusterId(); org.ovirt.engine.core.common.businessentities.Network network = lookupClusterNetwork(clusterId, nic.getNetwork().getId()==null ? null : asGuid(nic.getNetwork().getId()), nic.getNetwork().getName()); if (network!=null) { diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicResource.java index ebe6b53..1cffca9 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicResource.java @@ -4,8 +4,8 @@ import org.ovirt.engine.api.model.Nics; import org.ovirt.engine.api.resource.NicResource; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.Network; +import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; public class BackendTemplateNicResource extends BackendNicResource implements NicResource { @@ -21,8 +21,10 @@ @Override protected NIC populate(NIC model, VmNetworkInterface entity) { Network network = findNetwork(model); - model.getNetwork().setId(network.getId().toString()); - model.getNetwork().setName(null); + if (network != null) { + model.getNetwork().setId(network.getId().toString()); + model.getNetwork().setName(null); + } return model; } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResource.java index 28f9c73..531498e 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResource.java @@ -1,22 +1,21 @@ package org.ovirt.engine.api.restapi.resource; -import org.ovirt.engine.core.common.action.AddVmTemplateInterfaceParameters; -import org.ovirt.engine.core.common.action.RemoveVmTemplateInterfaceParameters; -import org.ovirt.engine.core.common.action.VdcActionParametersBase; -import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; -import org.ovirt.engine.core.common.businessentities.VmTemplate; -import org.ovirt.engine.core.common.businessentities.Network; -import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; -import org.ovirt.engine.core.common.queries.VdcQueryType; -import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider; - import org.ovirt.engine.api.model.NIC; import org.ovirt.engine.api.model.Nics; import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.resource.DeviceResource; import org.ovirt.engine.api.resource.DevicesResource; +import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider; +import org.ovirt.engine.core.common.action.AddVmTemplateInterfaceParameters; +import org.ovirt.engine.core.common.action.RemoveVmTemplateInterfaceParameters; +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.VmNetworkInterface; +import org.ovirt.engine.core.common.businessentities.VmTemplate; +import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; public class BackendTemplateNicsResource extends BackendNicsResource @@ -67,12 +66,19 @@ @Override protected VmNetworkInterface setNetwork(NIC device, VmNetworkInterface ni) { if (device.isSetNetwork()) { - Guid clusterId = getEntity(VmTemplate.class, - VdcQueryType.GetVmTemplate, - new GetVmTemplateParameters(parentId), "id").getvds_group_id(); - Network net = lookupClusterNetwork(clusterId, device.getNetwork().isSetId() ? asGuid(device.getNetwork().getId()) : null, device.getNetwork().getName()); - if (net != null) { - ni.setNetworkName(net.getname()); + if (device.getNetwork().getId() != null || device.getNetwork().getName() != null) { + Guid clusterId = getEntity(VmTemplate.class, + VdcQueryType.GetVmTemplate, + new GetVmTemplateParameters(parentId), "id").getvds_group_id(); + Network net = + lookupClusterNetwork(clusterId, device.getNetwork().isSetId() ? asGuid(device.getNetwork() + .getId()) + : null, device.getNetwork().getName()); + if (net != null) { + ni.setNetworkName(net.getname()); + } + } else { + ni.setNetworkName(null); } } return ni; diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java index fae39a3..29bf1a2 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java @@ -6,7 +6,10 @@ import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.Fault; import org.ovirt.engine.api.model.NIC; +import org.ovirt.engine.api.model.Network; +import org.ovirt.engine.api.model.Networks; import org.ovirt.engine.api.model.Nics; +import org.ovirt.engine.api.model.PortMirroring; import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.VmNicResource; import org.ovirt.engine.core.common.action.ActivateDeactivateVmNicParameters; @@ -14,80 +17,119 @@ import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.api.model.Network; -import org.ovirt.engine.api.model.Networks; -import org.ovirt.engine.api.model.PortMirroring; public class BackendVmNicResource extends BackendNicResource implements VmNicResource { protected BackendVmNicResource(String id, - AbstractBackendReadOnlyDevicesResource<NIC, Nics, VmNetworkInterface> collection, - VdcActionType updateType, - ParametersProvider<NIC, VmNetworkInterface> updateParametersProvider, - String[] requiredUpdateFields, - String[] subCollections) { + AbstractBackendReadOnlyDevicesResource<NIC, Nics, VmNetworkInterface> collection, + VdcActionType updateType, + ParametersProvider<NIC, VmNetworkInterface> updateParametersProvider, + String[] requiredUpdateFields, + String[] subCollections) { super(id, collection, updateType, updateParametersProvider, requiredUpdateFields, subCollections); } @Override protected NIC populate(NIC model, VmNetworkInterface entity) { - BackendVmNicsResource parent = (BackendVmNicsResource)collection; - Guid clusterId = parent.getClusterId(); - org.ovirt.engine.core.common.businessentities.Network network = parent.getClusterNetwork(clusterId, null, model.getNetwork().getName()); - String networkId = network == null ? null : network.getId().toString(); - model.getNetwork().setId(networkId); - model.getNetwork().setName(null); - if (entity.isPortMirroring()) { - PortMirroring portMirroring = new PortMirroring(); - Networks networks = new Networks(); - Network net = new Network(); - net.setId(networkId); - net.setName(network.getname()); - portMirroring.setNetworks(networks); - portMirroring.getNetworks().getNetworks().add(net); - model.setPortMirroring(portMirroring); + BackendVmNicsResource parent = (BackendVmNicsResource) collection; + if (model.getNetwork().isSetName()) { + Guid clusterId = parent.getClusterId(); + org.ovirt.engine.core.common.businessentities.Network network = + parent.getClusterNetwork(clusterId, null, model.getNetwork().getName()); + String networkId = network == null ? null : network.getId().toString(); + model.getNetwork().setId(networkId); + model.getNetwork().setName(null); + + if (entity.isPortMirroring()) { + PortMirroring portMirroring = new PortMirroring(); + Networks networks = new Networks(); + Network net = new Network(); + net.setId(networkId); + net.setName(network.getname()); + portMirroring.setNetworks(networks); + portMirroring.getNetworks().getNetworks().add(net); + model.setPortMirroring(portMirroring); + } } return parent.addStatistics(model, entity, uriInfo, httpHeaders); } @Override public NIC update(NIC device) { - //TODO: this is temporary mapping between engine boolean port mirroring parameter, and REST - // port mirroring network collection, next engine version will support the network collection - // in port mirroring + // TODO: this is temporary mapping between engine boolean port mirroring parameter, and REST + // port mirroring network collection, next engine version will support the network collection + // in port mirroring + NIC nic = null; validateEnums(NIC.class, device); boolean fault = false; String faultString = "The port mirroring network must match the Network set on the NIC"; + Network pmNetwork = null; boolean isPortMirroring = device.isSetPortMirroring() && device.getPortMirroring().isSetNetworks(); - boolean isPortMirroringExceeded = - isPortMirroring && device.getPortMirroring().getNetworks().getNetworks().size() > 1; - isPortMirroring = isPortMirroring && device.getPortMirroring().getNetworks().getNetworks().size() == 1; - if (isPortMirroringExceeded) { - fault = true; - faultString = "Cannot set more than one network in port mirroring mode"; + if (isPortMirroring) { + boolean isPortMirroringExceeded = + isPortMirroring && device.getPortMirroring().getNetworks().getNetworks().size() > 1; + isPortMirroring = isPortMirroring && device.getPortMirroring().getNetworks().getNetworks().size() == 1; + if (isPortMirroring) { + pmNetwork = device.getPortMirroring().getNetworks().getNetworks().get(0); + } + if (isPortMirroringExceeded) { + fault = true; + faultString = "Cannot set more than one network in port mirroring mode"; + } + } else { + nic = get(); + isPortMirroring = nic.isSetPortMirroring() && nic.getPortMirroring().isSetNetworks(); + if (isPortMirroring) { + pmNetwork = nic.getPortMirroring().getNetworks().getNetworks().get(0); + } } + String networkId = (device.isSetNetwork() && device.getNetwork().isSetId()) ? device.getNetwork().getId() : null; String networkName = (device.isSetNetwork() && device.getNetwork().isSetName()) ? device.getNetwork().getName() : null; + String faultStringNoNetwork = "Cannot set port mirroring if there is no network on the NIC"; if (!fault && isPortMirroring) { - Network pmNetwork = device.getPortMirroring().getNetworks().getNetworks().get(0); + String pmNetworkId = (pmNetwork.isSetId() ? pmNetwork.getId() : null); String pmNetworkName = (pmNetwork.isSetName() ? pmNetwork.getName() : null); - if (pmNetworkId != null) { + if (device.isSetNetwork() && device.getNetwork().getId() == null && device.getNetwork().getName() == null) { + fault = true; + faultString = faultStringNoNetwork; + } + else if (pmNetworkId != null) { if (networkId == null) { - networkId = (networkName != null) ? getNetworkId(networkName) : get().getNetwork().getId(); + if (networkName != null) { + networkId = getNetworkId(networkName); + } else { + nic = nic != null ? nic : get(); + networkId = nic.getNetwork().getId(); + } } - fault = (!pmNetworkId.equals(networkId)); + if (networkId != null) { + fault = (!pmNetworkId.equals(networkId)); + } else { + fault = true; + faultString = faultStringNoNetwork; + } } else if (pmNetworkName != null) { if (networkName == null) { if (networkId == null) { - networkId = get().getNetwork().getId(); + nic = nic != null ? nic : get(); + networkId = nic.getNetwork().getId(); } pmNetworkId = getNetworkId(pmNetworkName); - fault = (!networkId.equals(pmNetworkId)); + if (networkId != null) { + fault = (!pmNetworkId.equals(networkId)); + } } - fault = fault || (!pmNetworkName.equals(networkName)); + if (networkId != null || networkName != null) { + fault = fault || (!pmNetworkName.equals(networkName)); + } + else { + fault = true; + faultString = faultStringNoNetwork; + } } else { fault = true; faultString = "Network must have name or id property for port mirroring"; @@ -103,12 +145,14 @@ } private String getNetworkId(String networkName) { - BackendVmNicsResource parent = (BackendVmNicsResource) collection; - Guid clusterId = parent.getClusterId(); - org.ovirt.engine.core.common.businessentities.Network n = - parent.getClusterNetwork(clusterId, null, networkName); - if (n != null) { - return n.getId().toString(); + if (networkName != null) { + BackendVmNicsResource parent = (BackendVmNicsResource) collection; + Guid clusterId = parent.getClusterId(); + org.ovirt.engine.core.common.businessentities.Network n = + parent.getClusterNetwork(clusterId, null, networkName); + if (n != null) { + return n.getId().toString(); + } } return null; } @@ -135,6 +179,6 @@ @Override public NIC get() { - return super.get();//explicit call solves REST-Easy confusion + return super.get();// explicit call solves REST-Easy confusion } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java index 89ef3d4..acc3962 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java @@ -7,6 +7,15 @@ 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.Fault; +import org.ovirt.engine.api.model.NIC; +import org.ovirt.engine.api.model.Statistic; +import org.ovirt.engine.api.model.Statistics; +import org.ovirt.engine.api.resource.VmNicResource; +import org.ovirt.engine.api.resource.VmNicsResource; +import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider; import org.ovirt.engine.core.common.action.AddVmInterfaceParameters; import org.ovirt.engine.core.common.action.RemoveVmInterfaceParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; @@ -17,28 +26,18 @@ import org.ovirt.engine.core.common.queries.GetVmByVmIdParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider; - -import org.ovirt.engine.api.common.util.DetailHelper; -import org.ovirt.engine.api.common.util.LinkHelper; -import org.ovirt.engine.api.model.Fault; -import org.ovirt.engine.api.model.NIC; -import org.ovirt.engine.api.model.Statistic; -import org.ovirt.engine.api.model.Statistics; -import org.ovirt.engine.api.resource.VmNicResource; -import org.ovirt.engine.api.resource.VmNicsResource; public class BackendVmNicsResource - extends BackendNicsResource + extends BackendNicsResource implements VmNicsResource { public BackendVmNicsResource(Guid parentId) { super(parentId, - VdcQueryType.GetVmInterfacesByVmId, - new GetVmByVmIdParameters(parentId), - VdcActionType.AddVmInterface, - VdcActionType.RemoveVmInterface, - VdcActionType.UpdateVmInterface); + VdcQueryType.GetVmInterfacesByVmId, + new GetVmByVmIdParameters(parentId), + VdcActionType.AddVmInterface, + VdcActionType.RemoveVmInterface, + VdcActionType.UpdateVmInterface); } @Override @@ -55,9 +54,9 @@ @Override public Response add(NIC device) { - //TODO: this is temporary mapping between engine boolean port mirroring parameter, and REST - // port mirroring network collection, next engine version will support the network collection - // in port mirroring + // TODO: this is temporary mapping between engine boolean port mirroring parameter, and REST + // port mirroring network collection, next engine version will support the network collection + // in port mirroring validateEnums(NIC.class, device); boolean fault = false; @@ -78,18 +77,24 @@ (device.isSetNetwork() && device.getNetwork().isSetId()) ? device.getNetwork().getId() : null; String networkName = (device.isSetNetwork() && device.getNetwork().isSetName()) ? device.getNetwork().getName() : null; - if (pmNetworkId != null) { - networkId = (networkId == null) ? getNetworkId(networkName) : networkId; - fault = (!pmNetworkId.equals(networkId)); - } else if (pmNetworkName != null) { - if (networkName == null && networkId != null) { - pmNetworkId = getNetworkId(pmNetworkName); + + if (networkName != null || networkId != null) { + if (pmNetworkId != null) { + networkId = (networkId == null) ? getNetworkId(networkName) : networkId; fault = (!pmNetworkId.equals(networkId)); + } else if (pmNetworkName != null) { + if (networkName == null && networkId != null) { + pmNetworkId = getNetworkId(pmNetworkName); + fault = (!pmNetworkId.equals(networkId)); + } + fault = fault || (!pmNetworkName.equals(networkName)); + } else { + fault = true; + faultString = "Network must have name or id property for port mirroring"; } - fault = fault || (!pmNetworkName.equals(networkName)); } else { fault = true; - faultString = "Network must have name or id property for port mirroring"; + faultString = "Cannot set port mirroring if there is no network on the NIC"; } } if (fault) { @@ -102,11 +107,12 @@ } private String getNetworkId(String networkName) { - Guid clusterId = getClusterId(); - org.ovirt.engine.core.common.businessentities.Network n = - getClusterNetwork(clusterId, null, networkName); - if (n != null) { - return n.getId().toString(); + if (networkName != null) { + Guid clusterId = getClusterId(); + org.ovirt.engine.core.common.businessentities.Network n = getClusterNetwork(clusterId, null, networkName); + if (n != null) { + return n.getId().toString(); + } } return null; } @@ -143,20 +149,26 @@ @SingleEntityResource public VmNicResource getDeviceSubResource(String id) { return inject(new BackendVmNicResource(id, - this, - updateType, - getUpdateParametersProvider(), - getRequiredUpdateFields(), - subCollections)); + this, + updateType, + getUpdateParametersProvider(), + getRequiredUpdateFields(), + subCollections)); } @Override protected VmNetworkInterface setNetwork(NIC device, VmNetworkInterface ni) { if (device.isSetNetwork()) { - Guid clusterId = getClusterId(); - Network net = lookupClusterNetwork(clusterId, device.getNetwork().isSetId() ? asGuid(device.getNetwork().getId()) : null, device.getNetwork().getName()); - if (net != null) { - ni.setNetworkName(net.getname()); + if (device.getNetwork().isSetId() || device.getNetwork().isSetName()) { + Guid clusterId = getClusterId(); + Network net = + lookupClusterNetwork(clusterId, device.getNetwork().isSetId() ? asGuid(device.getNetwork() + .getId()) : null, device.getNetwork().getName()); + if (net != null) { + ni.setNetworkName(net.getname()); + } + } else { + ni.setNetworkName(null); } } return ni; @@ -165,8 +177,8 @@ @Override protected Guid getClusterId() { Guid clusterId = getEntity(VM.class, - VdcQueryType.GetVmByVmId, - new GetVmByVmIdParameters(parentId), "id").getVdsGroupId(); + VdcQueryType.GetVmByVmId, + new GetVmByVmIdParameters(parentId), "id").getVdsGroupId(); return clusterId; } } diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendNicsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendNicsResourceTest.java index 0c69cbd..5647f5e 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendNicsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendNicsResourceTest.java @@ -3,12 +3,11 @@ import java.util.LinkedList; import java.util.List; -import org.junit.Test; - import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.junit.Test; import org.ovirt.engine.api.model.NIC; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.resource.NicResource; @@ -163,7 +162,7 @@ @Test public void testAddIncompleteParameters() throws Exception { NIC model = new NIC(); - model.setName(NAMES[0]); + model.setName(null); model.setNetwork(new Network()); setUriInfo(setUpBasicUriExpectations()); @@ -172,7 +171,7 @@ collection.add(model); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { - verifyIncompleteException(wae, "NIC", "add", "network.name|id"); + verifyIncompleteException(wae, "NIC", "add", "name"); } } @@ -204,6 +203,7 @@ verifyCollection(getCollection()); } + @Override protected void setUpEntityQueryExpectations(int times) throws Exception { while (times-- > 0) { setUpEntityQueryExpectations(VdcQueryType.GetVmInterfacesByVmId, diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResourceTest.java index 1fa0b34..f7fb0a7 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplateNicsResourceTest.java @@ -1,12 +1,11 @@ package org.ovirt.engine.api.restapi.resource; -import org.junit.Test; - import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.junit.Test; import org.ovirt.engine.api.model.NIC; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.resource.NicResource; @@ -145,7 +144,7 @@ @Test public void testAddIncompleteParameters() throws Exception { NIC model = new NIC(); - model.setName(NAMES[0]); + model.setName(null); model.setNetwork(new Network()); setUriInfo(setUpBasicUriExpectations()); @@ -154,7 +153,7 @@ collection.add(model); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { - verifyIncompleteException(wae, "NIC", "add", "network.name|id"); + verifyIncompleteException(wae, "NIC", "add", "name"); } } diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResourceTest.java index 49a7427..317d96c 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResourceTest.java @@ -163,6 +163,17 @@ assertNotNull(nic); } + @Test(expected = WebApplicationException.class) + public void testUpdateNoNetworkWithPortMirroringNetwork() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + control.replay(); + NIC nic = getNic(false); + nic.setNetwork(new Network()); + nic = resource.update(nic); + assertNotNull(nic); + } + + @Test(expected=WebFaultException.class) public void testUpdateWithNonExistingNetwork() throws Exception { control.replay(); diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResourceTest.java index 4c5db10..0700621 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResourceTest.java @@ -2,12 +2,11 @@ import java.util.List; -import org.junit.Test; - import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.junit.Test; import org.ovirt.engine.api.model.NIC; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.resource.NicResource; @@ -144,7 +143,7 @@ @Test public void testAddIncompleteParameters() throws Exception { NIC model = new NIC(); - model.setName(NAMES[0]); + model.setName(null); model.setNetwork(new Network()); setUriInfo(setUpBasicUriExpectations()); @@ -153,7 +152,7 @@ collection.add(model); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { - verifyIncompleteException(wae, "NIC", "add", "network.name|id"); + verifyIncompleteException(wae, "NIC", "add", "name"); } } diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NicMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NicMapper.java index de6b38e..1b189cb 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NicMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NicMapper.java @@ -24,8 +24,11 @@ if (model.isSetMac() && model.getMac().isSetAddress()) { entity.setMacAddress(model.getMac().getAddress()); } - if (model.isSetNetwork() && model.getNetwork().isSetName()) { + if (model.isSetNetwork()) { entity.setNetworkName(model.getNetwork().getName()); + } + if (model.isSetLinkActive()) { + entity.setLinked(model.isLinkActive()); } if (model.isSetInterface()) { NicInterface nicType = NicInterface.fromValue(model.getInterface()); @@ -35,6 +38,9 @@ } if (model.isSetActive()) { entity.setActive(model.isActive()); + } + if (model.isSetPlugged()) { + entity.setActive(model.isPlugged()); } if (model.isSetPortMirroring() && model.getPortMirroring().isSetNetworks() && model.getPortMirroring().getNetworks().isSetNetworks()) { @@ -63,12 +69,14 @@ model.setMac(new MAC()); model.getMac().setAddress(entity.getMacAddress()); } - if (entity.getNetworkName() != null) { - model.setNetwork(new Network()); - model.getNetwork().setName(entity.getNetworkName()); - } + + model.setNetwork(new Network()); + model.getNetwork().setName(entity.getNetworkName()); + + model.setLinkActive(entity.isLinked()); model.setInterface(map(entity.getType())); model.setActive(entity.isActive()); + model.setPlugged(entity.isActive()); return model; } diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/NicMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/NicMapperTest.java index 2448687..727150c 100644 --- a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/NicMapperTest.java +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/NicMapperTest.java @@ -33,6 +33,8 @@ assertNotNull(transform.getMac()); assertEquals(model.getMac().getAddress(), transform.getMac().getAddress()); assertEquals(model.getInterface(), transform.getInterface()); + assertEquals(model.isLinkActive(), transform.isLinkActive()); + assertEquals(model.isPlugged(), transform.isPlugged()); } @Test -- To view, visit http://gerrit.ovirt.org/10165 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I14394c47284364c87b0304451c1cb6c4504e83a0 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alona Kaplan <alkap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches