VPC: CS-15583 - hostName for the vm should be unique inside the network domain


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

Branch: refs/heads/vpc
Commit: 47615a26b613473971cd5a8a5cbaccde7c191721
Parents: a3d4ee3
Author: Alena Prokharchyk <[email protected]>
Authored: Mon Jul 16 13:34:25 2012 -0700
Committer: Alena Prokharchyk <[email protected]>
Committed: Mon Jul 16 15:42:47 2012 -0700

----------------------------------------------------------------------
 .../src/com/cloud/network/dao/NetworkDaoImpl.java  |    3 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java     |   31 +++++++++++++-
 server/src/com/cloud/vm/dao/VMInstanceDao.java     |    8 +++
 server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java |   34 ++++++++++++++-
 4 files changed, 73 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/47615a26/server/src/com/cloud/network/dao/NetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java 
b/server/src/com/cloud/network/dao/NetworkDaoImpl.java
index 7664817..d644286 100644
--- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java
@@ -71,8 +71,9 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, 
Long> implements N
     private final GenericSearchBuilder<NetworkVO, Integer> NetworksCount;
     final SearchBuilder<NetworkVO> SourceNATSearch;
     final GenericSearchBuilder<NetworkVO, Long>  CountByZoneAndURI;
+    
+    
     ResourceTagsDaoImpl _tagsDao = 
ComponentLocator.inject(ResourceTagsDaoImpl.class);
-
     NetworkAccountDaoImpl _accountsDao = 
ComponentLocator.inject(NetworkAccountDaoImpl.class);
     NetworkDomainDaoImpl _domainsDao = 
ComponentLocator.inject(NetworkDomainDaoImpl.class);
     NetworkOpDaoImpl _opDao = ComponentLocator.inject(NetworkOpDaoImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/47615a26/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 917e3e6..b57ac15 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -2403,14 +2403,43 @@ public class UserVmManagerImpl implements 
UserVmManager, UserVmService, Manager
         String instanceName = VirtualMachineName.getVmName(id, owner.getId(), 
_instance);
         
         String uuidName = UUID.randomUUID().toString();
+        
+        //verify hostname information
         if (hostName == null) {
             hostName = uuidName;
         } else {
-            // verify hostName (hostname doesn't have to be unique)
+            //1) check is hostName is RFC complient
             if (!NetUtils.verifyDomainNameLabel(hostName, true)) {
                 throw new InvalidParameterValueException("Invalid name. Vm 
name can contain ASCII letters 'a' through 'z', the digits '0' through '9', "
                         + "and the hyphen ('-'), must be between 1 and 63 
characters long, and can't start or end with \"-\" and can't start with digit");
             }
+            //2) hostName has to be unique in the network domain
+            Map<String, List<Long>> ntwkDomains = new HashMap<String, 
List<Long>>();
+            for (NetworkVO network : networkList) {
+                String ntwkDomain = network.getNetworkDomain();
+                if (!ntwkDomains.containsKey(ntwkDomain)) {
+                    List<Long> ntwkIds = new ArrayList<Long>();
+                    ntwkIds.add(network.getId());
+                    ntwkDomains.put(ntwkDomain, ntwkIds);
+                } else {
+                    List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
+                    ntwkIds.add(network.getId());
+                    ntwkDomains.put(ntwkDomain, ntwkIds);
+                }
+            } 
+            
+            for (String ntwkDomain : ntwkDomains.keySet()) {
+                for (Long ntwkId : ntwkDomains.get(ntwkDomain)) {
+                  //* get all vms hostNames in the network
+                    List<String> hostNames = 
_vmInstanceDao.listDistinctHostNames(ntwkId);
+                    //* verify that there are no duplicates
+                    if (hostNames.contains(hostName)) {
+                        throw new InvalidParameterValueException("The vm with 
hostName " + hostName
+                                + " already exists in the network domain: " + 
ntwkDomain + "; network=" 
+                                + _networkMgr.getNetwork(ntwkId));
+                    }
+                }
+            }
         }
 
         HypervisorType hypervisorType = null;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/47615a26/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 3aebba4..2cf3d75 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDao.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDao.java
@@ -26,6 +26,7 @@ import com.cloud.utils.fsm.StateDao;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VirtualMachine.Type;
 
 
 /*
@@ -100,4 +101,11 @@ public interface VMInstanceDao extends 
GenericDao<VMInstanceVO, Long>, StateDao<
     
     List<VMInstanceVO> listNonRemovedVmsByTypeAndNetwork(long networkId, 
VirtualMachine.Type... types);
 
+    /**
+     * @param networkId
+     * @param types
+     * @return
+     */
+    List<String> listDistinctHostNames(long networkId, VirtualMachine.Type... 
types);
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/47615a26/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 8de2f94..db4ab16 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -78,7 +78,10 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
     protected GenericSearchBuilder<VMInstanceVO, Long> CountRunningByHost;
     protected GenericSearchBuilder<VMInstanceVO, Long> CountRunningByAccount;
     protected SearchBuilder<VMInstanceVO> NetworkTypeSearch;
+    protected GenericSearchBuilder<VMInstanceVO, String> 
DistinctHostNameSearch;
+    
     ResourceTagsDaoImpl _tagsDao = 
ComponentLocator.inject(ResourceTagsDaoImpl.class);
+    NicDao _nicDao = ComponentLocator.inject(NicDaoImpl.class);
 
     protected final Attribute _updateTimeAttr;
     
@@ -98,6 +101,7 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
     protected final HostDaoImpl _hostDao = 
ComponentLocator.inject(HostDaoImpl.class);
     
     protected VMInstanceDaoImpl() {
+
         IdStatesSearch = createSearchBuilder();
         IdStatesSearch.and("id", IdStatesSearch.entity().getId(), Op.EQ);
         IdStatesSearch.and("states", IdStatesSearch.entity().getState(), 
Op.IN);
@@ -533,7 +537,7 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
     @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);
 
@@ -554,6 +558,34 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
         return listBy(sc);
     }
     
+    
+    
+    @Override
+    public List<String> listDistinctHostNames(long networkId, 
VirtualMachine.Type... types) {
+        if (DistinctHostNameSearch == null) {
+            
+            SearchBuilder<NicVO> nicSearch = _nicDao.createSearchBuilder();
+            nicSearch.and("networkId", nicSearch.entity().getNetworkId(), 
SearchCriteria.Op.EQ);
+
+            DistinctHostNameSearch = createSearchBuilder(String.class);
+            
DistinctHostNameSearch.selectField(DistinctHostNameSearch.entity().getHostName());
+            
+            DistinctHostNameSearch.and("types", 
DistinctHostNameSearch.entity().getType(), SearchCriteria.Op.IN);
+            DistinctHostNameSearch.and("removed", 
DistinctHostNameSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
+            DistinctHostNameSearch.join("nicSearch", nicSearch, 
DistinctHostNameSearch.entity().getId(), 
+                    nicSearch.entity().getInstanceId(), 
JoinBuilder.JoinType.INNER);
+            DistinctHostNameSearch.done();
+        }
+
+        SearchCriteria<String> sc = DistinctHostNameSearch.create();
+        if (types != null && types.length != 0) {
+            sc.setParameters("types", (Object[]) types);
+        }        
+        sc.setJoinParameters("nicSearch", "networkId", networkId);
+
+        return  customSearch(sc, null);
+    }
+    
     @Override
     @DB
     public boolean remove(Long id) {

Reply via email to