From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 46D1D1FF0AD for ; Sun, 18 Oct 2026 14:47:39 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 82F8C216D2; Sun, 18 Oct 2026 14:46:33 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WC6jHBam0EOmb1fEknncswD3/orSlgnnU6LXqm4kE/rx0vyo+CUPfu1SW74a8la62iyIPY/OtRvBvCsLt9iQXNBvzIrndZ8bR+oyV1k7ywdib7izsRfH7C0FdBrAqzpSW2dfJluFd/kDoXhZknyt/fTWf6Wh8T9QlJ8IIUZQwW4YcXZTafYGF2ThGIRdhhmlAN6VL+FcOGyH9ZpzPLxwj9v8fiZ/mQOweK8CrZZMpha+z5EOD1qpZLDecZD+yElUmIUt+Ytm3MZuH8PVlHU7UHrmj0Zn3fyJz0ghrURwNgVy4EuF4kP6O6kkza8krDvOCVT4T64VN4HuYCNH53Iotg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=T97cfA00R0JuhlxE5nySnEOGfFd5Q7iRsdaEhYoPupE=; b=k6fGodKniNRQaPI5i3gJ8/aLYdob+H9V1Y7UzWxxSGS+gl3juFHJmwi1JLaoDTk9J1TD6EaBBs66iNdS6gOiYCcAsJV5VIHn3lzVodd0VzFAH6ZJN0k7vrDYBwu15Fwqz2LT5Rmt/OwqNph4+7r+3eR2DDsJlHXoVTQFc9IGZZ9jQbQp+pwj8HUAggasYEgg4b80yf96gsQQCsQASlOxiA/r+cy6GseGnbQtkWWc9Eynsip0eovctfzbKbYK8lIAAkNgXT5oVxyuDzCb3tCRXZ7I9YUSLUt3L8d5He0l8cX2N2fNQWtLPc4oMwppmuM83YMT4CD88E+BkcaTH7mf4g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=ryomherold.dk; dmarc=pass action=none header.from=ryomherold.dk; dkim=pass header.d=ryomherold.dk; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=RyomHerold.dk; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T97cfA00R0JuhlxE5nySnEOGfFd5Q7iRsdaEhYoPupE=; b=3CemjQ/f0agyFOw7hgwHocQm35Ix49NPQldAXWCGl/au9hGJVa7DK0pmfcYizlhBOMLptshLCnnwx+2xEHhjf0CTGb8sIcO2OwcnalxilfTHnIX7FHf1SZYsrebQRH1vgftzpm1xalCPAskXIWQhw1+ryvSqP+MDfoAeFcuGOZSxc2OeH2xTJJqr6nfqPaf9VUTxNQlR4laF9AKvaipEuMMqH9TqihtkQlm951n+rO2H/lxxZVbFCnoApH5jQY1FOTnfcEQ6xltnPV8Xz5RboQ/Jh8OBLRF0Vivbv6nZ2TgZ6vsn9IC/CD1zRrJpl+qHvTyoDwkuPhnLKqJj8T43bg== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=RyomHerold.dk; From: Michael Ryom To: pve-devel@lists.proxmox.com Subject: [PATCH ha-manager v2 07/14] test: add auto rebalance test case for a marginal absolute improvement Date: Sun, 18 Oct 2026 14:45:51 +0200 Message-ID: <20261018124559.24305-8-Michael@RyomHerold.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261018124559.24305-1-Michael@RyomHerold.dk> References: <20261018124559.24305-1-Michael@RyomHerold.dk> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MM0P280CA0046.SWEP280.PROD.OUTLOOK.COM (2603:10a6:190:b::20) To AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:619::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8PR10MB7231:EE_|PA4PR10MB5706:EE_ X-MS-Office365-Filtering-Correlation-Id: ca77044a-2361-48e1-cb53-08df2d15ccb2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|23010399003|6133799003|22082099003|10067099003|18002099003|260925021311599003|261009223027099003|260925022911599003|260925021911599003|56012099006; X-Microsoft-Antispam-Message-Info: xe2Mp91ovuAz9InF55yPnAK1763MB+gU9/by12Nyv2uFLp/aRafnCRQ1fGB8moDzCR4gmoTtqkrE24Hq5nIKxCVDXaGe4CuE0vzF6Em6ykf04XtiDm7AlPBPYe4nAoubxDVOVOpGLd1bJgBhR3lTzqypApvrUVhc+OwITBHUZBq+nrv5fNtxCMUpdTWb9tg8041lbqXZPfYPQUVyuTZLs+zPs0pHq3AT4URiicoajqXwdZBWaUYtmYxkpvuuJ3J2eK0P0MLLyi4awtQu5uE/fRMPAtmMYo3EASl0a9+ArRhHHewPmEbtS7DjeIcHisdwU/fCRKUh1p0smuGY0TZYvPvtSmtXaFVLES1ZjuBWlITLo+doY+0uPtVJNd3ao5FstpkgmFk0nPj46hrCTH4QPJRWGo+9V8yzT/GJitYNSYTjPzy9O6JbymFFuYtJoGtI1Gno1qvr2WIva+1XY9sLJcj8gvnBa9bcdtE2o4pHfDNoNmUj9BPPXAbGHpVjXgnPe7ViQ+f2O1H1B676SfnDx4xlXQQ777Q7X9FRSaUs35RrYmkGPXJnvUG1ddg7SB8cOgf/wWJRWJccWeY7YqU2qxEtjzUPMCeWZP2Z6GXJk+cBX+GzYguESw3pxHiUqSSPJo3XJho5SZp06lGUNDQB7p8cF5yqAx66hxSyxFx0kcg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(23010399003)(6133799003)(22082099003)(10067099003)(18002099003)(260925021311599003)(261009223027099003)(260925022911599003)(260925021911599003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6KhWxqlaag4FyqhR2mUuHnDRrFKZm5kk+0Gx5u3roNwMV+eoXhUjZCDf7r4x?= =?us-ascii?Q?/aFOPu1yWxmqMfmX2AWSspMs4FMRFUUi17Ku05SMwy0gpTMKXBHqBpWVo1dj?= =?us-ascii?Q?fL3rSsavFK5m94jEDnRbRj4zThG89mYLJ96tmU+aHRAhMAgAv4MfNXRt52Ph?= =?us-ascii?Q?ZzzZ1gGyNYrtIDkH7hv8NKXypaWfSPxfY2plaM02E7sG1ZE3ydEt6R7N2i9k?= =?us-ascii?Q?D2VCLxr0OcwMxoOi5RQDMWKkMpzDaR3NyjpSnR4lSot6lpI2kvMlFJD8GTni?= =?us-ascii?Q?AzmHRwc5Q/Cbko56alpFBw1kIt3JMHUH0ZZDV3JZa6wrWScFOiAs4/o/hYxg?= =?us-ascii?Q?1B18WJRnzgF2QtSFq9bvVfPfQCo0XoysYOcVlpXB+E/f6k4LEbhMQf3ozzfi?= =?us-ascii?Q?0+feuUPH0taVOvXr4OyVG2PzQLh6AKnV9vg2rDyy4ERd3tTctzG1vVvo1qvj?= =?us-ascii?Q?7kiNZ3/nMDjrPHUErN44IBJhIMaBWQrn+bXA8pgy40YoAPisffux2TFR9a2L?= =?us-ascii?Q?hqcwhEhhrfl9kV7p7/WyvNlJ/72W05jQ2Old0JYnQN6RJVl5HMTHZmPNFWm3?= =?us-ascii?Q?drEkG6MEv6oEWdTtQPuKFV1HmiRrrA3PipvtP3CEkDL6gYpi7rPoi0H3XIXP?= =?us-ascii?Q?XF28UIKE8YUNFNqUpdEk6G8oz8ViFIJ2klCWAGa1FxHKZPbdR3RNR1F3sHkE?= =?us-ascii?Q?MEctbjoAPIY9nk0NqmTuvvsSBjTNW+OgUbyWw8b1gEa7jy2Npoz0mF1b7eDj?= =?us-ascii?Q?QJ2R1l1j3q9wV8JlB1HupQyO8g7XTi350k3Ft1Sc0stcVo8nAoB/6OkcnmkN?= =?us-ascii?Q?Rz8kDanfYW9kOPKwfsT3r5Df2VBblkBVBAWSr4/jibhsvT4svVaUt15EZow/?= =?us-ascii?Q?Btu1wFgOd0ljdlMz/D9r7hiQ82AcxarWfzCTYOaOeRXskg+FTIyCBS7xZgKS?= =?us-ascii?Q?cqCcxEHZKGlPHWGRZ3FErvasKNwwGrfhXgGtiXT0iz27g3LmJXD3W5ceRRGE?= =?us-ascii?Q?icweHF6hpIQwz09A1HtAWdCUNhZP8mGacf+K5DQHLXQbgBcjvCqR+jkb8NJL?= =?us-ascii?Q?99Jq92p0lzHn+Oz+pCBThui36ByQ/kVaBq2meDw5K7naF3JHaZOBoT5Crx++?= =?us-ascii?Q?nbI7XVm2mYlloRwun6a3irTRhxjauqm0fUDvCz7iPFLYb26uS385xrENunpA?= =?us-ascii?Q?f6JP7LbWgxiMCNuXAU0w0DSX+E3HU4U0FJEFIezYJ3QrKssVvrctTuV+Y7AV?= =?us-ascii?Q?XKcO60IuCn9OBoJzWIixq5aw+wGoSLI6vZUyg1oi35j2d1eTwSb+mtj/XNNc?= =?us-ascii?Q?nMhVWH3e5CJBHA8nLRqd/clP4QLic7J1MP6sWGF2UxMBJE+xVqPidwWjH8hX?= =?us-ascii?Q?fKj/ruqgahSEfcWsyh9kjZWGSujuaWFaOXpl6TOq4Jp+Y0rywTm2vdrdkm4h?= =?us-ascii?Q?iZyN6PiHkx81GsM6+/aysr0RwKa1WwvVXr3uXfHjEIyD7J1FSS7IWnHo25/6?= =?us-ascii?Q?08xlqzRAqdoB9mjrGdByWV1Xz0ZRWlA/0/CYinO2C+X8UJyCXb1VTwA3Nmkb?= =?us-ascii?Q?fOus1yetRdp19fEcoUlNMuXHFNNYkwx/Lwquwisk3KmY4fG6OPgyaf6dPSMc?= =?us-ascii?Q?GDkgQcxzjrU0L/uEu/eSAURM+IEylehnjE5bEMBWBvl32F6O3bA629WkSPO2?= =?us-ascii?Q?7Jlkc57H2HhwouMdfS3VIlgk9HzQasJWQFqbFnW406I9fxFVY7oveAvVKLn1?= =?us-ascii?Q?hpbV5U11rQ=3D=3D?= X-OriginatorOrg: RyomHerold.dk X-MS-Exchange-CrossTenant-Network-Message-Id: ca77044a-2361-48e1-cb53-08df2d15ccb2 X-MS-Exchange-CrossTenant-AuthSource: AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Oct 2026 12:46:16.3793 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 26a2499e-4646-4888-a695-c64736a56807 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: awBIfSRFGKLuqcGxSLfTI4CoVS31SkEpx7XwjSZHHQ9GNIadz1ncbfty0LFXHiOAAT43aaf91l5wwcmrHfpD8Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR10MB5706 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.004 Adjusted score from AWL reputation of From: address DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy GB_MSAUTHSOURCE_EUROPE 0.01 Mail authenticated via Microsoft Europe (EURP) datacenter RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: JLN5OB6BLCP6CZSB5577UBXSHR72RBG6 X-Message-ID-Hash: JLN5OB6BLCP6CZSB5577UBXSHR72RBG6 X-MailFrom: Michael@RyomHerold.dk X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Michael Ryom X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: When a single resource dominates the cluster load, the relative margin provides almost no hysteresis, so a rebalance motion with an absolute improvement of only a few percentage points qualifies. Add a test case, where migrating vm:101 would improve the imbalance from 35.6% to 31.1%, i.e. by 12.5% relative, but only by 4.4 percentage points absolute. The test case already configures an absolute margin of 5 percentage points with the ha-auto-rebalance-margin-mode option, which is not used yet, so the margin of 5 is still interpreted as relative and its expected log records that vm:101 is migrated. It is adapted by the following patch. Signed-off-by: Michael Ryom --- .../test-crs-dynamic-auto-rebalance8/README | 12 ++++++ .../test-crs-dynamic-auto-rebalance8/cmdlist | 3 ++ .../datacenter.cfg | 8 ++++ .../dynamic_service_stats | 5 +++ .../hardware_status | 4 ++ .../log.expect | 39 +++++++++++++++++++ .../manager_status | 1 + .../service_config | 5 +++ .../static_service_stats | 5 +++ 9 files changed, 82 insertions(+) create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/README create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/cmdlist create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/datacenter.cfg create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/dynamic_service_stats create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/hardware_status create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/log.expect create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/manager_status create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/service_config create mode 100644 src/test/test-crs-dynamic-auto-rebalance8/static_service_stats diff --git a/src/test/test-crs-dynamic-auto-rebalance8/README b/src/test/test-crs-dynamic-auto-rebalance8/README new file mode 100644 index 0000000..80e9ac3 --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/README @@ -0,0 +1,12 @@ +Test that the auto rebalance system with an absolute margin does not act on a +rebalance motion whose absolute improvement of the node imbalance is below +the margin, even though its relative improvement is well above it. + +The cluster has two nodes with a HA resource excluded from auto rebalancing +on each (vm:100 on node1 and vm:200 on node2) acting as node base loads, and +one movable HA resource vm:101 on node1. The imbalance is 35.6% and stays +above the default trigger threshold of 30%, and migrating vm:101 to node2 +would improve the imbalance to 31.1%, i.e. by 12.5% relative. With a relative +margin of 5% the motion would qualify, but with the margin mode set to +'absolute', the improvement of 4.4 percentage points is below the margin of 5 +percentage points, so the motion must not be issued. diff --git a/src/test/test-crs-dynamic-auto-rebalance8/cmdlist b/src/test/test-crs-dynamic-auto-rebalance8/cmdlist new file mode 100644 index 0000000..76f0313 --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/cmdlist @@ -0,0 +1,3 @@ +[ + [ "power node1 on", "power node2 on" ] +] diff --git a/src/test/test-crs-dynamic-auto-rebalance8/datacenter.cfg b/src/test/test-crs-dynamic-auto-rebalance8/datacenter.cfg new file mode 100644 index 0000000..63c1d6b --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/datacenter.cfg @@ -0,0 +1,8 @@ +{ + "crs": { + "ha": "dynamic", + "ha-auto-rebalance": 1, + "ha-auto-rebalance-margin": 5, + "ha-auto-rebalance-margin-mode": "absolute" + } +} diff --git a/src/test/test-crs-dynamic-auto-rebalance8/dynamic_service_stats b/src/test/test-crs-dynamic-auto-rebalance8/dynamic_service_stats new file mode 100644 index 0000000..231af30 --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/dynamic_service_stats @@ -0,0 +1,5 @@ +{ + "vm:100": { "cpu": 7.44, "mem": 0 }, + "vm:101": { "cpu": 7.2, "mem": 0 }, + "vm:200": { "cpu": 6.96, "mem": 0 } +} diff --git a/src/test/test-crs-dynamic-auto-rebalance8/hardware_status b/src/test/test-crs-dynamic-auto-rebalance8/hardware_status new file mode 100644 index 0000000..864adb3 --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/hardware_status @@ -0,0 +1,4 @@ +{ + "node1": { "power": "off", "network": "off", "maxcpu": 24, "maxmem": 34359738368 }, + "node2": { "power": "off", "network": "off", "maxcpu": 24, "maxmem": 34359738368 } +} diff --git a/src/test/test-crs-dynamic-auto-rebalance8/log.expect b/src/test/test-crs-dynamic-auto-rebalance8/log.expect new file mode 100644 index 0000000..df11212 --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/log.expect @@ -0,0 +1,39 @@ +info 0 hardware: starting simulation +info 20 cmdlist: execute power node1 on +info 20 node1/crm: status change startup => wait_for_quorum +info 20 node1/lrm: status change startup => wait_for_agent_lock +info 20 cmdlist: execute power node2 on +info 20 node2/crm: status change startup => wait_for_quorum +info 20 node2/lrm: status change startup => wait_for_agent_lock +info 20 node1/crm: got lock 'ha_manager_lock' +info 20 node1/crm: status change wait_for_quorum => master +info 20 node1/crm: using scheduler mode 'dynamic' +info 20 node1/crm: node 'node1': state changed from 'unknown' => 'online' +info 20 node1/crm: node 'node2': state changed from 'unknown' => 'online' +info 20 node1/crm: adding new service 'vm:100' on node 'node1' +info 20 node1/crm: adding new service 'vm:101' on node 'node1' +info 20 node1/crm: adding new service 'vm:200' on node 'node2' +info 20 node1/crm: service 'vm:100': state changed from 'request_start' to 'started' (node = node1) +info 20 node1/crm: service 'vm:101': state changed from 'request_start' to 'started' (node = node1) +info 20 node1/crm: service 'vm:200': state changed from 'request_start' to 'started' (node = node2) +info 21 node1/lrm: got lock 'ha_agent_node1_lock' +info 21 node1/lrm: status change wait_for_agent_lock => active +info 21 node1/lrm: starting service vm:100 +info 21 node1/lrm: service status vm:100 started +info 21 node1/lrm: starting service vm:101 +info 21 node1/lrm: service status vm:101 started +info 22 node2/crm: status change wait_for_quorum => slave +info 23 node2/lrm: got lock 'ha_agent_node2_lock' +info 23 node2/lrm: status change wait_for_agent_lock => active +info 23 node2/lrm: starting service vm:200 +info 23 node2/lrm: service status vm:200 started +info 80 node1/crm: auto rebalance - migrate vm:101 to node2 (expected change for imbalance from 35.6% to 31.1%) +info 80 node1/crm: got crm command: migrate vm:101 node2 +info 80 node1/crm: migrate service 'vm:101' to node 'node2' +info 80 node1/crm: service 'vm:101': state changed from 'started' to 'migrate' (node = node1, target = node2) +info 81 node1/lrm: service vm:101 - start migrate to node 'node2' +info 81 node1/lrm: service vm:101 - end migrate to node 'node2' +info 100 node1/crm: service 'vm:101': state changed from 'migrate' to 'started' (node = node2) +info 103 node2/lrm: starting service vm:101 +info 103 node2/lrm: service status vm:101 started +info 620 hardware: exit simulation - done diff --git a/src/test/test-crs-dynamic-auto-rebalance8/manager_status b/src/test/test-crs-dynamic-auto-rebalance8/manager_status new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/manager_status @@ -0,0 +1 @@ +{} diff --git a/src/test/test-crs-dynamic-auto-rebalance8/service_config b/src/test/test-crs-dynamic-auto-rebalance8/service_config new file mode 100644 index 0000000..83bf42e --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/service_config @@ -0,0 +1,5 @@ +{ + "vm:100": { "node": "node1", "state": "started", "auto-rebalance": 0 }, + "vm:101": { "node": "node1", "state": "started" }, + "vm:200": { "node": "node2", "state": "started", "auto-rebalance": 0 } +} diff --git a/src/test/test-crs-dynamic-auto-rebalance8/static_service_stats b/src/test/test-crs-dynamic-auto-rebalance8/static_service_stats new file mode 100644 index 0000000..300fb7a --- /dev/null +++ b/src/test/test-crs-dynamic-auto-rebalance8/static_service_stats @@ -0,0 +1,5 @@ +{ + "vm:100": { "maxcpu": 8.0, "maxmem": 8589934592 }, + "vm:101": { "maxcpu": 8.0, "maxmem": 8589934592 }, + "vm:200": { "maxcpu": 8.0, "maxmem": 8589934592 } +} -- 2.47.3