mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-03 04:12:31 +01:00
VPC: CS-15583 - hostName for the vm should be unique inside the network domain
This commit is contained in:
parent
a3d4ee3d87
commit
47615a26b6
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user