diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index a2f7cde9872..e97f2c62ee3 100755 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -113,7 +113,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase tokens = processVlanRange(network,removeVlan); - removeVlanRange(network, tokens.get(0), tokens.get(1)); + boolean result = removeVlanRange(network, tokens.get(0), tokens.get(1)); } if (tags != null && tags.size() > 1) { @@ -2589,6 +2589,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { network.setSpeed(networkSpeed); } + // Vnet range can be extended only boolean AddVnet = true; List> vnetsToAdd = new ArrayList>(); @@ -2605,6 +2606,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { int existingStartVnet = existingRanges.get(j).first(); int existingEndVnet = existingRanges.get(j).second(); + // check if vnet is being extended if (newStartVnet.intValue() >= existingStartVnet & newEndVnet.intValue() <= existingEndVnet) { throw new InvalidParameterValueException("The vlan range you trying to add already exists."); } @@ -2628,62 +2630,79 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { vnetsToAdd.add(new Pair(existingEndVnet+1,newEndVnet)); existingRanges.get(j).first(newStartVnet); existingRanges.get(j).second(newEndVnet); - AddVnet = false; break; } } } if (AddVnet){ - vnetsToAdd.add(new Pair(newStartVnet, newEndVnet)); - existingRanges.add(new Pair(newStartVnet,newEndVnet)); - j= existingRanges.size()-1; + vnetsToAdd.add(new Pair(newStartVnet, newEndVnet)); + existingRanges.add(new Pair(newStartVnet,newEndVnet)); } + + Map vnetMap = new HashMap(existingRanges.size()); + Map IndexMap = new HashMap(existingRanges.size()); + for (int i=0; i< existingRanges.size(); i++){ + vnetMap.put(existingRanges.get(i).first(),existingRanges.get(i).second()); + IndexMap.put(existingRanges.get(i).first(),i); + } + Integer value; + Integer index; String vnetString = ""; - - Integer changed_entry_start = existingRanges.get(j).first(); - Integer changed_entry_end = existingRanges.get(j).second(); for (int i=0; i < existingRanges.size(); i++){ - if (i !=j && existingRanges.get(i).first()<=changed_entry_end && existingRanges.get(i).second() >= changed_entry_end) { - existingRanges.get(j).second(existingRanges.get(i).second()); + value = vnetMap.get((existingRanges.get(i).second()+1)); + if (value != null) { + vnetMap.remove((existingRanges.get(i).second()+1)); + vnetMap.remove(existingRanges.get(i).first()); + vnetMap.put(existingRanges.get(i).first(),value); + existingRanges.add(new Pair(existingRanges.get(i).first(),value)); + index = IndexMap.get(existingRanges.get(i).second()+1); + existingRanges.get(index).first(-1); + existingRanges.get(index).second(-1); + existingRanges.get(i).first(-1); + existingRanges.get(i).second(-1); + } + value = vnetMap.get((existingRanges.get(i).second())); + if (value != null && ( (existingRanges.get(i).second()) != (existingRanges.get(i).first()) )) { + vnetMap.remove((existingRanges.get(i).second())); + vnetMap.remove(existingRanges.get(i).first()); + vnetMap.put(existingRanges.get(i).first(),value); + existingRanges.add(new Pair(existingRanges.get(i).first(),value)); + index = IndexMap.get(existingRanges.get(i).second()); + existingRanges.get(index).first(-1); + existingRanges.get(index).second(-1); existingRanges.get(i).first(-1); existingRanges.get(i).second(-1); - } else if ((i !=j && changed_entry_end > existingRanges.get(i).second()) && changed_entry_start <= existingRanges.get(i).first()) { - existingRanges.get(i).first(-1); - existingRanges.get(i).second(-1); - }else if ((i != j ) && changed_entry_end > existingRanges.get(i).second() && changed_entry_start <= existingRanges.get(i).second() && existingRanges.get(i).first() <= changed_entry_start) { - existingRanges.get(j).first(existingRanges.get(i).first()); - existingRanges.get(i).first(-1); - existingRanges.get(i).first(-1); } } - for (Pair vnetRange : existingRanges ){ - value=vnetRange.first(); - if (value != -1){ - vnetString = vnetString+vnetRange.first().toString()+"-"+vnetRange.second().toString()+";"; - } + + if (newVnetRangeString != null) { + for (Pair vnetRange : existingRanges ){ + value=vnetMap.get(vnetRange.first()); + if (value != null){ + vnetString = vnetString+vnetRange.first().toString()+"-"+value.toString()+";"; + } + } + if (vnetString.length() > 0 && vnetString.charAt(vnetString.length()-1)==';') { + vnetString = vnetString.substring(0, vnetString.length()-1); + } + network.setVnet(vnetString); } - if (vnetString.length() > 0 && vnetString.charAt(vnetString.length()-1)==';') { - vnetString = vnetString.substring(0, vnetString.length()-1); - } - network.setVnet(vnetString); - Transaction txn = Transaction.currentTxn(); - txn.start(); + for (Pair vnetToAdd : vnetsToAdd) { s_logger.debug("Adding vnet range " + vnetToAdd.first() + "-" + vnetToAdd.second() + " for the physicalNetwork id= " + id + " and zone id=" + network.getDataCenterId() - + " as a part of updatePhysicalNetwork call"); + + " as a part of updatePhysicalNetwork call"); _dcDao.addVnet(network.getDataCenterId(), network.getId(), vnetToAdd.first(), vnetToAdd.second()); } - _physicalNetworkDao.update(id, network); - txn.commit(); } - return network; - } + _physicalNetworkDao.update(id, network); + return network; + } private List processVlanRange(PhysicalNetworkVO network, String removeVlan) { Integer StartVnet;