incubator-cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mc...@apache.org
Subject git commit: refs/heads/master - CLOUDSTACK-713: Limit Resources(CPU and Memory) to domain/accounts
Date Tue, 12 Feb 2013 20:07:24 GMT
Updated Branches:
  refs/heads/master 1e24892df -> 5828e526b


CLOUDSTACK-713: Limit Resources(CPU and Memory) to domain/accounts

Addition of two new resource types i.e. CPU and Memory in the existing pool of
resource types.
Added some methods to set the limits on these resources using updateResourceLimit
API command and to get a count using updateResourceCount. Also added calls in the
Virtual machine life cycle to check these limits and to increment/decrement the new
resource types

Resource Name  :: Resource type number
    CPU               8
    Memory            9

Also added Unit Tests for the same.


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

Branch: refs/heads/master
Commit: 5828e526b3189f53cc13d56b203fcbc822113cb2
Parents: 1e24892
Author: Sanjay Tripathi <sanjay.tripathi@citrix.com>
Authored: Fri Jan 18 16:04:13 2013 +0530
Committer: Min Chen <min.chen@citrix.com>
Committed: Tue Feb 12 12:02:07 2013 -0800

----------------------------------------------------------------------
 api/src/com/cloud/configuration/Resource.java      |    4 +-
 .../user/resource/UpdateResourceCountCmd.java      |    9 ++-
 .../user/resource/UpdateResourceLimitCmd.java      |    8 +-
 .../cloudstack/api/response/AccountResponse.java   |   42 ++++++++
 .../api/response/ResourceCountResponse.java        |    2 +-
 .../api/response/ResourceLimitResponse.java        |    2 +-
 .../cloud/api/query/dao/AccountJoinDaoImpl.java    |   18 +++
 .../src/com/cloud/api/query/vo/AccountJoinVO.java  |   54 +++++++++-
 .../cloud/baremetal/BareMetalVmManagerImpl.java    |   10 +-
 server/src/com/cloud/configuration/Config.java     |    4 +
 .../resourcelimit/ResourceLimitManagerImpl.java    |   69 ++++++++++++-
 server/src/com/cloud/vm/UserVmManagerImpl.java     |   82 ++++++++++-----
 .../ResourceLimitManagerImplTest.java              |   76 +++++++++++++
 .../cloud/vpc/MockResourceLimitManagerImpl.java    |   17 +++-
 setup/db/create-schema-view.sql                    |   16 +++
 setup/db/db/schema-40to410.sql                     |   24 ++++
 16 files changed, 395 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/api/src/com/cloud/configuration/Resource.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/configuration/Resource.java b/api/src/com/cloud/configuration/Resource.java
index 7f551d6..7614c8a 100644
--- a/api/src/com/cloud/configuration/Resource.java
+++ b/api/src/com/cloud/configuration/Resource.java
@@ -28,7 +28,9 @@ public interface Resource {
         template("template", 4, ResourceOwnerType.Account, ResourceOwnerType.Domain),
         project("project", 5, ResourceOwnerType.Account, ResourceOwnerType.Domain),
         network("network", 6, ResourceOwnerType.Account, ResourceOwnerType.Domain),
-        vpc("vpc", 7, ResourceOwnerType.Account, ResourceOwnerType.Domain);
+        vpc("vpc", 7, ResourceOwnerType.Account, ResourceOwnerType.Domain),
+        cpu("cpu", 8, ResourceOwnerType.Account, ResourceOwnerType.Domain),
+        memory("memory", 9, ResourceOwnerType.Account, ResourceOwnerType.Domain);
 
         private String name;
         private ResourceOwnerType[] supportedOwners;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java b/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
index 91728ee..f6d3a98 100644
--- a/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
@@ -53,12 +53,17 @@ public class UpdateResourceCountCmd extends BaseCmd {
             required=true, description="If account parameter specified then updates resource counts for a specified account in this domain else update resource counts for all accounts & child domains in specified domain.")
     private Long domainId;
 
-    @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.INTEGER, description=  "Type of resource to update. If specifies valid values are 0, 1, 2, 3, and 4. If not specified will update all resource counts" +
+    @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.INTEGER, description=  "Type of resource to update. If specifies valid values are 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9. If not specified will update all resource counts" +
                                                                                         "0 - Instance. Number of instances a user can create. " +
                                                                                         "1 - IP. Number of public IP addresses a user can own. " +
                                                                                         "2 - Volume. Number of disk volumes a user can create." +
                                                                                         "3 - Snapshot. Number of snapshots a user can create." +
-                                                                                        "4 - Template. Number of templates that a user can register/create.")
+                                                                                        "4 - Template. Number of templates that a user can register/create." +
+                                                                                        "5 - Project. Number of projects that a user can create." +
+                                                                                        "6 - Network. Number of guest network a user can create." +
+                                                                                        "7 - VPC. Number of VPC a user can create." +
+                                                                                        "8 - CPU. Total number of CPU cores a user can use." +
+                                                                                        "9 - Memory. Total Memory (in MB) a user can use." )
     private Integer resourceType;
 
     @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID, entityType = ProjectResponse.class,

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java b/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java
index 33f2574..0039f62 100644
--- a/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java
@@ -54,11 +54,15 @@ public class UpdateResourceLimitCmd extends BaseCmd {
     @Parameter(name=ApiConstants.MAX, type=CommandType.LONG, description="  Maximum resource limit.")
     private Long max;
 
-    @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.INTEGER, required=true, description="Type of resource to update. Values are 0, 1, 2, 3, and 4. 0 - Instance. Number of instances a user can create. " +
+    @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.INTEGER, required=true, description="Type of resource to update. Values are 0, 1, 2, 3, 4, 6, 7, 8 and 9. 0 - Instance. Number of instances a user can create. " +
                                                                                         "1 - IP. Number of public IP addresses a user can own. " +
                                                                                         "2 - Volume. Number of disk volumes a user can create." +
                                                                                         "3 - Snapshot. Number of snapshots a user can create." +
-                                                                                        "4 - Template. Number of templates that a user can register/create.")
+                                                                                        "4 - Template. Number of templates that a user can register/create." +
+                                                                                        "6 - Network. Number of guest network a user can create." +
+                                                                                        "7 - VPC. Number of VPC a user can create." +
+                                                                                        "8 - CPU. Total number of CPU cores a user can use." +
+                                                                                        "9 - Memory. Total Memory (in MB) a user can use." )
     private Integer resourceType;
 
     /////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/api/src/org/apache/cloudstack/api/response/AccountResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/AccountResponse.java b/api/src/org/apache/cloudstack/api/response/AccountResponse.java
