...
https://issues.apache.org/jira/browse/CLOUDSTACK-739
A new branch will be created off master soon for this work. Will update the branch details once started on it.Work is in progress on the affinity_groups branch
As part of cloud orchestration there is always a need for cloud admins and users to be able to judiciously place the VMs to ensure better availability of their service. Cloudstack API ‘deployVirtualMachine’ lets you specify the compute/disk tags to choose a specific compute host/storage during VM placement.
...
User
...
...
Code Block |
---|
public interface AffinityGroupProcessor extends Adapter { /** * process() is called to apply the affinity/anti-affinity rules to the deployment plan and avoid set for ththe given VM placement. * @param vm virtual machine. * @param plan deployment plan that tells you where it's being deployed to. * @param avoid avoid these data centers, pods, clusters, or hosts. */ void process(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, ExcludeList avoid) throws AffinityConflictException; /** * getType() should return the affinity/anti-affinity group being implemented * @return String Affinity/Anti-affinity type */ String getType(); } |
We will provide default implementation of the host affinity rule. This processor will implement the AffinityGroupProcessor adapter.
For the given VM, it will list the other VMs associated to its affinity group and set the same hostId in the DeploymentPlan for placement by the planner.
This has been removed from the FS as per discussions on the mailing list. This usecase has less value and more prone to failures in deployment.
...
For the given VM, it will list the other VMs associated to its affinity group and set the hostIds of these VM’s in the ExcludeList, so that the planner will not place this VM on these hosts.
...
During VM deployment, deployment planners are invoked currently and they apply the algorithms Admins have set to provide better performance/value. But now we need to first consider the user preferences of the VM placement defined using affinity groups and set the correct scope for searching the deployment destination. Then this scope can be passed along to the deployment planners to process.
Thus there is a need of some layer above the deployment planners to orchestrate these deployment stages:
Code Block |
---|
public interface DeploymentPlannerDeploymentPlanningManager extends AdapterManager { /** * plan is called to determine where a virtual machine should be running. Manages vm deployment stages: * First Process Affinity/Anti-affinity - Call the chain of AffinityGroupProcessor adapters to set deploymentplan scope and exclude list * @param vm virtual machine. * @param plan deployment plan that tells you where it's being deployed to Secondly, Call DeploymentPlanner - to use heuristics to find the best spot to place the vm/volume. Planner will drill down to the write set of clusters to look for placement based on various heuristics. * @param avoid avoid these data centers, pods, clusters, or hosts Lastly, Call Allocators - Given a cluster, allocators matches the requirements to capabilities of the physical resource (host, storage pool). * @return DeployDestination for that virtual machine. */ DeployDestination planplanDeployment(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException, AffinityConflictException; …} |
Following are the API additions and changes.
...
This is a new user API to create affinity groups for the account. Parameters include:
a) AccountName
b) DomainId
c) Name - required
d) Type (affinity/anti-affinity) - required
e) Description
ListAffinityGroups API
This is a new user API to list affinity groups.Parameters include:
a) Affinity group Id
b) Affinity group Name
c) VM Id
d) AccountName and DomainId
It does return the details of the affinity group and also the VM Ids that are part of this group.
Code Block |
---|
{ "listaffinitygroupsresponse" : { "count":1 ,"affinitygroup" : [
{"id":"538d0918-2605-42ff-b4ef-2f1e95ac77b1","name":"db","account":"admin","domainid":"24fd1d41-a2fa-11e2-af0a-90004e86b601","domain":"ROOT","virtualmachineIds":["ac5e0006-0d1a-4334-82cf-9a06732c56c0","126318c6-0fcc-4eb7-89ae-0f4790c4145a"]}
] } }
|
} }
DeleteAffinityGroup API
This is a new user API to delete affinity groups. Parameters include:
a) Affinity group Id
b) Affinity group Name
c) VM Id
d) AccountName and DomainId
...
Lists the affinity/ anti-affinity types available in the zone.
a) zoneId
the deployment.
ListVirtualMachines API
The response of this command will include the affinity_groups associated to the VM.
Code Block |
---|
{ "listvirtualmachinesresponse" : { "count":1 ,"virtualmachine" : [ {"id":"2e3e0afd-4b32-428c-835d-72a0cce8cbc1","name":"2e3e0afd-4b32-428c-835d-72a0cce8cbc1","account":"admin","domainid":"6a04ecc4-9bed-11e2-bff6-7010fdc4e018","domain":"ROOT","created":"2013-04-03T14:44:02-0700","state":"Destroyed","haenable":false,"zoneid":"d8ac0a8a-fb57-43c7-8014-3a1f697e68fb","zonename":"lab","templateid":"677cd3ca-9bed-11e2-bff6-7010fdc4e018","templatename":"CentOS 5.6(64-bit) no GUI (XenServer)","templatedisplaytext":"CentOS 5.6(64-bit) no GUI (XenServer)","passwordenabled":false,"serviceofferingid":"adf0cd87-c863-4b79-afda-41f0ee549afa","serviceofferingname":"Medium Instance","cpunumber":1,"cpuspeed":1000,"memory":1024,"guestosid":"67803a82-9bed-11e2-bff6-7010fdc4e018","rootdeviceid":0,"rootdevicetype":"ROOT","securitygroup":[],"nic":[
{"id":"0852d991-0cc5-4397-abe2-9f6bc7fdb8e3","networkid":"3360145c-46a0-44fb-8fca-1cc6e1969c47","networkname":"n1","netmask":"255.255.255.0","gateway":"10.1.1.1","ipaddress":"10.1.1.249","traffictype":"Guest","type":"Isolated","isdefault":true,"macaddress":"02:00:70:b5:00:07"}
],"hypervisor":"XenServer","instancename":"i-2-11-VM","tags":[],*"affinitygroup":[
{"id":"96e30154-ef42-4bc8-a7d4-601e9426fb79","name":"webvms","account":"admin"}
]*,"jobstatus":0} ] } }}
|
Also affinitygroupid parameter is added to listVirtualMachines API to list VMs by affinity group.
As part of this feature following new tables have been added to the cloud schema:
1) `cloud`.`affinity_group` table to hold the groups created
CREATE TABLE `cloud`.`affinity_group` (
`id` bigint unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`uuid` varchar(40),
`description` varchar(4096) NULL,
`domain_id` bigint unsigned NOT NULL,
`account_id` bigint unsigned NOT NULL,
UNIQUE (`name`, `account_id`),
PRIMARY KEY (`id`),
CONSTRAINT `fk_affinity_group__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`),
CONSTRAINT `fk_affinity_group__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`),
CONSTRAINT `uc_affinity_group__uuid` UNIQUE (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2) `cloud`.`affinity_group_vm_map` table to hold the VM and affinity group associations
CREATE TABLE `cloud`.`affinity_group_vm_map` (
`id` bigint unsigned NOT NULL auto_increment,
`affinity_group_id` bigint unsigned NOT NULL,
`instance_id` bigint unsigned NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_agvm__group_id` FOREIGN KEY(`affinity_group_id`) REFERENCES `affinity_group`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
UI/UX Requirements
Appendix A:
Appendix B: