Martin Mucha has uploaded a new change for review. Change subject: core,restapi: allow indetifying network by its name when adding network attachment allow indetifying network by its name. ......................................................................
core,restapi: allow indetifying network by its name when adding network attachment allow indetifying network by its name. Change-Id: I2b692915593a86e9ea4b8faa8056cbcafefe328e Signed-off-by: Martin Mucha <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/HostSetupNetworksCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/NetworkIdNetworkNameCompleter.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/NetworkAttachment.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/NetworkIdOrNetworkNameIsSetConstraint.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/NetworkIdOrNetworkNameIsSet.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResource.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResourceTest.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NetworkAttachmentMapper.java 11 files changed, 206 insertions(+), 55 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/59/40359/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java index 4e38557..6c5952a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java @@ -26,6 +26,8 @@ @NonTransactiveCommandAttribute public class AddNetworkAttachmentCommand<T extends NetworkAttachmentParameters> extends VdsCommand<T> { + @Inject + private NetworkIdNetworkNameCompleter networkIdNetworkNameCompleter; @Inject private ManagementNetworkUtil managementNetworkUtil; @@ -56,6 +58,8 @@ completer.completeNetworkAttachment(getParameters().getNetworkAttachment()); completer.completeNetworkAttachments(networkAttachmentsForVds); + networkIdNetworkNameCompleter.completeNetworkAttachment(getParameters().getNetworkAttachment()); + return validateNetworkAttachment() && validateHostInterface() && validateCrossAttachments(networkAttachmentsForVds); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/HostSetupNetworksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/HostSetupNetworksCommand.java index 9290497..878f207 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/HostSetupNetworksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/HostSetupNetworksCommand.java @@ -14,8 +14,8 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; -import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.FailingValidationResults; +import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.VdsCommand; import org.ovirt.engine.core.bll.VdsHandler; import org.ovirt.engine.core.bll.context.CommandContext; @@ -81,6 +81,9 @@ @Inject private ManagementNetworkUtil managementNetworkUtil; + @Inject + private NetworkIdNetworkNameCompleter networkIdNetworkNameCompleter; + public HostSetupNetworksCommand(T parameters) { this(parameters, null); } @@ -118,6 +121,8 @@ completer.completeBonds(getParameters().getRemovedBonds()); completer.completeNetworkAttachments(getExistingAttachments()); + networkIdNetworkNameCompleter.completeNetworkAttachments(getParameters().getNetworkAttachments(), getNetworkBusinessEntityMap()); + validator = new HostSetupNetworksValidator(host, getParameters(), getExistingNics(), diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/NetworkIdNetworkNameCompleter.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/NetworkIdNetworkNameCompleter.java new file mode 100644 index 0000000..5d1acd6 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/NetworkIdNetworkNameCompleter.java @@ -0,0 +1,78 @@ +package org.ovirt.engine.core.bll.network.host; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.ovirt.engine.core.common.businessentities.BusinessEntityMap; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.network.NetworkDao; + + +@Singleton +public class NetworkIdNetworkNameCompleter { + + private final NetworkDao networkDao; + + @Inject + public NetworkIdNetworkNameCompleter(NetworkDao networkDao) { + this.networkDao = networkDao; + } + + public void completeNetworkAttachment(NetworkAttachment networkAttachment) { + completeNetworkAttachment(networkAttachment, null); + } + + public void completeNetworkAttachments(List<NetworkAttachment> networkAttachments, BusinessEntityMap<Network> clusterNetworks) { + for (NetworkAttachment networkAttachment : networkAttachments) { + completeNetworkAttachment(networkAttachment, clusterNetworks); + } + } + + private void completeNetworkAttachment(NetworkAttachment networkAttachment, BusinessEntityMap<Network> clusterNetworks) { + Guid networkId = networkAttachment.getNetworkId(); + String networkName = networkAttachment.getNetworkName(); + + if (networkId == null && networkName == null) { + throw new IllegalArgumentException("network name or network id must be set."); + } + + if (networkName != null) { + Network network = getNetworkByName(networkName, clusterNetworks); + if (network != null) { + if (networkId == null) { + networkAttachment.setNetworkId(network.getId()); + } else { + if (!network.getId().equals(networkId)) { + throw new IllegalArgumentException("Both nicId and nicName was specified, " + + "but they does not denote same nic."); + } + } + } + } else { + //TODO MM: this is not actually required, but it may be confusing why there's sometime unset fields. + Network network = getNetworkById(networkId, clusterNetworks); + networkAttachment.setNetworkName(network.getName()); + } + } + + private Network getNetworkById(Guid networkId, BusinessEntityMap<Network> clusterNetworks) { + if (clusterNetworks != null) { + return clusterNetworks.get(networkId); + } else { + return networkDao.get(networkId); + } + } + + private Network getNetworkByName(String networkName, BusinessEntityMap<Network> clusterNetworks) { + if (clusterNetworks != null) { + return clusterNetworks.get(networkName); + } else { + return networkDao.getByName(networkName); + } + + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/NetworkAttachment.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/NetworkAttachment.java index 09f3902..6d55ab6 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/NetworkAttachment.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/NetworkAttachment.java @@ -8,11 +8,13 @@ import org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions; import org.ovirt.engine.core.common.businessentities.BusinessEntity; import org.ovirt.engine.core.common.businessentities.IVdcQueryable; +import org.ovirt.engine.core.common.validation.annotation.NetworkIdOrNetworkNameIsSet; import org.ovirt.engine.core.common.validation.group.CreateEntity; import org.ovirt.engine.core.common.validation.group.RemoveEntity; import org.ovirt.engine.core.common.validation.group.UpdateEntity; import org.ovirt.engine.core.compat.Guid; +@NetworkIdOrNetworkNameIsSet(groups = { CreateEntity.class }) public class NetworkAttachment extends IVdcQueryable implements BusinessEntity<Guid> { private static final long serialVersionUID = -8052325342869681284L; @@ -20,8 +22,10 @@ @NotNull(groups = { UpdateEntity.class, RemoveEntity.class }) private Guid id; - @NotNull(groups = { CreateEntity.class, UpdateEntity.class }) + @NotNull(groups = { UpdateEntity.class }) private Guid networkId; + + private String networkName; private Guid nicId; @@ -115,6 +119,7 @@ result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((ipConfiguration == null) ? 0 : ipConfiguration.hashCode()); result = prime * result + ((networkId == null) ? 0 : networkId.hashCode()); + result = prime * result + ((networkName == null) ? 0 : networkName.hashCode()); result = prime * result + ((nicId == null) ? 0 : nicId.hashCode()); result = prime * result + ((nicName == null) ? 0 : nicName.hashCode()); result = prime * result + ((properties == null) ? 0 : properties.hashCode()); @@ -145,6 +150,11 @@ return false; } else if (!networkId.equals(other.networkId)) return false; + if (networkName == null) { + if (other.networkName != null) + return false; + } else if (!networkName.equals(other.networkName)) + return false; if (nicId == null) { if (other.nicId != null) return false; @@ -167,9 +177,18 @@ public String toString() { return "NetworkAttachment [id=" + id + ", networkId=" + networkId + + ", networkName=" + networkName + ", nicId=" + nicId + ", nicName=" + nicName + ", ipConfiguration=" + ipConfiguration + ", properties=" + properties + "]"; } + + public String getNetworkName() { + return networkName; + } + + public void setNetworkName(String networkName) { + this.networkName = networkName; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/NetworkIdOrNetworkNameIsSetConstraint.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/NetworkIdOrNetworkNameIsSetConstraint.java new file mode 100644 index 0000000..29162f6 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/NetworkIdOrNetworkNameIsSetConstraint.java @@ -0,0 +1,23 @@ +package org.ovirt.engine.core.common.validation; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; +import org.ovirt.engine.core.common.validation.annotation.NetworkIdOrNetworkNameIsSet; + +public class NetworkIdOrNetworkNameIsSetConstraint + implements ConstraintValidator<NetworkIdOrNetworkNameIsSet, NetworkAttachment> { + + @Override + public void initialize(NetworkIdOrNetworkNameIsSet constraintAnnotation) { + } + + @Override + public boolean isValid(NetworkAttachment value, ConstraintValidatorContext context) { + boolean networkIdNotSet = value.getNetworkId() == null; + boolean networkNameNotSet = value.getNetworkName() == null; + + return !(networkIdNotSet && networkNameNotSet); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/NetworkIdOrNetworkNameIsSet.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/NetworkIdOrNetworkNameIsSet.java new file mode 100644 index 0000000..7f97787 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/NetworkIdOrNetworkNameIsSet.java @@ -0,0 +1,24 @@ +package org.ovirt.engine.core.common.validation.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import org.ovirt.engine.core.common.validation.NetworkIdOrNetworkNameIsSetConstraint; + +@Constraint(validatedBy = NetworkIdOrNetworkNameIsSetConstraint.class) +@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface NetworkIdOrNetworkNameIsSet { + String message() default "VALIDATION_NETWORK_ID_OR_NETWORK_NAME_MUST_BE_SET"; + + Class<?>[] groups() default { }; + + Class<? extends Payload>[] payload() default { }; +} diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index b245577..f953ca2 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -888,6 +888,7 @@ VALIDATION.DATA_CENTER.DESCRIPTION.INVALID="Data Center description must be formed of ASCII charis only" VALIDATION.DATA_CENTER.NAME.INVALID=Data Center name must be formed of alphanumeric characters, numbers or "-_" VALIDATION_ID_NULL=ID is required. +VALIDATION_NETWORK_ID_OR_NETWORK_NAME_MUST_BE_SET=Either network id or network name must be provided. VALIDATION_NAME_NULL=Name is required. VALIDATION_NAME_INVALID=Name must be formed of alphanumeric characters, numbers or "-_". VALIDATION_NAME_INVALID_WITH_DOT=Name must be formed of alphanumeric characters, numbers or "-_.". diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml index 6cccee6..28ab4e1 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml @@ -2701,17 +2701,17 @@ parameterType: NetworkAttachment signatures: - mandatoryArguments: - network_attachment.network.id: 'xs:string' + network_attachment.network.name|id: 'xs:string' optionalArguments: - network_attachment.ip_configuration.ipv4s.boot_protocol: 'xs:string' - network_attachment.ip_configuration.ipv4s.ipv4--COLLECTION: - ipv4.address: 'xs:string' - ipv4.netmask: 'xs:string' - ipv4.gateway: 'xs:string' - network_attachment.properties.property--COLLECTION: - property.name: 'xs:string' - property.value: 'xs:string' - network_attachment.override_configuration: 'xs:boolean' + network_attachment.ip_configuration.ipv4s.boot_protocol: 'xs:string' + network_attachment.ip_configuration.ipv4s.ipv4--COLLECTION: + ipv4.address: 'xs:string' + ipv4.netmask: 'xs:string' + ipv4.gateway: 'xs:string' + network_attachment.properties.property--COLLECTION: + property.name: 'xs:string' + property.value: 'xs:string' + network_attachment.override_configuration: 'xs:boolean' - name: /hosts/{host:id}/networkattachments|rel=get description: get the list of network attachments of the host request: @@ -2732,17 +2732,17 @@ parameterType: NetworkAttachment signatures: - optionalArguments: - network_attachment.host_nic.id: 'xs:string' - network_attachment.host_nic.name: 'xs:string' - network_attachment.ip_configuration.ipv4s.boot_protocol: 'xs:string' - network_attachment.ip_configuration.ipv4s.ipv4--COLLECTION: - ipv4.address: 'xs:string' - ipv4.netmask: 'xs:string' - ipv4.gateway: 'xs:string' - network_attachment.properties.property--COLLECTION: - property.name: 'xs:string' - property.value: 'xs:string' - network_attachment.override_configuration: 'xs:boolean' + network_attachment.host_nic.id: 'xs:string' + network_attachment.host_nic.name: 'xs:string' + network_attachment.ip_configuration.ipv4s.boot_protocol: 'xs:string' + network_attachment.ip_configuration.ipv4s.ipv4--COLLECTION: + ipv4.address: 'xs:string' + ipv4.netmask: 'xs:string' + ipv4.gateway: 'xs:string' + network_attachment.properties.property--COLLECTION: + property.name: 'xs:string' + property.value: 'xs:string' + network_attachment.override_configuration: 'xs:boolean' - name: /hosts/{host:id}/networkattachments|rel=add description: add a new network attachment to the host request: @@ -2750,19 +2750,19 @@ parameterType: NetworkAttachment signatures: - mandatoryArguments: - network_attachment.network.id: 'xs:string' + network_attachment.network.name|id: 'xs:string' optionalArguments: - network_attachment.host_nic.id: 'xs:string' - network_attachment.host_nic.name: 'xs:string' - network_attachment.ip_configuration.ipv4s.boot_protocol: 'xs:string' - network_attachment.ip_configuration.ipv4s.ipv4--COLLECTION: - ipv4.address: 'xs:string' - ipv4.netmask: 'xs:string' - ipv4.gateway: 'xs:string' - network_attachment.properties.property--COLLECTION: - property.name: 'xs:string' - property.value: 'xs:string' - network_attachment.override_configuration: 'xs:boolean' + network_attachment.host_nic.id: 'xs:string' + network_attachment.host_nic.name: 'xs:string' + network_attachment.ip_configuration.ipv4s.boot_protocol: 'xs:string' + network_attachment.ip_configuration.ipv4s.ipv4--COLLECTION: + ipv4.address: 'xs:string' + ipv4.netmask: 'xs:string' + ipv4.gateway: 'xs:string' + network_attachment.properties.property--COLLECTION: + property.name: 'xs:string' + property.value: 'xs:string' + network_attachment.override_configuration: 'xs:boolean' - name: /hosts/{host:id}/unmanagednetworks|rel=get description: get a list of unmanaged networks request: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResource.java index 616a76e..a7ba8a1 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResource.java @@ -46,7 +46,6 @@ @Override public Response add(NetworkAttachment attachment) { - validateParameters(attachment, "network.id"); org.ovirt.engine.core.common.businessentities.network.NetworkAttachment networkAttachment = map(attachment); NetworkAttachmentParameters params = new NetworkAttachmentParameters(hostId, networkAttachment); return performCreate(VdcActionType.AddNetworkAttachment, diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResourceTest.java index f62036c..e4964ca 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/AbstractBackendNetworkAttachmentsResourceTest.java @@ -121,19 +121,6 @@ } @Test - public void testAddIncompleteParameters() throws Exception { - org.ovirt.engine.api.model.NetworkAttachment model = createIncompleteNetworkAttachment(); - setUriInfo(setUpBasicUriExpectations()); - control.replay(); - try { - collection.add(model); - fail("expected WebApplicationException on incomplete parameters"); - } catch (WebApplicationException wae) { - verifyIncompleteException(wae, "NetworkAttachment", "add", getIncompleteFields()); - } - } - - @Test @Ignore @Override public void testQuery() throws Exception { @@ -220,10 +207,6 @@ } catch (WebApplicationException wae) { verifyFault(wae, detail); } - } - - protected String[] getIncompleteFields() { - return new String[] { "network.id" }; } protected org.ovirt.engine.api.model.NetworkAttachment createIncompleteNetworkAttachment() { diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NetworkAttachmentMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NetworkAttachmentMapper.java index 4d10036..e9b2808 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NetworkAttachmentMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/NetworkAttachmentMapper.java @@ -24,8 +24,15 @@ entity.setId(GuidUtils.asGuid(model.getId())); } - if (model.isSetNetwork() && model.getNetwork().isSetId()) { - entity.setNetworkId(GuidUtils.asGuid(model.getNetwork().getId())); + if (model.isSetNetwork()) { + Network networkModel = model.getNetwork(); + if (networkModel.isSetId()) { + entity.setNetworkId(GuidUtils.asGuid(networkModel.getId())); + } + + if (networkModel.isSetName()) { + entity.setNetworkName(networkModel.getName()); + } } if (model.isSetHostNic()) { @@ -97,6 +104,14 @@ model.getNetwork().setId(entity.getNetworkId().toString()); } + if (entity.getNetworkName() != null) { + if (model.getNetwork() == null) { + model.setNetwork(new Network()); + } + + model.getNetwork().setName(entity.getNetworkName()); + } + if (entity.getNicId() != null) { model.setHostNic(new HostNIC()); model.getHostNic().setId(entity.getNicId().toString()); -- To view, visit https://gerrit.ovirt.org/40359 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2b692915593a86e9ea4b8faa8056cbcafefe328e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Mucha <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
