CS-15082: don't allow to remove guest network in Basic zone when there are 
non-expunged CPVM/SSVMs using it.


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

Branch: refs/heads/3.0.x
Commit: 4c83520dd1076ea2376cf23a330dd99a7c305138
Parents: ae2b599
Author: Alena Prokharchyk <[email protected]>
Authored: Thu May 24 11:37:28 2012 -0700
Committer: Alena Prokharchyk <[email protected]>
Committed: Thu May 24 11:48:47 2012 -0700

----------------------------------------------------------------------
 .../src/com/cloud/network/NetworkManagerImpl.java  |   11 ++++
 server/src/com/cloud/vm/dao/VMInstanceDao.java     |    5 ++-
 server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java |   40 +++++++++++++--
 3 files changed, 51 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4c83520d/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 3d8054a..7c9b51b 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -3077,6 +3077,17 @@ public class NetworkManagerImpl implements 
NetworkManager, NetworkService, Manag
                 return false;
             }
         }
+        
+        //In Basic zone, make sure that there are no non-removed console 
proxies and SSVMs using the network
+        DataCenter zone = _configMgr.getZone(network.getDataCenterId());
+        if (zone.getNetworkType() == NetworkType.Basic) {
+            List<VMInstanceVO> systemVms = 
_vmDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), 
+                    Type.ConsoleProxy, Type.SecondaryStorageVm);
+            if (systemVms != null && !systemVms.isEmpty()) {
+                s_logger.warn("Can't delete the network, not all 
consoleProxy/secondaryStorage vms are expunged");
+                return false;
+            }
+        }
 
         // Shutdown network first
         shutdownNetwork(networkId, context, false);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4c83520d/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 27c568d..e9a6dae 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDao.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDao.java
@@ -92,5 +92,8 @@ public interface VMInstanceDao extends 
GenericDao<VMInstanceVO, Long>, StateDao<
 
     List<Long> listHostIdsByVmCount(long dcId, Long podId, Long clusterId, 
long accountId);
 
-    Long countRunningByAccount(long accountId);    
+    Long countRunningByAccount(long accountId);
+    
+    List<VMInstanceVO> listNonRemovedVmsByTypeAndNetwork(long networkId, 
VirtualMachine.Type... types);
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4c83520d/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 ea89006..5d4be39 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.component.ComponentLocator;
 import com.cloud.utils.db.Attribute;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.GenericSearchBuilder;
+import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -41,6 +42,8 @@ import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.Event;
@@ -68,16 +71,20 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
     protected final GenericSearchBuilder<VMInstanceVO, Long> 
CountVirtualRoutersByAccount;
     protected GenericSearchBuilder<VMInstanceVO, Long> CountRunningByHost;
     protected GenericSearchBuilder<VMInstanceVO, Long> CountRunningByAccount;
+    protected SearchBuilder<VMInstanceVO> NetworkTypeSearch;
 
     protected final Attribute _updateTimeAttr;
     
-    private static final String ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART1 
= "SELECT host.cluster_id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 1, 
0)) FROM `cloud`.`host` host LEFT JOIN `cloud`.`vm_instance` vm ON host.id = 
vm.host_id WHERE ";
-    private static final String ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART2 
= " AND host.type = 'Routing' GROUP BY host.cluster_id ORDER BY 2 ASC ";
+    private static final String ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART1 
= 
+            "SELECT host.cluster_id, SUM(IF(vm.state='Running' AND 
vm.account_id = ?, 1, 0)) FROM `cloud`.`host` host LEFT JOIN 
`cloud`.`vm_instance` vm ON host.id = vm.host_id WHERE ";
+    private static final String ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART2 
=
+            " AND host.type = 'Routing' GROUP BY host.cluster_id ORDER BY 2 
ASC ";
     
     private static final String ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT = "SELECT 
pod.id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 1, 0)) FROM 
`cloud`.`host_pod_ref` pod LEFT JOIN `cloud`.`vm_instance` vm ON pod.id = 
vm.pod_id WHERE pod.data_center_id = ? " +
                                                                        " GROUP 
BY pod.id ORDER BY 2 ASC ";
     
-    private static final String ORDER_HOSTS_NUMBER_OF_VMS_FOR_ACCOUNT = 
"SELECT host.id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 1, 0)) FROM 
`cloud`.`host` host LEFT JOIN `cloud`.`vm_instance` vm ON host.id = vm.host_id 
WHERE host.data_center_id = ? " +
+    private static final String ORDER_HOSTS_NUMBER_OF_VMS_FOR_ACCOUNT =
+            "SELECT host.id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 
1, 0)) FROM `cloud`.`host` host LEFT JOIN `cloud`.`vm_instance` vm ON host.id = 
vm.host_id WHERE host.data_center_id = ? " +
                                                                            " 
AND host.pod_id = ? AND host.cluster_id = ? AND host.type = 'Routing' " +
                                                                            " 
GROUP BY host.id ORDER BY 2 ASC ";
 
@@ -514,5 +521,30 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
         sc.setParameters("account", accountId);
         sc.setParameters("state", State.Running);
         return customSearch(sc, null).get(0);
-    }    
+    }
+    
+    @Override
+    public List<VMInstanceVO> listNonRemovedVmsByTypeAndNetwork(long 
networkId, VirtualMachine.Type... types) {
+        if (NetworkTypeSearch == null) {
+            NicDao _nicDao = 
ComponentLocator.getLocator("management-server").getDao(NicDao.class);
+            SearchBuilder<NicVO> nicSearch = _nicDao.createSearchBuilder();
+            nicSearch.and("networkId", nicSearch.entity().getNetworkId(), 
SearchCriteria.Op.EQ);
+            nicSearch.and("ip4Address", nicSearch.entity().getIp4Address(), 
SearchCriteria.Op.NNULL);
+
+            NetworkTypeSearch = createSearchBuilder();
+            NetworkTypeSearch.and("types", 
NetworkTypeSearch.entity().getType(), SearchCriteria.Op.IN);
+            NetworkTypeSearch.and("removed", 
NetworkTypeSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
+            NetworkTypeSearch.join("nicSearch", nicSearch, 
NetworkTypeSearch.entity().getId(), 
+                    nicSearch.entity().getInstanceId(), 
JoinBuilder.JoinType.INNER);
+            NetworkTypeSearch.done();
+        }
+
+        SearchCriteria<VMInstanceVO> sc = NetworkTypeSearch.create();
+        if (types != null && types.length != 0) {
+            sc.setParameters("types", (Object[]) types);
+        }        
+        sc.setJoinParameters("nicSearch", "networkId", networkId);
+
+        return listBy(sc);
+    }
 }

Reply via email to