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 <[email protected]>
Authored: Fri Jan 18 16:04:13 2013 +0530
Committer: Min Chen <[email protected]>
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');

Reply via email to