From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id AE70A1FF164 for <inbox@lore.proxmox.com>; Fri, 20 Jun 2025 16:33:44 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D8122E116; Fri, 20 Jun 2025 16:32:35 +0200 (CEST) From: Daniel Kral <d.kral@proxmox.com> To: pve-devel@lists.proxmox.com Date: Fri, 20 Jun 2025 16:31:08 +0200 Message-Id: <20250620143148.218469-1-d.kral@proxmox.com> X-Mailer: git-send-email 2.39.5 MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.113 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LOTSOFHASH 0.25 Emails with lots of hash-like gibberish SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [RFC common/cluster/ha-manager/docs/manager v2 00/40] HA colocation rules X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> 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 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel