[pve-devel] [RFC common/cluster/ha-manager/docs/manager v2 00/40] HA colocation rules

Daniel Kral d.kral at proxmox.com
Fri Jun 20 16:31:08 CEST 2025


This is a follow-up to the previous RFC patch series for the HA
colocation rules feature, which allow users to specify colocation rules
(or affinity/anti-affinity) for the HA Manager, so that two or more
services are either kept together or apart with respect to each other.


Changelog
---------

I've added per-patch changelogs for patches that have been changed, but
here's a better overview about the overall changes since the RFC:

- rebased to master and formatted with proxmox-{perltidy,biome}

- implemented the API/CLI endpoints and web interface integration for HA
  rules

- added user-facing documentation about HA rules

- implemented HA location rules as semantically equivalent replacements
  to HA groups (with the addition that the 'nofailback' flag was moved
  to HA services as an inverted 'failback' to remove the double negation)

- implemented a "use-location-rules" feature flag in the datacenter
  config to allow users to upgrade to the feature on their own

- dropped the 'loose' colocation rules for now, as these can be a
  separate feature and it's unsure how these should act without user
  feedback (there are a few special cases where non-strict colocation
  rules could result in cycles or infinite back-and-forward migrations;
  these should be easy to resolve with some introduced state, but that
  would put unnecessary complexity in an initial implementation); i have
  them implemented in a separate tree with not a lot of changes in
  between these patches here, so they are easy to rebase as a follow-up
  patch series

- moved global rule checkers to the base rules plugin and made them
  more modular and aware of their own plugin-specific rule set

- fixed a race condition where positively colocated services are split
  and stay on multiple nodes (e.g. when the rule has been newly added
  and the services are on different nodes) -> selects the node where
  most of the pos. colocated service are now

- made the HA manager aware of the positive and negative colocations
  when migrating, i.e., migrating other pos. colocated service with the
  to-be-migrated service and blocking if a service is migrated to a node
  where a neg. colocated service already is

- refactored the select_service_node(...) subroutine a bit to have less
  arguments


TODO
----

There are some things left to be done or discussed for a proper patch
series:

- Implement check which does not allow negative colocation rules with
  more services than nodes, because these cannot be applied. Or should
  we just fail the remaining services which cannot be separated to any
  node since these do not have anywhere to go?

- How can the migration process from HA groups to HA location rules be
  improved? Add a 'Migrate' button to the HA Groups page and then
  auto-toggle the use-location-rules feature flag? Should the
  use-location-rules feature flag even be user-toggleable?

- Add web interface and/or CLI facing messages about the HA service
  migration blockers and side-effects. The rough idea would be like the
  following (feedback highly appreciated!):

    - For the web interface, I'd make these visible through the already
      existing precondition checks (which need to also be added for
      containers, as there is no existing API endpoint there).
      Side-effects would be 'warning' items, which just state that some
      positively colocated service is migrated with them (the 'Migrate'
      button then is the confirmation for that). Blockers would be
      'error' items, which state that a negatively colocated service is
      on the requested target node and therefore the migration is
      blocked because of that.

    - For bulk migrations in the web interface, these are still visible
      through the console that is popped up afterwards, which should
      print the messages from the migrate/relocate crm-command API
      endpoints.

    - For the CLI, I'd add another 'force' flag or something similar. If
      there are side-effects and the force flag is not set, then no
      migration happens at all, but the user gets a list of the
      migrations that will be done and should confirm by making another
      call to 'migrate'/'relocate' with the force flag set to confirm
      these choices.

- Add more user documentation (especially about conflicts, migrations,
  restrictions and failover scenario handling)

- Add mixed test cases with HA location and HA colocation rules



------

Below is the updated initial cover letter of the first RFC.

------


I chose the name "colocation" in favor of affinity/anti-affinity, since
it is a bit more concise that it is about co-locating services between
each other in contrast to locating services on nodes, but no hard
feelings to change it (same for any other names in this series).

Many thanks to @Thomas, @Fiona, @Friedrich, @Fabian, @Lukas and @Hannes
Duerr for the discussions about this feature off-list!


Recap: HA groups
----------------

The HA Manager currently allows a service to be assigned to one HA
groups, which essentially implements an affinity to a set of nodes. This
affinity can either be unrestricted or restricted, where the first
allows recovery to nodes outside of the HA group's nodes, if those are
currently unavailable.

This allows users to constrain the set of nodes, that can be selected
from as the starting and/or recovery node. Furthermore, each node in a
HA group can have an individual priority. This further constraints the
set of possible recovery nodes to the subset of online nodes in the
highest priority group.


Introduction
------------

Colocation is the concept of an inter-service affinity relationship,
which can either be positive (keep services together) or negative (keep
services apart). This is in contrast with the service-nodes affinity
relationship implemented by HA groups.


Motivation
----------

There are many different use cases to support colocation, but two simple
examples that come to mind are:

- Two or more services need to communicate with each other very
  frequently. To reduce the communication path length and therefore
  hopefully the latency, keep them together on one node.

- Two or more services need a lot of computational resources and will
  therefore consume much of the assigned node's resource capacity. To
  reduce starving and memory stalls, keep them separate on multiple
  nodes, so that they have enough resources for themselves.

And some more concrete use cases from current HA Manager users:

- "For example: let's say we have three DB VMs (DB nodes in a cluster)
  which we want to run on ANY PVE host, but we don't want them to be on
  the same host." [1]

- "An example is: When Server from the DMZ zone start on the same host
  like the firewall or another example the application servers start on
  the same host like the sql server. Services they depend on each other
  have short latency to each other." [2]


HA Rules
--------

To implement colocation, this patch series introduces HA rules, which
allows users to specify the colocation requirements on services. These
are implemented with the widely used section config, where each type of
rule is a individual plugin (for now 'location' and 'colocation').

This introduces some small initial complexity for testing satisfiability
of the rules, but allows the constraint interface to be extensible, and
hopefully allow easier reasoning about the node selection process with
the added constraint rules in the future.

Colocation Rules
----------------

The two properties of colocation rules, as described in the
introduction, are rather straightforward. A typical colocation rule
inside of the config would look like the following:

colocation: some-lonely-services
	services vm:101,vm:103,ct:909
	affinity separate

This means that the three services vm:101, vm:103 and ct:909 must be
kept separate on different nodes. I'm very keen on naming suggestions
since I think there could be a better word than 'affinity' here. I
played around with 'keep-services', since then it would always read
something like 'keep-services separate', which is very declarative, but
this might suggest that this is a binary option to too much users (I
mean it is, but not with the values 0 and 1).

Feasibility and Inference
-------------------------

Since rules allow more complexity, it is necessary to check whether
rules are (1) feasible and (2) can be simplified, so that as many HA
rules can still be applied as are feasible.

| Feasibility
----------

The feasibility checks are implemented in PVE::HA::Rules::Location,
PVE::HA::Rules::Colocation, and PVE::HA::Rules, where the latter handles
global checks in between rule types.

| Canonicalization
----------

Additionally, colocation rules are currently simplified as follows:

- If there are multiple positive colocation rules with common services
  and the same strictness, these are merged to a single positive
  colocation rule (so it is easier to check which services are
  positively colocated with a service).

This is implemented in PVE::HA::Rules::Colocation::plugin_canonicalize.


Special negative colocation scenarios
-------------------------------------

Just to be aware of these, there's a distinction between the following
two sets of negative colocation rules:

colocation: separate-vms
	services vm:101,vm:102,vm:103
	affinity separate

and

colocation: separate-vms1
	services vm:101,vm:102
	affinity separate

colocation: separate-vms2
	services vm:102,vm:103
	affinity separate

The first keeps all three services separate from each other, while the
second only keeps pair-wise services separate from each other, but
vm:101 and vm:103 might be migrated to the same node.


Additional and/or future ideas
------------------------------

- Make recomputing the online node usage more granular.

- Add information of overall free node resources to improve decision
  heuristic when recovering services to nodes.

- Implementing non-strict colocation rules, e.g., which won't fail but
  ignore the rule (for a timeout?, until migrated by the user?), only
  considering the $target node while migrating, etc.

- When deciding the recovery node for positively colocated services,
  account for the needed resources of all to-be-migrated services rather
  than just the first one. This is a non-trivial problem as we currently
  solve this as a online bin covering problem, i.e. selecting for each
  service alone instead of selecting for all services together.

- Ignore migrations to nodes where the service may not be according to
  their location rules / HA group nodes.

- Dynamic colocation rule health statistics (e.g. warn on the
  satisfiability of a colocation rule), e.g. in the WebGUI and/or API.

- Property for mandatory colocation rules to specify whether all
  services should be stopped if the rule cannot be satisfied.

[1] https://bugzilla.proxmox.com/show_bug.cgi?id=5260
[2] https://bugzilla.proxmox.com/show_bug.cgi?id=5332

common:

Daniel Kral (1):
  introduce HashTools module

 src/Makefile         |   1 +
 src/PVE/HashTools.pm | 101 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 102 insertions(+)
 create mode 100644 src/PVE/HashTools.pm


base-commit: 6025a6360da7d502a14e354b23424709e29e62a7
prerequisite-patch-id: e6294c0998ea96878718cfd190f323f2e8003d88
prerequisite-patch-id: e4814efeefd103c81808b9e0a94fa984a7be48f7
prerequisite-patch-id: 537e0aa745edc574e9e6285965442084960b4baf

cluster:

Daniel Kral (3):
  cfs: add 'ha/rules.cfg' to observed files
  datacenter config: make pve-ha-shutdown-policy optional
  datacenter config: introduce feature flag for location rules

 src/PVE/Cluster.pm          | 1 +
 src/PVE/DataCenterConfig.pm | 7 +++++++
 src/pmxcfs/status.c         | 1 +
 3 files changed, 9 insertions(+)


ha-manager:

