You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ch...@apache.org on 2013/07/17 19:35:34 UTC

[35/50] [abbrv] git commit: updated refs/heads/ldapplugin to 7bc705e

Incorportaed the review changes Now dhcpservice IPs are removed when last vm from the subnet is removed. Rebased with master.

Signed-off-by: Abhinandan Prateek <ap...@apache.org>


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

Branch: refs/heads/ldapplugin
Commit: d73bb22802cba9116f27fada6780c966b0060b30
Parents: 4ac6ebb
Author: Bharat Kumar <bh...@citrix.com>
Authored: Sun Jul 14 12:15:23 2013 +0530
Committer: Abhinandan Prateek <ap...@apache.org>
Committed: Wed Jul 17 12:35:06 2013 +0530

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/to/DhcpTO.java      |  64 ++++++++
 api/src/com/cloud/agent/api/to/DnsmasqTO.java   |  64 --------
 api/src/com/cloud/network/Network.java          |   1 +
 api/src/com/cloud/network/NetworkService.java   |   3 +
 .../network/element/DhcpServiceProvider.java    |   2 +-
 .../agent/api/routing/DnsMasqConfigCommand.java |  40 ++++-
 .../com/cloud/network/DnsMasqConfigurator.java  |  48 ++++--
 .../com/cloud/capacity/dao/CapacityDaoImpl.java |   2 +-
 .../src/com/cloud/network/dao/IPAddressDao.java |   6 +-
 .../com/cloud/network/dao/IPAddressDaoImpl.java |  33 +++--
 engine/schema/src/com/cloud/vm/dao/NicDao.java  |   3 +
 .../schema/src/com/cloud/vm/dao/NicDaoImpl.java |  13 +-
 .../debian/config/root/createIpAlias.sh         |  12 +-
 .../debian/config/root/deleteIpAlias.sh         |  22 +--
 patches/systemvm/debian/config/root/dnsmasq.sh  |  13 +-
 scripts/network/domr/call_dnsmasq.sh            |   2 -
 .../vm/hypervisor/xenserver/createipAlias.sh    |   1 -
 .../vm/hypervisor/xenserver/deleteipAlias.sh    |   1 -
 .../configuration/ConfigurationManagerImpl.java | 145 ++++++-------------
 .../com/cloud/network/NetworkManagerImpl.java   |   6 +-
 .../com/cloud/network/NetworkServiceImpl.java   |   9 +-
 .../network/element/VirtualRouterElement.java   |  17 +--
 .../VirtualNetworkApplianceManagerImpl.java     |  69 +++++----
 .../VpcVirtualNetworkApplianceManagerImpl.java  |  16 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  74 ++++++++++
 .../cloud/network/MockNetworkManagerImpl.java   |   5 +
 ...cVirtualNetworkApplianceManagerImplTest.java |  31 +++-
 .../com/cloud/vpc/MockNetworkManagerImpl.java   |   5 +
 utils/conf/db.properties                        |   2 +-
 utils/src/com/cloud/utils/net/NetUtils.java     |  19 ++-
 30 files changed, 446 insertions(+), 282 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/api/src/com/cloud/agent/api/to/DhcpTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/DhcpTO.java b/api/src/com/cloud/agent/api/to/DhcpTO.java
