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

Reply via email to