Daniel Kral (26):
  tree-wide: make arguments for select_service_node explicit
  manager: improve signature of select_service_node
  introduce rules base plugin
  rules: introduce location rule plugin
  rules: introduce colocation rule plugin
  rules: add global checks between location and colocation rules
  config, env, hw: add rules read and parse methods
  manager: read and update rules config
  test: ha tester: add test cases for future location rules
  resources: introduce failback property in service config
  manager: migrate ha groups to location rules in-memory
  manager: apply location rules when selecting service nodes
  usage: add information about a service's assigned nodes
  manager: apply colocation rules when selecting service nodes
  manager: handle migrations for colocated services
  sim: resources: add option to limit start and migrate tries to node
  test: ha tester: add test cases for strict negative colocation rules
  test: ha tester: add test cases for strict positive colocation rules
  test: ha tester: add test cases in more complex scenarios
  test: add test cases for rules config
  manager: handle negative colocations with too many services
  config: prune services from rules if services are deleted from config
  api: introduce ha rules api endpoints
  cli: expose ha rules api endpoints to ha-manager cli
  api: groups, services: assert use-location-rules feature flag
  api: services: check for colocations for service motions

 .gitignore                                    |   1 +
 debian/pve-ha-manager.install                 |   4 +
 src/PVE/API2/HA/Groups.pm                     |  20 +
 src/PVE/API2/HA/Makefile                      |   2 +-
 src/PVE/API2/HA/Resources.pm                  | 108 ++-
 src/PVE/API2/HA/Rules.pm                      | 409 +++++++++++
 src/PVE/API2/HA/Status.pm                     |   6 +-
 src/PVE/CLI/ha_manager.pm                     |  70 +-
 src/PVE/HA/Config.pm                          | 119 +++-
 src/PVE/HA/Env.pm                             |   6 +
 src/PVE/HA/Env/PVE2.pm                        |  14 +
 src/PVE/HA/Groups.pm                          |  48 ++
 src/PVE/HA/Makefile                           |   3 +-
 src/PVE/HA/Manager.pm                         | 257 ++++---
 src/PVE/HA/Resources.pm                       |   9 +
 src/PVE/HA/Resources/PVECT.pm                 |   1 +
 src/PVE/HA/Resources/PVEVM.pm                 |   1 +
 src/PVE/HA/Rules.pm                           | 661 ++++++++++++++++++
 src/PVE/HA/Rules/Colocation.pm                | 488 +++++++++++++
 src/PVE/HA/Rules/Location.pm                  | 302 ++++++++
 src/PVE/HA/Rules/Makefile                     |   6 +
 src/PVE/HA/Sim/Env.pm                         |  16 +
 src/PVE/HA/Sim/Hardware.pm                    |  22 +
 src/PVE/HA/Sim/Resources/VirtFail.pm          |  29 +-
 src/PVE/HA/Tools.pm                           |  46 ++
 src/PVE/HA/Usage.pm                           |  18 +
 src/PVE/HA/Usage/Basic.pm                     |  19 +
 src/PVE/HA/Usage/Static.pm                    |  19 +
 src/test/Makefile                             |   4 +-
 .../defaults-for-colocation-rules.cfg         |  10 +
 .../defaults-for-colocation-rules.cfg.expect  |  29 +
 .../defaults-for-location-rules.cfg           |  16 +
 .../defaults-for-location-rules.cfg.expect    |  49 ++
 .../duplicate-service-in-location-rules.cfg   |  31 +
 ...icate-service-in-location-rules.cfg.expect |  66 ++
 .../inconsistent-colocation-rules.cfg         |  11 +
 .../inconsistent-colocation-rules.cfg.expect  |  11 +
 ...inconsistent-location-colocation-rules.cfg |  54 ++
 ...stent-location-colocation-rules.cfg.expect | 130 ++++
 .../ineffective-colocation-rules.cfg          |   7 +
 .../ineffective-colocation-rules.cfg.expect   |   9 +
 ...ulti-priority-location-with-colocation.cfg |  19 +
 ...iority-location-with-colocation.cfg.expect |  47 ++
 .../test-colocation-strict-separate1/README   |  13 +
 .../test-colocation-strict-separate1/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  60 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   6 +
 .../test-colocation-strict-separate2/README   |  15 +
 .../test-colocation-strict-separate2/cmdlist  |   4 +
 .../hardware_status                           |   7 +
 .../log.expect                                |  90 +++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |  10 +
 .../test-colocation-strict-separate3/README   |  16 +
 .../test-colocation-strict-separate3/cmdlist  |   4 +
 .../hardware_status                           |   7 +
 .../log.expect                                | 110 +++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |  10 +
 .../test-colocation-strict-separate4/README   |  18 +
 .../test-colocation-strict-separate4/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  69 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   6 +
 .../test-colocation-strict-separate5/README   |  11 +
 .../test-colocation-strict-separate5/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  56 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   7 +
 .../service_config                            |   5 +
 .../test-colocation-strict-separate6/README   |  18 +
 .../test-colocation-strict-separate6/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  69 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   6 +
 .../test-colocation-strict-separate7/README   |  15 +
 .../test-colocation-strict-separate7/cmdlist  |   5 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  52 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   4 +
 .../test-colocation-strict-separate8/README   |  11 +
 .../test-colocation-strict-separate8/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  38 +
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   5 +
 .../test-colocation-strict-separate9/README   |  14 +
 .../test-colocation-strict-separate9/cmdlist  |   3 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  57 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   7 +
 .../test-colocation-strict-together1/README   |  11 +
 .../test-colocation-strict-together1/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  66 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   6 +
 .../test-colocation-strict-together2/README   |  10 +
 .../test-colocation-strict-together2/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  80 +++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   8 +
 .../test-colocation-strict-together3/README   |  17 +
 .../test-colocation-strict-together3/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  89 +++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   8 +
 .../test-colocation-strict-together4/README   |  11 +
 .../test-colocation-strict-together4/cmdlist  |   4 +
 .../hardware_status                           |   5 +
 .../log.expect                                |  59 ++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   5 +
 .../test-colocation-strict-together5/README   |  19 +
 .../test-colocation-strict-together5/cmdlist  |   8 +
 .../hardware_status                           |   5 +
 .../log.expect                                | 281 ++++++++
 .../manager_status                            |   1 +
 .../rules_config                              |  15 +
 .../service_config                            |  11 +
 .../test-crs-static-rebalance-coloc1/README   |  26 +
 .../test-crs-static-rebalance-coloc1/cmdlist  |   4 +
 .../datacenter.cfg                            |   6 +
 .../hardware_status                           |   5 +
 .../log.expect                                | 120 ++++
 .../manager_status                            |   1 +
 .../rules_config                              |  19 +
 .../service_config                            |  10 +
 .../static_service_stats                      |  10 +
 .../test-crs-static-rebalance-coloc2/README   |  20 +
 .../test-crs-static-rebalance-coloc2/cmdlist  |   4 +
 .../datacenter.cfg                            |   6 +
 .../hardware_status                           |   5 +
 .../log.expect                                | 174 +++++
 .../manager_status                            |   1 +
 .../rules_config                              |  11 +
 .../service_config                            |  14 +
 .../static_service_stats                      |  14 +
 .../test-crs-static-rebalance-coloc3/README   |  22 +
 .../test-crs-static-rebalance-coloc3/cmdlist  |  22 +
 .../datacenter.cfg                            |   6 +
 .../hardware_status                           |   7 +
 .../log.expect                                | 272 +++++++
 .../manager_status                            |   1 +
 .../rules_config                              |   3 +
 .../service_config                            |   9 +
 .../static_service_stats                      |   9 +
 src/test/test-location-loose1/README          |  10 +
 src/test/test-location-loose1/cmdlist         |   4 +
 src/test/test-location-loose1/groups          |   2 +
 src/test/test-location-loose1/hardware_status |   5 +
 src/test/test-location-loose1/log.expect      |  40 ++
 src/test/test-location-loose1/manager_status  |   1 +
 src/test/test-location-loose1/service_config  |   3 +
 src/test/test-location-loose2/README          |  12 +
 src/test/test-location-loose2/cmdlist         |   4 +
 src/test/test-location-loose2/groups          |   3 +
 src/test/test-location-loose2/hardware_status |   5 +
 src/test/test-location-loose2/log.expect      |  35 +
 src/test/test-location-loose2/manager_status  |   1 +
 src/test/test-location-loose2/service_config  |   3 +
 src/test/test-location-loose3/README          |  10 +
 src/test/test-location-loose3/cmdlist         |   4 +
 src/test/test-location-loose3/groups          |   2 +
 src/test/test-location-loose3/hardware_status |   5 +
 src/test/test-location-loose3/log.expect      |  56 ++
 src/test/test-location-loose3/manager_status  |   1 +
 src/test/test-location-loose3/service_config  |   5 +
 src/test/test-location-loose4/README          |  14 +
 src/test/test-location-loose4/cmdlist         |   4 +
 src/test/test-location-loose4/groups          |   2 +
 src/test/test-location-loose4/hardware_status |   5 +
 src/test/test-location-loose4/log.expect      |  54 ++
 src/test/test-location-loose4/manager_status  |   1 +
 src/test/test-location-loose4/service_config  |   5 +
 src/test/test-location-loose5/README          |  16 +
 src/test/test-location-loose5/cmdlist         |   5 +
 src/test/test-location-loose5/groups          |   2 +
 src/test/test-location-loose5/hardware_status |   5 +
 src/test/test-location-loose5/log.expect      |  66 ++
 src/test/test-location-loose5/manager_status  |   1 +
 src/test/test-location-loose5/service_config  |   3 +
 src/test/test-location-loose6/README          |  14 +
 src/test/test-location-loose6/cmdlist         |   5 +
 src/test/test-location-loose6/groups          |   3 +
 src/test/test-location-loose6/hardware_status |   5 +
 src/test/test-location-loose6/log.expect      |  52 ++
 src/test/test-location-loose6/manager_status  |   1 +
 src/test/test-location-loose6/service_config  |   3 +
 src/test/test-location-strict1/README         |  10 +
 src/test/test-location-strict1/cmdlist        |   4 +
 src/test/test-location-strict1/groups         |   3 +
 .../test-location-strict1/hardware_status     |   5 +
 src/test/test-location-strict1/log.expect     |  40 ++
 src/test/test-location-strict1/manager_status |   1 +
 src/test/test-location-strict1/service_config |   3 +
 src/test/test-location-strict2/README         |  11 +
 src/test/test-location-strict2/cmdlist        |   4 +
 src/test/test-location-strict2/groups         |   4 +
 .../test-location-strict2/hardware_status     |   5 +
 src/test/test-location-strict2/log.expect     |  40 ++
 src/test/test-location-strict2/manager_status |   1 +
 src/test/test-location-strict2/service_config |   3 +
 src/test/test-location-strict3/README         |  10 +
 src/test/test-location-strict3/cmdlist        |   4 +
 src/test/test-location-strict3/groups         |   3 +
 .../test-location-strict3/hardware_status     |   5 +
 src/test/test-location-strict3/log.expect     |  74 ++
 src/test/test-location-strict3/manager_status |   1 +
 src/test/test-location-strict3/service_config |   5 +
 src/test/test-location-strict4/README         |  14 +
 src/test/test-location-strict4/cmdlist        |   4 +
 src/test/test-location-strict4/groups         |   3 +
 .../test-location-strict4/hardware_status     |   5 +
 src/test/test-location-strict4/log.expect     |  54 ++
 src/test/test-location-strict4/manager_status |   1 +
 src/test/test-location-strict4/service_config |   5 +
 src/test/test-location-strict5/README         |  16 +
 src/test/test-location-strict5/cmdlist        |   5 +
 src/test/test-location-strict5/groups         |   3 +
 .../test-location-strict5/hardware_status     |   5 +
 src/test/test-location-strict5/log.expect     |  66 ++
 src/test/test-location-strict5/manager_status |   1 +
 src/test/test-location-strict5/service_config |   3 +
 src/test/test-location-strict6/README         |  14 +
 src/test/test-location-strict6/cmdlist        |   5 +
 src/test/test-location-strict6/groups         |   4 +
 .../test-location-strict6/hardware_status     |   5 +
 src/test/test-location-strict6/log.expect     |  52 ++
 src/test/test-location-strict6/manager_status |   1 +
 src/test/test-location-strict6/service_config |   3 +
 src/test/test_failover1.pl                    |  29 +-
 src/test/test_rules_config.pl                 | 102 +++
 254 files changed, 6664 insertions(+), 125 deletions(-)
 create mode 100644 src/PVE/API2/HA/Rules.pm
 create mode 100644 src/PVE/HA/Rules.pm
 create mode 100644 src/PVE/HA/Rules/Colocation.pm
 create mode 100644 src/PVE/HA/Rules/Location.pm
 create mode 100644 src/PVE/HA/Rules/Makefile
 create mode 100644 src/test/rules_cfgs/defaults-for-colocation-rules.cfg
 create mode 100644 src/test/rules_cfgs/defaults-for-colocation-rules.cfg.expect
 create mode 100644 src/test/rules_cfgs/defaults-for-location-rules.cfg
 create mode 100644 src/test/rules_cfgs/defaults-for-location-rules.cfg.expect
 create mode 100644 src/test/rules_cfgs/duplicate-service-in-location-rules.cfg
 create mode 100644 src/test/rules_cfgs/duplicate-service-in-location-rules.cfg.expect
 create mode 100644 src/test/rules_cfgs/inconsistent-colocation-rules.cfg
 create mode 100644 src/test/rules_cfgs/inconsistent-colocation-rules.cfg.expect
 create mode 100644 src/test/rules_cfgs/inconsistent-location-colocation-rules.cfg
 create mode 100644 src/test/rules_cfgs/inconsistent-location-colocation-rules.cfg.expect
 create mode 100644 src/test/rules_cfgs/ineffective-colocation-rules.cfg
 create mode 100644 src/test/rules_cfgs/ineffective-colocation-rules.cfg.expect
 create mode 100644 src/test/rules_cfgs/multi-priority-location-with-colocation.cfg
 create mode 100644 src/test/rules_cfgs/multi-priority-location-with-colocation.cfg.expect
 create mode 100644 src/test/test-colocation-strict-separate1/README
 create mode 100644 src/test/test-colocation-strict-separate1/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate1/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate1/log.expect
 create mode 100644 src/test/test-colocation-strict-separate1/manager_status
 create mode 100644 src/test/test-colocation-strict-separate1/rules_config
 create mode 100644 src/test/test-colocation-strict-separate1/service_config
 create mode 100644 src/test/test-colocation-strict-separate2/README
 create mode 100644 src/test/test-colocation-strict-separate2/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate2/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate2/log.expect
 create mode 100644 src/test/test-colocation-strict-separate2/manager_status
 create mode 100644 src/test/test-colocation-strict-separate2/rules_config
 create mode 100644 src/test/test-colocation-strict-separate2/service_config
 create mode 100644 src/test/test-colocation-strict-separate3/README
 create mode 100644 src/test/test-colocation-strict-separate3/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate3/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate3/log.expect
 create mode 100644 src/test/test-colocation-strict-separate3/manager_status
 create mode 100644 src/test/test-colocation-strict-separate3/rules_config
 create mode 100644 src/test/test-colocation-strict-separate3/service_config
 create mode 100644 src/test/test-colocation-strict-separate4/README
 create mode 100644 src/test/test-colocation-strict-separate4/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate4/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate4/log.expect
 create mode 100644 src/test/test-colocation-strict-separate4/manager_status
 create mode 100644 src/test/test-colocation-strict-separate4/rules_config
 create mode 100644 src/test/test-colocation-strict-separate4/service_config
 create mode 100644 src/test/test-colocation-strict-separate5/README
 create mode 100644 src/test/test-colocation-strict-separate5/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate5/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate5/log.expect
 create mode 100644 src/test/test-colocation-strict-separate5/manager_status
 create mode 100644 src/test/test-colocation-strict-separate5/rules_config
 create mode 100644 src/test/test-colocation-strict-separate5/service_config
 create mode 100644 src/test/test-colocation-strict-separate6/README
 create mode 100644 src/test/test-colocation-strict-separate6/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate6/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate6/log.expect
 create mode 100644 src/test/test-colocation-strict-separate6/manager_status
 create mode 100644 src/test/test-colocation-strict-separate6/rules_config
 create mode 100644 src/test/test-colocation-strict-separate6/service_config
 create mode 100644 src/test/test-colocation-strict-separate7/README
 create mode 100644 src/test/test-colocation-strict-separate7/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate7/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate7/log.expect
 create mode 100644 src/test/test-colocation-strict-separate7/manager_status
 create mode 100644 src/test/test-colocation-strict-separate7/rules_config
 create mode 100644 src/test/test-colocation-strict-separate7/service_config
 create mode 100644 src/test/test-colocation-strict-separate8/README
 create mode 100644 src/test/test-colocation-strict-separate8/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate8/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate8/log.expect
 create mode 100644 src/test/test-colocation-strict-separate8/manager_status
 create mode 100644 src/test/test-colocation-strict-separate8/rules_config
 create mode 100644 src/test/test-colocation-strict-separate8/service_config
 create mode 100644 src/test/test-colocation-strict-separate9/README
 create mode 100644 src/test/test-colocation-strict-separate9/cmdlist
 create mode 100644 src/test/test-colocation-strict-separate9/hardware_status
 create mode 100644 src/test/test-colocation-strict-separate9/log.expect
 create mode 100644 src/test/test-colocation-strict-separate9/manager_status
 create mode 100644 src/test/test-colocation-strict-separate9/rules_config
 create mode 100644 src/test/test-colocation-strict-separate9/service_config
 create mode 100644 src/test/test-colocation-strict-together1/README
 create mode 100644 src/test/test-colocation-strict-together1/cmdlist
 create mode 100644 src/test/test-colocation-strict-together1/hardware_status
 create mode 100644 src/test/test-colocation-strict-together1/log.expect
 create mode 100644 src/test/test-colocation-strict-together1/manager_status
 create mode 100644 src/test/test-colocation-strict-together1/rules_config
 create mode 100644 src/test/test-colocation-strict-together1/service_config
 create mode 100644 src/test/test-colocation-strict-together2/README
 create mode 100644 src/test/test-colocation-strict-together2/cmdlist
 create mode 100644 src/test/test-colocation-strict-together2/hardware_status
 create mode 100644 src/test/test-colocation-strict-together2/log.expect
 create mode 100644 src/test/test-colocation-strict-together2/manager_status
 create mode 100644 src/test/test-colocation-strict-together2/rules_config
 create mode 100644 src/test/test-colocation-strict-together2/service_config
 create mode 100644 src/test/test-colocation-strict-together3/README
 create mode 100644 src/test/test-colocation-strict-together3/cmdlist
 create mode 100644 src/test/test-colocation-strict-together3/hardware_status
 create mode 100644 src/test/test-colocation-strict-together3/log.expect
 create mode 100644 src/test/test-colocation-strict-together3/manager_status
 create mode 100644 src/test/test-colocation-strict-together3/rules_config
 create mode 100644 src/test/test-colocation-strict-together3/service_config
 create mode 100644 src/test/test-colocation-strict-together4/README
 create mode 100644 src/test/test-colocation-strict-together4/cmdlist
 create mode 100644 src/test/test-colocation-strict-together4/hardware_status
 create mode 100644 src/test/test-colocation-strict-together4/log.expect
 create mode 100644 src/test/test-colocation-strict-together4/manager_status
 create mode 100644 src/test/test-colocation-strict-together4/rules_config
 create mode 100644 src/test/test-colocation-strict-together4/service_config
 create mode 100644 src/test/test-colocation-strict-together5/README
 create mode 100644 src/test/test-colocation-strict-together5/cmdlist
 create mode 100644 src/test/test-colocation-strict-together5/hardware_status
 create mode 100644 src/test/test-colocation-strict-together5/log.expect
 create mode 100644 src/test/test-colocation-strict-together5/manager_status
 create mode 100644 src/test/test-colocation-strict-together5/rules_config
 create mode 100644 src/test/test-colocation-strict-together5/service_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/README
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/cmdlist
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/datacenter.cfg
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/hardware_status
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/log.expect
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/manager_status
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/rules_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/service_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc1/static_service_stats
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/README
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/cmdlist
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/datacenter.cfg
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/hardware_status
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/log.expect
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/manager_status
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/rules_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/service_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc2/static_service_stats
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/README
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/cmdlist
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/datacenter.cfg
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/hardware_status
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/log.expect
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/manager_status
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/rules_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/service_config
 create mode 100644 src/test/test-crs-static-rebalance-coloc3/static_service_stats
 create mode 100644 src/test/test-location-loose1/README
 create mode 100644 src/test/test-location-loose1/cmdlist
 create mode 100644 src/test/test-location-loose1/groups
 create mode 100644 src/test/test-location-loose1/hardware_status
 create mode 100644 src/test/test-location-loose1/log.expect
 create mode 100644 src/test/test-location-loose1/manager_status
 create mode 100644 src/test/test-location-loose1/service_config
 create mode 100644 src/test/test-location-loose2/README
 create mode 100644 src/test/test-location-loose2/cmdlist
 create mode 100644 src/test/test-location-loose2/groups
 create mode 100644 src/test/test-location-loose2/hardware_status
 create mode 100644 src/test/test-location-loose2/log.expect
 create mode 100644 src/test/test-location-loose2/manager_status
 create mode 100644 src/test/test-location-loose2/service_config
 create mode 100644 src/test/test-location-loose3/README
 create mode 100644 src/test/test-location-loose3/cmdlist
 create mode 100644 src/test/test-location-loose3/groups
 create mode 100644 src/test/test-location-loose3/hardware_status
 create mode 100644 src/test/test-location-loose3/log.expect
 create mode 100644 src/test/test-location-loose3/manager_status
 create mode 100644 src/test/test-location-loose3/service_config
 create mode 100644 src/test/test-location-loose4/README
 create mode 100644 src/test/test-location-loose4/cmdlist
 create mode 100644 src/test/test-location-loose4/groups
 create mode 100644 src/test/test-location-loose4/hardware_status
 create mode 100644 src/test/test-location-loose4/log.expect
 create mode 100644 src/test/test-location-loose4/manager_status
 create mode 100644 src/test/test-location-loose4/service_config
 create mode 100644 src/test/test-location-loose5/README
 create mode 100644 src/test/test-location-loose5/cmdlist
 create mode 100644 src/test/test-location-loose5/groups
 create mode 100644 src/test/test-location-loose5/hardware_status
 create mode 100644 src/test/test-location-loose5/log.expect
 create mode 100644 src/test/test-location-loose5/manager_status
 create mode 100644 src/test/test-location-loose5/service_config
 create mode 100644 src/test/test-location-loose6/README
 create mode 100644 src/test/test-location-loose6/cmdlist
 create mode 100644 src/test/test-location-loose6/groups
 create mode 100644 src/test/test-location-loose6/hardware_status
 create mode 100644 src/test/test-location-loose6/log.expect
 create mode 100644 src/test/test-location-loose6/manager_status
 create mode 100644 src/test/test-location-loose6/service_config
 create mode 100644 src/test/test-location-strict1/README
 create mode 100644 src/test/test-location-strict1/cmdlist
 create mode 100644 src/test/test-location-strict1/groups
 create mode 100644 src/test/test-location-strict1/hardware_status
 create mode 100644 src/test/test-location-strict1/log.expect
 create mode 100644 src/test/test-location-strict1/manager_status
 create mode 100644 src/test/test-location-strict1/service_config
 create mode 100644 src/test/test-location-strict2/README
 create mode 100644 src/test/test-location-strict2/cmdlist
 create mode 100644 src/test/test-location-strict2/groups
 create mode 100644 src/test/test-location-strict2/hardware_status
 create mode 100644 src/test/test-location-strict2/log.expect
 create mode 100644 src/test/test-location-strict2/manager_status
 create mode 100644 src/test/test-location-strict2/service_config
 create mode 100644 src/test/test-location-strict3/README
 create mode 100644 src/test/test-location-strict3/cmdlist
 create mode 100644 src/test/test-location-strict3/groups
 create mode 100644 src/test/test-location-strict3/hardware_status
 create mode 100644 src/test/test-location-strict3/log.expect
 create mode 100644 src/test/test-location-strict3/manager_status
 create mode 100644 src/test/test-location-strict3/service_config
 create mode 100644 src/test/test-location-strict4/README
 create mode 100644 src/test/test-location-strict4/cmdlist
 create mode 100644 src/test/test-location-strict4/groups
 create mode 100644 src/test/test-location-strict4/hardware_status
 create mode 100644 src/test/test-location-strict4/log.expect
 create mode 100644 src/test/test-location-strict4/manager_status
 create mode 100644 src/test/test-location-strict4/service_config
 create mode 100644 src/test/test-location-strict5/README
 create mode 100644 src/test/test-location-strict5/cmdlist
 create mode 100644 src/test/test-location-strict5/groups
 create mode 100644 src/test/test-location-strict5/hardware_status
 create mode 100644 src/test/test-location-strict5/log.expect
 create mode 100644 src/test/test-location-strict5/manager_status
 create mode 100644 src/test/test-location-strict5/service_config
 create mode 100644 src/test/test-location-strict6/README
 create mode 100644 src/test/test-location-strict6/cmdlist
 create mode 100644 src/test/test-location-strict6/groups
 create mode 100644 src/test/test-location-strict6/hardware_status
 create mode 100644 src/test/test-location-strict6/log.expect
 create mode 100644 src/test/test-location-strict6/manager_status
 create mode 100644 src/test/test-location-strict6/service_config
 create mode 100755 src/test/test_rules_config.pl


docs:

Daniel Kral (5):
  ha: config: add section about ha rules
  update static files to include ha rules api endpoints
  update static files to include use-location-rules feature flag
  update static files to include ha resources failback flag
  update static files to include ha service motion return value schema

 Makefile                        |   3 +
 api-viewer/apidata.js           | 414 +++++++++++++++++++++++++++++++-
 datacenter.cfg.5-opts.adoc      |   6 +-
 gen-ha-rules-colocation-opts.pl |  20 ++
 gen-ha-rules-location-opts.pl   |  20 ++
 gen-ha-rules-opts.pl            |  17 ++
 ha-manager.1-synopsis.adoc      | 146 +++++++++++
 ha-manager.adoc                 | 231 +++++++++++++++++-
 ha-resources-opts.adoc          |   4 +
 ha-rules-colocation-opts.adoc   |   8 +
 ha-rules-location-opts.adoc     |  14 ++
 ha-rules-opts.adoc              |  12 +
 12 files changed, 884 insertions(+), 11 deletions(-)
 create mode 100755 gen-ha-rules-colocation-opts.pl
 create mode 100755 gen-ha-rules-location-opts.pl
 create mode 100755 gen-ha-rules-opts.pl
 create mode 100644 ha-rules-colocation-opts.adoc
 create mode 100644 ha-rules-location-opts.adoc
 create mode 100644 ha-rules-opts.adoc


base-commit: 7cc17ee5950a53bbd5b5ad81270352ccdb1c541c

manager:

Daniel Kral (5):
  api: ha: add ha rules api endpoints
  ui: add use-location-rules feature flag
  ui: ha: hide ha groups if use-location-rules is enabled
  ui: ha: adapt resources components if use-location-rules is enabled
  ui: ha: add ha rules components and menu entry

 PVE/API2/HAConfig.pm                        |   8 +-
 www/manager6/Makefile                       |   7 +
 www/manager6/StateProvider.js               |   1 -
 www/manager6/Utils.js                       |   5 +
 www/manager6/Workspace.js                   |  20 ++
 www/manager6/dc/Config.js                   |  15 +-
 www/manager6/dc/OptionView.js               |  13 ++
 www/manager6/ha/Groups.js                   |   6 +
 www/manager6/ha/ResourceEdit.js             |  27 ++-
 www/manager6/ha/Resources.js                |   7 +
 www/manager6/ha/RuleEdit.js                 | 149 +++++++++++++
 www/manager6/ha/RuleErrorsModal.js          |  50 +++++
 www/manager6/ha/Rules.js                    | 228 ++++++++++++++++++++
 www/manager6/ha/rules/ColocationRuleEdit.js |  24 +++
 www/manager6/ha/rules/ColocationRules.js    |  31 +++
 www/manager6/ha/rules/LocationRuleEdit.js   | 145 +++++++++++++
 www/manager6/ha/rules/LocationRules.js      |  36 ++++
 17 files changed, 764 insertions(+), 8 deletions(-)
 create mode 100644 www/manager6/ha/RuleEdit.js
 create mode 100644 www/manager6/ha/RuleErrorsModal.js
 create mode 100644 www/manager6/ha/Rules.js
 create mode 100644 www/manager6/ha/rules/ColocationRuleEdit.js
 create mode 100644 www/manager6/ha/rules/ColocationRules.js
 create mode 100644 www/manager6/ha/rules/LocationRuleEdit.js
 create mode 100644 www/manager6/ha/rules/LocationRules.js


Summary over all repositories:
  288 files changed, 8423 insertions(+), 144 deletions(-)

-- 
Generated by git-murpp 0.8.0




More information about the pve-devel mailing list