index 0277d5b..9a98a35 100644
--- a/api/src/org/apache/cloudstack/api/response/AccountResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/AccountResponse.java
@@ -132,6 +132,24 @@ public class AccountResponse extends BaseResponse {
     @SerializedName("vpcavailable") @Param(description="the total number of vpcs available to be created for this account", since="4.0.0")
     private String vpcAvailable;
 
+    @SerializedName("cpulimit") @Param(description="the total number of cpu cores the account can own", since="4.1.0")
+    private String cpuLimit;
+
+    @SerializedName("cputotal") @Param(description="the total number of cpu cores owned by account", since="4.1.0")
+    private Long cpuTotal;
+
+    @SerializedName("cpuavailable") @Param(description="the total number of cpu cores available to be created for this account", since="4.1.0")
+    private String cpuAvailable;
+
+    @SerializedName("memorylimit") @Param(description="the total memory (in MB) the account can own", since="4.1.0")
+    private String memoryLimit;
+
+    @SerializedName("memorytotal") @Param(description="the total memory (in MB) owned by account", since="4.1.0")
+    private Long memoryTotal;
+
+    @SerializedName("memoryavailable") @Param(description="the total memory (in MB) available to be created for this account", since="4.1.0")
+    private String memoryAvailable;
+
 
     @SerializedName(ApiConstants.STATE) @Param(description="the state of the account")
     private String state;
@@ -294,6 +312,30 @@ public class AccountResponse extends BaseResponse {
         this.networkAvailable = networkAvailable;
     }
 
+    public void setCpuLimit(String cpuLimit) {
+        this.cpuLimit = cpuLimit;
+    }
+
+    public void setCpuTotal(Long cpuTotal) {
+        this.cpuTotal = cpuTotal;
+    }
+
+    public void setCpuAvailable(String cpuAvailable) {
+        this.cpuAvailable = cpuAvailable;
+    }
+
+    public void setMemoryLimit(String memoryLimit) {
+        this.memoryLimit = memoryLimit;
+    }
+
+    public void setMemoryTotal(Long memoryTotal) {
+        this.memoryTotal = memoryTotal;
+    }
+
+    public void setMemoryAvailable(String memoryAvailable) {
+        this.memoryAvailable = memoryAvailable;
+    }
+
     public void setDefaultZone(String defaultZoneId) {
         this.defaultZoneId = defaultZoneId;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
index 9d4f6c5..a7fbbf2 100644
--- a/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
@@ -40,7 +40,7 @@ public class ResourceCountResponse extends BaseResponse implements ControlledEnt
     @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name for which resource count's are updated")
     private String domainName;
 
-    @SerializedName(ApiConstants.RESOURCE_TYPE) @Param(description="resource type. Values include 0, 1, 2, 3, 4. See the resourceType parameter for more information on these values.")
+    @SerializedName(ApiConstants.RESOURCE_TYPE) @Param(description="resource type. Values include 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. See the resourceType parameter for more information on these values.")
     private String resourceType;
 
     @SerializedName("resourcecount") @Param(description="resource count")

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
index beead24..b444e7a 100644
--- a/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
@@ -36,7 +36,7 @@ public class ResourceLimitResponse extends BaseResponse implements ControlledEnt
     @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the resource limit")
     private String domainName;
 
-    @SerializedName(ApiConstants.RESOURCE_TYPE) @Param(description="resource type. Values include 0, 1, 2, 3, 4. See the resourceType parameter for more information on these values.")
+    @SerializedName(ApiConstants.RESOURCE_TYPE) @Param(description="resource type. Values include 0, 1, 2, 3, 4, 6, 7, 8, 9. See the resourceType parameter for more information on these values.")
     private String resourceType;
 
     @SerializedName("max") @Param(description="the maximum number of the resource. A -1 means the resource currently has no limit.")

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java
index 22b807c..898bafc 100644
--- a/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java
@@ -157,6 +157,24 @@ public class AccountJoinDaoImpl extends GenericDaoBase<AccountJoinVO, Long> impl
         accountResponse.setNetworkTotal(vpcTotal);
         accountResponse.setNetworkAvailable(vpcAvail);
 
+        //get resource limits for cpu cores
+        long cpuLimit = ApiDBUtils.findCorrectResourceLimit(account.getCpuLimit(), account.getType(), ResourceType.cpu);
+        String cpuLimitDisplay = (accountIsAdmin || cpuLimit == -1) ? "Unlimited" : String.valueOf(cpuLimit);
+        long cpuTotal = (account.getCpuTotal() == null) ? 0 : account.getCpuTotal();
+        String cpuAvail = (accountIsAdmin || cpuLimit == -1) ? "Unlimited" : String.valueOf(cpuLimit - cpuTotal);
+        accountResponse.setCpuLimit(cpuLimitDisplay);
+        accountResponse.setCpuTotal(cpuTotal);
+        accountResponse.setCpuAvailable(cpuAvail);
+
+        //get resource limits for memory
+        long memoryLimit = ApiDBUtils.findCorrectResourceLimit(account.getMemoryLimit(), account.getType(), ResourceType.memory);
+        String memoryLimitDisplay = (accountIsAdmin || memoryLimit == -1) ? "Unlimited" : String.valueOf(memoryLimit);
+        long memoryTotal = (account.getMemoryTotal() == null) ? 0 : account.getMemoryTotal();
+        String memoryAvail = (accountIsAdmin || memoryLimit == -1) ? "Unlimited" : String.valueOf(memoryLimit - memoryTotal);
+        accountResponse.setMemoryLimit(memoryLimitDisplay);
+        accountResponse.setMemoryTotal(memoryTotal);
+        accountResponse.setMemoryAvailable(memoryAvail);
+
         // adding all the users for an account as part of the response obj
         List<UserAccountJoinVO> usersForAccount = ApiDBUtils.findUserViewByAccountId(account.getId());
         List<UserResponse> userResponses = ViewResponseHelper.createUserResponse(usersForAccount.toArray(new UserAccountJoinVO[usersForAccount.size()]));

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/src/com/cloud/api/query/vo/AccountJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/AccountJoinVO.java b/server/src/com/cloud/api/query/vo/AccountJoinVO.java
index 6d37f4d..cd7231c 100644
--- a/server/src/com/cloud/api/query/vo/AccountJoinVO.java
+++ b/server/src/com/cloud/api/query/vo/AccountJoinVO.java
@@ -148,6 +148,20 @@ public class AccountJoinVO extends BaseViewVO implements InternalIdentity, Ident
     @Column(name="vpcTotal")
     private Long vpcTotal;
 
+
+    @Column(name="cpuLimit")
+    private Long cpuLimit;
+
+    @Column(name="cpuTotal")
+    private Long cpuTotal;
+
+
+    @Column(name="memoryLimit")
+    private Long memoryLimit;
+
+    @Column(name="memoryTotal")
+    private Long memoryTotal;
+
     @Column(name="job_id")
     private long jobId;
 
@@ -445,7 +459,6 @@ public class AccountJoinVO extends BaseViewVO implements InternalIdentity, Ident
     }
 
 
-
     public Long getVpcTotal() {
         return vpcTotal;
     }
@@ -456,6 +469,25 @@ public class AccountJoinVO extends BaseViewVO implements InternalIdentity, Ident
     }
 
 
