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;
}