diff --git a/server/src/com/cloud/configuration/dao/ResourceCountDao.java b/server/src/com/cloud/configuration/dao/ResourceCountDao.java index 482ef2aaf8c..9a5c17fd971 100644 --- a/server/src/com/cloud/configuration/dao/ResourceCountDao.java +++ b/server/src/com/cloud/configuration/dao/ResourceCountDao.java @@ -18,6 +18,7 @@ package com.cloud.configuration.dao; +import java.util.List; import java.util.Set; import com.cloud.configuration.ResourceCount.ResourceType; @@ -80,4 +81,11 @@ public interface ResourceCountDao extends GenericDao { void createResourceCounts(long ownerId, OwnerType ownerType); + List listByDomainId(long domainId); + + List listByAccountId(long accountId); + + List listDomainCounts(); + + List listAccountCounts(); } diff --git a/server/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/server/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java index c31bdaa90df..1e50e3c023d 100644 --- a/server/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java +++ b/server/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java @@ -19,6 +19,7 @@ package com.cloud.configuration.dao; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ejb.Local; @@ -37,26 +38,37 @@ import com.cloud.utils.db.Transaction; @Local(value={ResourceCountDao.class}) public class ResourceCountDaoImpl extends GenericDaoBase implements ResourceCountDao { - private SearchBuilder IdTypeSearch; - private SearchBuilder DomainIdTypeSearch; + private SearchBuilder AccountTypeSearch; + private SearchBuilder DomainTypeSearch; + + private SearchBuilder AccountSearch; + private SearchBuilder DomainSearch; protected final DomainDaoImpl _domainDao = ComponentLocator.inject(DomainDaoImpl.class); public ResourceCountDaoImpl() { - IdTypeSearch = createSearchBuilder(); - IdTypeSearch.and("type", IdTypeSearch.entity().getType(), SearchCriteria.Op.EQ); - IdTypeSearch.and("accountId", IdTypeSearch.entity().getAccountId(), SearchCriteria.Op.EQ); - IdTypeSearch.done(); + AccountTypeSearch = createSearchBuilder(); + AccountTypeSearch.and("type", AccountTypeSearch.entity().getType(), SearchCriteria.Op.EQ); + AccountTypeSearch.and("accountId", AccountTypeSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + AccountTypeSearch.done(); - DomainIdTypeSearch = createSearchBuilder(); - DomainIdTypeSearch.and("type", DomainIdTypeSearch.entity().getType(), SearchCriteria.Op.EQ); - DomainIdTypeSearch.and("domainId", DomainIdTypeSearch.entity().getDomainId(), SearchCriteria.Op.EQ); - DomainIdTypeSearch.done(); + DomainTypeSearch = createSearchBuilder(); + DomainTypeSearch.and("type", DomainTypeSearch.entity().getType(), SearchCriteria.Op.EQ); + DomainTypeSearch.and("domainId", DomainTypeSearch.entity().getDomainId(), SearchCriteria.Op.EQ); + DomainTypeSearch.done(); + + AccountSearch = createSearchBuilder(); + AccountSearch.and("accountId", AccountSearch.entity().getAccountId(), SearchCriteria.Op.NNULL); + AccountSearch.done(); + + DomainSearch = createSearchBuilder(); + DomainSearch.and("domainId", DomainSearch.entity().getDomainId(), SearchCriteria.Op.NNULL); + DomainSearch.done(); } @Override public ResourceCountVO findByAccountIdAndType(long accountId, ResourceType type) { - SearchCriteria sc = IdTypeSearch.create(); + SearchCriteria sc = AccountTypeSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("type", type); @@ -65,7 +77,7 @@ public class ResourceCountDaoImpl extends GenericDaoBase @Override public ResourceCountVO findByDomainIdAndType(long domainId, ResourceType type) { - SearchCriteria sc = DomainIdTypeSearch.create(); + SearchCriteria sc = DomainTypeSearch.create(); sc.setParameters("domainId", domainId); sc.setParameters("type", type); @@ -166,4 +178,34 @@ public class ResourceCountDaoImpl extends GenericDaoBase txn.commit(); } + + @Override + public List listByDomainId(long domainId) { + SearchCriteria sc = DomainTypeSearch.create(); + sc.setParameters("domainId", domainId); + + return listBy(sc); + } + + @Override + public List listByAccountId(long accountId) { + SearchCriteria sc = AccountTypeSearch.create(); + sc.setParameters("accountId", accountId); + + return listBy(sc); + } + + @Override + public List listDomainCounts() { + SearchCriteria sc = DomainSearch.create(); + + return listBy(sc); + } + + @Override + public List listAccountCounts() { + SearchCriteria sc = AccountSearch.create(); + + return listBy(sc); + } } \ No newline at end of file diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 939622cad38..529fbc2376a 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -33,6 +33,7 @@ import java.security.NoSuchAlgorithmException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Properties; @@ -47,6 +48,9 @@ import org.apache.log4j.Logger; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationVO; +import com.cloud.configuration.ResourceCount; +import com.cloud.configuration.ResourceCount.ResourceType; +import com.cloud.configuration.ResourceCountVO; import com.cloud.configuration.ResourceLimit.OwnerType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceCountDao; @@ -250,6 +254,8 @@ public class ConfigurationServerImpl implements ConfigurationServer { txn.commit(); } + updateResourceCount(); + // keystore for SSL/TLS connection updateSSLKeystore(); @@ -980,4 +986,56 @@ public class ConfigurationServerImpl implements ConfigurationServer { txn.commit(); } + private void updateResourceCount() { + ResourceType[] resourceTypes = ResourceCount.ResourceType.values(); + List accounts = _accountDao.listAllIncludingRemoved(); + List domains = _domainDao.listAllIncludingRemoved(); + List domainResourceCount = _resourceCountDao.listDomainCounts(); + List accountResourceCount = _resourceCountDao.listAccountCounts(); + + int resourceCount = resourceTypes.length; + + if ((domainResourceCount.size() < resourceCount * domains.size())) { + s_logger.debug("resource_count table has records missing for some domains...going to insert them"); + for (DomainVO domain : domains) { + List domainCounts = _resourceCountDao.listByDomainId(domain.getId()); + List domainCountStr = new ArrayList(); + for (ResourceCountVO domainCount : domainCounts) { + domainCountStr.add(domainCount.getType().toString()); + } + + if (domainCountStr.size() < resourceCount) { + for (ResourceType resourceType : resourceTypes) { + if (!domainCountStr.contains(resourceType.toString())) { + ResourceCountVO resourceCountVO = new ResourceCountVO(null, domain.getId(), resourceType, 0); + s_logger.debug("Inserting resource count of type " + resourceType + " for domain id=" + domain.getId()); + _resourceCountDao.persist(resourceCountVO); + } + } + } + } + } + + if ((accountResourceCount.size() < resourceTypes.length * accounts.size())) { + s_logger.debug("resource_count table has records missing for some accounts...going to insert them"); + for (AccountVO account : accounts) { + List accountCounts = _resourceCountDao.listByAccountId(account.getId()); + List accountCountStr = new ArrayList(); + for (ResourceCountVO accountCount : accountCounts) { + accountCountStr.add(accountCount.getType().toString()); + } + + if (accountCountStr.size() < resourceCount) { + for (ResourceType resourceType : resourceTypes) { + if (!accountCountStr.contains(resourceType.toString())) { + ResourceCountVO resourceCountVO = new ResourceCountVO(account.getId(), null, resourceType, 0); + s_logger.debug("Inserting resource count of type " + resourceType + " for account id=" + account.getId()); + _resourceCountDao.persist(resourceCountVO); + } + } + } + } + + } + } } diff --git a/server/src/com/cloud/servlet/CloudStartupServlet.java b/server/src/com/cloud/servlet/CloudStartupServlet.java index 4c5a912089f..e69bafe1259 100755 --- a/server/src/com/cloud/servlet/CloudStartupServlet.java +++ b/server/src/com/cloud/servlet/CloudStartupServlet.java @@ -18,6 +18,8 @@ package com.cloud.servlet; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -29,10 +31,6 @@ import com.cloud.server.ConfigurationServer; import com.cloud.server.ManagementServer; import com.cloud.utils.SerialVersionUID; import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.component.SystemIntegrityChecker; - -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; public class CloudStartupServlet extends HttpServlet implements ServletContextListener { public static final Logger s_logger = Logger.getLogger(CloudStartupServlet.class.getName());