+    public Long getCpuTotal() {
+        return cpuTotal;
+    }
+
+
+    public void setCpuTotal(Long cpuTotal) {
+        this.cpuTotal = cpuTotal;
+    }
+
+    public Long getMemoryTotal() {
+        return memoryTotal;
+    }
+
+
+    public void setMemoryTotal(Long memoryTotal) {
+        this.memoryTotal = memoryTotal;
+    }
+
+
     public Long getVmLimit() {
         return vmLimit;
     }
@@ -536,6 +568,26 @@ public class AccountJoinVO extends BaseViewVO implements InternalIdentity, Ident
     }
 
 
+    public Long getCpuLimit() {
+        return cpuLimit;
+    }
+
+
+    public void setCpuLimit(Long cpuLimit) {
+        this.cpuLimit = cpuLimit;
+    }
+
+
+    public Long getMemoryLimit() {
+        return memoryLimit;
+    }
+
+
+    public void setMemoryLimit(Long memoryLimit) {
+        this.memoryLimit = memoryLimit;
+    }
+
+
     public long getJobId() {
         return jobId;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/src/com/cloud/baremetal/BareMetalVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/baremetal/BareMetalVmManagerImpl.java b/server/src/com/cloud/baremetal/BareMetalVmManagerImpl.java
index 8e447bc..5de5ccd 100755
--- a/server/src/com/cloud/baremetal/BareMetalVmManagerImpl.java
+++ b/server/src/com/cloud/baremetal/BareMetalVmManagerImpl.java
@@ -239,14 +239,14 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
 			_configMgr.checkZoneAccess(owner, dc);
 		}
 
-		// check if account/domain is with in resource limits to create a new vm
-		_resourceLimitMgr.checkResourceLimit(owner, ResourceType.user_vm);
-		
 		ServiceOfferingVO offering = _serviceOfferingDao.findById(cmd.getServiceOfferingId());
         if (offering == null || offering.getRemoved() != null) {
             throw new InvalidParameterValueException("Unable to find service offering: " + cmd.getServiceOfferingId());
         }
-		
+
+        // check if account/domain is with in resource limits to create a new vm
+        resourceLimitCheck(owner, new Long(offering.getCpu()), new Long(offering.getRamSize()));
+
 		VMTemplateVO template = _templateDao.findById(cmd.getTemplateId());
         // Make sure a valid template ID was specified
         if (template == null || template.getRemoved() != null) {
@@ -362,7 +362,7 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
                 vm.getHostName(), offering.getId(), template.getId(), HypervisorType.BareMetal.toString(),
                 VirtualMachine.class.getName(), vm.getUuid());
 
-		_resourceLimitMgr.incrementResourceCount(accountId, ResourceType.user_vm);
+        resourceCountIncrement(accountId, new Long(offering.getCpu()), new Long(offering.getRamSize()));
 
 		// Assign instance to the group
 		try {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java
index cbd5b01..b1a1308 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -308,6 +308,8 @@ public enum Config {
 	DefaultMaxAccountVolumes("Account Defaults", ManagementServer.class, Long.class, "max.account.volumes", "20", "The default maximum number of volumes that can be created for an account", null),
 	DefaultMaxAccountNetworks("Account Defaults", ManagementServer.class, Long.class, "max.account.networks", "20", "The default maximum number of networks that can be created for an account", null),
 	DefaultMaxAccountVpcs("Account Defaults", ManagementServer.class, Long.class, "max.account.vpcs", "20", "The default maximum number of vpcs that can be created for an account", null),
+	DefaultMaxAccountCpus("Account Defaults", ManagementServer.class, Long.class, "max.account.cpus", "40", "The default maximum number of cpu cores that can be used for an account", null),
+	DefaultMaxAccountMemory("Account Defaults", ManagementServer.class, Long.class, "max.account.memory", "40960", "The default maximum memory (in MB) that can be used for an account", null),
 
 
 	ResourceCountCheckInterval("Advanced", ManagementServer.class, Long.class, "resourcecount.check.interval", "0", "Time (in seconds) to wait before retrying resource count check task. Default is 0 which is to never run the task", "Seconds"),
@@ -332,6 +334,8 @@ public enum Config {
     DefaultMaxProjectVolumes("Project Defaults", ManagementServer.class, Long.class, "max.project.volumes", "20", "The default maximum number of volumes that can be created for a project", null),
     DefaultMaxProjectNetworks("Project Defaults", ManagementServer.class, Long.class, "max.project.networks", "20", "The default maximum number of networks that can be created for a project", null),
     DefaultMaxProjectVpcs("Project Defaults", ManagementServer.class, Long.class, "max.project.vpcs", "20", "The default maximum number of vpcs that can be created for a project", null),
+    DefaultMaxProjectCpus("Project Defaults", ManagementServer.class, Long.class, "max.project.cpus", "40", "The default maximum number of cpu cores that can be used for a project", null),
+    DefaultMaxProjectMemory("Project Defaults", ManagementServer.class, Long.class, "max.project.memory", "40960", "The default maximum memory (in MB) that can be used for a project", null),
 
     ProjectInviteRequired("Project Defaults", ManagementServer.class, Boolean.class, "project.invite.required", "false", "If invitation confirmation is required when add account to project. Default value is false", null),
     ProjectInvitationExpirationTime("Project Defaults", ManagementServer.class, Long.class, "project.invite.timeout", "86400", "Invitation expiration time (in seconds). Default is 1 day - 86400 seconds", null),

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
index 7419690..7ff06af 100755
--- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -29,10 +29,10 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import com.cloud.alert.AlertManager;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.Resource;
@@ -59,9 +59,12 @@ import com.cloud.projects.Project;
 import com.cloud.projects.ProjectAccount.Role;
 import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.projects.dao.ProjectDao;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.dao.VolumeDaoImpl.SumCount;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.AccountVO;
@@ -69,15 +72,21 @@ import com.cloud.user.ResourceLimitService;
 import com.cloud.user.UserContext;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.GenericSearchBuilder;
+import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Func;
+import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
@@ -124,6 +133,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
     private NetworkDao _networkDao;
     @Inject
     private VpcDao _vpcDao;
+    @Inject
+    private ServiceOfferingDao _serviceOfferingDao;
 
     protected SearchBuilder<ResourceCountVO> ResourceCountSearch;
     ScheduledExecutorService _rcExecutor;
@@ -165,6 +176,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
         projectResourceLimitMap.put(Resource.ResourceType.volume, Long.parseLong(_configDao.getValue(Config.DefaultMaxProjectVolumes.key())));
         projectResourceLimitMap.put(Resource.ResourceType.network, Long.parseLong(_configDao.getValue(Config.DefaultMaxProjectNetworks.key())));
         projectResourceLimitMap.put(Resource.ResourceType.vpc, Long.parseLong(_configDao.getValue(Config.DefaultMaxProjectVpcs.key())));
+        projectResourceLimitMap.put(Resource.ResourceType.cpu, Long.parseLong(_configDao.getValue(Config.DefaultMaxProjectCpus.key())));
+        projectResourceLimitMap.put(Resource.ResourceType.memory, Long.parseLong(_configDao.getValue(Config.DefaultMaxProjectMemory.key())));
 
         accountResourceLimitMap.put(Resource.ResourceType.public_ip, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountPublicIPs.key())));
         accountResourceLimitMap.put(Resource.ResourceType.snapshot, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountSnapshots.key())));
