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 2013/08/01 19:41:12 UTC

git commit: updated refs/heads/4.2 to 4fb4afb

Updated Branches:
  refs/heads/4.2 620eb5094 -> 4fb4afb88


Cloudstack-3753 Multiple VLAN range API need to accept a list rather than "add" or "remove" per command
Reviewed-by: Alena Prokharchyk


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

Branch: refs/heads/4.2
Commit: 4fb4afb88ad8281c88351ac9e766054d5f12e6e1
Parents: 620eb50
Author: Bharat Kumar <bh...@citrix.com>
Authored: Thu Jul 25 01:18:21 2013 +0530
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Aug 1 10:40:56 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/network/NetworkService.java   |   2 +-
 .../admin/network/UpdatePhysicalNetworkCmd.java |   8 +-
 .../src/com/cloud/dc/dao/DataCenterVnetDao.java |   2 +-
 .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java |  24 +-
 .../cloud/network/dao/PhysicalNetworkVO.java    |   2 +-
 .../com/cloud/network/NetworkServiceImpl.java   | 354 +++++++++----------
 .../cloud/network/MockNetworkManagerImpl.java   |   2 +-
 .../network/UpdatePhysicalNetworkTest.java      |   2 +-
 .../com/cloud/vpc/MockNetworkManagerImpl.java   |   2 +-
 9 files changed, 197 insertions(+), 201 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/api/src/com/cloud/network/NetworkService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java
index 59ccdbf..87fecb0 100755
--- a/api/src/com/cloud/network/NetworkService.java
+++ b/api/src/com/cloud/network/NetworkService.java
@@ -87,7 +87,7 @@ public interface NetworkService {
             Long startIndex, Long pageSize, String name);
 
     PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags,
-                                          String newVnetRangeString, String state, String removeVlan);
+                                          String newVnetRangeString, String state);
 
     boolean deletePhysicalNetwork(Long id);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/api/src/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java
index 6d37dd8..06cf38d 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java
@@ -54,8 +54,6 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
 
     @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the VLAN for the physical network")
     private String vlan;
-    @Parameter(name=ApiConstants.REMOVE_VLAN, type = CommandType.STRING, description ="The vlan range we want to remove")
-    private String removevlan;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -81,10 +79,6 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
         return vlan;
     }
 
-    public String getRemoveVlan(){
-        return removevlan;
-    }
-
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -101,7 +95,7 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd {
 
     @Override
     public void execute(){
-        PhysicalNetwork result = _networkService.updatePhysicalNetwork(getId(),getNetworkSpeed(), getTags(), getVlan(), getState(), getRemoveVlan());
+        PhysicalNetwork result = _networkService.updatePhysicalNetwork(getId(),getNetworkSpeed(), getTags(), getVlan(), getState());
         PhysicalNetworkResponse response = _responseGenerator.createPhysicalNetworkResponse(result);
         response.setResponseName(getCommandName());
         this.setResponseObject(response);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
index e2e6b79..de68e1e 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
@@ -33,7 +33,7 @@ public interface DataCenterVnetDao extends GenericDao<DataCenterVnetVO, Long> {
     
     public void delete(long physicalNetworkId);
 
-    public void deleteRange(Transaction txn, long dcId, long physicalNetworkId, int start, int end);
+    public void deleteVnets(Transaction txn, long dcId, long physicalNetworkId, List<String> vnets);
 
     public void lockRange(long dcId, long physicalNetworkId, Integer start, Integer end);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
index ced2982..3ac2729 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
@@ -110,9 +110,10 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
         sc.setParameters("vnet", vnet);
 
         return listBy(sc);
-    }    
-    
-    @DB
+    }
+
+
+    @DB   //In the List<string> argument each string is a vlan. not a vlanRange.
     public void add(long dcId, long physicalNetworkId, List<String> vnets) {
         String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
         
@@ -133,15 +134,18 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
         }
     }
 
-    public void deleteRange(Transaction txn, long dcId, long physicalNetworkId, int start, int end) {
-        String deleteVnet = "DELETE FROM `cloud`.`op_dc_vnet_alloc` WHERE data_center_id=? AND physical_network_id=? AND taken IS NULL AND vnet BETWEEN ? AND ?";
+    //In the List<string> argument each string is a vlan. not a vlanRange.
+    public void deleteVnets(Transaction txn, long dcId, long physicalNetworkId, List<String> vnets) {
+        String deleteVnet = "DELETE FROM `cloud`.`op_dc_vnet_alloc` WHERE data_center_id=? AND physical_network_id=? AND taken IS NULL AND vnet=?";
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteVnet);
-            stmt.setLong(1,dcId);
-            stmt.setLong(2,physicalNetworkId);
-            stmt.setString(3,((Integer)start).toString());
-            stmt.setString(4,((Integer)end).toString());
-            stmt.execute();
+            for (int i =0; i <= vnets.size()-1; i++) {
+                stmt.setLong(1,dcId);
+                stmt.setLong(2,physicalNetworkId);
+                stmt.setString(3, vnets.get(i));
+                stmt.addBatch();
+            }
+            stmt.executeBatch();
         } catch (SQLException e) {
             throw new CloudRuntimeException("Exception caught adding vnet ", e);
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java
index f68eee1..684a600 100644
--- a/engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java
+++ b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java
@@ -206,7 +206,7 @@ public class PhysicalNetworkVO implements PhysicalNetwork {
     public List<Pair<Integer, Integer>> getVnet() {
         List <Pair<Integer,Integer>>  vnetList = new ArrayList<Pair<Integer, Integer>>();
         if (vnet != null) {
-           String [] Temp = vnet.split(";");
+           String [] Temp = vnet.split(",");
            String [] vnetSplit = null;
            for (String vnetRange : Temp){
                vnetSplit = vnetRange.split("-");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 7e6b581..90368be 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -2425,34 +2425,12 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             throw new InvalidParameterException("Only one isolationMethod can be specified for a physical network at this time");
         }
 
-        int vnetStart = 0;
-        int vnetEnd = 0;
-        long minVnet = MIN_VLAN_ID;
-        long maxVnet = MAX_VLAN_ID;
-        // Wondering why GRE doesn't check its vNet range here. While they check it in processVlanRange called by updatePhysicalNetwork.
-
         if (vnetRange != null) {
             // Verify zone type
             if (zoneType == NetworkType.Basic
                     || (zoneType == NetworkType.Advanced && zone.isSecurityGroupEnabled())) {
                 throw new InvalidParameterValueException("Can't add vnet range to the physical network in the zone that supports " + zoneType + " network, Security Group enabled: " + zone.isSecurityGroupEnabled());
             }
-
-            String[] tokens = vnetRange.split("-");
-            try {
-                vnetStart = Integer.parseInt(tokens[0]);
-                if (tokens.length == 1) {
-                    vnetEnd = vnetStart;
-                } else {
-                    vnetEnd = Integer.parseInt(tokens[1]);
-                }
-            } catch (NumberFormatException e) {
-                throw new InvalidParameterValueException("Please specify valid integers for the vlan range.");
-            }
-            if ((vnetStart > vnetEnd) || (vnetStart < minVnet) || (vnetEnd > maxVnet)) {
-                s_logger.warn("Invalid vnet range: start range:" + vnetStart + " end range:" + vnetEnd);
-                throw new InvalidParameterValueException("Vnet range should be between " + minVnet + "-" + maxVnet + " and start range should be lesser than or equal to end range");
-            }
         }
 
         BroadcastDomainRange broadcastDomainRange = null;
@@ -2491,14 +2469,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             pNetwork = _physicalNetworkDao.persist(pNetwork);
 
             // Add vnet entries for the new zone if zone type is Advanced
-
-            List <String> vnets = new ArrayList<String>();
-            for (Integer i= vnetStart; i<= vnetEnd; i++ ) {
-                vnets.add(i.toString());
-            }
-
             if (vnetRange != null) {
-                _dcDao.addVnet(zone.getId(), pNetwork.getId(), vnets);
+                addOrRemoveVnets(vnetRange.split(","), pNetwork);
             }
 
             // add VirtualRouter as the default network service provider
@@ -2548,7 +2520,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_UPDATE, eventDescription = "updating physical network", async = true)
-    public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags, String newVnetRange, String state, String removeVlan) {
+    public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags, String newVnetRange, String state) {
 
         // verify input parameters
         PhysicalNetworkVO network = _physicalNetworkDao.findById(id);
@@ -2573,11 +2545,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             }
         }
 
-        if (removeVlan != null){
-            List<Integer> tokens = processVlanRange(network,removeVlan);
-            removeVlanRange(network, tokens.get(0), tokens.get(1));
-        }
-
         if (tags != null && tags.size() > 1) {
             throw new InvalidParameterException("Unable to support more than one tag on network yet");
         }
@@ -2603,173 +2570,204 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             network.setSpeed(networkSpeed);
         }
 