new file mode 100644
index 0000000..b0d6c7a
--- /dev/null
+++ b/api/src/com/cloud/agent/api/to/DhcpTO.java
@@ -0,0 +1,64 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api.to;
+
+public class DhcpTO {
+    String routerIp;
+    String gateway;
+    String netmask;
+    String startIpOfSubnet;
+
+    public DhcpTO(String routerIp, String gateway, String netmask, String StartIpOfSubnet) {
+        this.routerIp = routerIp;
+        this.startIpOfSubnet = StartIpOfSubnet;
+        this.gateway = gateway;
+        this.netmask =netmask;
+
+    }
+
+    public void setRouterIp(String routerIp){
+        this.routerIp = routerIp;
+    }
+
+    public void setGateway(String gateway) {
+        this.gateway = gateway;
+    }
+
+    public void setNetmask(String netmask) {
+        this.netmask = netmask ;
+    }
+
+    public void setStartIpOfSubnet( String ipOfSubNet) {
+        startIpOfSubnet = ipOfSubNet;
+    }
+
+    public String getRouterIp() {
+        return routerIp;
+    }
+
+    public String getGateway() {
+        return gateway;
+    }
+
+    public String getNetmask() {
+        return netmask;
+    }
+    public String getStartIpOfSubnet() {
+        return startIpOfSubnet;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/api/src/com/cloud/agent/api/to/DnsmasqTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/DnsmasqTO.java b/api/src/com/cloud/agent/api/to/DnsmasqTO.java
deleted file mode 100644
index c7be04d..0000000
--- a/api/src/com/cloud/agent/api/to/DnsmasqTO.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.api.to;
-
-public class DnsmasqTO {
-    String routerIp;
-    String gateway;
-    String netmask;
-    String startIpOfSubnet;
-
-    public DnsmasqTO(String routerIp, String gateway, String netmask, String StartIpOfSubnet) {
-        this.routerIp = routerIp;
-        this.startIpOfSubnet = StartIpOfSubnet;
-        this.gateway = gateway;
-        this.netmask =netmask;
-
-    }
-
-    public void setRouterIp(String routerIp){
-        this.routerIp = routerIp;
-    }
-
-    public void setGateway(String gateway) {
-        this.gateway = gateway;
-    }
-
-    public void setNetmask(String netmask) {
-        this.netmask = netmask ;
-    }
-
-    public void setStartIpOfSubnet( String ipOfSubNet) {
-        startIpOfSubnet = ipOfSubNet;
-    }
-
-    public String getRouterIp() {
-        return routerIp;
-    }
-
-    public String getGateway() {
-        return gateway;
-    }
-
-    public String getNetmask() {
-        return netmask;
-    }
-    public String getStartIpOfSubnet() {
-        return startIpOfSubnet;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index a06208b..9be6171 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -180,6 +180,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Capability SupportedEgressProtocols = new Capability("SupportedEgressProtocols");
         public static final Capability HealthCheckPolicy = new Capability("HealthCheckPolicy");
         public static final Capability LbSchemes = new Capability("LbSchemes");
+        public static final Capability DhcpAccrossMultipleSubnets = new Capability("DhcpAccrossMultipleSubnets");
 
         private String name;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/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 405cecd..59ccdbf 100755
--- a/api/src/com/cloud/network/NetworkService.java
+++ b/api/src/com/cloud/network/NetworkService.java
@@ -17,7 +17,9 @@
 package com.cloud.network;
 
 import java.util.List;
+import java.util.Map;
 
+import com.cloud.offering.NetworkOffering;
 import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
 import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
@@ -180,4 +182,5 @@ public interface NetworkService {
     /* lists the nic informaton */
     List<? extends Nic> listNics(ListNicsCmd listNicsCmd);
 
+    Map<Network.Capability, String> getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/api/src/com/cloud/network/element/DhcpServiceProvider.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/element/DhcpServiceProvider.java b/api/src/com/cloud/network/element/DhcpServiceProvider.java
index 83008ca..6363d7c 100644
--- a/api/src/com/cloud/network/element/DhcpServiceProvider.java
+++ b/api/src/com/cloud/network/element/DhcpServiceProvider.java
@@ -29,5 +29,5 @@ import com.cloud.vm.VirtualMachineProfile;
 public interface DhcpServiceProvider extends NetworkElement {
     boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
     boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
-    boolean  removeDhcpSupportForSubnet(Network network);
+    boolean  removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/core/src/com/cloud/agent/api/routing/DnsMasqConfigCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/DnsMasqConfigCommand.java b/core/src/com/cloud/agent/api/routing/DnsMasqConfigCommand.java
index a52af90..521ad70 100644
--- a/core/src/com/cloud/agent/api/routing/DnsMasqConfigCommand.java
+++ b/core/src/com/cloud/agent/api/routing/DnsMasqConfigCommand.java
@@ -16,7 +16,7 @@
 // under the License.
 package com.cloud.agent.api.routing;
 
-import com.cloud.agent.api.to.DnsmasqTO;
+import com.cloud.agent.api.to.DhcpTO;
 
 import java.util.List;
 
@@ -26,11 +26,14 @@ public class DnsMasqConfigCommand extends NetworkElementCommand {
     String dns2;
     String internal_dns1;
     String internal_dns2;
-    List<DnsmasqTO> dnsmasqTOs;
+    List<DhcpTO> dhcpTOs;
+    boolean useExternal_dns;
+    String domain_suffix;
+    boolean dns;
 
-    public DnsMasqConfigCommand(String domain, List<DnsmasqTO> dnsmasqTOs, String dns1, String dns2, String internal_dns1, String internal_dns2) {
+    public DnsMasqConfigCommand(String domain, List<DhcpTO> dhcpTOs, String dns1, String dns2, String internal_dns1, String internal_dns2) {
         this.domain = domain;
-        this.dnsmasqTOs = dnsmasqTOs;
+        this.dhcpTOs = dhcpTOs;
         this.dns1= dns1;
         this.dns2= dns2;
         this.internal_dns1 = internal_dns1;
@@ -38,8 +41,8 @@ public class DnsMasqConfigCommand extends NetworkElementCommand {
 
     }
 
-    public List<DnsmasqTO> getIps() {
-        return  dnsmasqTOs;
+    public List<DhcpTO> getIps() {
+        return dhcpTOs;
     }
 
     public  String getDomain() {
@@ -62,4 +65,29 @@ public class DnsMasqConfigCommand extends NetworkElementCommand {
         return internal_dns2;
     }
 
+    public void setUseExternalDns(boolean useExternal_dns) {
+        this.useExternal_dns = useExternal_dns;
+    }
+
+    public void setDomainSuffix(String domain_suffix) {
+        this.domain_suffix = domain_suffix;
+    }
+
+    public void setIfDnsProvided(boolean dns) {
+        this.dns =dns;
+    }
+
+    public String getDomainSuffix() {
+        return this.domain_suffix;
+    }
+
+    public boolean getUseExternalDns() {
+        return useExternal_dns;
+    }
+
+    public boolean isDnsProvided() {
+        return dns;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/core/src/com/cloud/network/DnsMasqConfigurator.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/network/DnsMasqConfigurator.java b/core/src/com/cloud/network/DnsMasqConfigurator.java
index dd34926..3fc61df 100644
--- a/core/src/com/cloud/network/DnsMasqConfigurator.java
+++ b/core/src/com/cloud/network/DnsMasqConfigurator.java
@@ -17,7 +17,7 @@
 package com.cloud.network;
 
 import com.cloud.agent.api.routing.DnsMasqConfigCommand;
-import com.cloud.agent.api.to.DnsmasqTO;
+import com.cloud.agent.api.to.DhcpTO;
 import org.apache.log4j.Logger;
 
 import java.util.Arrays;
@@ -74,11 +74,10 @@ import java.util.List;
                                            "dhcp-option=6,router_ip,external_dns\n",
                                            "dhcp-optsfile=/etc/dhcpopts.txt\n",
 
-
          };
 
      public String[] generateConfiguration(DnsMasqConfigCommand dnsMasqconfigcmd) {
-         List<DnsmasqTO> dnsmasqTOs = dnsMasqconfigcmd.getIps();
+         List<DhcpTO> dhcpTOs = dnsMasqconfigcmd.getIps();
          List <String> dnsMasqconf = Arrays.asList(Dnsmasq_config);
          String range="";
          String gateway="";
@@ -95,15 +94,42 @@ import java.util.List;
          dns_external = dns_external + "*";
          dns_external = dns_external.replace(",*","");
          int i=0;
-         for (; i< dnsmasqTOs.size(); i++) {
-              range=range + "dhcp-range=set:range"+i+","+dnsmasqTOs.get(i).getStartIpOfSubnet()+",static\n";
-              gateway=gateway +"dhcp-option=tag:range"+i+",3,"+dnsmasqTOs.get(i).getGateway()+"\n";
-              netmask=netmask +"dhcp-option=tag:range"+i+",1,"+dnsmasqTOs.get(i).getNetmask()+"\n";
-              dnsServers=dnsServers+"dhcp-option=tag:range"+i+",6,"+dnsmasqTOs.get(i).getRouterIp()+","+dns_external+"\n";
+         for (; i< dhcpTOs.size(); i++) {
+              range=range + "dhcp-range=set:range"+i+","+ dhcpTOs.get(i).getStartIpOfSubnet()+",static\n";
+              gateway=gateway +"dhcp-option=tag:range"+i+",3,"+ dhcpTOs.get(i).getGateway()+"\n";
+              netmask=netmask +"dhcp-option=tag:range"+i+",1,"+ dhcpTOs.get(i).getNetmask()+"\n";
+              if (!dnsMasqconfigcmd.isDnsProvided()) {
+                  dnsServers = dnsServers+"dhcp-option=tag:range"+i+",6,"+dns_external+"\n";
+              }
+              else {
+                  dnsServers=dnsServers+"dhcp-option=tag:range"+i+",6,"+ dhcpTOs.get(i).getRouterIp()+","+dns_external+"\n";
+              }
+
          }
-         dnsMasqconf.set(12, "domain="+domain+"\n");
-         dnsMasqconf.set(14, "domain="+domain+"\n");
-         dnsMasqconf.set(16,"domain="+domain+"\n");
+         String domain_suffix= dnsMasqconfigcmd.getDomainSuffix();
+
+         if (domain != null) {
+             if (domain_suffix != null) {
+
+                 dnsMasqconf.get(5).replace(" local=/cs1cloud.internal/"," local=/"+domain+"/");
+                 dnsMasqconf.set(12, "domain="+domain_suffix+domain+"\n");
+                 dnsMasqconf.set(14, "domain="+domain_suffix+domain+"\n");
+                 dnsMasqconf.set(16,"domain="+domain_suffix+domain+"\n");
+             } else {
+                 dnsMasqconf.get(5).replace(" local=/cs1cloud.internal/"," local=/"+domain+"/");
+                 dnsMasqconf.set(12, "domain="+domain+"\n");
+                 dnsMasqconf.set(14, "domain="+domain+"\n");
+                 dnsMasqconf.set(16,"domain="+domain+"\n");
+             }
+         }
+         ///if no domain is specified. this happens when dns service is not provided by the virtualrouter.
+         else {
+             dnsMasqconf.get(5).replace(" local=/cs1cloud.internal/"," local=/"+domain+"/");
+             dnsMasqconf.set(12, "domain="+"cloudnine.internal\n");
+             dnsMasqconf.set(14, "domain="+"cloudnine.internal\n");
+             dnsMasqconf.set(16,"domain="+"cloudnine.internal\n");
+         }
+
          dnsMasqconf.set(18, range);
          dnsMasqconf.set(22, gateway);
          dnsMasqconf.set(23, netmask);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
index cecc145..dc2899f 100755
--- a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
+++ b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
@@ -387,7 +387,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
             SummedCapacitySearch.and("clusterId", SummedCapacitySearch.entity().getClusterId(), Op.EQ);
         }
         if (capacityType != null){
-            SummedCapacitySearch.and("capacityType", SummedCapacitySearch.entity().getCapacityType(), Op.EQ);	
+            SummedCapacitySearch.and("capacityType", SummedCapacitySearch.entity().getCapacityType(), Op.EQ);
         }        
 
         SummedCapacitySearch.done();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
index 3eba6d8..314ae18 100755
--- a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java
@@ -75,7 +75,9 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, Long> {
 
     long countFreeIpsInVlan(long vlanDbId);
 
-    boolean deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp) throws SQLException;
+    void deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp);
 
-    boolean deletePublicIPRange(long vlanDbId) throws SQLException;
+    boolean deletePublicIPRange(long vlanDbId) ;
+
+    void lockRange(long vlandbId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
index 1051b69..9f5f403 100755
--- a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.network.dao;
 
+import com.cloud.dc.DataCenterVnetVO;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.dc.VlanVO;
 import com.cloud.dc.dao.VlanDao;
@@ -54,7 +55,8 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
     protected SearchBuilder<IPAddressVO> VlanDbIdSearchUnallocated;
     protected GenericSearchBuilder<IPAddressVO, Integer> AllIpCount;
     protected GenericSearchBuilder<IPAddressVO, Integer> AllocatedIpCount;
-    protected GenericSearchBuilder<IPAddressVO, Integer> AllIpCountForDashboard;    
+    protected GenericSearchBuilder<IPAddressVO, Integer> AllIpCountForDashboard;
+    protected SearchBuilder<IPAddressVO> DeleteAllExceptGivenIp;
     protected GenericSearchBuilder<IPAddressVO, Long> AllocatedIpCountForAccount;    
     @Inject protected VlanDao _vlanDao;
     protected GenericSearchBuilder<IPAddressVO, Long> CountFreePublicIps;
@@ -128,6 +130,10 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
         join.and("vlanType", join.entity().getVlanType(), Op.EQ);
         CountFreePublicIps.join("vlans", join, CountFreePublicIps.entity().getVlanId(), join.entity().getId(), JoinBuilder.JoinType.INNER);
         CountFreePublicIps.done();
+
+        DeleteAllExceptGivenIp = createSearchBuilder();
+        DeleteAllExceptGivenIp.and("vlanDbId", DeleteAllExceptGivenIp.entity().getVlanId(), Op.EQ);
+        DeleteAllExceptGivenIp.and("ip", DeleteAllExceptGivenIp.entity().getAddress(), Op.NEQ);
     }
 
     @Override
@@ -366,21 +372,15 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
     }
 
     @Override
-    public boolean deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp) throws SQLException {
-        Transaction txn = Transaction.currentTxn();
-        String deleteSql = "DELETE FROM `cloud`.`user_ip_address` WHERE vlan_db_id = ? and public_ip_address!=?";
-
-        txn.start();
-        PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteSql);
-        stmt.setLong(1, vlanDbId);
-        stmt.setString(2, aliasIp);
-        stmt.executeUpdate();
-        txn.commit();
-        return true;
+    public void deletePublicIPRangeExceptAliasIP(long vlanDbId, String aliasIp)  {
+        SearchCriteria<IPAddressVO> sc =DeleteAllExceptGivenIp .create();
+        sc.setParameters("vlan", vlanDbId);
+        sc.setParameters("ip", aliasIp);
+        remove(sc);
     }
 
     @Override
-    public boolean deletePublicIPRange(long vlanDbId) throws SQLException{
+    public boolean deletePublicIPRange(long vlanDbId) {
         SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
         sc.setParameters("vlan", vlanDbId);
         remove(sc);
@@ -408,4 +408,11 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
         sc.setParameters("associatedVmIp", vmIp);
         return findOneBy(sc);
     }
+
+    @Override
+    public void lockRange(long vlandbId) {
+        SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
+        sc.setParameters("vlan", vlandbId);
+        lockRows(sc,null,true);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/engine/schema/src/com/cloud/vm/dao/NicDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java
index 83f280e..37249dd 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDao.java
@@ -20,6 +20,7 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.VirtualMachine;
 
+import java.net.URI;
 import java.util.List;
 
 public interface NicDao extends GenericDao<NicVO, Long> {
@@ -68,4 +69,6 @@ public interface NicDao extends GenericDao<NicVO, Long> {
     List<NicVO> listPlaceholderNicsByNetworkIdAndVmType(long networkId, VirtualMachine.Type vmType);
 
     NicVO findByInstanceIdAndIpAddressAndVmtype(long instanceId, String ipaddress, VirtualMachine.Type type);
+
+    List<NicVO> listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
index 420643f..d6433a4 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.vm.VirtualMachine;
 import org.springframework.stereotype.Component;
 
 import javax.ejb.Local;
+import java.net.URI;
 import java.util.List;
 
 @Component
@@ -151,7 +152,17 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
         sc.setParameters("gateway", gateway);
         return findOneBy(sc);
     }
-    
+
+    @Override
+    public List<NicVO> listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcasturi) {
+        SearchCriteria<NicVO> sc = AllFieldsSearch.create();
+        sc.setParameters("network", networkId);
+        sc.setParameters("vmType", vmType);
+        sc.setParameters("gateway", gateway);
+        sc.setParameters("broadcastUri", broadcasturi);
+        return listBy(sc);
+    }
+
     @Override
     public NicVO findByIp4AddressAndNetworkId(String ip4Address, long networkId) {
         SearchCriteria<NicVO> sc = AllFieldsSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/patches/systemvm/debian/config/root/createIpAlias.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/root/createIpAlias.sh b/patches/systemvm/debian/config/root/createIpAlias.sh
index 1db210b..5498195 100755
--- a/patches/systemvm/debian/config/root/createIpAlias.sh
+++ b/patches/systemvm/debian/config/root/createIpAlias.sh
@@ -19,8 +19,16 @@
 usage() {
   printf " %s   <alias_count:ip:netmask;alias_count2:ip2:netmask2;....> \n" $(basename $0) >&2
 }
+source /root/func.sh
+
+lock="biglock"
+locked=$(getLockFile $lock)
+if [ "$locked" != "1" ]
+then
+    exit 1
+fi
+
 
-set -x
 var="$1"
 cert="/root/.ssh/id_rsa.cloud"
 
@@ -35,4 +43,4 @@ do
 done
 #restaring the password service to enable it on the ip aliases
 /etc/init.d/cloud-passwd-srvr restart
-exit $?
\ No newline at end of file
+unlock_exit $? $lock $locked
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/patches/systemvm/debian/config/root/deleteIpAlias.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/root/deleteIpAlias.sh b/patches/systemvm/debian/config/root/deleteIpAlias.sh
index cf6d4de..fa228fb 100755
--- a/patches/systemvm/debian/config/root/deleteIpAlias.sh
+++ b/patches/systemvm/debian/config/root/deleteIpAlias.sh
@@ -20,7 +20,15 @@ usage() {
   printf " %s   <alias_count:ip:netmask;alias_count2:ip2:netmask2;....> \n" $(basename $0) >&2
 }
 
-set -x
+source /root/func.sh
+
+lock="biglock"
+locked=$(getLockFile $lock)
+if [ "$locked" != "1" ]
+then
+    exit 1
+fi
+
 var="$1"
 cert="/root/.ssh/id_rsa.cloud"
 
@@ -32,12 +40,8 @@ do
  var=$( echo $var | sed "s/${var1}-//" )
 done
 
-#recreating the active ip aliases
-sh /root/createIpAlias.sh $2
-result=$?
-if [  "$result" -ne "0" ]
-then
- exit $result
-fi
+releaseLockFile $lock $locked
 
-exit 0
+#recreating the active ip aliases
+/root/createIpAlias.sh $2
+unlock_exit $? $lock $locked

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/patches/systemvm/debian/config/root/dnsmasq.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/root/dnsmasq.sh b/patches/systemvm/debian/config/root/dnsmasq.sh
index 656fd3c..b70e2d3 100755
--- a/patches/systemvm/debian/config/root/dnsmasq.sh
+++ b/patches/systemvm/debian/config/root/dnsmasq.sh
@@ -20,6 +20,15 @@ usage() {
   printf "Usage: %s:  <path to new dnsmasq config file>\n" $(basename $0) >&2
 }
 
+source /root/func.sh
+
+lock="biglock"
+locked=$(getLockFile $lock)
+if [ "$locked" != "1" ]
+then
+    exit 1
+fi
+
 set -x
 #backup the old config file
 cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
@@ -37,7 +46,7 @@ then
    echo "reverting to the old config"
    cp /etc/dnsmasq.config.bak /etc/dnsmasq.conf
    service dnsmasq restart
-   exit 2
+   unlock_exit $? $lock $locked
 fi
 rm $1
-echo "success"
+unlock_exit $? $lock $locked

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/scripts/network/domr/call_dnsmasq.sh
----------------------------------------------------------------------
diff --git a/scripts/network/domr/call_dnsmasq.sh b/scripts/network/domr/call_dnsmasq.sh
index 097e185..81c218d 100755
--- a/scripts/network/domr/call_dnsmasq.sh
+++ b/scripts/network/domr/call_dnsmasq.sh
@@ -20,8 +20,6 @@ usage() {
   printf "Usage: %s:  <domR eth1 ip>  <path_to_new_config_file>\n" $(basename $0) >&2
 }
 
-set -x
-
 cert="/root/.ssh/id_rsa.cloud"
 
 ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$1 "/root/dnsmasq.sh $2"	 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/scripts/vm/hypervisor/xenserver/createipAlias.sh
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/createipAlias.sh b/scripts/vm/hypervisor/xenserver/createipAlias.sh
index c35658e..4ef6618 100755
--- a/scripts/vm/hypervisor/xenserver/createipAlias.sh
+++ b/scripts/vm/hypervisor/xenserver/createipAlias.sh
@@ -21,6 +21,5 @@ usage() {
   printf " %s  routerip  <alias_count:ip:netmask;alias_count2:ip2:netmask2;....> \n" $(basename $0) >&2
 }
 
-set -x
 cert="/root/.ssh/id_rsa.cloud"
 ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$1 "/root/createIpAlias.sh $2"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/deleteipAlias.sh b/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
index 6816edd..7604172 100644
--- a/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
+++ b/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
@@ -20,6 +20,5 @@ usage() {
   printf " %s  routerip  <alias_count:ip:netmask;alias_count2:ip2:netmask2;....> \n" $(basename $0) >&2
 }
 
-set -x
 cert="/root/.ssh/id_rsa.cloud"
 ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$1 "/root/deleteIpAlias.sh $2 $3"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 801028d..92178c9 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -2738,9 +2738,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         Transaction txn = Transaction.currentTxn();
         txn.start();
 
-        if (sameSubnet == null || sameSubnet.first() == false) {
+        if ((sameSubnet == null || sameSubnet.first() == false) && (network.getTrafficType()== TrafficType.Guest) && (network.getGuestType() == GuestType.Shared) && (_vlanDao.listVlansByNetworkId(networkId) != null)) {
+            Map<Capability, String> dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(network.getNetworkOfferingId()), Service.Dhcp);
+            String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
+            if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) {
+                       throw new  InvalidParameterValueException("The Dhcp serivice provider for this network dose not support the dhcp  across multiple subnets");
+            }
             s_logger.info("adding a new subnet to the network " + network.getId());
-        } else {
+        } else if (sameSubnet != null)  {
             // if it is same subnet the user might not send the vlan and the
             // netmask details. so we are
             // figuring out while validation and setting them here.
@@ -2757,7 +2762,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         return vlan;
     }
 
-    public int checkIfSubsetOrSuperset(String newVlanGateway, String newVlanNetmask, VlanVO vlan, String startIP,
+    public NetUtils.supersetOrSubset checkIfSubsetOrSuperset(String newVlanGateway, String newVlanNetmask, VlanVO vlan, String startIP,
             String endIP) {
         if (newVlanGateway == null && newVlanNetmask == null) {
             newVlanGateway = vlan.getVlanGateway();
@@ -2765,10 +2770,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             // this means he is trying to add to the existing subnet.
             if (NetUtils.sameSubnet(startIP, newVlanGateway, newVlanNetmask)) {
                 if (NetUtils.sameSubnet(endIP, newVlanGateway, newVlanNetmask)) {
-                    return 3;
+                    return NetUtils.supersetOrSubset.sameSubnet;
                 }
             }
-            return 0;
+            return NetUtils.supersetOrSubset.neitherSubetNorSuperset;
         } else if (newVlanGateway == null || newVlanGateway == null) {
             throw new InvalidParameterValueException(
                     "either both netmask and gateway should be passed or both should me omited.");
@@ -2798,25 +2803,30 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                     vlanGateway = vlan.getVlanGateway();
                     vlanNetmask = vlan.getVlanNetmask();
                     // check if subset or super set or neither.
-                    int val = checkIfSubsetOrSuperset(newVlanGateway, newVlanNetmask, vlan, startIP, endIP);
-                    if (val == 1) {
+                    NetUtils.supersetOrSubset val = checkIfSubsetOrSuperset(newVlanGateway, newVlanNetmask, vlan, startIP, endIP);
+                    if (val == NetUtils.supersetOrSubset.isSuperset) {
                         // this means that new cidr is a superset of the
                         // existing subnet.
                         throw new InvalidParameterValueException(
                                 "The subnet you are trying to add is a superset of the existing subnet having gateway"
                                         + vlan.getVlanGateway() + " and netmask  " + vlan.getVlanNetmask());
-                    } else if (val == 0) {
+                    } else if (val == NetUtils.supersetOrSubset.neitherSubetNorSuperset) {
                         // this implies the user is trying to add a new subnet
                         // which is not a superset or subset of this subnet.
                         // checking with the other subnets.
                         continue;
-                    } else if (val == 2) {
+                    } else if (val == NetUtils.supersetOrSubset.isSubset) {
                         // this means he is trying to add to the same subnet.
                         throw new InvalidParameterValueException(
                                 "The subnet you are trying to add is a subset of the existing subnet having gateway"
                                         + vlan.getVlanGateway() + " and netmask  " + vlan.getVlanNetmask());
-                    } else if (val == 3) {
+                    } else if (val == NetUtils.supersetOrSubset.sameSubnet) {
                         sameSubnet = true;
+                        //check if the gateway provided by the user is same as that of the subnet.
+                        if (newVlanGateway != null && !newVlanGateway.equals(vlanGateway)) {
+                             throw new InvalidParameterValueException("The gateway of the subnet should be unique. The subnet alreaddy has a gateway "+ vlanGateway);
+                        }
+                        break;
                     }
                 }
                 if (ipv6) {
@@ -3021,7 +3031,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 if (otherVlanGateway == null) {
                     continue;
                 }
-                String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask());
+                 String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask());
                 String[] otherVlanIpRange = vlan.getIpRange().split("\\-");
                 String otherVlanStartIP = otherVlanIpRange[0];
                 String otherVlanEndIP = null;
@@ -3149,15 +3159,6 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         return vlan;
     }
 
-    @DB
-    public void deleteVLANFromDb(long vlanDbId) throws SQLException {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        _publicIpAddressDao.deletePublicIPRange(vlanDbId);
-        _vlanDao.expunge(vlanDbId);
-        txn.commit();
-    }
-
     @Override
     @DB
     public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) {
@@ -3222,102 +3223,38 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                         s_logger.warn("Some ip addresses failed to be released as a part of vlan " + vlanDbId
                                 + " removal");
                     }
+                    else {
+                        for (IPAddressVO ip : ips) {
+                            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE, acctVln.get(0).getId(), ip
+                                    .getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlanRange
+                                    .getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                        }
+                    }
                 } finally {
                     _vlanDao.releaseFromLockTable(vlanDbId);
                 }
             }
-        }
-
-        if (success) {
-            // Delete all public IPs in the VLAN
-            // if ip range is dedicated to an account generate usage events for
-            // release of every ip in the range
-            if (isAccountSpecific) {
-                for (IPAddressVO ip : ips) {
-                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE, acctVln.get(0).getId(), ip
-                            .getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlanRange
-                            .getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
-                }
-            }
-            try {
-                if (_networkModel.areServicesSupportedInNetwork(vlanRange.getNetworkId(), Service.Dhcp)) {
-                    Network network = _networkDao.findById(vlanRange.getNetworkId());
-                    DhcpServiceProvider dhcpServiceProvider = _networkMgr.getDhcpServiceProvider(network);
-                    if (!dhcpServiceProvider.getProvider().getName().equalsIgnoreCase(Provider.VirtualRouter.getName())) {
-                        deleteVLANFromDb(vlanDbId);
-                    } else {
-                        return  handleIpAliasDeletion(vlanRange, vlanDbId, dhcpServiceProvider, network);
-                    }
+            else {   // !isAccountSpecific
+                NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(vlanRange.getVlanGateway(), vlanRange.getNetworkId(), NicIpAlias.state.active);
+                //check if the ipalias belongs to the vlan range being deleted.
+                if (ipAlias != null && vlanDbId == _publicIpAddressDao.findByIpAndSourceNetworkId(vlanRange.getNetworkId(), ipAlias.getIp4Address()).getVlanId()) {
+                    throw new InvalidParameterValueException("Cannot delete vlan range "+vlanDbId+" as "+ipAlias.getIp4Address() +
+                            "is being used for providing dhcp service in this subnet. Delete all VMs in this subnet and try again");
                 }
-
-                else {
-                    deleteVLANFromDb(vlanDbId);
+                allocIpCount = _publicIpAddressDao.countIPs(vlanRange.getDataCenterId(), vlanDbId, true);
+                if (allocIpCount > 0) {
+                    throw new InvalidParameterValueException(allocIpCount + "  Ips are in use. Cannot delete this vlan");
                 }
             }
-            catch ( SQLException e) {
-               throw  new CloudRuntimeException(e.getMessage());
-            }
-
         }
-        return true;
-    }
 
-    @DB
-    private boolean handleIpAliasDeletion(VlanVO vlanRange, long vlanDbId, DhcpServiceProvider dhcpServiceProvider, Network network) throws SQLException {
+
         Transaction txn = Transaction.currentTxn();
         txn.start();
-        IPAddressVO ip = null;
-        NicIpAliasVO ipAlias = null;
-        try{
-            Integer allocIpCount=0;
-            //search if the vlan has any allocated ips.
-            allocIpCount = _publicIpAddressDao.countIPs(vlanRange.getDataCenterId(), vlanDbId, true);
-            if (allocIpCount > 1) {
-                throw  new InvalidParameterValueException ("Cannot delete this range as some of the vlans are in use.");
-            }
-            else if (allocIpCount == 0){
-                deleteVLANFromDb(vlanDbId);
-            }
-            else {
-                ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(vlanRange.getVlanGateway(), vlanRange.getNetworkId(),  NicIpAlias.state.active);
-                if (ipAlias == null) {
-                    throw  new InvalidParameterValueException ("Cannot delete this range as some of the Ips are in use.");
-                }
-
-                //check if this ip belongs to this vlan and is allocated.
-                ip = _publicIpAddressDao.findByIpAndVlanId(ipAlias.getIp4Address(), vlanDbId);
-                if (ip != null && ip.getState() == IpAddress.State.Allocated) {
-                    //check if there any other vlan ranges in the same subnet having free ips
-                    List<VlanVO> vlanRanges = _vlanDao.listVlansByNetworkIdAndGateway(vlanRange.getNetworkId(), vlanRange.getVlanGateway());
-                    //if there is no other vlanrage in this subnet. free the ip and delete the vlan.
-                    if (vlanRanges.size() == 1) {
-                        ipAlias.setState(NicIpAlias.state.revoked);
-                        _nicIpAliasDao.update(ipAlias.getId(), ipAlias);
-                        if (!dhcpServiceProvider.removeDhcpSupportForSubnet(network)) {
-                            s_logger.debug("Failed to delete the vlan range as we could not free the ip used to provide the dhcp service.");
-                            //setting the state back to active
-                            ipAlias.setState(NicIpAlias.state.active);
-                            _nicIpAliasDao.update(ipAlias.getId(), ipAlias);
-                        }
-                        else {
-                            _publicIpAddressDao.unassignIpAddress(ip.getId());
-                            deleteVLANFromDb(vlanDbId);
-                        }
-                    } else {
-                        // if there are more vlans in the subnet, free all the ips in the range except the ip alias.
-                        s_logger.info("vlan Range"+vlanRange.getId()+" id being deleted, one of the Ips in this range is used to provide the dhcp service, will free the rest of the IPs in range.");
-                        _publicIpAddressDao.deletePublicIPRangeExceptAliasIP(vlanDbId, ipAlias.getIp4Address());
-                        VlanVO vlan = _vlanDao.findById(vlanDbId);
-                        vlan.setIpRange(ipAlias.getIp4Address()+"-"+ipAlias.getIp4Address());
-                        _vlanDao.update(vlan.getId(), vlan);
-                    }
-                }
-            }
-        } catch (CloudRuntimeException e) {
-            txn.rollback();
-            throw e;
-        }
+        _publicIpAddressDao.deletePublicIPRange(vlanDbId);
+        _vlanDao.expunge(vlanDbId);
         txn.commit();
+
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/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 db375c3..0fa58be 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -2002,9 +2002,11 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
         if (vmProfile.getType() == Type.User && element.getProvider() != null) {
             if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) &&
                     _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) &&
-                    element instanceof DhcpServiceProvider) {
+                    element instanceof DhcpServiceProvider ) {
                 DhcpServiceProvider sp = (DhcpServiceProvider) element;
-                if (profile.getIp6Address() == null) {
+                Map <Capability, String> dhcpCapabilities = element.getCapabilities().get(Service.Dhcp);
+                String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
+                if ((supportsMultipleSubnets != null || Boolean.valueOf(supportsMultipleSubnets)) && profile.getIp6Address() == null) {
                     if (!sp.configDhcpSupportForSubnet(network, profile, vmProfile, dest, context)) {
                         return false;
                     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/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 ccd23bf..ad437e5 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -1822,11 +1822,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     }
 
 
-
-
-
-
-    protected Map<Capability, String> getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service) {
+    @Override
+    public Map<Capability, String> getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service) {
 
         if (!areServicesSupportedByNetworkOffering(offering.getId(), service)) {
             // TBD: We should be sending networkOfferingId and not the offering object itself.
@@ -2676,8 +2673,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 }
             }
 
-
-
             if (newVnetRangeString != null) {
                for (Pair<Integer,Integer> vnetRange : existingRanges ){
                     value=vnetMap.get(vnetRange.first());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/server/src/com/cloud/network/element/VirtualRouterElement.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 1916678..d26c1e1 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -614,7 +614,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
         capabilities.put(Service.Dns, dnsCapabilities);
 
         capabilities.put(Service.UserData, null);
-        capabilities.put(Service.Dhcp, null);
+
+        Map<Capability, String> dhcpCapabilities = new HashMap<Capability, String>();
+        dhcpCapabilities.put(Capability.DhcpAccrossMultipleSubnets, "true");
+        capabilities.put(Service.Dhcp, dhcpCapabilities);
 
         capabilities.put(Service.Gateway, null);
 
@@ -873,24 +876,18 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
     }
 
     @Override
-    public boolean removeDhcpSupportForSubnet(Network network) {
+    public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException{
         if (canHandle(network, Service.Dhcp)) {
             List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
-           try {
-               if ((routers == null) || (routers.size() == 0)) {
+            if ((routers == null) || (routers.size() == 0)) {
                    throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
-               }
-           }
-           catch (ResourceUnavailableException e) {
-               s_logger.debug("could not find any router on this network");
-           }
+            }
            try {
                 return _routerMgr.removeDhcpSupportForSubnet(network, routers);
            }
            catch (ResourceUnavailableException e) {
                 s_logger.debug("Router resource unavailable ");
            }
-
         }
         return false;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index e437af6..66d904c 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -85,7 +85,7 @@ import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
 import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
 import com.cloud.agent.api.routing.VmDataCommand;
 import com.cloud.agent.api.routing.VpnUsersCfgCommand;
-import com.cloud.agent.api.to.DnsmasqTO;
+import com.cloud.agent.api.to.DhcpTO;
 import com.cloud.agent.api.to.FirewallRuleTO;
 import com.cloud.agent.api.to.IpAddressTO;
 import com.cloud.agent.api.to.LoadBalancerTO;
@@ -141,6 +141,7 @@ import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.NetworkManager;
 import com.cloud.network.NetworkModel;
+import com.cloud.network.NetworkService;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.IsolationType;
 import com.cloud.network.Networks.TrafficType;
@@ -356,6 +357,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
     Site2SiteVpnManager _s2sVpnMgr;
     @Inject
     UserIpv6AddressDao _ipv6Dao;
+    @Inject
+    NetworkService _networkSvc;
 
     
     int _routerRamSize;
@@ -2497,23 +2500,31 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         }
         //Reapply dhcp and dns configuration.
         if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Dhcp, provider)) {
-            List<NicIpAliasVO> revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(guestNetworkId, NicIpAlias.state.revoked);
-            s_logger.debug("Found" + revokedIpAliasVOs.size() + "ip Aliases to revoke on the router as a part of dhcp configuration");
-            List<IpAliasTO> revokedIpAliasTOs = new ArrayList<IpAliasTO>();
-            for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
-                revokedIpAliasTOs.add(new IpAliasTO(revokedAliasVO.getIp4Address(), revokedAliasVO.getNetmask(), revokedAliasVO.getAliasCount().toString()));
-            }
-            List<NicIpAliasVO> aliasVOs = _nicIpAliasDao.listByNetworkIdAndState(guestNetworkId, NicIpAlias.state.active);
-            s_logger.debug("Found" + aliasVOs.size() + "ip Aliases to apply on the router as a part of dhcp configuration");
-            List<IpAliasTO> activeIpAliasTOs = new ArrayList<IpAliasTO>();
-            for (NicIpAliasVO aliasVO : aliasVOs) {
-                   activeIpAliasTOs.add(new IpAliasTO(aliasVO.getIp4Address(), aliasVO.getNetmask(), aliasVO.getAliasCount().toString()));
-            }
-            if (revokedIpAliasTOs.size() != 0 || activeIpAliasTOs.size() != 0){
-                createDeleteIpAliasCommand(router, revokedIpAliasTOs, activeIpAliasTOs, guestNetworkId, cmds);
-                configDnsMasq(router, _networkDao.findById(guestNetworkId), cmds);
+            Map<Network.Capability, String> dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(_networkDao.findById(guestNetworkId).getNetworkOfferingId()), Service.Dhcp);
+            String supportsMultipleSubnets = dhcpCapabilities.get(Network.Capability.DhcpAccrossMultipleSubnets);
+            if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) {
+                List<NicIpAliasVO> revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(guestNetworkId, NicIpAlias.state.revoked);
+                s_logger.debug("Found" + revokedIpAliasVOs.size() + "ip Aliases to revoke on the router as a part of dhcp configuration");
+                removeRevokedIpAliasFromDb(revokedIpAliasVOs);
+
+                List<NicIpAliasVO> aliasVOs = _nicIpAliasDao.listByNetworkIdAndState(guestNetworkId, NicIpAlias.state.active);
+                s_logger.debug("Found" + aliasVOs.size() + "ip Aliases to apply on the router as a part of dhcp configuration");
+                List<IpAliasTO> activeIpAliasTOs = new ArrayList<IpAliasTO>();
+                for (NicIpAliasVO aliasVO : aliasVOs) {
+                    activeIpAliasTOs.add(new IpAliasTO(aliasVO.getIp4Address(), aliasVO.getNetmask(), aliasVO.getAliasCount().toString()));
+                }
+                if (activeIpAliasTOs.size() != 0){
+                    createIpAlias(router, activeIpAliasTOs, guestNetworkId, cmds);
+                    configDnsMasq(router, _networkDao.findById(guestNetworkId), cmds);
+                }
+
             }
+        }
+    }
 
+    private void removeRevokedIpAliasFromDb(List<NicIpAliasVO> revokedIpAliasVOs) {
+        for (NicIpAliasVO ipalias : revokedIpAliasVOs) {
+            _nicIpAliasDao.expunge(ipalias.getId());
         }
     }
 
@@ -2790,9 +2801,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                     router.getState(), DataCenter.class, network.getDataCenterId());
         }
         //check if this is not the primary subnet.
-
-
-        //check if the the ip Alias is configured on the virtualrouter.
         UserVm vm = updatedProfile.getVirtualMachine();
         NicVO domr_guest_nic = _nicDao.findByInstanceIdAndIpAddressAndVmtype(router.getId(), _nicDao.getIpAddress(nic.getNetworkId(), router.getId()), VirtualMachine.Type.DomainRouter);
         //check if the router ip address and the vm ip address belong to same subnet.
@@ -2849,8 +2857,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 boolean result = sendCommandsToRouter(router, cmds);
                 if (result == false) {
                     NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
+                    Transaction txn = Transaction.currentTxn();
+                    txn.start();
                     _nicIpAliasDao.expunge(ipAliasVO.getId());
                     _ipAddressDao.unassignIpAddress(routerPublicIP.getId());
+                    txn.commit();
                     throw new CloudRuntimeException("failed to configure ip alias on the router as a part of dhcp config");
                 }
             }
@@ -2891,10 +2902,13 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             configDnsMasq(router, network, cmds);
             boolean result = sendCommandsToRouter(router, cmds);
             if (result) {
+                Transaction txn= Transaction.currentTxn();
+                txn.start();
                 for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
                     _nicIpAliasDao.expunge(revokedAliasVO.getId());
-                    return true;
                 }
+                txn.commit();
+                return true;
             }
         }
         return  false;
@@ -3461,7 +3475,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         }
         DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
         List<NicIpAliasVO> ipAliasVOList = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.state.active);
-        List<DnsmasqTO> ipList = new ArrayList<DnsmasqTO>();
+        List<DhcpTO> ipList = new ArrayList<DhcpTO>();
 
         NicVO router_guest_nic = _nicDao.findByNtwkIdAndInstanceId(network.getId(), router.getId());
         String cidr = NetUtils.getCidrFromGatewayAndNetmask(router_guest_nic.getGateway(), router_guest_nic.getNetmask());
@@ -3470,22 +3484,25 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         long cidrSize = Long.parseLong(cidrPair[1]);
         String startIpOfSubnet = NetUtils.getIpRangeStartIpFromCidr(cidrAddress, cidrSize);
 
-        ipList.add(new DnsmasqTO(router_guest_nic.getIp4Address(),router_guest_nic.getGateway(),router_guest_nic.getNetmask(), startIpOfSubnet));
+        ipList.add(new DhcpTO(router_guest_nic.getIp4Address(),router_guest_nic.getGateway(),router_guest_nic.getNetmask(), startIpOfSubnet));
         for (NicIpAliasVO ipAliasVO : ipAliasVOList) {
-             DnsmasqTO dnsmasqTO = new DnsmasqTO(ipAliasVO.getIp4Address(), ipAliasVO.getGateway(), ipAliasVO.getNetmask(), ipAliasVO.getStartIpOfSubnet());
+             DhcpTO DhcpTO = new DhcpTO(ipAliasVO.getIp4Address(), ipAliasVO.getGateway(), ipAliasVO.getNetmask(), ipAliasVO.getStartIpOfSubnet());
              if (s_logger.isTraceEnabled()) {
-                 s_logger.trace("configDnsMasq : adding ip {" + dnsmasqTO.getGateway() + ", " + dnsmasqTO.getNetmask() + ", " + dnsmasqTO.getRouterIp() + ", " + dnsmasqTO.getStartIpOfSubnet() + "}");
+                 s_logger.trace("configDnsMasq : adding ip {" + DhcpTO.getGateway() + ", " + DhcpTO.getNetmask() + ", " + DhcpTO.getRouterIp() + ", " + DhcpTO.getStartIpOfSubnet() + "}");
              }
-             ipList.add(dnsmasqTO);
+             ipList.add(DhcpTO);
              ipAliasVO.setVmId(router.getId());
         }
         DataCenterVO dcvo = _dcDao.findById(router.getDataCenterId());
+        boolean dnsProvided = _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, Provider.VirtualRouter);
+        String domain_suffix = dcvo.getDetail(ZoneConfig.DnsSearchOrder.getName());
         DnsMasqConfigCommand dnsMasqConfigCmd = new DnsMasqConfigCommand(network.getNetworkDomain(),ipList, dcvo.getDns1(), dcvo.getDns2(), dcvo.getInternalDns1(), dcvo.getInternalDns2());
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId()));
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(network.getId(), router.getId()));
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
-
+        dnsMasqConfigCmd.setDomainSuffix(domain_suffix);
+        dnsMasqConfigCmd.setIfDnsProvided(dnsProvided);
         cmds.addCommand("dnsMasqConfig" ,dnsMasqConfigCmd);
         //To change body of created methods use File | Settings | File Templates.
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 39d0895..986dd4f 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -27,6 +27,7 @@ import java.util.TreeSet;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
+import com.cloud.configuration.ZoneConfig;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -44,7 +45,7 @@ import com.cloud.agent.api.routing.SetNetworkACLCommand;
 import com.cloud.agent.api.routing.SetSourceNatCommand;
 import com.cloud.agent.api.routing.SetStaticRouteCommand;
 import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
-import com.cloud.agent.api.to.DnsmasqTO;
+import com.cloud.agent.api.to.DhcpTO;
 import com.cloud.agent.api.to.IpAddressTO;
 import com.cloud.agent.api.to.NetworkACLTO;
 import com.cloud.agent.api.to.NicTO;
@@ -885,24 +886,29 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
         }
         VpcVO vpc = _vpcDao.findById(router.getVpcId());
         DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
-        List<DnsmasqTO> ipList = new ArrayList<DnsmasqTO>();
+        List<DhcpTO> ipList = new ArrayList<DhcpTO>();
 
         String cidr = vpc.getCidr();
         String[] cidrPair = cidr.split("\\/");
         String cidrAddress = cidrPair[0];
         long cidrSize = Long.parseLong(cidrPair[1]);
         String startIpOfSubnet = NetUtils.getIpRangeStartIpFromCidr(cidrAddress, cidrSize);
-        DnsmasqTO dnsmasqTO = new DnsmasqTO(router.getPrivateIpAddress(), router.getPublicIpAddress(), NetUtils.getCidrNetmask(cidrSize), startIpOfSubnet);
-        ipList.add(dnsmasqTO);
+        DhcpTO DhcpTO = new DhcpTO(router.getPrivateIpAddress(), router.getPublicIpAddress(), NetUtils.getCidrNetmask(cidrSize), startIpOfSubnet);
+        ipList.add(DhcpTO);
 
+        NicVO nic = _nicDao.findByIp4AddressAndVmId(_routerDao.findById(router.getId()).getPrivateIpAddress(), router.getId());
+        DataCenterVO dcvo = _dcDao.findById(router.getDataCenterId());
+        boolean dnsProvided = _networkModel.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dns, Provider.VirtualRouter);
+        String domain_suffix = dcvo.getDetail(ZoneConfig.DnsSearchOrder.getName());
         DnsMasqConfigCommand dnsMasqConfigCmd = new DnsMasqConfigCommand(vpc.getNetworkDomain(),ipList, dcVo.getDns1(), dcVo.getDns2(), dcVo.getInternalDns1(), dcVo.getInternalDns2());
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId()));
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, router.getPublicIpAddress());
         dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+        dnsMasqConfigCmd.setDomainSuffix(domain_suffix);
+        dnsMasqConfigCmd.setIfDnsProvided(dnsProvided);
 
         cmds.addCommand("dnsMasqConfig" ,dnsMasqConfigCmd);
-        //To change body of created methods use File | Settings | File Templates.
     }
 
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index afdc85d..6fb2379 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -36,6 +36,13 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.network.Networks;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.element.DhcpServiceProvider;
+import com.cloud.vm.dao.NicIpAliasDao;
+import com.cloud.vm.dao.NicIpAliasVO;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
@@ -267,6 +274,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     protected ConfigurationServer _configServer;
     @Inject
     protected ManagementServer _mgmtServer;
+    @Inject
+    protected IPAddressDao _publicIpAddressDao;
+    @Inject
+    protected VlanDao _vlanDao;
+    @Inject
+    protected NicIpAliasDao _nicIpAliasDao;
 
     protected List<DeploymentPlanner> _planners;
     public List<DeploymentPlanner> getPlanners() {
@@ -460,6 +473,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             s_logger.debug("Destroying vm " + vm);
         }
 
+        if (vm.getType() == VirtualMachine.Type.User) {
+              removeDhcpServiceInsubnet(vm);
+        }
+
         VirtualMachineProfile<T> profile = new VirtualMachineProfileImpl<T>(vm);
 
         HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
@@ -517,6 +534,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         return true;
     }
 
+    @DB
+    private void removeDhcpServiceInsubnet(VirtualMachine vm) {
+        //list all the nics which belong to this vm and are the last nics  in the subnets.
+        //we are using the info in these nics to remove the dhcp sercvice for these subnets.
+        List<NicVO> nicList = listLastNicsInSubnet(vm);
+
+        if(nicList != null && nicList.size() != 0) {
+            for (NicVO nic : nicList) {
+                //free the ipalias on the routers corresponding to each of the nics.
+                Network network = _networkDao.findById(nic.getNetworkId());
+                DhcpServiceProvider dhcpServiceProvider = _networkMgr.getDhcpServiceProvider(network);
+                try {
+                    NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(nic.getGateway(), network.getId(), NicIpAlias.state.active);
+                    if (ipAlias != null) {
+                        ipAlias.setState(NicIpAlias.state.revoked);
+                        Transaction txn = Transaction.currentTxn();
+                        txn.start();
+                        _nicIpAliasDao.update(ipAlias.getId(),ipAlias);
+                        IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address());
+                        _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId());
+                        txn.commit();
+                        if (!dhcpServiceProvider.removeDhcpSupportForSubnet(network)) {
+                            s_logger.warn("Failed to remove the ip alias on the router, marking it as removed in db and freed the allocated ip " + ipAlias.getIp4Address());
+                        }
+                    }
+                }
+                catch (ResourceUnavailableException e) {
+                    //failed to remove the dhcpconfig on the router.
+                    s_logger.info ("Unable to delete the ip alias due to unable to contact the virtualrouter.");
+                }
+
+            }
+        }
+    }
+
     @Override
     public boolean start() {
         _executor.scheduleAtFixedRate(new CleanupTask(), _cleanupInterval, _cleanupInterval, TimeUnit.SECONDS);
@@ -1337,6 +1389,28 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         return true;
     }
 