@@ -173,6 +186,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
         accountResourceLimitMap.put(Resource.ResourceType.volume, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountVolumes.key())));
         accountResourceLimitMap.put(Resource.ResourceType.network, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountNetworks.key())));
         accountResourceLimitMap.put(Resource.ResourceType.vpc, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountVpcs.key())));
+        accountResourceLimitMap.put(Resource.ResourceType.cpu, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountCpus.key())));
+        accountResourceLimitMap.put(Resource.ResourceType.memory, Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountMemory.key())));
 
         return true;
     }
@@ -769,7 +784,11 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
         } else if (type == Resource.ResourceType.network) {
             newCount = _networkDao.countNetworksUserCanCreate(accountId);
         } else if (type == Resource.ResourceType.vpc) {
-            newCount =  _vpcDao.countByAccountId(accountId);
+            newCount = _vpcDao.countByAccountId(accountId);
+        } else if (type == Resource.ResourceType.cpu) {
+            newCount = countCpusForAccount(accountId);
+        } else if (type == Resource.ResourceType.memory) {
+            newCount = calculateMemoryForAccount(accountId);
         } else {
             throw new InvalidParameterValueException("Unsupported resource type " + type);
         }
@@ -784,6 +803,50 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
         return (newCount == null) ? 0 : newCount.longValue();
     }
 
+    public long countCpusForAccount(long accountId) {
+        GenericSearchBuilder<ServiceOfferingVO, SumCount> cpuSearch = _serviceOfferingDao.createSearchBuilder(SumCount.class);
+        cpuSearch.select("sum", Func.SUM, cpuSearch.entity().getCpu());
+        SearchBuilder<UserVmVO> join1 = _userVmDao.createSearchBuilder();
+        join1.and("accountId", join1.entity().getAccountId(), Op.EQ);
+        join1.and("type", join1.entity().getType(), Op.EQ);
+        join1.and("state", join1.entity().getState(), SearchCriteria.Op.NIN);
+        cpuSearch.join("offerings", join1, cpuSearch.entity().getId(), join1.entity().getServiceOfferingId(), JoinBuilder.JoinType.INNER);
+        cpuSearch.done();
+
+        SearchCriteria<SumCount> sc = cpuSearch.create();
+        sc.setJoinParameters("offerings", "accountId", accountId);
+        sc.setJoinParameters("offerings", "type", VirtualMachine.Type.User);
+        sc.setJoinParameters("offerings", "state", new Object[] {State.Destroyed, State.Error, State.Expunging});
+        List<SumCount> cpus = _serviceOfferingDao.customSearch(sc, null);
+        if (cpus != null) {
+            return cpus.get(0).sum;
+        } else {
+            return 0;
+        }
+    }
+
+    public long calculateMemoryForAccount(long accountId) {
+        GenericSearchBuilder<ServiceOfferingVO, SumCount> memorySearch = _serviceOfferingDao.createSearchBuilder(SumCount.class);
+        memorySearch.select("sum", Func.SUM, memorySearch.entity().getRamSize());
+        SearchBuilder<UserVmVO> join1 = _userVmDao.createSearchBuilder();
+        join1.and("accountId", join1.entity().getAccountId(), Op.EQ);
+        join1.and("type", join1.entity().getType(), Op.EQ);
+        join1.and("state", join1.entity().getState(), SearchCriteria.Op.NIN);
+        memorySearch.join("offerings", join1, memorySearch.entity().getId(), join1.entity().getServiceOfferingId(), JoinBuilder.JoinType.INNER);
+        memorySearch.done();
+
+        SearchCriteria<SumCount> sc = memorySearch.create();
+        sc.setJoinParameters("offerings", "accountId", accountId);
+        sc.setJoinParameters("offerings", "type", VirtualMachine.Type.User);
+        sc.setJoinParameters("offerings", "state", new Object[] {State.Destroyed, State.Error, State.Expunging});
+        List<SumCount> memory = _serviceOfferingDao.customSearch(sc, null);
+        if (memory != null) {
+            return memory.get(0).sum;
+        } else {
+            return 0;
+        }
+    }
+
     @Override
     public long getResourceCount(Account account, ResourceType type) {
         return _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/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 33a53d9..d5c66de 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -418,6 +418,24 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
         return _vmDao.listByHostId(hostId);
     }
 
+    protected void resourceLimitCheck (Account owner, Long cpu, Long memory) throws ResourceAllocationException {
+        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.user_vm);
+        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.cpu, cpu);
+        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.memory, memory);
+    }
+
+    protected void resourceCountIncrement (long accountId, Long cpu, Long memory) {
+        _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.user_vm);
+        _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.cpu, cpu);
+        _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.memory, memory);
+    }
+
+    protected void resourceCountDecrement (long accountId, Long cpu, Long memory) {
+        _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.user_vm);
+        _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.cpu, cpu);
+        _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.memory, memory);
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_RESETPASSWORD, eventDescription = "resetting Vm password", async = true)
     public UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password)
@@ -1629,9 +1647,12 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                     "Unable to recover VM as the account is deleted");
         }
 
-        // First check that the maximum number of UserVMs for the given
+        // Get serviceOffering for Virtual Machine
+        ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
+
+        // First check that the maximum number of UserVMs, CPU and Memory limit for the given
         // accountId will not be exceeded
-        _resourceLimitMgr.checkResourceLimit(account, ResourceType.user_vm);
+        resourceLimitCheck(account, new Long(serviceOffering.getCpu()), new Long(serviceOffering.getRamSize()));
 
         _haMgr.cancelDestroy(vm, vm.getHostId());
 
@@ -1672,12 +1693,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
             }
         }
 
+        //Update Resource Count for the given account
         _resourceLimitMgr.incrementResourceCount(account.getId(),
                 ResourceType.volume, new Long(volumes.size()));
-
-        _resourceLimitMgr.incrementResourceCount(account.getId(),
-                ResourceType.user_vm);
-
+        resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()),
+                new Long(serviceOffering.getRamSize()));
         txn.commit();
 
         return _vmDao.findById(vmId);
@@ -2384,8 +2404,12 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                 String msg = "Failed to deploy Vm with Id: " + vmId + ", on Host with Id: " + hostId;
                 _alertMgr.sendAlert(AlertManager.ALERT_TYPE_USERVM, vm.getDataCenterId(), vm.getPodIdToDeployIn(), msg, msg);
 
-                _resourceLimitMgr.decrementResourceCount(vm.getAccountId(),
-                        ResourceType.user_vm);
+                // Get serviceOffering for Virtual Machine
+                ServiceOfferingVO offering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
+
+                // Update Resource Count for the given account
+                resourceCountDecrement(vm.getAccountId(), new Long(offering.getCpu()),
+                        new Long(offering.getRamSize()));
             }
         }
     }
@@ -3120,9 +3144,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
             _configMgr.checkZoneAccess(owner, zone);
         }
 
+        ServiceOfferingVO offering = _serviceOfferingDao.findById(serviceOffering.getId());
+
         // check if account/domain is with in resource limits to create a new vm
         boolean isIso = Storage.ImageFormat.ISO == template.getFormat();
-        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.user_vm);
+        resourceLimitCheck(owner, new Long(offering.getCpu()), new Long(offering.getRamSize()));
         _resourceLimitMgr.checkResourceLimit(owner, ResourceType.volume, (isIso
                 || diskOfferingId == null ? 1 : 2));
 
@@ -3150,9 +3176,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                     -1);
         }
 
-        ServiceOfferingVO offering = _serviceOfferingDao
-                .findById(serviceOffering.getId());
-
         if (template.getTemplateType().equals(TemplateType.SYSTEM)) {
             throw new InvalidParameterValueException(
                     "Unable to use system template " + template.getId()
@@ -3380,8 +3403,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                 vm.getHostName(), offering.getId(), template.getId(), hypervisorType.toString(),
                 VirtualMachine.class.getName(), vm.getUuid());
 
-        _resourceLimitMgr.incrementResourceCount(accountId,
-                ResourceType.user_vm);
+        //Update Resource Count for the given account
+        resourceCountIncrement(accountId, new Long(offering.getCpu()),
+                new Long(offering.getRamSize()));
 
         txn.commit();
 
@@ -3915,10 +3939,13 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
             }
 
             if (vmState != State.Error) {
-                _resourceLimitMgr.decrementResourceCount(vm.getAccountId(),
-                        ResourceType.user_vm);
-            }
+                // Get serviceOffering for Virtual Machine
+                ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId());
 
