diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index ce698854bbe..9365e78ead9 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -215,8 +215,9 @@
-
-
+
+
+
diff --git a/core/src/com/cloud/vm/dao/VMInstanceDao.java b/core/src/com/cloud/vm/dao/VMInstanceDao.java
index 653445ad331..d496a80f4f3 100644
--- a/core/src/com/cloud/vm/dao/VMInstanceDao.java
+++ b/core/src/com/cloud/vm/dao/VMInstanceDao.java
@@ -80,4 +80,5 @@ public interface VMInstanceDao extends GenericDao {
List listByHostIdTypes(long hostid, VirtualMachine.Type... types);
List listUpByHostIdTypes(long hostid, VirtualMachine.Type... types);
+ List listByZoneIdAndType(long zoneId, VirtualMachine.Type type);
}
diff --git a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 3ec6b2a12dc..d625db08bf7 100644
--- a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -51,6 +51,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem
protected final SearchBuilder HostSearch;
protected final SearchBuilder LastHostSearch;
protected final SearchBuilder ZoneSearch;
+ protected final SearchBuilder ZoneVmTypeSearch;
protected final SearchBuilder ZoneTemplateNonExpungedSearch;
protected final SearchBuilder NameLikeSearch;
protected final SearchBuilder StateChangeSearch;
@@ -79,6 +80,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem
ZoneSearch = createSearchBuilder();
ZoneSearch.and("zone", ZoneSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
ZoneSearch.done();
+
+ ZoneVmTypeSearch = createSearchBuilder();
+ ZoneVmTypeSearch.and("zone", ZoneVmTypeSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
+ ZoneVmTypeSearch.and("type", ZoneVmTypeSearch.entity().getType(), SearchCriteria.Op.EQ);
+ ZoneVmTypeSearch.done();
ZoneTemplateNonExpungedSearch = createSearchBuilder();
ZoneTemplateNonExpungedSearch.and("zone", ZoneTemplateNonExpungedSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
@@ -193,6 +199,15 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem
return listActiveBy(sc);
}
+ @Override
+ public List listByZoneIdAndType(long zoneId, VirtualMachine.Type type) {
+ SearchCriteria sc = ZoneVmTypeSearch.create();
+ sc.setParameters("zone", zoneId);
+ sc.setParameters("type", type.toString());
+ return listActiveBy(sc);
+ }
+
+
@Override
public List listNonExpungedByZoneAndTemplate(long zoneId, long templateId) {
SearchCriteria sc = ZoneTemplateNonExpungedSearch.create();
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 047da0d1bef..9978cee29b1 100644
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -57,6 +57,7 @@ import com.cloud.offering.NetworkOffering.GuestIpType;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.SecondaryStorage;
import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.user.AccountVO;
import com.cloud.user.UserVO;
@@ -66,9 +67,14 @@ import com.cloud.utils.component.Inject;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.SecondaryStorageVmVO;
import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.ConsoleProxyDao;
import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.SecondaryStorageVmDao;
import com.cloud.vm.dao.VMInstanceDao;
@Local(value={ConfigurationManager.class})
@@ -91,6 +97,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
@Inject AccountDao _accountDao;
@Inject EventDao _eventDao;
@Inject UserDao _userDao;
+ @Inject ConsoleProxyDao _consoleDao;
+ @Inject SecondaryStorageVmDao _secStorageDao;
public boolean _premium;
@Override
@@ -665,13 +673,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
throw new InvalidParameterValueException("A zone with ID: " + zoneId + " does not exist.");
}
- // If DNS values are being changed, make sure there are no VMs in this zone
- if (dns1 != null || dns2 != null || internalDns1 != null || internalDns2 != null) {
- if (zoneHasVMs(zoneId)) {
- throw new InternalErrorException("The zone is not editable because there are VMs in the zone.");
- }
- }
-
// If the Vnet range is being changed, make sure there are no allocated VNets
if (vnetRange != null) {
if (zoneHasAllocatedVnets(zoneId)) {
@@ -679,22 +680,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
}
}
- //To modify a zone, we need to make sure there are no domr's associated with it
- //1. List all the domain router objs
- //2. Check if any of these has the current data center associated
- //3. If yes, throw exception
- //4, If no, edit
- List allDomainRoutersAvailable = _domrDao.listAll();
-
- for(DomainRouterVO domR : allDomainRoutersAvailable)
- {
- if(domR.getDataCenterId() == zoneId)
- {
- throw new InternalErrorException("The zone is not editable because there are domR's associated with the zone.");
- }
- }
-
- //5. Reached here, hence editable
DataCenterVO zone = _zoneDao.findById(zoneId);
String oldZoneName = zone.getName();
@@ -703,6 +688,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
newZoneName = oldZoneName;
}
+ boolean dnsUpdate = false;
+
+ if(dns1 != null || dns2 != null){
+ dnsUpdate = true;
+ }
+
if (dns1 == null) {
dns1 = zone.getDns1();
}
@@ -742,6 +733,48 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
_zoneDao.addVnet(zone.getId(), begin, end);
}
+ if(dnsUpdate){
+
+ //Update dns for domRs in zone
+
+ List DomainRouters = _domrDao.listByDataCenter(zoneId);
+
+ for(DomainRouterVO domR : DomainRouters)
+ {
+ domR.setDns1(dns1);
+ domR.setDns2(dns2);
+ _domrDao.update(domR.getId(), domR);
+ }
+
+ //Update dns for console proxies in zone
+ List ConsoleProxies = _vmInstanceDao.listByZoneIdAndType(zoneId, VirtualMachine.Type.ConsoleProxy);
+
+ for(VMInstanceVO consoleVm : ConsoleProxies)
+ {
+ ConsoleProxyVO proxy = _consoleDao.findById(consoleVm.getId());
+ if( proxy!= null ){
+ proxy.setDns1(dns1);
+ proxy.setDns2(dns2);
+ _consoleDao.update(proxy.getId(), proxy);
+ }
+ }
+
+ //Update dns for secondary storage Vms in zone
+ List storageVms = _vmInstanceDao.listByZoneIdAndType(zoneId, VirtualMachine.Type.SecondaryStorageVm);
+
+ for(VMInstanceVO storageVm : storageVms)
+ {
+ SecondaryStorageVmVO secStorageVm = _secStorageDao.findById(storageVm.getId());
+ if( secStorageVm!= null ){
+ secStorageVm.setDns1(dns1);
+ secStorageVm.setDns2(dns2);
+ _secStorageDao.update(secStorageVm.getId(), secStorageVm);
+ }
+ }
+
+ }
+
+
saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_EDIT, "Successfully edited zone with name: " + zone.getName() + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "vnetRange=" + vnetRange, "guestCidr=" + guestCidr);
return zone;