Affinity Manager Plugin
WHAT: In keeping with my previous project (Tag-Automation Plugin, found here), I am releasing the Affinity Manager Plugin, which is a fully tag-driven plugin for Xen Orchestra. It is designed to provide VM placement and grouping controls based on assigned tags, which are managed by predefined tag rules:
PROGRAM FEATURES
Host Affinity (RunOn) Run VMs on specific host group (e.g. a particular data center or set of hosts)
Host Anti-Affinity (NotOn) Keep VMs off of specific host group
VM Keep-Together (KeepTogether) Keep named group of VMs on the same host (follows Leader VM)
VM Separation (KeepApart) Spread named group of VMs across unique hosts (best-effort)
VM TAG SYNTAX
Apply tags to VMs in the XO UI:
VM TAG / RULE
EXAMPLE
MEANING
AM-RunOn_{HostGrpName}
AM-RunOn_P1-DC2-HOST
VM should run on hosts tagged P1-DC2-HOST
AM-NotOn_{HostGrpName}
AM-NotOn_P2-DC1-HOST
VM should NOT run on hosts tagged P2-DC1-HOST
AM-KeepTogether_{GrpName}
AM-KeepTogether_AppStack1
Keep all group VMs on same host (follows Leader VM)
AM-KeepApart_{GrpName}
AM-KeepApart_DBCluster1
Spread group VMs across unique hosts (best effort)
Note: Multiple rules can be combined on a single VM. For example, a VM can have both
AM-RunOn_P1-DC1-HOST and AM-KeepTogether_WebCluster simultaneously.
HOST TAG SYNTAX
Apply tags to hosts in the XO UI (i.e. to define host groups):
EXAMPLE HOST TAG
POOL
LOCATION
P1-DC2-HOST
POOL-1
Data Center 2
P2-DC1-HOST
POOL-2
Data Center 1
Installation
Download the latest airgap release tarball from GitHub:
https://github.com/johnezero/xo-affinity-manager/releases
SCP the tarball to your XOA:
scp xo-affinity-manager-airgap-vX.X.X.tar.gz <xoa-user>@<xoa-ip>:/tmp/
Create the plugin folder:
sudo mkdir -p /usr/local/lib/node_modules/xo-server-affinity-manager
Extract directly into the plugin directory:
sudo tar -xzvf /tmp/xo-affinity-manager-airgap-vX.X.X.tar.gz -C /usr/local/lib/node_modules/xo-server-affinity-manager/ --strip-components=1
Restart xo-server:
sudo systemctl restart xo-server
Verify registration:
sudo journalctl -u xo-server -n 100 --no-pager | grep -A3 "affinity-manager"
You should see:
[INFO] xo-affinity-manager: Plugin factory called -- xo context: YES
[INFO] xo-affinity-manager: Plugin loaded -- waiting for core started.
xo:plugin INFO successfully register affinity-manager
Enable and configure the plugin in XO:
Settings -> Plugins -> affinity-manager -> Enable
CONFIGURATION (XO > Settings > Plugins)
Enforcement Schedule — Run every 15 minutes, hourly, or daily (configurable)
Dry Run Mode — Logs all intended actions without migrating anything (default: ON)
Log Path — Configurable path to the log (Created automatically if it does not exist).
Pool Safety — Cross-pool migration is always blocked (i.e. Plugin only migrates VMs within the same pool)
Log Rotatate — Rotate/compress log files at 10 MB (keeping 3 archives)
LINKS
GitHub: https://github.com/johnezero/xo-tag-automation_plugin
STANDARD DISCLAIMER HERE
This software is provided AS-IS without any express or implied warranty.
While this plugin is being used in a production environment managing live VMs,
you should always review the code and test it in a non-production environment
before full deployment.
Note: The plugin is designed to ONLY take action on VMs with specific predefined tags assigned -- all other VMs are never touched.
Use Dry-Run mode to preview all changes before applying them.
That said, as always - your mileage may vary...
[image: 1788399103619-johnezero-logo-small.png]