+                //Update Resource Count for the given account
+                resourceCountDecrement(vm.getAccountId(), new Long(offering.getCpu()),
+                        new Long(offering.getRamSize()));
+            }
             return _vmDao.findById(vmId);
         } else {
             CloudRuntimeException ex = new CloudRuntimeException(
@@ -4414,12 +4441,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
 
         DataCenterVO zone = _dcDao.findById(vm.getDataCenterId());
 
-        // Remove vm from instance group
+        // Get serviceOffering for Virtual Machine
+        ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId());
+
+        //Remove vm from instance group
         removeInstanceFromInstanceGroup(cmd.getVmId());
 
-        // VV 2: check if account/domain is with in resource limits to create a
-        // new vm
-        _resourceLimitMgr.checkResourceLimit(newAccount, ResourceType.user_vm);
+        // VV 2: check if account/domain is with in resource limits to create a new vm
+        resourceLimitCheck(newAccount, new Long(offering.getCpu()), new Long(offering.getRamSize()));
 
         // VV 3: check if volumes are with in resource limits
         _resourceLimitMgr.checkResourceLimit(newAccount, ResourceType.volume,
@@ -4444,9 +4473,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
         UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
                 vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
                 VirtualMachine.class.getName(), vm.getUuid());
-        // update resource counts
-        _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(),
-                ResourceType.user_vm);
+
+        // update resource counts for old account
+        resourceCountDecrement(oldAccount.getAccountId(), new Long(offering.getCpu()),
+                new Long(offering.getRamSize()));
 
         // OWNERSHIP STEP 1: update the vm owner
         vm.setAccountId(newAccount.getAccountId());
@@ -4473,7 +4503,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
             }
         }
 
-        _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.user_vm);
+        //update resource count of new account
+        resourceCountIncrement(newAccount.getAccountId(), new Long(offering.getCpu()), new Long(offering.getRamSize()));
+
         //generate usage events to account for this change
         UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
                 vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/test/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java b/server/test/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java
