CLOUDSTACK-70: Improve Network Restart Behaviour for Basic Zone: Restarting 
Network Fails
If cleanup=true, removes all VRs and creates VR, implements network.
If cleanup=false, skips running VRs, implements network for stopped/deleted VRs.

Signed-off-by: Rohit Yadav <[email protected]>


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

Branch: refs/heads/4.0
Commit: ecd1ac214c34007214557c4191a803a55ded29f5
Parents: 5a9d7a7
Author: Rohit Yadav <[email protected]>
Authored: Mon Aug 27 16:32:38 2012 +0530
Committer: Murali Reddy <[email protected]>
Committed: Mon Sep 10 14:13:24 2012 +0530

----------------------------------------------------------------------
 .../src/com/cloud/network/NetworkManagerImpl.java  |   54 +++++++++++----
 server/src/com/cloud/vm/dao/DomainRouterDao.java   |    9 ++-
 .../src/com/cloud/vm/dao/DomainRouterDaoImpl.java  |    7 ++
 server/src/com/cloud/vm/dao/VMInstanceDao.java     |    9 ++-
 server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java |   10 +++-
 ui/scripts/network.js                              |   12 +---
 6 files changed, 75 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ecd1ac21/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 292a259..aee9a41 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -68,6 +68,7 @@ import com.cloud.dc.AccountVlanMapVO;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.HostPodVO;
 import com.cloud.dc.Pod;
 import com.cloud.dc.PodVlanMapVO;
 import com.cloud.dc.Vlan;
@@ -77,6 +78,7 @@ import com.cloud.dc.dao.AccountVlanMapDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.PodVlanMapDao;
 import com.cloud.dc.dao.VlanDao;
+import com.cloud.dc.dao.HostPodDao;
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
@@ -202,6 +204,7 @@ import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
@@ -232,6 +235,8 @@ public class NetworkManagerImpl implements NetworkManager, 
NetworkService, Manag
     @Inject
     DataCenterDao _dcDao = null;
     @Inject
+    HostPodDao _podDao = null;
+    @Inject
     VlanDao _vlanDao = null;
     @Inject
     IPAddressDao _ipAddressDao = null;
@@ -240,6 +245,8 @@ public class NetworkManagerImpl implements NetworkManager, 
NetworkService, Manag
     @Inject
     DomainDao _domainDao = null;
     @Inject
+    DomainRouterDao _domainRouterDao = null;
+    @Inject
     UserStatisticsDao _userStatsDao = null;
     @Inject
     EventDao _eventDao = null;
@@ -3807,12 +3814,6 @@ public class NetworkManagerImpl implements 
NetworkManager, NetworkService, Manag
             throw new InvalidParameterValueException("Network is not in the 
right state to be restarted. Correct states are: " + Network.State.Implemented 
+ ", " + Network.State.Setup);
         }
 
-        // don't allow clenaup=true for the network in Basic zone
-        DataCenter zone = _configMgr.getZone(network.getDataCenterId());
-        if (zone.getNetworkType() == NetworkType.Basic && cleanup) {
-            throw new InvalidParameterValueException("Cleanup can't be true 
when restart network in Basic zone");
-        }
-
         _accountMgr.checkAccess(callerAccount, null, true, network);
 
         boolean success = restartNetwork(networkId, callerAccount, callerUser, 
cleanup);
@@ -3857,10 +3858,6 @@ public class NetworkManagerImpl implements 
NetworkManager, NetworkService, Manag
         ReservationContext context = new ReservationContextImpl(null, null, 
callerUser, callerAccount);
 
         if (cleanup) {
-            if (network.getGuestType() != GuestType.Isolated) {
-                s_logger.warn("Only support clean up network for isolated 
network!");
-                return false;
-            }
             // shutdown the network
             s_logger.debug("Shutting down the network id=" + networkId + " as 
a part of network restart");
 
@@ -3873,14 +3870,43 @@ public class NetworkManagerImpl implements 
NetworkManager, NetworkService, Manag
             s_logger.debug("Skip the shutting down of network id=" + 
networkId);
         }
 
-        // implement the network elements and rules again
-        DeployDestination dest = new 
DeployDestination(_dcDao.findById(network.getDataCenterId()), null, null, null);
-
         s_logger.debug("Implementing the network " + network + " elements and 
resources as a part of network restart");
         NetworkOfferingVO offering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
 
         try {
-            implementNetworkElementsAndResources(dest, context, network, 
offering);
+            DataCenter dc = _dcDao.findById(network.getDataCenterId());
+            //Pod based network restart for basic network, one VR per pod
+            if (dc.getNetworkType() == NetworkType.Basic) {
+                //Loop through all pods with running user vms and restart 
network
+                for (HostPodVO pod: _podDao.listByDataCenterId(dc.getId())) {
+                    s_logger.debug("Trying to restart network for Pod: " + 
pod.getName() + ", id=" + pod.getId());
+                    //If cleanup is false, don't implement network on running 
VRs
+                    List<DomainRouterVO> virtualRouters = 
_domainRouterDao.listByPodId(pod.getId());
+                    Boolean podHasSingleVR = (virtualRouters.size() == 1);
+                    if (!podHasSingleVR) {
+                        s_logger.warn("Pod should have only one VR in Basic 
Zone, please check!");
+                    }
+                    if (!cleanup && virtualRouters != null && podHasSingleVR
+                            && virtualRouters.get(0).getState() == 
VirtualMachine.State.Running) {
+                        s_logger.debug("Cleanup=false: Found a running VR, 
skipping network implementation for the pod");
+                        continue;
+                    }
+                    //Implement network only if there are running user vms in 
'pod'
+                    List<VMInstanceVO> vms = _vmDao.listByPodId(pod.getId());
+                    for (VMInstanceVO vm: vms) {
+                        // implement the network elements and rules again
+                        if (vm.getType() == Type.User && vm.getState() == 
VirtualMachine.State.Running) {
+                            DeployDestination dest = new DeployDestination(dc, 
pod, null, null);
+                            implementNetworkElementsAndResources(dest, 
context, network, offering);
+                            break;
+                        }
+                    }
+                }
+            } else {
+                // implement the network elements and rules again
+                DeployDestination dest = new DeployDestination(dc, null, null, 
null);
+                implementNetworkElementsAndResources(dest, context, network, 
offering);
+            }
             setRestartRequired(network, true);
         } catch (Exception ex) {
             s_logger.warn("Failed to implement network " + network + " 
elements and resources as a part of network restart due to ", ex);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ecd1ac21/server/src/com/cloud/vm/dao/DomainRouterDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/DomainRouterDao.java 
b/server/src/com/cloud/vm/dao/DomainRouterDao.java
index 01e3258..d8e8cd8 100755
--- a/server/src/com/cloud/vm/dao/DomainRouterDao.java
+++ b/server/src/com/cloud/vm/dao/DomainRouterDao.java
@@ -61,7 +61,14 @@ public interface DomainRouterDao extends 
GenericDao<DomainRouterVO, Long> {
      */
     public List<DomainRouterVO> listByHostId(Long hostId);
     public List<DomainRouterVO> listByLastHostId(Long hostId);
-    
+
+    /**
+     * virtual machine routers.
+     * @param podId id of the pod.  null if to get all.
+     * @return list of DomainRouterVO
+     */
+    public List<DomainRouterVO> listByPodId(Long podId);
+
     /**
      * list virtual machine routers by host id.
      * pass in null to get all

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ecd1ac21/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java 
b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
index 175d3f2..2948500 100755
--- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
@@ -178,6 +178,13 @@ public class DomainRouterDaoImpl extends 
GenericDaoBase<DomainRouterVO, Long> im
     }
 
     @Override
+    public List<DomainRouterVO> listByPodId(Long podId) {
+        SearchCriteria<DomainRouterVO> sc = AllFieldsSearch.create();
+        sc.setParameters("podId", podId);
+       return listBy(sc);
+    }
+
+    @Override
     public List<DomainRouterVO> listIsolatedByHostId(Long hostId) {
         SearchCriteria<DomainRouterVO> sc = HostUpSearch.create();
         if (hostId != null) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ecd1ac21/server/src/com/cloud/vm/dao/VMInstanceDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/VMInstanceDao.java 
b/server/src/com/cloud/vm/dao/VMInstanceDao.java
index 2cf3d75..9a261aa 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDao.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDao.java
@@ -46,7 +46,14 @@ public interface VMInstanceDao extends 
GenericDao<VMInstanceVO, Long>, StateDao<
         * @return list of VMInstanceVO in the specified zone
         */
        List<VMInstanceVO> listByZoneId(long zoneId);
-       
+
+    /**
+     * List VMs by pod ID
+     * @param podId
+     * @return list of VMInstanceVO in the specified pod
+     */
+    List<VMInstanceVO> listByPodId(long podId);
+
        /**
         * Lists non-expunged VMs by zone ID and templateId
         * @param zoneId

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ecd1ac21/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java 
b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 571b5d1..7f1c5b2 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -127,6 +127,7 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
         AllFieldsSearch.and("lastHost", 
AllFieldsSearch.entity().getLastHostId(), Op.EQ);
         AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), 
Op.EQ);
         AllFieldsSearch.and("zone", 
AllFieldsSearch.entity().getDataCenterIdToDeployIn(), Op.EQ);
+        AllFieldsSearch.and("pod", 
AllFieldsSearch.entity().getPodIdToDeployIn(), Op.EQ);
         AllFieldsSearch.and("type", AllFieldsSearch.entity().getType(), Op.EQ);
         AllFieldsSearch.and("account", 
AllFieldsSearch.entity().getAccountId(), Op.EQ);
         AllFieldsSearch.done();
@@ -230,7 +231,14 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
 
         return listBy(sc);
     }
-    
+
+    @Override
+    public List<VMInstanceVO> listByPodId(long podId) {
+        SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+        sc.setParameters("pod", podId);
+        return listBy(sc);
+    }
+
     @Override
     public List<VMInstanceVO> listByClusterId(long clusterId) {
         SearchCriteria<VMInstanceVO> sc = VMClusterSearch.create();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ecd1ac21/ui/scripts/network.js
----------------------------------------------------------------------
diff --git a/ui/scripts/network.js b/ui/scripts/network.js
index d0f65c4..d239cad 100644
--- a/ui/scripts/network.js
+++ b/ui/scripts/network.js
@@ -604,15 +604,9 @@
                                                                                
        success: function(json){                                                
                                          
                                                                                
          zoneObj = json.listzonesresponse.zone[0];                             
                                                                
                                                                                
        }
-                                                                               
});                                                                             
                                                                                
-                                                                               
if(zoneObj.networktype == "Basic") {                                            
                                                                                
                
-                                                                               
        
args.$form.find('.form-item[rel=cleanup]').find('input').removeAttr('checked'); 
//unchecked
-                                                                               
        args.$form.find('.form-item[rel=cleanup]').hide(); //hidden
-                                                                               
}
-                                                                               
else {                                                                          
                                                                                
                
-                                                                               
        
args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 
'checked'); //checked                                                           
                       
-                                                                               
        args.$form.find('.form-item[rel=cleanup]').css('display', 
'inline-block'); //shown
-                    }                                                          
                        
+                                        });
+                                        
args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 
'checked'); //checked
+                                        
args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block'); 
//shown
                                                                        },
                                                                        fields: 
{
                     cleanup: {

Reply via email to