diff --git a/core/src/com/cloud/domain/dao/DomainDao.java b/core/src/com/cloud/domain/dao/DomainDao.java index 7bbff1624dd..1716755ab1d 100644 --- a/core/src/com/cloud/domain/dao/DomainDao.java +++ b/core/src/com/cloud/domain/dao/DomainDao.java @@ -18,6 +18,8 @@ package com.cloud.domain.dao; +import java.util.List; + import com.cloud.domain.DomainVO; import com.cloud.utils.db.GenericDao; @@ -25,5 +27,6 @@ public interface DomainDao extends GenericDao { public void update(Long id, String domainName); public DomainVO create(DomainVO domain); public DomainVO findDomainByPath(String domainPath); - public boolean isChildDomain(Long parentId, Long childId); + public boolean isChildDomain(Long parentId, Long childId); + List listDomainChildren(long parentDomainId); } diff --git a/core/src/com/cloud/domain/dao/DomainDaoImpl.java b/core/src/com/cloud/domain/dao/DomainDaoImpl.java index b56eb9cb7f6..3ba6cb303d9 100644 --- a/core/src/com/cloud/domain/dao/DomainDaoImpl.java +++ b/core/src/com/cloud/domain/dao/DomainDaoImpl.java @@ -40,7 +40,8 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom protected SearchBuilder DomainNameLikeSearch; protected SearchBuilder ParentDomainNameLikeSearch; - protected SearchBuilder DomainPairSearch; + protected SearchBuilder DomainPairSearch; + protected SearchBuilder ChildDomainsSearch; public DomainDaoImpl () { DomainNameLikeSearch = createSearchBuilder(); @@ -54,7 +55,12 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom DomainPairSearch = createSearchBuilder(); DomainPairSearch.and("id", DomainPairSearch.entity().getId(), SearchCriteria.Op.IN); - DomainPairSearch.done(); + DomainPairSearch.done(); + + ChildDomainsSearch = createSearchBuilder(); + ChildDomainsSearch.and("path", ChildDomainsSearch.entity().getPath(), SearchCriteria.Op.LIKE); + ChildDomainsSearch.and("id", ChildDomainsSearch.entity().getId(), SearchCriteria.Op.NEQ); + ChildDomainsSearch.done(); } public void update(Long id, String domainName) { @@ -218,5 +224,15 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom } } return result; + } + + @Override + public List listDomainChildren(long parentDomainId) { + DomainVO parentDomain = findById(parentDomainId); + SearchCriteria sc = ChildDomainsSearch.create(); + sc.setParameters("path", parentDomain.getPath() + "%"); + //don't include parent domain + sc.setParameters("id", parentDomainId); + return listBy(sc); } } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 007d8bd5246..39e4c6dc954 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -3820,18 +3820,18 @@ public class ManagementServerImpl implements ManagementServer { //if account doesn't have direct ip addresses and there are no direct Zone wide vlans, return virtual service offerings only List accountDirectVlans = new ArrayList(); List zoneDirectVlans = new ArrayList(); - if (accountId != null || zoneId != null) { - if (accountId != null && zoneId != null) { - accountDirectVlans = _vlanDao.listVlansForAccountByType(null, ((Long)accountId).longValue(), VlanType.DirectAttached); - zoneDirectVlans = listZoneWideVlansByType(VlanType.DirectAttached, (Long)zoneId); - } else if (zoneId != null) { - zoneDirectVlans = listZoneWideVlansByType(VlanType.DirectAttached, (Long)zoneId); - } - + if (accountId != null && zoneId != null) { + accountDirectVlans = _vlanDao.listVlansForAccountByType(null, ((Long)accountId).longValue(), VlanType.DirectAttached); + zoneDirectVlans = listZoneWideVlansByType(VlanType.DirectAttached, (Long)zoneId); if (accountDirectVlans.isEmpty() && zoneDirectVlans.isEmpty()) { sc.addAnd("guestIpType", SearchCriteria.Op.EQ, GuestIpType.Virtualized); } - } + } else if (zoneId != null) { + zoneDirectVlans = listZoneWideVlansByType(VlanType.DirectAttached, (Long)zoneId); + if (zoneDirectVlans.isEmpty()) { + sc.addAnd("guestIpType", SearchCriteria.Op.EQ, GuestIpType.Virtualized); + } + } return _offeringsDao.search(sc, searchFilter); @@ -6243,14 +6243,38 @@ public class ManagementServerImpl implements ManagementServer { return success && deleteDomainSuccess; } + @DB public void updateDomain(Long domainId, String domainName) { SearchCriteria sc = _domainDao.createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, domainName); List domains = _domainDao.search(sc, null); + Transaction txn = Transaction.currentTxn(); + + if ((domains == null) || domains.isEmpty()) { - _domainDao.update(domainId, domainName); + txn.start(); DomainVO domain = _domainDao.findById(domainId); + String newName = domainName; + String oldName = domain.getName(); + domain.setName(newName); + _domainDao.update(domainId, domain); + + //update path for parent domain and all domain children + List domainChildren = _domainDao.listDomainChildren(domainId); + domainChildren.add(domain); + + String parentPath = domain.getPath().substring(0, domain.getPath().length() - oldName.length()-1); + + for (DomainVO domainChild : domainChildren) { + String originalPath = domainChild.getPath(); + String resultPath = parentPath + newName + originalPath.substring(parentPath.length() + oldName.length()); + + domainChild.setPath(resultPath); + _domainDao.update(domainChild.getId(), domainChild); + } + saveEvent(new Long(1), domain.getOwner(), EventVO.LEVEL_INFO, EventTypes.EVENT_DOMAIN_UPDATE, "Domain, " + domainName + " was updated"); + txn.commit(); } else { DomainVO domain = _domainDao.findById(domainId); saveEvent(new Long(1), domain.getOwner(), EventVO.LEVEL_ERROR, EventTypes.EVENT_DOMAIN_UPDATE, "Failed to update domain " + domain.getName() + " with name " + domainName + ", name in use.");