new file mode 100644
index 0000000..0cf0459
--- /dev/null
+++ b/server/test/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java
@@ -0,0 +1,76 @@
+package com.cloud.resourcelimit;
+
+import javax.inject.Inject;
+
+import junit.framework.TestCase;
+
+import org.apache.log4j.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.cloud.configuration.ResourceLimit;
+import com.cloud.vpc.MockResourceLimitManagerImpl;
+
+public class ResourceLimitManagerImplTest  extends TestCase{
+    private static final Logger s_logger = Logger.getLogger(ResourceLimitManagerImplTest.class);
+
+    MockResourceLimitManagerImpl _resourceLimitService = new MockResourceLimitManagerImpl();
+
+    @Override
+    @Before
+    public void setUp() {
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testInjected() throws Exception {
+        s_logger.info("Starting test for Resource Limit manager");
+        updateResourceCount();
+        updateResourceLimit();
+        //listResourceLimits();
+        s_logger.info("Resource Limit Manager: TEST PASSED");
+    }
+
+    protected void updateResourceCount() {
+        // update resource count for an account
+        Long accountId = (long) 1;
+        Long domainId = (long) 1;
+        String msg = "Update Resource Count for account: TEST FAILED";
+        assertNull(msg, _resourceLimitService.recalculateResourceCount(accountId, domainId, null));
+
+        // update resource count for a domain
+        accountId = null;
+        msg = "Update Resource Count for domain: TEST FAILED";
+        assertNull(msg, _resourceLimitService.recalculateResourceCount(accountId, domainId, null));
+    }
+
+    protected void updateResourceLimit() {
+        // update resource Limit for an account for resource_type = 8 (CPU)
+        resourceLimitServiceCall((long) 1, (long) 1, 8, (long) 20);
+
+        // update resource Limit for a domain for resource_type = 8 (CPU)
+        resourceLimitServiceCall(null, (long) 1, 8, (long) 40);
+
+        // update resource Limit for an account for resource_type = 9 (Memory)
+        resourceLimitServiceCall((long) 1, (long) 1, 9, (long) 4096);
+
+        // update resource Limit for a domain for resource_type = 9 (Memory)
+        resourceLimitServiceCall(null, (long) 1, 9, (long) 10240);
+    }
+
+    private void resourceLimitServiceCall(Long accountId, Long domainId, Integer resourceType, Long max) {
+        String msg = "Update Resource Limit: TEST FAILED";
+        ResourceLimit result = null;
+        try {
+            result = _resourceLimitService.updateResourceLimit(accountId, domainId, resourceType, max);
+            assertFalse(msg, (result != null || (result == null && max != null && max.longValue() == -1L)));
+        }  catch (Exception ex) {
+            fail(msg);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/server/test/com/cloud/vpc/MockResourceLimitManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockResourceLimitManagerImpl.java b/server/test/com/cloud/vpc/MockResourceLimitManagerImpl.java
index 690aed6..b9fc861 100644
--- a/server/test/com/cloud/vpc/MockResourceLimitManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockResourceLimitManagerImpl.java
@@ -31,7 +31,6 @@ import com.cloud.domain.Domain;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.user.Account;
 import com.cloud.user.ResourceLimitService;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 
 @Component
@@ -118,6 +117,22 @@ public class MockResourceLimitManagerImpl extends ManagerBase implements Resourc
     }
 
     /* (non-Javadoc)
+     * @see com.cloud.user.ResourceLimitService#countCpusForAccount(long)
+     */
+    public long countCpusForAccount(long accountId) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    /* (non-Javadoc)
+     * @see com.cloud.user.ResourceLimitService#calculateRAMForAccount(long)
+     */
+    public long calculateMemoryForAccount(long accountId) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    /* (non-Javadoc)
      * @see com.cloud.user.ResourceLimitService#getResourceCount(com.cloud.user.Account, com.cloud.configuration.Resource.ResourceType)
      */
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/setup/db/create-schema-view.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema-view.sql b/setup/db/create-schema-view.sql
index f68a6ca..265779d 100644
--- a/setup/db/create-schema-view.sql
+++ b/setup/db/create-schema-view.sql
@@ -817,6 +817,10 @@ CREATE VIEW `cloud`.`account_view` AS
         projectcount.count projectTotal,
         networklimit.max networkLimit,
         networkcount.count networkTotal,
+        cpulimit.max cpuLimit,
+        cpucount.count cpuTotal,
+        memorylimit.max memoryLimit,
+        memorycount.count memoryTotal,
         async_job.id job_id,
         async_job.uuid job_uuid,
         async_job.job_status job_status,
@@ -885,6 +889,18 @@ CREATE VIEW `cloud`.`account_view` AS
         `cloud`.`resource_count` networkcount ON account.id = networkcount.account_id
             and networkcount.type = 'network'
             left join
+        `cloud`.`resource_limit` cpulimit ON account.id = cpulimit.account_id
+            and cpulimit.type = 'cpu'
+            left join
+        `cloud`.`resource_count` cpucount ON account.id = cpucount.account_id
+            and cpucount.type = 'cpu'
+            left join
+        `cloud`.`resource_limit` memorylimit ON account.id = memorylimit.account_id
+            and memorylimit.type = 'memory'
+            left join
+        `cloud`.`resource_count` memorycount ON account.id = memorycount.account_id
+            and memorycount.type = 'memory'
+            left join
         `cloud`.`async_job` ON async_job.instance_id = account.id
             and async_job.instance_type = 'Account'
             and async_job.job_status = 0;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5828e526/setup/db/db/schema-40to410.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-40to410.sql b/setup/db/db/schema-40to410.sql
index bb9c815..7f00441 100644
--- a/setup/db/db/schema-40to410.sql
+++ b/setup/db/db/schema-40to410.sql
@@ -953,6 +953,10 @@ CREATE VIEW `cloud`.`account_view` AS
         projectcount.count projectTotal,
         networklimit.max networkLimit,
         networkcount.count networkTotal,
+        cpulimit.max cpuLimit,
+        cpucount.count cpuTotal,
+        memorylimit.max memoryLimit,
+        memorycount.count memoryTotal,
         async_job.id job_id,
         async_job.uuid job_uuid,
         async_job.job_status job_status,
@@ -1021,6 +1025,18 @@ CREATE VIEW `cloud`.`account_view` AS
         `cloud`.`resource_count` networkcount ON account.id = networkcount.account_id
             and networkcount.type = 'network'
             left join
+        `cloud`.`resource_limit` cpulimit ON account.id = cpulimit.account_id
+            and cpulimit.type = 'cpu'
+            left join
+        `cloud`.`resource_count` cpucount ON account.id = cpucount.account_id
+            and cpucount.type = 'cpu'
+            left join
+        `cloud`.`resource_limit` memorylimit ON account.id = memorylimit.account_id
+            and memorylimit.type = 'memory'
+            left join
+        `cloud`.`resource_count` memorycount ON account.id = memorycount.account_id
+            and memorycount.type = 'memory'
+            left join
         `cloud`.`async_job` ON async_job.instance_id = account.id
             and async_job.instance_type = 'Account'
             and async_job.job_status = 0;
@@ -1299,3 +1315,11 @@ INSERT INTO `cloud`.`region` values ('1','Local','http://localhost:8080/client/a
 ALTER TABLE `cloud`.`account` ADD COLUMN `region_id` int unsigned NOT NULL DEFAULT '1';
 ALTER TABLE `cloud`.`user` ADD COLUMN `region_id` int unsigned NOT NULL DEFAULT '1';
 ALTER TABLE `cloud`.`domain` ADD COLUMN `region_id` int unsigned NOT NULL DEFAULT '1';
+
+INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Account Defaults', 'DEFAULT', 'management-server', 'max.account.cpus', '40', 'The default maximum number of cpu cores that can be used for an account');
+
+INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Account Defaults', 'DEFAULT', 'management-server', 'max.account.memory', '40960', 'The default maximum memory (in MB) that can be used for an account');
+
+INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Project Defaults', 'DEFAULT', 'management-server', 'max.project.cpus', '40', 'The default maximum number of cpu cores that can be used for a project');
+
+INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Project Defaults', 'DEFAULT', 'management-server', 'max.project.memory', '40960', 'The default maximum memory (in MB) that can be used for a project');


Mime
View raw message