+    //list all the nics which belong to this vm and are the last nics  in the subnets.
+    //we are using the info in these nics to remove the dhcp sercvice for these subnets.
+    private  List<NicVO> listLastNicsInSubnet(VirtualMachine vm) {
+        List<NicVO>  nicList  = _nicsDao.listByVmId(vm.getId());
+        List<NicVO>  copyOfnicList = new ArrayList<NicVO>(nicList);
+        for (NicVO nic : nicList) {
+            Network network = _networkDao.findById(nic.getNetworkId());
+            DhcpServiceProvider dhcpServiceProvider = _networkMgr.getDhcpServiceProvider(network);
+            Map <Network.Capability, String> capabilities = dhcpServiceProvider.getCapabilities().get(Network.Service.Dhcp);
+            String supportsMultipleSubnets = capabilities.get(Network.Capability.DhcpAccrossMultipleSubnets);
+            if ((supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets) && network.getTrafficType() == Networks.TrafficType.Guest && network.getGuestType() == Network.GuestType.Shared)) {
+                //including the ip of the vm and the ipAlias
+                if (_nicsDao.listByNetworkIdTypeAndGatewayAndBroadcastUri(nic.getNetworkId(), VirtualMachine.Type.User, nic.getGateway(), nic.getBroadcastUri()).size() > 1) {
+                    copyOfnicList.remove(nic);
+                }
+            } else {
+                copyOfnicList.remove(nic);
+            }
+        }
+        return copyOfnicList;
+    }
+
     protected boolean checkVmOnHost(VirtualMachine vm, long hostId) throws AgentUnavailableException, OperationTimedoutException {
         CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(hostId, new CheckVirtualMachineCommand(vm.getInstanceName()));
         if (!answer.getResult() || answer.getState() == State.Stopped) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/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 9c7d092..4577d0a 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -908,6 +908,11 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
     }
 
     @Override
+    public Map<Network.Capability, String> getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
     public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc,
             Pod pod, Account caller, String requestedIp)
             throws InsufficientAddressCapacityException {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/server/test/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImplTest.java b/server/test/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImplTest.java
index 04a3601..071f658 100644
--- a/server/test/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImplTest.java
+++ b/server/test/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImplTest.java
@@ -18,11 +18,21 @@
 package com.cloud.network.router;
 
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockingDetails;
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
+import com.cloud.configuration.ZoneConfig;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.vm.VirtualMachine;
 import org.apache.log4j.Logger;
 import org.junit.Assert;
 import org.junit.Before;
@@ -58,7 +68,10 @@ public class VpcVirtualNetworkApplianceManagerImplTest {
     @Mock VpcDao _vpcDao;
     @Mock VirtualRouter router;
     @Mock NicDao _nicDao;
-    @Mock DomainRouterDao _routerDao; 
+    @Mock DomainRouterDao _routerDao;
+    @Mock NetworkModel _networkmodel;
+    @Mock NicVO nicVO;
+    @Mock DataCenterVO dcVO;
 
     @Before
     public void setup() {
@@ -79,20 +92,28 @@ public class VpcVirtualNetworkApplianceManagerImplTest {
         VpcVO vpc = new VpcVO(1L,"bla","bla",1L,1L,1L,"10.0.0.0/8","blieb.net");
         when( _vpcDao.findById(1L)).thenReturn(vpc);
         DataCenterVO dcVo = new DataCenterVO(1L,"dc","dc","8.8.8.8",null,null,null,"10.0.0.0/8","bla.net",new Long(1L),NetworkType.Advanced,null,".net");
-        when( _dcDao.findById(1L) ).thenReturn(dcVo);
+        Map<String, String> map = new HashMap<String, String>();
+        dcVo.setDetails(map);
+        dcVo.setDetail(ZoneConfig.DnsSearchOrder.getName(), "dummy");
+        when(_dcDao.findById(1L)).thenReturn(dcVo);
         DomainRouterVO routerVo = new DomainRouterVO(1L,1L,1L,"brr",1L,HypervisorType.Any,1L,1L,1L,false,0,false,RedundantState.MASTER,false,false,1L);
         when( _routerDao.findById(1L)).thenReturn(routerVo);
 //        when( vpcVirtNetAppMgr.getRouterControlIp(1L)).thenReturn("10.0.0.1");
         when( router.getInstanceName()).thenReturn("r-vm-1");
         when( router.getPublicIpAddress()).thenReturn("11.11.11.11");
-        when( _nicDao.listByVmId(1L)).thenReturn(new ArrayList<NicVO>());
+        NicVO nicvo = new NicVO("server", 1l, 1l, VirtualMachine.Type.DomainRouter);
+        nicvo.setNetworkId(1l);
+        when(_nicDao.findByIp4AddressAndVmId(anyString(), anyLong())).thenReturn(nicvo);
         NetworkManager netMgr = mock(NetworkManager.class);
         vpcVirtNetAppMgr._networkMgr = netMgr;
-
+        vpcVirtNetAppMgr._networkModel = _networkmodel;
+        when(nicVO.getNetworkId()).thenReturn(1l);
+        when(_networkmodel.isProviderSupportServiceInNetwork(1l, Network.Service.Dhcp, Network.Provider.VirtualRouter)).thenReturn(true);
+        when(dcVO.getDetail(anyString())).thenReturn(null);
         Commands cmds = new Commands(OnError.Stop);
 
         vpcVirtNetAppMgr.configDnsMasq(router, cmds);
-        Assert.assertEquals("expected one command",1,cmds.size());
+        Assert.assertEquals("expected one command",1, cmds.size());
         
         DnsMasqConfigCommand cmd = cmds.getCommand(DnsMasqConfigCommand.class);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/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 523dfb8..fd61bc6 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -1382,6 +1382,11 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
         return null;
     }
 
+    @Override
+    public Map<Network.Capability, String> getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
 
     @Override
     public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/utils/conf/db.properties
----------------------------------------------------------------------
diff --git a/utils/conf/db.properties b/utils/conf/db.properties
index e1b5fe9..903cf71 100644
--- a/utils/conf/db.properties
+++ b/utils/conf/db.properties
@@ -25,7 +25,7 @@ region.id=1
 # CloudStack database settings
 db.cloud.username=cloud
 db.cloud.password=cloud
-db.root.password=
+db.root.password=root
 db.cloud.host=localhost
 db.cloud.port=3306
 db.cloud.name=cloud

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d73bb228/utils/src/com/cloud/utils/net/NetUtils.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java
index 68f4965..05b485b 100755
--- a/utils/src/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/com/cloud/utils/net/NetUtils.java
@@ -797,13 +797,20 @@ public class NetUtils {
         return new Pair<String, Integer>(tokens[0], Integer.parseInt(tokens[1]));
     }
 
-    public static int isNetowrkASubsetOrSupersetOfNetworkB (String cidrA, String cidrB) {
+    public  static enum supersetOrSubset {
+        isSuperset,
+        isSubset,
+        neitherSubetNorSuperset,
+        sameSubnet,
+        errorInCidrFormat
+    }
+    public static supersetOrSubset isNetowrkASubsetOrSupersetOfNetworkB (String cidrA, String cidrB) {
         Long[] cidrALong = cidrToLong(cidrA);
         Long[] cidrBLong = cidrToLong(cidrB);
         long shift =0;
         if (cidrALong == null || cidrBLong == null) {
             //implies error in the cidr format
-            return -1;
+            return supersetOrSubset.errorInCidrFormat;
         }
         if (cidrALong[1] >= cidrBLong[1]) {
             shift = 32 - cidrBLong[1];
@@ -815,17 +822,17 @@ public class NetUtils {
         if (result == 0) {
             if (cidrALong[1] < cidrBLong[1]) {
                 //this implies cidrA is super set of cidrB
-                return 1;
+                return supersetOrSubset.isSuperset;
             }
             else if (cidrALong[1] == cidrBLong[1]) {
              //this implies both the cidrs are equal
-                return 3;
+                return supersetOrSubset.sameSubnet;
             }
             // implies cidrA is subset of cidrB
-            return 2;
+            return supersetOrSubset.isSubset;
         }
         //this implies no overlap.
-        return 0;
+        return supersetOrSubset.neitherSubetNorSuperset;
     }
 
     public static boolean isNetworkAWithinNetworkB(String cidrA, String cidrB) {