Moti Asayag has uploaded a new change for review. Change subject: engine: Add network attachment commands ......................................................................
engine: Add network attachment commands Change-Id: I828bada5a8f2e9548579dfa3fdcb610190df279c Signed-off-by: Moti Asayag <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/RemoveNetworkAttachmentCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UpdateNetworkAttachmentCommand.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/NetworkAttachmentParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 5 files changed, 327 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/27/33927/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 new file mode 100644 index 0000000..f6d3559 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AddNetworkAttachmentCommand.java @@ -0,0 +1,145 @@ +package org.ovirt.engine.core.bll.network.host; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.VdsCommand; +import org.ovirt.engine.core.common.action.NetworkAttachmentParameters; +import org.ovirt.engine.core.common.businessentities.Entities; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.network.IpConfiguration; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; +import org.ovirt.engine.core.common.businessentities.network.NetworkBootProtocol; +import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; +import org.ovirt.engine.core.common.businessentities.network.NetworkClusterId; +import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.utils.NetworkUtils; + +public class AddNetworkAttachmentCommand<T extends NetworkAttachmentParameters> extends VdsCommand<T> { + + private List<VdsNetworkInterface> hostNics; + + public AddNetworkAttachmentCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + VDS vds = getVds(); + + if (vds == null) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_HOST_NOT_EXIST); + } + + if (!HostSetupNetworksCommand.SUPPORTED_HOST_STATUSES.contains(vds.getStatus())) { + addCanDoActionMessage(VdcBllMessages.VAR__HOST_STATUS__UP_MAINTENANCE_OR_NON_OPERATIONAL); + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL); + } + + if (getParameters().getNetworkAttachment() == null) { + getReturnValue().getCanDoActionMessages().add("NO_NETWORK_ATTACHMENT"); + return false; + } + + Network network = getNetworkDAO().get(getParameters().getNetworkAttachment().getNetworkId()); + if (network == null) { + getReturnValue().getCanDoActionMessages().add("NETWORK_NOT_EXISTS"); + return false; + } + + if (network.isExternal()) { + return failCanDoAction(VdcBllMessages.EXTERNAL_NETWORK_CANNOT_BE_PROVISIONED); + } + + List<VDS> hostsAttachedToNetwork = getVdsDAO().getAllForNetwork(network.getId()); + for (VDS host : hostsAttachedToNetwork) { + if (host.getId().equals(getVdsId())) { + getReturnValue().getCanDoActionMessages().add("NETWORK_ALREADY_ATTACHED_TO_HOST"); + return false; + } + } + + NetworkCluster networkCluster = + getNetworkClusterDAO().get(new NetworkClusterId(getVdsGroupId(), network.getId())); + if (networkCluster == null) { + getReturnValue().getCanDoActionMessages().add("NETWORK_NOT_ATTACHED_TO_CLUSTER"); + return false; + } + + IpConfiguration ipConfiguration = getParameters().getNetworkAttachment().getIpConfiguration(); + if (ipConfiguration != null + && ipConfiguration.getBootProtocol() == NetworkBootProtocol.STATIC_IP + && ipConfiguration.getAddress() == null) { + return failCanDoAction(VdcBllMessages.NETWORK_ADDR_MANDATORY_IN_STATIC_IP); + } + + if (networkCluster.isDisplay() + && (ipConfiguration == null || ipConfiguration.getBootProtocol() == NetworkBootProtocol.NONE)) { + getReturnValue().getCanDoActionMessages().add("DISPLAY_NETWORK_MUST_HAVE_IP"); + return false; + } + + VdsNetworkInterface nic = null; + if (getParameters().getNetworkAttachment().getNicId() != null) { + nic = getDbFacade().getInterfaceDao().get(getParameters().getNetworkAttachment().getNicId()); + } else if (getParameters().getNetworkAttachment().getNicName() != null) { + nic = Entities.entitiesByName(getHostInterfaces()).get(getParameters().getNetworkAttachment().getNicName()); + } + + if (nic == null) { + return failCanDoAction(VdcBllMessages.HOST_NETWORK_INTERFACE_NOT_EXIST); + } + + if (!nic.getVdsId().equals(getVdsId())) { + getReturnValue().getCanDoActionMessages().add("NIC_NOT_BELONG_TO_HOST"); + return false; + } + + // TODO: Reuse LabelNicCommand validation + if (Boolean.TRUE.equals(nic.getBonded())) { + int slavesCount = 0; + for (VdsNetworkInterface i : getHostInterfaces()) { + if (StringUtils.equals(i.getName(), nic.getBondName())) { + slavesCount++; + if (slavesCount == 2) { + break; + } + } + } + + if (slavesCount < 2) { + return failCanDoAction(VdcBllMessages.NETWORK_BONDS_INVALID_SLAVE_COUNT); + } + } + + if (NetworkUtils.isVlan(nic) || nic.isBondSlave()) { + getReturnValue().getCanDoActionMessages().add("NETWORK_ATTACHED_TO_SLAVE_OR_VLAN"); + return false; + } + + List<NetworkAttachment> networkAttachments = getDbFacade().getNetworkAttachmentDao().getAllForNic(nic.getId()); + for (NetworkAttachment networkAttachment : networkAttachments) { + canCoExist(networkAttachment, getParameters().getNetworkAttachment()); + } + + return true; + } + + private List<VdsNetworkInterface> getHostInterfaces() { + if (hostNics == null) { + hostNics = getDbFacade().getInterfaceDao().getAllInterfacesForVds(getVdsId()); + } + + return hostNics; + } + + private void canCoExist(NetworkAttachment networkAttachment, NetworkAttachment networkAttachment2) { + // TODO reuse AttachNetworkToVdsInterfaceCommand.networkConfigurationSupported() + } + + @Override + protected void executeCommand() { + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/RemoveNetworkAttachmentCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/RemoveNetworkAttachmentCommand.java new file mode 100644 index 0000000..ca18e32 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/RemoveNetworkAttachmentCommand.java @@ -0,0 +1,20 @@ +package org.ovirt.engine.core.bll.network.host; + +import org.ovirt.engine.core.bll.VdsCommand; +import org.ovirt.engine.core.common.action.NetworkAttachmentParameters; + +public class RemoveNetworkAttachmentCommand<T extends NetworkAttachmentParameters> extends VdsCommand<T> { + + public RemoveNetworkAttachmentCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + return true; + } + + @Override + protected void executeCommand() { + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UpdateNetworkAttachmentCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UpdateNetworkAttachmentCommand.java new file mode 100644 index 0000000..bbf3070 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UpdateNetworkAttachmentCommand.java @@ -0,0 +1,130 @@ +package org.ovirt.engine.core.bll.network.host; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.VdsCommand; +import org.ovirt.engine.core.common.action.NetworkAttachmentParameters; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.network.IpConfiguration; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; +import org.ovirt.engine.core.common.businessentities.network.NetworkBootProtocol; +import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; +import org.ovirt.engine.core.common.businessentities.network.NetworkClusterId; +import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.utils.NetworkUtils; + +public class UpdateNetworkAttachmentCommand<T extends NetworkAttachmentParameters> extends VdsCommand<T> { + + public UpdateNetworkAttachmentCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + VDS vds = getVds(); + + if (vds == null) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_HOST_NOT_EXIST); + } + + if (!HostSetupNetworksCommand.SUPPORTED_HOST_STATUSES.contains(vds.getStatus())) { + addCanDoActionMessage(VdcBllMessages.VAR__HOST_STATUS__UP_MAINTENANCE_OR_NON_OPERATIONAL); + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL); + } + + if (getParameters().getNetworkAttachment() == null) { + getReturnValue().getCanDoActionMessages().add("NO_NETWORK_ATTACHMENT"); + return false; + } + + Network network = getNetworkDAO().get(getParameters().getNetworkAttachment().getNetworkId()); + if (network == null) { + getReturnValue().getCanDoActionMessages().add("NETWORK_NOT_EXISTS"); + return false; + } + + if (network.isExternal()) { + return failCanDoAction(VdcBllMessages.EXTERNAL_NETWORK_CANNOT_BE_PROVISIONED); + } + + List<VDS> hostsAttachedToNetwork = getVdsDAO().getAllForNetwork(network.getId()); + for (VDS host : hostsAttachedToNetwork) { + if (host.getId().equals(getVdsId())) { + getReturnValue().getCanDoActionMessages().add("NETWORK_ALREADY_ATTACHED_TO_HOST"); + return false; + } + } + + NetworkCluster networkCluster = + getNetworkClusterDAO().get(new NetworkClusterId(getVdsGroupId(), network.getId())); + if (networkCluster == null) { + getReturnValue().getCanDoActionMessages().add("NETWORK_NOT_ATTACHED_TO_CLUSTER"); + return false; + } + + IpConfiguration ipConfiguration = getParameters().getNetworkAttachment().getIpConfiguration(); + if (ipConfiguration != null + && ipConfiguration.getBootProtocol() == NetworkBootProtocol.STATIC_IP + && ipConfiguration.getAddress() == null) { + return failCanDoAction(VdcBllMessages.NETWORK_ADDR_MANDATORY_IN_STATIC_IP); + } + + if (networkCluster.isDisplay() + && (ipConfiguration == null || ipConfiguration.getBootProtocol() == NetworkBootProtocol.NONE)) { + getReturnValue().getCanDoActionMessages().add("DISPLAY_NETWORK_MUST_HAVE_IP"); + return false; + } + + VdsNetworkInterface nic = + getDbFacade().getInterfaceDao().get(getParameters().getNetworkAttachment().getNicId()); + if (nic == null) { + getReturnValue().getCanDoActionMessages().add("NIC_NOT_EXISTS"); + return false; + } + + if (!nic.getVdsId().equals(getVdsId())) { + getReturnValue().getCanDoActionMessages().add("NIC_NOT_BELONG_TO_HOST"); + return false; + } + + // TODO: Reuse LabelNicCommand validation + if (Boolean.TRUE.equals(nic.getBonded())) { + int slavesCount = 0; + for (VdsNetworkInterface i : getDbFacade().getInterfaceDao().getAllInterfacesForVds(getVdsId())) { + if (StringUtils.equals(i.getName(), nic.getBondName())) { + slavesCount++; + if (slavesCount == 2) { + break; + } + } + } + + if (slavesCount < 2) { + return failCanDoAction(VdcBllMessages.NETWORK_BONDS_INVALID_SLAVE_COUNT); + } + } + + if (NetworkUtils.isVlan(nic) || nic.isBondSlave()) { + getReturnValue().getCanDoActionMessages().add("NETWORK_ATTACHED_TO_SLAVE_OR_VLAN"); + return false; + } + + List<NetworkAttachment> networkAttachments = getDbFacade().getNetworkAttachmentDao().getAllForNic(nic.getId()); + for (NetworkAttachment networkAttachment : networkAttachments) { + canCoExist(networkAttachment, getParameters().getNetworkAttachment()); + } + + return true; + } + + private void canCoExist(NetworkAttachment networkAttachment, NetworkAttachment networkAttachment2) { + // TODO reuse AttachNetworkToVdsInterfaceCommand.networkConfigurationSupported() + } + + @Override + protected void executeCommand() { + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/NetworkAttachmentParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/NetworkAttachmentParameters.java new file mode 100644 index 0000000..8c6b9ef --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/NetworkAttachmentParameters.java @@ -0,0 +1,28 @@ +package org.ovirt.engine.core.common.action; + +import javax.validation.Valid; + +import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; + +public class NetworkAttachmentParameters extends VdsActionParameters { + + private static final long serialVersionUID = -5132029941161321131L; + + @Valid + private NetworkAttachment networkAttachment; + + public NetworkAttachmentParameters() { + } + + public NetworkAttachmentParameters(NetworkAttachment networkAttachment) { + this.networkAttachment = networkAttachment; + } + + public NetworkAttachment getNetworkAttachment() { + return networkAttachment; + } + + public void setNetworkAttachment(NetworkAttachment networkAttachment) { + this.networkAttachment = networkAttachment; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index f49c55c..adf5099 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -391,7 +391,10 @@ RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, QuotaDependency.NONE), // Network Attachments - HostSetupNetworks(3200, ActionGroup.CONFIGURE_HOST_NETWORK, QuotaDependency.NONE); + HostSetupNetworks(3200, ActionGroup.CONFIGURE_HOST_NETWORK, QuotaDependency.NONE), + AddNetworkAttachment(3201, ActionGroup.CONFIGURE_HOST_NETWORK, QuotaDependency.NONE), + UpdateNetworkAttachment(3202, ActionGroup.CONFIGURE_HOST_NETWORK, QuotaDependency.NONE), + RemoveNetworkAttachment(3203, ActionGroup.CONFIGURE_HOST_NETWORK, QuotaDependency.NONE); private int intValue; private ActionGroup actionGroup; -- To view, visit http://gerrit.ovirt.org/33927 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I828bada5a8f2e9548579dfa3fdcb610190df279c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Moti Asayag <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
