Quota Management
Quota management has been completely re-written for ManageIQ Capablanca (CloudForms Management Engine 5.5). Prior to this release, quota management for Cloud Instance, Infrastructure VM, and Service provisioning was handled under the respective /Cloud
, /Infrastructure
, and /Service
Namespaces , but in Capablanca, quota handling has been consolidated under /System/CommonMethods
:
The ManageIQ/System/CommonMethods/QuotaStateMachine/quota
State Machine Instance has the following Field values:
We can see that the processing of quota follows a simple workflow of:
- Determine the quota source
- Determine the quota limits assigned to that source
- Determine the resources currently used by that source
- Determine the new resources requested by the source
- Validate whether the new requested amount would exceed quota
Quota Source
A new concept with the re-implemented quota management mechanism is that of quota source. This is the entity to which the quota is applied, and by default is a Tenant. Tenant quotas can be edited in the WebUI under Configure -> Configuration -> Access Control -> Tenants -> tenant:
The tenant object keeps track of allocated values in virtual columns:
--- virtual columns follow ---
$evm.root['tenant'].allocated_memory = 48318382080 (type: Fixnum)
$evm.root['tenant'].allocated_storage = 498216206336 (type: Fixnum)
$evm.root['tenant'].allocated_vcpu = 23 (type: Fixnum)
$evm.root['tenant'].provisioned_storage = 546534588416 (type: Fixnum)
Alternative Quota Sources
If we wish to use an alternative quota source, we can copy the quota_source
Method to our own domain, and edit it to define $evm.root['quota_source']
and $evm.root['quota_source_type']
as required. A commented-out example shows how to define a group as the quota source, in which case quota handling is handled in the pre-Capablanca way:
# Sample code to enable group as the default quota source.
$evm.root['quota_source'] = @miq_request.requester.current_group
$evm.root['quota_source_type'] = 'group’
When we use an alternative quota source, we can set quota in two ways.
Defining Quota in the State Machine Schema (the Model)
We can set generic warn and max values for each of VM Count, Storage, CPU and Memory, by copying the ManageIQ/System/CommonMethods/QuotaStateMachine/quota
State Machine Instance into our domain, and editing the schema attributes:
Quotas defined in the Model in this way apply to all instances of the quota source (e.g. all Groups)
Defining Quota Using Tags
We can override the default Model attributes by applying tags from one or more of the following tag categories to individual quota source entities (e.g. individual Groups):
Tag Category Name | Tag Category Display Name | Pre-Exists |
---|---|---|
quota_warn_vms | Quota - Warn VMs | No - must be created |
quota_max_vms | Quota - Max VMs | No - must be created |
quota_warn_storage | Quota - Warn Storage | No - must be created |
quota_max_storage | Quota - Max Storage | Yes |
quota_warn_cpu | Quota - Warn CPUs | No - must be created |
quota_max_cpu | Quota - Max CPUs | Yes |
quota_warn_memory | Quota - Warn Memory | No - must be created |
quota_max_memory | Quota - Max Memory | Yes |
For example:
If a Group is tagged in such a way, then any VM or Service Provisioning Request from any Group member is matched against the currently allocated CPUs, memory or storage for the Group.
If quotas are defined in both the Model and using tags, the tagged value takes priority.
Quota Checking During VM Provisioning
The quota checking process for a VM Provision Request is entered as a result of the /System/Policy/MiqProvisionRequest_starting
policy being run from a request_starting event. The policy Instance jumps straight to the quota
State Machine from its rel5 Relationship:
If the Provisioning Request would result in the quota being exceeded, then the Request is rejected, and the requesting User is emailed using the /{Infrastructure,Cloud}/VM/Provisioning/Email/MiqProvisionRequest_Denied
email class.