Moti Asayag has uploaded a new change for review.

Change subject: engine: Support 3.1 network topologies by AttachNetwork
......................................................................

engine: Support 3.1 network topologies by AttachNetwork

The patch provides support for 3.1 network topologies by
the AttachNetworkCommand, also exposed via the api by:
api/hosts/{host:id}/nics/{nic:id}/attach

The supported networktopologies over a nic are:
1. Attach a VM network (with/without vlan)
2. Attach a non-VM network (with/without vlan)
3. Attach a non-VM network to a nic which a vlan is already attached to.
4. Attach a vlan to a nic which a non-VM network is already attached to.

The unsupported network topologies are:
1. Attaching any network to a nic which a VM network is already attached to.
2. Attach a VM network to a nic which any network is already attached to.
3. Attach a non-VM network to a nic which a non-VM network is already attached 
to.

Change-Id: I9e1abe84e2877171be5af41c9bb3ab590fed3653
Signed-off-by: Moti Asayag <masa...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AttachNetworkToVdsInterfaceCommand.java
1 file changed, 54 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/22/13722/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AttachNetworkToVdsInterfaceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AttachNetworkToVdsInterfaceCommand.java
index 4d88a0f..addffe1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AttachNetworkToVdsInterfaceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/AttachNetworkToVdsInterfaceCommand.java
@@ -8,6 +8,7 @@
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.network.cluster.NetworkClusterHelper;
 import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.action.AttachNetworkToVdsParameters;
 import org.ovirt.engine.core.common.businessentities.Entities;
 import org.ovirt.engine.core.common.businessentities.network.Network;
@@ -103,11 +104,22 @@
             
addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_ALREADY_IN_BOND);
             return false;
         }
-        // Check that the specify interface has no network
-        if (!StringUtils.isEmpty(iface.getNetworkName())) {
+
+        Map<String, Network> networksByName =
+                
Entities.entitiesByName(getNetworkDAO().getAllForCluster(getVds().getVdsGroupId()));
+        // check that the network exists in current cluster
+        if (!networksByName.containsKey(params.getNetwork().getName())) {
+            
addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS_IN_CLUSTER);
+            return false;
+        } else {
+            logicalNetwork = networksByName.get(params.getNetwork().getName());
+        }
+
+        if (!networkConfigurationSupported(iface, networksByName)) {
             
addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_ALREADY_HAVE_NETWORK);
             return false;
         }
+
         if 
(!NetworkUtils.getEngineNetwork().equals(params.getNetwork().getName())
                 && !StringUtils.isEmpty(params.getGateway())) {
             
addCanDoActionMessage(VdcBllMessages.NETWORK_ATTACH_ILLEGAL_GATEWAY);
@@ -121,19 +133,6 @@
             return false;
         }
 
-        // check that the network exists in current cluster
-
-        Map<String, Network> networksByName =
-                
Entities.entitiesByName(getNetworkDAO().getAllForCluster(getVds().getVdsGroupId()));
-
-        if (!networksByName.containsKey(params.getNetwork().getName())) {
-            
addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS_IN_CLUSTER);
-            return false;
-        } else {
-            logicalNetwork = networksByName.get(params.getNetwork().getName());
-        }
-
-
         // check address exists in static ip
         if (params.getBootProtocol() == NetworkBootProtocol.STATIC_IP) {
             if (StringUtils.isEmpty(params.getAddress())) {
@@ -143,7 +142,7 @@
         }
 
         // check that nic have no vlans
-        if (params.getNetwork().getVlanId() == null) {
+        if (vmNetworkNonVlan(params.getNetwork())) {
             VdcQueryReturnValue ret = Backend.getInstance().runInternalQuery(
                     VdcQueryType.GetAllChildVlanInterfaces,
                     new InterfaceAndIdQueryParameters(params.getVdsId(), params
@@ -164,4 +163,43 @@
         return getSucceeded() ? AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS
                 : AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_FAILED;
     }
+
+    /**
+     * Validates whether the network configuration is supported.
+     *
+     * @param iface
+     *            The target network interface
+     * @param networksByName
+     *            A map contains all cluster's networks
+     * @return <code>true</code> if the configuration is supported, else 
<code>false</code>
+     */
+    private boolean networkConfigurationSupported(VdsNetworkInterface iface, 
Map<String, Network> networksByName) {
+        if (StringUtils.isEmpty(iface.getNetworkName())) {
+            return true;
+        }
+
+        Network attachedNetwork = networksByName.get(iface.getNetworkName());
+
+        // Prevent attaching a VM network when a VM network is already attached
+        if (vmNetworkNonVlan(attachedNetwork) || 
vmNetworkNonVlan(logicalNetwork)) {
+            return false;
+        }
+
+        // Verify Non-VM networks are supported
+        if 
(!FeatureSupported.nonVmNetwork(getVds().getVdsGroupCompatibilityVersion())
+                && (!attachedNetwork.isVmNetwork() || 
!logicalNetwork.isVmNetwork())) {
+            return false;
+        }
+
+        // Prevent attaching non-VM network to a nic which already has an 
attached non-VM network
+        if (NetworkUtils.isNonVmNonVlanNetwork(attachedNetwork) && 
NetworkUtils.isNonVmNonVlanNetwork(logicalNetwork)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private boolean vmNetworkNonVlan(Network network) {
+        return network.isVmNetwork() && network.getVlanId() == null;
+    }
 }


--
To view, visit http://gerrit.ovirt.org/13722
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9e1abe84e2877171be5af41c9bb3ab590fed3653
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Moti Asayag <masa...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to