-        // Vnet range can be extended only
-        boolean AddVnet = true;
-        List<Pair<Integer, Integer>> vnetsToAdd = new ArrayList<Pair<Integer, Integer>>();
-
-        List<Integer> tokens = null;
-        List<String>  add_Vnet = null;
         if (newVnetRange != null) {
-            tokens = processVlanRange(network, newVnetRange);
-            HashSet<String> vnetsInDb = new HashSet<String>();
-            vnetsInDb.addAll(_datacneter_vnet.listVnetsByPhysicalNetworkAndDataCenter(network.getDataCenterId(), id));
-            HashSet<String> tempVnets = new HashSet<String>();
+            String [] listOfRanges = newVnetRange.split(",");
+            addOrRemoveVnets(listOfRanges, network);
+        }
+        _physicalNetworkDao.update(id, network);
+        return network;
+
+    }
+
+    @DB
+    public void addOrRemoveVnets(String [] listOfRanges,  PhysicalNetworkVO network) {
+        List<String>  addVnets = null;
+        List<String>  removeVnets =null;
+        HashSet<String> tempVnets = new HashSet<String>();
+        HashSet<String> vnetsInDb = new HashSet<String>();
+        List<Pair<Integer, Integer>> vnetranges = null;
+        String comaSeperatedStingOfVnetRanges = null;
+        int i =0;
+        if (listOfRanges.length !=0) {
+            _physicalNetworkDao.acquireInLockTable(network.getId(),10);
+            vnetranges = validateVlanRange(network, listOfRanges);
+
+            //computing vnets to be removed.
+            removeVnets = getVnetsToremove(network, vnetranges);
+
+            //computing vnets to add
+            vnetsInDb.addAll(_datacneter_vnet.listVnetsByPhysicalNetworkAndDataCenter(network.getDataCenterId(), network.getId()));
             tempVnets.addAll(vnetsInDb);
-            for (Integer i = tokens.get(0); i <= tokens.get(1); i++) {
-                tempVnets.add(i.toString());
+            for (Pair<Integer, Integer>vlan : vnetranges) {
+                for (i= vlan.first(); i<= vlan.second(); i++) {
+                    tempVnets.add(Integer.toString(i));
                 }
+            }
             tempVnets.removeAll(vnetsInDb);
-            if (tempVnets.isEmpty()) {
-                throw new InvalidParameterValueException("The vlan range you are trying to add already exists.");
-                }
-            vnetsInDb.addAll(tempVnets);
-            add_Vnet = new ArrayList<String>();
-            add_Vnet.addAll(tempVnets);
-            List<String> sortedList = new ArrayList<String>(vnetsInDb);
-            Collections.sort(sortedList, new Comparator<String>() {
-            public int compare(String s1, String s2) {
-                        return Integer.valueOf(s1).compareTo(Integer.valueOf(s2));
-                    }
-                });
-            //build the vlan string form the allocated vlan list.
-            String vnetRange = "";
-            String startvnet = sortedList.get(0);
-            String endvnet = "";
-            for ( int i =0; i < sortedList.size()-1; i++ ) {
-                if (Integer.valueOf(sortedList.get(i+1)) - Integer.valueOf(sortedList.get(i)) > 1) {
-                    endvnet = sortedList.get(i);
-                    vnetRange=vnetRange + startvnet+"-"+endvnet+";";
-                    startvnet = sortedList.get(i+1);
-                    }
-                }
-            endvnet = sortedList.get(sortedList.size()-1);
-            vnetRange=vnetRange + startvnet+"-"+endvnet+";";
-            vnetRange = vnetRange.substring(0,vnetRange.length()-1);
-            network.setVnet(vnetRange);
+
+            //vnets to add in tempVnets.
+            //adding and removing vnets from vnetsInDb
+            if (removeVnets != null && removeVnets.size() !=0 ) {
+                vnetsInDb.removeAll(removeVnets);
             }
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        if (add_Vnet != null) {
-            s_logger.debug("Adding vnet range " + tokens.get(0).toString() + "-" + tokens.get(1).toString() + " for the physicalNetwork id= " + id + " and zone id=" + network.getDataCenterId()
-                    + " as a part of updatePhysicalNetwork call");
-            _dcDao.addVnet(network.getDataCenterId(), network.getId(), add_Vnet);
-        }
-        _physicalNetworkDao.update(id, network);
-        txn.commit();
 
-        return network;
+            if (tempVnets.size() != 0) {
+                addVnets = new ArrayList<String>();
+                addVnets.addAll(tempVnets);
+                vnetsInDb.addAll(tempVnets);
+            }
+
+            //sorting the vnets in Db to generate a coma seperated list of  the vnet string.
+            if (vnetsInDb.size() !=0 ) {
+                comaSeperatedStingOfVnetRanges = generateVnetString( new ArrayList<String>(vnetsInDb));
+            }
+            network.setVnet(comaSeperatedStingOfVnetRanges);
+
+            Transaction txn = Transaction.currentTxn();
+            txn.start();
+            if (addVnets != null) {
+                s_logger.debug("Adding vnet range " + addVnets.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
+                        + " as a part of updatePhysicalNetwork call");
+                //add vnet takes a list of strings to be added. each string is a vnet.
+                _dcDao.addVnet(network.getDataCenterId(), network.getId(), addVnets);
+            }
+            if (removeVnets != null) {
+                s_logger.debug("removing vnet range " + removeVnets.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
+                        + " as a part of updatePhysicalNetwork call");
+                //deleteVnets  takes a list of strings to be removed. each string is a vnet.
+                _datacneter_vnet.deleteVnets(txn, network.getDataCenterId(), network.getId(), removeVnets);
+            }
+            _physicalNetworkDao.update(network.getId(), network);
+            txn.commit();
+            _physicalNetworkDao.releaseFromLockTable(network.getId());
+        }
     }
 
-    private List<Integer> processVlanRange(PhysicalNetworkVO network, String vlan) {
+    private List<Pair<Integer, Integer>> validateVlanRange(PhysicalNetworkVO network, String[] listOfRanges) {
         Integer StartVnet;
         Integer EndVnet;
-        String[] VnetRange = vlan.split("-");
+        List<Pair<Integer,Integer>> vlanTokens = new ArrayList<Pair<Integer, Integer>>();
+        for (String vlanRange : listOfRanges) {
+            String[] VnetRange = vlanRange.split("-");
 
-        // Init with [min,max] of VLAN. Actually 0x000 and 0xFFF are reserved by IEEE, shoudn't be used.
-        long minVnet = MIN_VLAN_ID;
-        long maxVnet = MAX_VLAN_ID;
+            // Init with [min,max] of VLAN. Actually 0x000 and 0xFFF are reserved by IEEE, shoudn't be used.
+            long minVnet = MIN_VLAN_ID;
+            long maxVnet = MAX_VLAN_ID;
 
-        // for GRE phynets allow up to 32bits
-        // TODO: Not happy about this test.
-        // What about guru-like objects for physical networs?
-        s_logger.debug("ISOLATION METHODS:" + network.getIsolationMethods());
-        // Java does not have unsigned types...
-        if (network.getIsolationMethods().contains("GRE")) {
-            minVnet = MIN_GRE_KEY;
-            maxVnet = MAX_GRE_KEY;
-        }
-        String rangeMessage = " between " + minVnet + " and " + maxVnet;
-        if (VnetRange.length < 2) {
-            throw new InvalidParameterValueException("Please provide valid vnet range" + rangeMessage);
-        }
+            // for GRE phynets allow up to 32bits
+            // TODO: Not happy about this test.
+            // What about guru-like objects for physical networs?
+            s_logger.debug("ISOLATION METHODS:" + network.getIsolationMethods());
+            // Java does not have unsigned types...
+            if (network.getIsolationMethods().contains("GRE")) {
+                minVnet = MIN_GRE_KEY;
+                maxVnet = MAX_GRE_KEY;
+            }
+            String rangeMessage = " between " + minVnet + " and " + maxVnet;
+            if (VnetRange.length == 1 && VnetRange[0].equals("")) {
+                return vlanTokens;
+            }
+            if (VnetRange.length < 2) {
+                throw new InvalidParameterValueException("Please provide valid vnet range. vnet range should be a coma seperated list of vlan ranges. example 500-500,600-601" + rangeMessage);
+            }
 
-        if (VnetRange[0] == null || VnetRange[1] == null) {
-            throw new InvalidParameterValueException("Please provide valid vnet range" + rangeMessage);
-        }
+            if (VnetRange[0] == null || VnetRange[1] == null) {
+                throw new InvalidParameterValueException("Please provide valid vnet range" + rangeMessage);
+            }
 
-        try {
-            StartVnet = Integer.parseInt(VnetRange[0]);
-            EndVnet = Integer.parseInt(VnetRange[1]);
-        } catch (NumberFormatException e) {
-            s_logger.warn("Unable to parse vnet range:", e);
-            throw new InvalidParameterValueException("Please provide valid vnet range" + rangeMessage);
-        }
-        if (StartVnet < minVnet || EndVnet > maxVnet) {
-            throw new InvalidParameterValueException("Vnet range has to be" + rangeMessage);
-        }
+            try {
+                StartVnet = Integer.parseInt(VnetRange[0]);
+                EndVnet = Integer.parseInt(VnetRange[1]);
+            } catch (NumberFormatException e) {
+                s_logger.warn("Unable to parse vnet range:", e);
+                throw new InvalidParameterValueException("Please provide valid vnet range. The vnet range should be a coma seperated list example 2001-2012,3000-3005." + rangeMessage);
+            }
+            if (StartVnet < minVnet || EndVnet > maxVnet) {
+                throw new InvalidParameterValueException("Vnet range has to be" + rangeMessage);
+            }
 
-        if (StartVnet > EndVnet) {
-            throw new InvalidParameterValueException("Vnet range has to be" + rangeMessage + " and start range should be lesser than or equal to stop range");
+            if (StartVnet > EndVnet) {
+                throw new InvalidParameterValueException("Vnet range has to be" + rangeMessage + " and start range should be lesser than or equal to stop range");
+            }
+            vlanTokens.add(new Pair<Integer, Integer>(StartVnet, EndVnet));
         }
-        List<Integer> tokens = new ArrayList<Integer>();
-        tokens.add(StartVnet);
-        tokens.add(EndVnet);
-        return tokens;
+        return vlanTokens;
 
     }
 
 
-    private boolean removeVlanRange( PhysicalNetworkVO network, Integer start, Integer end) {
-        Integer temp=0;
-        int i;
-        List <Pair <Integer,Integer>> existingRanges = network.getVnet();
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        _physicalNetworkDao.acquireInLockTable(network.getId(),10);
-        _datacneter_vnet.lockRange(network.getDataCenterId(), network.getId(), start, end);
-        List<DataCenterVnetVO> result = _datacneter_vnet.listAllocatedVnetsInRange(network.getDataCenterId(), network.getId(), start, end);
-        if (!result.isEmpty()){
-            txn.close();
-            throw new InvalidParameterValueException("Some of the vnets from this range are allocated, can only remove a range which has no allocated vnets");
-        }
-        // If the range is partially dedicated to an account fail the request
-        List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(network.getId());
-        for (AccountGuestVlanMapVO map : maps) {
-            String[] vlans = map.getGuestVlanRange().split("-");
-            Integer dedicatedStartVlan = Integer.parseInt(vlans[0]);
-            Integer dedicatedEndVlan = Integer.parseInt(vlans[1]);
-            if ((start >= dedicatedStartVlan && start <= dedicatedEndVlan) || (end >= dedicatedStartVlan && end <= dedicatedEndVlan)) {
-                txn.close();
-                throw new InvalidParameterValueException("Vnet range " + map.getGuestVlanRange() + " is dedicated" +
-                        " to an account. The specified range " + start + "-" + end + " overlaps with the dedicated range " +
-                        " Please release the overlapping dedicated range before deleting the range");
-            }
-        }
-        for (i=0; i<existingRanges.size(); i++){
-            if (existingRanges.get(i).first()<= start & existingRanges.get(i).second()>= end){
-                temp = existingRanges.get(i).second();
-                existingRanges.get(i).second(start - 1);
-                existingRanges.add(new Pair<Integer, Integer>((end+1),temp));
-                break;
+    public  String generateVnetString(List<String> vnetList) {
+        Collections.sort(vnetList, new Comparator<String>() {
+            public int compare(String s1, String s2) {
+                return Integer.valueOf(s1).compareTo(Integer.valueOf(s2));
             }
-        }
-
-        if (temp == 0){
-            throw new InvalidParameterValueException("The vnet range you are trying to delete does not exist.");
-        }
-        if(existingRanges.get(i).first() > existingRanges.get(i).second()){
-            existingRanges.remove(i);
-        }
-        if(existingRanges.get(existingRanges.size()-1).first() > existingRanges.get(existingRanges.size()-1).second()){
-            existingRanges.remove(existingRanges.size()-1);
-        }
-        _datacneter_vnet.deleteRange(txn, network.getDataCenterId(), network.getId(), start, end);
-
-        String vnetString="";
-        if (existingRanges.isEmpty()) {
-            network.setVnet(null);
-        } else {
-            for (Pair<Integer,Integer> vnetRange : existingRanges ) {
-                vnetString=vnetString+vnetRange.first().toString()+"-"+vnetRange.second().toString()+";";
+        });
+        int i;
+        //build the vlan string form the sorted list.
+        String vnetRange = "";
+        String startvnet = vnetList.get(0);
+        String endvnet = "";
+        for ( i =0; i < vnetList.size()-1; i++ ) {
+            if (Integer.valueOf(vnetList.get(i+1)) - Integer.valueOf(vnetList.get(i)) > 1) {
+                endvnet = vnetList.get(i);
+                vnetRange=vnetRange + startvnet+"-"+endvnet+",";
+                startvnet = vnetList.get(i+1);
             }
-            vnetString = vnetString.substring(0, vnetString.length()-1);
-            network.setVnet(vnetString);
         }
-        _physicalNetworkDao.update(network.getId(), network);
-        txn.commit();
-        _physicalNetworkDao.releaseFromLockTable(network.getId());
+        endvnet = vnetList.get(vnetList.size()-1);
+        vnetRange=vnetRange + startvnet+"-"+endvnet+",";
+        vnetRange=vnetRange.substring(0,vnetRange.length()-1);
+        return vnetRange;
+    }
 
-        return  true;
+    private List<String> getVnetsToremove(PhysicalNetworkVO network, List<Pair<Integer, Integer>> vnetRanges) {
+        int i;
+        List<String> removeVnets = new ArrayList<String>();
+        HashSet<String> vnetsInDb = new HashSet<String>();
+        vnetsInDb.addAll(_datacneter_vnet.listVnetsByPhysicalNetworkAndDataCenter(network.getDataCenterId(), network.getId()));
+        //remove all the vnets from vnets in db to check if there are any vnets that are not there in given list.
+        //remove all the vnets not in the list of vnets passed by the user.
+        if (vnetRanges.size() == 0) {
+            //this implies remove all vlans.
+            removeVnets.addAll(vnetsInDb);
+            return removeVnets;
+        }
+        for (Pair<Integer, Integer>vlan : vnetRanges) {
+            for (i= vlan.first(); i<= vlan.second(); i++) {
+                vnetsInDb.remove(Integer.toString(i));
+            }
+        }
+        String vnetRange = null;
+        if (vnetsInDb.size() != 0) {
+            removeVnets.addAll(vnetsInDb);
+            vnetRange = generateVnetString(removeVnets);
+        }else {
+            return removeVnets;
+        }
+
+        for (String vnet : vnetRange.split(",")) {
+            String [] range = vnet.split("-");
+            Integer start = Integer.parseInt(range[0]);
+            Integer end= Integer.parseInt(range[1]);
+            _datacneter_vnet.lockRange(network.getDataCenterId(), network.getId(), start, end);
+            List<DataCenterVnetVO> result = _datacneter_vnet.listAllocatedVnetsInRange(network.getDataCenterId(), network.getId(), start, end);
+            if (!result.isEmpty()){
+                throw new InvalidParameterValueException("Some of the vnets from this range are allocated, can only remove a range which has no allocated vnets");
+            }
+            // If the range is partially dedicated to an account fail the request
+            List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(network.getId());
+            for (AccountGuestVlanMapVO map : maps) {
+                String[] vlans = map.getGuestVlanRange().split("-");
+                Integer dedicatedStartVlan = Integer.parseInt(vlans[0]);
+                Integer dedicatedEndVlan = Integer.parseInt(vlans[1]);
+                if ((start >= dedicatedStartVlan && start <= dedicatedEndVlan) || (end >= dedicatedStartVlan && end <= dedicatedEndVlan)) {
+                    throw new InvalidParameterValueException("Vnet range " + map.getGuestVlanRange() + " is dedicated" +
+                            " to an account. The specified range " + start + "-" + end + " overlaps with the dedicated range " +
+                            " Please release the overlapping dedicated range before deleting the range");
+                }
+            }
+        }
+        return  removeVnets;
     }
 
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index a3d6f53..7f34e55 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -351,7 +351,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
     }
 
     @Override
-    public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags, String newVnetRangeString, String state, String removeVlan) {
+    public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags, String newVnetRangeString, String state) {
         // TODO Auto-generated method stub
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java b/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
index e3fc36a..1c0eff6 100644
--- a/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
+++ b/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
@@ -65,7 +65,7 @@ public class UpdatePhysicalNetworkTest {
         when(_datacenterDao.findById(anyLong())).thenReturn(datacentervo);
         when(_physicalNetworkDao.update(anyLong(), any(physicalNetworkVO.getClass()))).thenReturn(true);
         when(_DatacenterVnetDao.listVnetsByPhysicalNetworkAndDataCenter(anyLong(), anyLong())).thenReturn(existingRange);
-        networkService.updatePhysicalNetwork(1l, null, null, "525-530", null, null);
+        networkService.updatePhysicalNetwork(1l, null, null, "524-524,525-530", null);
         txn.close("updatePhysicalNetworkTest");
         verify(physicalNetworkVO).setVnet(argumentCaptor.capture());
         assertEquals("524-530", argumentCaptor.getValue());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4fb4afb8/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index a282840..178ebba 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -372,7 +372,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
      */
     @Override
     public PhysicalNetwork updatePhysicalNetwork(Long id, String networkSpeed, List<String> tags,
-                                                 String newVnetRangeString, String state, String removeVlan) {
+                                                 String newVnetRangeString, String state) {
         // TODO Auto-generated method stub
         return null;
     }