You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/09/28 22:13:32 UTC

git commit: Fixing CLOUDSTACK-226: don't allow physical networks with overlaping vnet ranges, belong to the same zone. Fixed create and update physical network code

Updated Branches:
  refs/heads/master e1ae302c1 -> 11fe086ad


Fixing CLOUDSTACK-226: don't allow physical networks with overlaping vnet ranges, belong to the same zone. Fixed create and update physical network code


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/11fe086a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/11fe086a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/11fe086a

Branch: refs/heads/master
Commit: 11fe086adab8e790018343252ed08aac9a27b1c6
Parents: e1ae302
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Sep 28 13:10:09 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Sep 28 13:11:20 2012 -0700

----------------------------------------------------------------------
 .../api/commands/UpdatePhysicalNetworkCmd.java     |   12 ++-----
 .../src/com/cloud/network/NetworkManagerImpl.java  |   27 +++++++++++++-
 2 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/11fe086a/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java b/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java
index 30fa532..a6abc03 100644
--- a/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java
+++ b/api/src/com/cloud/api/commands/UpdatePhysicalNetworkCmd.java
@@ -22,11 +22,9 @@ import org.apache.log4j.Logger;
 
 import com.cloud.api.ApiConstants;
 import com.cloud.api.BaseAsyncCmd;
-import com.cloud.api.BaseCmd;
 import com.cloud.api.IdentityMapper;
 import com.cloud.api.Implementation;
 import com.cloud.api.Parameter;
-import com.cloud.api.ServerApiException;
 import com.cloud.api.response.PhysicalNetworkResponse;
 import com.cloud.async.AsyncJob;
 import com.cloud.event.EventTypes;
@@ -99,13 +97,9 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
     @Override
     public void execute(){
         PhysicalNetwork result = _networkService.updatePhysicalNetwork(getId(),getNetworkSpeed(), getTags(), getVlan(), getState());
-        if (result != null) {
-            PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result);
-            response.setResponseName(getCommandName());
-            this.setResponseObject(response);
-        }else {
-            throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update physical network");
-        }
+        PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/11fe086a/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index 7a11525..0cb61d5 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -130,6 +130,7 @@ import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
 import com.cloud.network.element.ConnectivityProvider;
 import com.cloud.network.element.DhcpServiceProvider;
 import com.cloud.network.element.FirewallServiceProvider;
+import com.cloud.network.element.SourceNatServiceProvider;
 import com.cloud.network.element.IpDeployer;
 import com.cloud.network.element.LoadBalancingServiceProvider;
 import com.cloud.network.element.NetworkACLServiceProvider;
@@ -137,7 +138,6 @@ import com.cloud.network.element.NetworkElement;
 import com.cloud.network.element.PortForwardingServiceProvider;
 import com.cloud.network.element.RemoteAccessVPNServiceProvider;
 import com.cloud.network.element.Site2SiteVpnServiceProvider;
-import com.cloud.network.element.SourceNatServiceProvider;
 import com.cloud.network.element.StaticNatServiceProvider;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.network.element.VirtualRouterElement;
@@ -218,7 +218,6 @@ import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
-
 import edu.emory.mathcs.backport.java.util.Collections;
 
 /**
@@ -5192,6 +5191,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
             } catch (NumberFormatException e) {
                 throw new InvalidParameterValueException("Please specify valid integers for the vlan range.");
             }
+            
+            //check for vnet conflicts with other physical network(s) in the zone
+            checkGuestVnetsConflicts(zoneId, vnetStart, vnetEnd, null);
 
             if ((vnetStart > vnetEnd) || (vnetStart < 0) || (vnetEnd > 4096)) {
                 s_logger.warn("Invalid vnet range: start range:" + vnetStart + " end range:" + vnetEnd);
@@ -5370,6 +5372,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
                 throw new InvalidParameterValueException("Vnet range has to be" + rangeMessage + " and start range should be lesser than or equal to stop range");
             }
             
+            //check if new vnet conflicts with vnet ranges of other physical networks
+            checkGuestVnetsConflicts(network.getDataCenterId(), newStartVnet, newEndVnet, network.getId());
+
             if (physicalNetworkHasAllocatedVnets(network.getDataCenterId(), network.getId())) {
                 String[] existingRange = network.getVnet().split("-");
                 int existingStartVnet = Integer.parseInt(existingRange[0]);
@@ -5414,6 +5419,24 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
         return network;
     }
 
+    protected void checkGuestVnetsConflicts(long zoneId, int newStartVnet, int newEndVnet, Long pNtwkIdToSkip) {
+        List<? extends PhysicalNetwork> pNtwks = _physicalNetworkDao.listByZone(zoneId);
+        for (PhysicalNetwork pNtwk : pNtwks) {
+            // skip my own network
+            if (pNtwkIdToSkip != null && pNtwkIdToSkip == pNtwk.getId()) {
+                continue;
+            }
+            String[] existingRange = pNtwk.getVnet().split("-");
+            int startVnet = Integer.parseInt(existingRange[0]);
+            int endVnet = Integer.parseInt(existingRange[1]);
+            if ((newStartVnet >= startVnet && newStartVnet <= endVnet)
+                    || (newEndVnet <= endVnet && newEndVnet >= startVnet)) {
+                throw new InvalidParameterValueException("Vnet range for physical network conflicts with another " +
+                		"physical network's vnet in the zone");
+            } 
+        }
+    }
+
     private boolean physicalNetworkHasAllocatedVnets(long zoneId, long physicalNetworkId) {
         return !_dcDao.listAllocatedVnets(physicalNetworkId).isEmpty();
     }